gnubg-1.08.003/000755 001751 000024 00000000000 14613451700 012621 5ustar00pmstaff000000 000000 gnubg-1.08.003/gtkwindows.h000644 001751 000024 00000005174 14574155047 015214 0ustar00pmstaff000000 000000 /* * Copyright (C) 2006-2019 Jon Kinsey * Copyright (C) 2006-2018 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkwindows.h,v 1.26 2019/11/14 20:39:10 plm Exp $ */ #ifndef GTKWINDOWS_H #define GTKWINDOWS_H #include #define GTK_STOCK_DIALOG_GNU "gtk-dialog-gnu" /* stock gnu head icon */ #define GTK_STOCK_DIALOG_GNU_QUESTION "gtk-dialog-gnuquestion" /* stock gnu head icon with question mark */ #define GTK_STOCK_DIALOG_GNU_BIG "gtk-dialog-gnubig" /* large gnu icon */ enum { /* Dialog flags */ DIALOG_FLAG_NONE = 0, DIALOG_FLAG_MODAL = 1, DIALOG_FLAG_NOOK = 2, DIALOG_FLAG_CLOSEBUTTON = 4, DIALOG_FLAG_NOTIDY = 8, DIALOG_FLAG_MINMAXBUTTONS = 16, DIALOG_FLAG_NORESPONSE = 32 }; typedef enum { DA_MAIN, DA_BUTTONS, DA_OK } dialogarea; typedef enum { DT_INFO, DT_QUESTION, DT_AREYOUSURE, DT_WARNING, DT_ERROR, DT_CUSTOM, NUM_DIALOG_TYPES } dialogtype; extern GtkWidget *GTKCreateDialog(const char *szTitle, const dialogtype dt, GtkWidget * parent, int flags, GCallback okFun, void *p); extern GtkWidget *DialogArea(GtkWidget * pw, dialogarea da); extern void GTKRunDialog(GtkWidget * dialog); extern int GTKGetInputYN(char *szPrompt); extern char *GTKGetInput(char *title, char *prompt, GtkWidget * parent); extern int GTKMessage(const char *sz, dialogtype dt); extern void GTKSetCurrentParent(GtkWidget * parent); extern GtkWidget *GTKGetCurrentParent(void); typedef enum { WARN_FULLSCREEN_EXIT = 0, WARN_SET_SHADOWS, WARN_UNACCELERATED, WARN_STOP, WARN_ENDGAME, WARN_RESIGN, WARN_ROLLOUT, WARN_NUM_WARNINGS } warningType; extern int GTKShowWarning(warningType warning, GtkWidget * pwParent); extern warningType ParseWarning(char *str); extern void SetWarningEnabled(warningType warning, int value); extern int GetWarningEnabled(warningType warning); extern void PrintWarning(warningType warning); extern void WriteWarnings(FILE * pf); #endif gnubg-1.08.003/analysis.c000644 001751 000024 00000213205 14605051561 014615 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2004 Joern Thyssen * Copyright (C) 2000-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: analysis.c,v 1.262 2023/03/07 22:29:54 plm Exp $ */ /* 02/2023: Isaac Keslassy: introduced the "background analysis" feature, together with a new button in the main toolbar: "Analyse" - button: "Analyse": - This is to analyse the current match. - Define options for what it does (in Settings>Analysis): - "background analysis" checkbox: * unchecked => regular "analyse match" (blocking, like today), vs. * checked => we can browse at the same time and check the analysis - "automatic add-to-database" checkbox: * Unchecked = like today, vs * Checked = automatic add-to-db at end of analysis (and we remove the add-to-db button from the statistics page) - 2nd button: "Analyze file": - This is for a file, e.g. a match that we just played online. - Can launch either one of 3 options (defined in Settings>Analysis): 1) Regular "batch analysis": blocking, like today (+add-to-db) 2) "Single-file analysis": analysis of 1 chosen file, can be in background and/or add-to-db based on defined settings 3) "Smart analysis": pick the newest file in the preferred folder that gnubg recognizes, then can be in background and/or add-to-db based on defined settings When analyzing in the background, various menus are disabled so the user does not launch another analysis in the middle. */ #include "config.h" #include #include #include #include "backgammon.h" #include "drawboard.h" #include "eval.h" #if defined(USE_GTK) #include "gtkgame.h" #endif #include "positionid.h" #include "analysis.h" #include "sound.h" #include "matchequity.h" #include "formatgs.h" #include "progress.h" #include "multithread.h" #include "format.h" #include "lib/simd.h" const char *aszRating[N_RATINGS] = { N_("rating|Awful!"), N_("rating|Beginner"), N_("rating|Casual player"), N_("rating|Intermediate"), N_("rating|Advanced"), N_("rating|Expert"), N_("rating|World class"), N_("rating|Supernatural"), N_("rating|N/A") }; const char *aszLuckRating[N_LUCKS] = { N_("luck|Go to bed"), N_("luck|Bad dice, man!"), N_("luck|None"), N_("luck|Good dice, man!"), N_("luck|Go to Las Vegas"), }; static const float arThrsRating[RAT_SUPERNATURAL + 1] = { 1e38f, 0.035f, 0.026f, 0.018f, 0.012f, 0.008f, 0.005f, 0.002f }; /* 1e38, 0.060, 0.030, 0.025, 0.020, 0.015, 0.010, 0.005 }; */ int afAnalysePlayers[2] = { TRUE, TRUE }; evalcontext ecLuck = { TRUE, 0, FALSE, TRUE, 0.0 }; extern ratingtype GetRating(const float rError) { int i; for (i = RAT_SUPERNATURAL; i >= 0; i--) if (rError < arThrsRating[i]) return (ratingtype) i; return RAT_UNDEFINED; } static float LuckFirst(const TanBoard anBoard, const int n0, const int n1, cubeinfo * pci, const evalcontext * pec) { TanBoard anBoardTemp; int i, j; float aar[6][6], ar[NUM_ROLLOUT_OUTPUTS], rMean = 0.0f; cubeinfo ciOpp; movelist ml; /* first with player pci->fMove on roll */ memcpy(&ciOpp, pci, sizeof(cubeinfo)); ciOpp.fMove = !pci->fMove; for (i = 0; i < 6; i++) for (j = 0; j < i; j++) { memcpy(&anBoardTemp[0][0], &anBoard[0][0], 2 * 25 * sizeof(int)); /* Find the best move for each roll at ply 0 only. */ if (FindnSaveBestMoves(&ml, i + 1, j + 1, (ConstTanBoard) anBoardTemp, NULL, 0.0f, pci, pec, defaultFilters) < 0) { g_free(ml.amMoves); return ERR_VAL; } if (!ml.cMoves) { SwapSides(anBoardTemp); if (GeneralEvaluationE(ar, (ConstTanBoard) anBoardTemp, &ciOpp, pec) < 0) return ERR_VAL; if (pec->fCubeful) { if (pci->nMatchTo) aar[i][j] = -mwc2eq(ar[OUTPUT_CUBEFUL_EQUITY], &ciOpp); else aar[i][j] = -ar[OUTPUT_CUBEFUL_EQUITY]; } else aar[i][j] = -ar[OUTPUT_EQUITY]; } else { aar[i][j] = ml.amMoves[0].rScore; g_free(ml.amMoves); } rMean += aar[i][j]; } /* with other player on roll */ for (i = 0; i < 6; i++) for (j = i + 1; j < 6; j++) { memcpy(&anBoardTemp[0][0], &anBoard[0][0], 2 * 25 * sizeof(int)); SwapSides(anBoardTemp); /* Find the best move for each roll at ply 0 only. */ if (FindnSaveBestMoves(&ml, i + 1, j + 1, (ConstTanBoard) anBoardTemp, NULL, 0.0f, &ciOpp, pec, defaultFilters) < 0) { g_free(ml.amMoves); return ERR_VAL; } if (!ml.cMoves) { SwapSides(anBoardTemp); if (GeneralEvaluationE(ar, (ConstTanBoard) anBoardTemp, pci, pec) < 0) return ERR_VAL; if (pec->fCubeful) { if (pci->nMatchTo) aar[i][j] = mwc2eq(ar[OUTPUT_CUBEFUL_EQUITY], pci); else aar[i][j] = ar[OUTPUT_CUBEFUL_EQUITY]; } else aar[i][j] = ar[OUTPUT_EQUITY]; } else { aar[i][j] = -ml.amMoves[0].rScore; g_free(ml.amMoves); } rMean += aar[i][j]; } if (n0 > n1) return aar[n0][n1] - rMean / 30.0f; else return aar[n1][n0] - rMean / 30.0f; } static float LuckNormal(const TanBoard anBoard, const int n0, const int n1, const cubeinfo * pci, const evalcontext * pec) { TanBoard anBoardTemp; int i, j; float aar[6][6], ar[NUM_ROLLOUT_OUTPUTS], rMean = 0.0f; cubeinfo ciOpp; movelist ml; memcpy(&ciOpp, pci, sizeof(cubeinfo)); ciOpp.fMove = !pci->fMove; for (i = 0; i < 6; i++) for (j = 0; j <= i; j++) { memcpy(&anBoardTemp[0][0], &anBoard[0][0], 2 * 25 * sizeof(int)); /* Find the best move for each roll at ply 0 only. */ if (FindnSaveBestMoves(&ml, i + 1, j + 1, (ConstTanBoard) anBoardTemp, NULL, 0.0f, pci, pec, defaultFilters) < 0) { g_free(ml.amMoves); return ERR_VAL; } if (!ml.cMoves) { SwapSides(anBoardTemp); if (GeneralEvaluationE(ar, (ConstTanBoard) anBoardTemp, &ciOpp, pec) < 0) return ERR_VAL; if (pec->fCubeful) { if (pci->nMatchTo) aar[i][j] = -mwc2eq(ar[OUTPUT_CUBEFUL_EQUITY], &ciOpp); else aar[i][j] = -ar[OUTPUT_CUBEFUL_EQUITY]; } else aar[i][j] = -ar[OUTPUT_EQUITY]; } else { aar[i][j] = ml.amMoves[0].rScore; g_free(ml.amMoves); } rMean += (i == j) ? aar[i][j] : aar[i][j] * 2.0f; } return aar[n0][n1] - rMean / 36.0f; } extern float LuckAnalysis(const TanBoard anBoard, int n0, int n1, matchstate * pms) { cubeinfo ci; int is_init_board; TanBoard init_board; GetMatchStateCubeInfo(&ci, pms); InitBoard(init_board, pms->bgv); is_init_board = !memcmp(init_board, pms->anBoard, 2 * 25 * sizeof(int)); if (n0-- < n1--) /* -- because as input n0 and n1 are dice [1..6] but in calls to LuckXX() they are array indexes [0..5] */ swap(&n0, &n1); if (is_init_board && n0 != n1) /* FIXME: this fails if we return to the initial position after a few moves */ return LuckFirst(anBoard, n0, n1, &ci, &ecLuck); else return LuckNormal(anBoard, n0, n1, &ci, &ecLuck); } extern lucktype Luck(float r) { if (r > arLuckLevel[LUCK_VERYGOOD]) return LUCK_VERYGOOD; else if (r > arLuckLevel[LUCK_GOOD]) return LUCK_GOOD; else if (r < -arLuckLevel[LUCK_VERYBAD]) return LUCK_VERYBAD; else if (r < -arLuckLevel[LUCK_BAD]) return LUCK_BAD; else return LUCK_NONE; } extern skilltype Skill(float r) { if (r < -arSkillLevel[SKILL_VERYBAD]) return SKILL_VERYBAD; else if (r < -arSkillLevel[SKILL_BAD]) return SKILL_BAD; else if (r < -arSkillLevel[SKILL_DOUBTFUL]) return SKILL_DOUBTFUL; else return SKILL_NONE; } /* * update statcontext for given move * * Input: * psc: the statcontext to update * pmr: the given move * pms: the current match state * * Output: * psc: the updated stat context * */ static void updateStatcontext(statcontext * psc, const moverecord * pmr, const matchstate * pms, const listOLD * plGame) { cubeinfo ci; static positionkey key; float rSkill, rCost; unsigned int i; float arDouble[4]; const xmovegameinfo *pmgi = &((moverecord *) plGame->plNext->p)->g; doubletype dt; taketype tt; switch (pmr->mt) { case MOVE_GAMEINFO: /* update luck adjusted result */ psc->arActualResult[0] = psc->arActualResult[1] = 0.0f; if (pmr->g.fWinner != -1) { if (pmr->g.nMatch) { psc->arActualResult[pmr->g.fWinner] = getME(pmr->g.anScore[0], pmr->g.anScore[1], pmr->g.nMatch, pmr->g.fWinner, pmr->g.nPoints, pmr->g.fWinner, pmr->g.fCrawfordGame, aafMET, aafMETPostCrawford) - getMEAtScore(pmr->g.anScore[0], pmr->g.anScore[1], pmr->g.nMatch, pmr->g.fWinner, pmr->g.fCrawfordGame, aafMET, aafMETPostCrawford); psc->arActualResult[!pmr->g.fWinner] = -psc->arActualResult[pmr->g.fWinner]; } else { psc->arActualResult[pmr->g.fWinner] = (float) pmr->g.nPoints; psc->arActualResult[!pmr->g.fWinner] = (float) -pmr->g.nPoints; } } for (i = 0; i < 2; ++i) psc->arLuckAdj[i] = psc->arActualResult[i]; break; case MOVE_NORMAL: /* * Cube analysis; check for * - missed doubles */ GetMatchStateCubeInfo(&ci, pms); if (pmr->CubeDecPtr->esDouble.et != EVAL_NONE && fAnalyseCube && pmgi->fCubeUse) { FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, &ci); psc->anTotalCube[pmr->fPlayer]++; /* Count doubles less than very bad */ if (isCloseCubedecision(arDouble)) psc->anCloseCube[pmr->fPlayer]++; if (arDouble[OUTPUT_NODOUBLE] < arDouble[OUTPUT_OPTIMAL]) { /* it was a double */ rSkill = arDouble[OUTPUT_NODOUBLE] - arDouble[OUTPUT_OPTIMAL]; rCost = pms->nMatchTo ? eq2mwc(rSkill, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * rSkill; if (arDouble[OUTPUT_TAKE] > 1.0f) { /* missed double above cash point */ psc->anCubeMissedDoubleTG[pmr->fPlayer]++; psc->arErrorMissedDoubleTG[pmr->fPlayer][0] -= rSkill; psc->arErrorMissedDoubleTG[pmr->fPlayer][1] -= rCost; } else { /* missed double below cash point */ psc->anCubeMissedDoubleDP[pmr->fPlayer]++; psc->arErrorMissedDoubleDP[pmr->fPlayer][0] -= rSkill; psc->arErrorMissedDoubleDP[pmr->fPlayer][1] -= rCost; } } /* missed double */ } /* EVAL_NONE */ /* * update luck statistics for roll */ if (fAnalyseDice && pmr->rLuck != ERR_VAL) { float r = pms->nMatchTo ? eq2mwc(pmr->rLuck, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * pmr->rLuck; psc->arLuck[pmr->fPlayer][0] += pmr->rLuck; psc->arLuck[pmr->fPlayer][1] += r; psc->arLuckAdj[pmr->fPlayer] -= r; psc->arLuckAdj[!pmr->fPlayer] += r; psc->anLuck[pmr->fPlayer][pmr->lt]++; } /* * update chequerplay statistics */ /* Count total regradless of analysis */ psc->anTotalMoves[pmr->fPlayer]++; /* hmm, MOVE_NORMALs which has no legal moves have * pmr->n.esChequer.et == EVAL_NONE * (Joseph) But we can detect them by checking if a move was actually * made or not. */ if (fAnalyseMove && (pmr->esChequer.et != EVAL_NONE || pmr->n.anMove[0] < 0)) { /* find skill */ TanBoard anBoardMove; float rChequerSkill = 0.0f; memcpy(anBoardMove, pms->anBoard, sizeof(anBoardMove)); ApplyMove(anBoardMove, pmr->n.anMove, FALSE); PositionKey((ConstTanBoard) anBoardMove, &key); if (pmr->ml.amMoves) { for (i = 0; i < pmr->ml.cMoves; i++) if (EqualKeys(key, pmr->ml.amMoves[i].key)) { rChequerSkill = pmr->ml.amMoves[i].rScore - pmr->ml.amMoves[0].rScore; break; } } /* update statistics */ rCost = pms->nMatchTo ? eq2mwc(rChequerSkill, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * rChequerSkill; psc->anMoves[pmr->fPlayer][Skill(rChequerSkill)]++; if (pmr->ml.cMoves > 1) { psc->anUnforcedMoves[pmr->fPlayer]++; psc->arErrorCheckerplay[pmr->fPlayer][0] -= rChequerSkill; psc->arErrorCheckerplay[pmr->fPlayer][1] -= rCost; } } else { /* unmarked move */ psc->anMoves[pmr->fPlayer][SKILL_NONE]++; } break; case MOVE_DOUBLE: dt = DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (dt != DT_NORMAL) break; GetMatchStateCubeInfo(&ci, pms); if (fAnalyseCube && pmgi->fCubeUse && pmr->CubeDecPtr->esDouble.et != EVAL_NONE) { FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, &ci); rSkill = arDouble[OUTPUT_TAKE] < arDouble[OUTPUT_DROP] ? arDouble[OUTPUT_TAKE] - arDouble[OUTPUT_OPTIMAL] : arDouble[OUTPUT_DROP] - arDouble[OUTPUT_OPTIMAL]; psc->anTotalCube[pmr->fPlayer]++; psc->anDouble[pmr->fPlayer]++; psc->anCloseCube[pmr->fPlayer]++; if (rSkill < 0.0f) { /* it was not a double */ rCost = pms->nMatchTo ? eq2mwc(rSkill, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * rSkill; if (arDouble[OUTPUT_NODOUBLE] > 1.0f) { /* wrong double above too good point */ psc->anCubeWrongDoubleTG[pmr->fPlayer]++; psc->arErrorWrongDoubleTG[pmr->fPlayer][0] -= rSkill; psc->arErrorWrongDoubleTG[pmr->fPlayer][1] -= rCost; } else { /* wrong double below double point */ psc->anCubeWrongDoubleDP[pmr->fPlayer]++; psc->arErrorWrongDoubleDP[pmr->fPlayer][0] -= rSkill; psc->arErrorWrongDoubleDP[pmr->fPlayer][1] -= rCost; } } } break; case MOVE_TAKE: tt = (taketype) DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (tt > TT_NORMAL) break; GetMatchStateCubeInfo(&ci, pms); if (fAnalyseCube && pmgi->fCubeUse && pmr->CubeDecPtr->esDouble.et != EVAL_NONE) { FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, &ci); psc->anTotalCube[pmr->fPlayer]++; psc->anTake[pmr->fPlayer]++; psc->anCloseCube[pmr->fPlayer]++; if (-arDouble[OUTPUT_TAKE] < -arDouble[OUTPUT_DROP]) { /* it was a drop */ rSkill = -arDouble[OUTPUT_TAKE] - -arDouble[OUTPUT_DROP]; rCost = pms->nMatchTo ? eq2mwc(rSkill, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * rSkill; psc->anCubeWrongTake[pmr->fPlayer]++; psc->arErrorWrongTake[pmr->fPlayer][0] -= rSkill; psc->arErrorWrongTake[pmr->fPlayer][1] -= rCost; } } break; case MOVE_DROP: GetMatchStateCubeInfo(&ci, pms); if (fAnalyseCube && pmgi->fCubeUse && pmr->CubeDecPtr->esDouble.et != EVAL_NONE) { FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, &ci); psc->anTotalCube[pmr->fPlayer]++; psc->anPass[pmr->fPlayer]++; psc->anCloseCube[pmr->fPlayer]++; if (-arDouble[OUTPUT_DROP] < -arDouble[OUTPUT_TAKE]) { /* it was a take */ rSkill = -arDouble[OUTPUT_DROP] - -arDouble[OUTPUT_TAKE]; rCost = pms->nMatchTo ? eq2mwc(rSkill, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * rSkill; psc->anCubeWrongPass[pmr->fPlayer]++; psc->arErrorWrongPass[pmr->fPlayer][0] -= rSkill; psc->arErrorWrongPass[pmr->fPlayer][1] -= rCost; } } break; case MOVE_SETDICE: /* * update luck statistics for roll */ GetMatchStateCubeInfo(&ci, pms); if (fAnalyseDice && pmr->rLuck != ERR_VAL) { float r = pms->nMatchTo ? eq2mwc(pmr->rLuck, &ci) - eq2mwc(0.0f, &ci) : (float) pms->nCube * pmr->rLuck; psc->arLuck[pmr->fPlayer][0] += pmr->rLuck; psc->arLuck[pmr->fPlayer][1] += r; psc->arLuckAdj[pmr->fPlayer] -= r; psc->arLuckAdj[!pmr->fPlayer] += r; psc->anLuck[pmr->fPlayer][pmr->lt]++; } break; default: break; } /* switch */ } extern int AnalyzeMove(moverecord * pmr, matchstate * pms, const listOLD * plParentGame, statcontext * psc, const evalsetup * pesChequer, evalsetup * pesCube, /* const */ movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES], const int analysePlayers[2], float *doubleError) { TanBoard anBoardMove; cubeinfo ci; float rSkill, rChequerSkill; float aarOutput[2][NUM_ROLLOUT_OUTPUTS]; float aarStdDev[2][NUM_ROLLOUT_OUTPUTS]; doubletype dt; taketype tt; const xmovegameinfo *pmgi = &((moverecord *) plParentGame->plNext->p)->g; int is_initial_position = 1; /* analyze this move */ FixMatchState(pms, pmr); /* check if it's the initial position: no cube analysis and special * luck analysis */ if (pmr->mt != MOVE_GAMEINFO) { InitBoard(anBoardMove, pms->bgv); is_initial_position = !memcmp(anBoardMove, pms->anBoard, 2 * 25 * sizeof(int)); } MT_Exclusive(); switch (pmr->mt) { case MOVE_GAMEINFO: if (psc) { IniStatcontext(psc); updateStatcontext(psc, pmr, pms, plParentGame); } break; case MOVE_NORMAL: if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } if (analysePlayers && !analysePlayers[pmr->fPlayer]) break; rChequerSkill = 0.0f; GetMatchStateCubeInfo(&ci, pms); /* cube action? */ if (!is_initial_position && fAnalyseCube && pmgi->fCubeUse && GetDPEq(NULL, NULL, &ci)) { float arDouble[NUM_CUBEFUL_OUTPUTS]; if (cmp_evalsetup(pesCube, &pmr->CubeDecPtr->esDouble) > 0) { MT_Release(); if (GeneralCubeDecision(aarOutput, aarStdDev, NULL, (ConstTanBoard) pms->anBoard, &ci, pesCube, NULL, NULL) < 0) return -1; MT_Exclusive(); pmr->CubeDecPtr->esDouble = *pesCube; memcpy(pmr->CubeDecPtr->aarOutput, aarOutput, sizeof(aarOutput)); memcpy(pmr->CubeDecPtr->aarStdDev, aarStdDev, sizeof(aarStdDev)); } FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, &ci); rSkill = arDouble[OUTPUT_NODOUBLE] - arDouble[OUTPUT_OPTIMAL]; pmr->stCube = Skill(rSkill); } else pmr->CubeDecPtr->esDouble.et = EVAL_NONE; /* luck analysis */ if (fAnalyseDice) { pmr->rLuck = LuckAnalysis((ConstTanBoard) pms->anBoard, pmr->anDice[0], pmr->anDice[1], pms); pmr->lt = Luck(pmr->rLuck); } /* evaluate move */ if (fAnalyseMove) { positionkey key; /* evaluate move */ memcpy(anBoardMove, pms->anBoard, sizeof(anBoardMove)); ApplyMove(anBoardMove, pmr->n.anMove, FALSE); PositionKey((ConstTanBoard) anBoardMove, &key); if (cmp_evalsetup(pesChequer, &pmr->esChequer) > 0) { if (pmr->ml.cMoves) { g_free(pmr->ml.amMoves); pmr->ml.amMoves = NULL; } /* find best moves */ { movelist ml; MT_Release(); if (FindnSaveBestMoves(&ml, pmr->anDice[0], pmr->anDice[1], (ConstTanBoard) pms->anBoard, &key, arSkillLevel[SKILL_DOUBTFUL], &ci, &pesChequer->ec, aamf) < 0) { g_free(ml.amMoves); return -1; } MT_Exclusive(); CopyMoveList(&pmr->ml, &ml); if (ml.cMoves) { g_free(ml.amMoves); } } } for (pmr->n.iMove = 0; pmr->n.iMove < pmr->ml.cMoves; pmr->n.iMove++) if (EqualKeys(key, pmr->ml.amMoves[pmr->n.iMove].key)) { rChequerSkill = pmr->ml.amMoves[pmr->n.iMove].rScore - pmr->ml.amMoves[0].rScore; break; } pmr->n.stMove = Skill(rChequerSkill); pmr->esChequer = *pesChequer; } if (psc) updateStatcontext(psc, pmr, pms, plParentGame); break; case MOVE_DOUBLE: /* always analyse MOVE_DOUBLEs as they are shared with the subsequent * MOVE_TAKEs or MOVE_DROPs. */ dt = DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (dt > DT_NORMAL) /* TODO: analyse beavers */ break; /* cube action */ if (fAnalyseCube && pmgi->fCubeUse) { GetMatchStateCubeInfo(&ci, pms); if (GetDPEq(NULL, NULL, &ci) || ci.fCubeOwner < 0 || ci.fCubeOwner == ci.fMove) { float arDouble[NUM_CUBEFUL_OUTPUTS]; if (cmp_evalsetup(pesCube, &pmr->CubeDecPtr->esDouble) > 0) { MT_Release(); if (GeneralCubeDecision(aarOutput, aarStdDev, NULL, (ConstTanBoard) pms->anBoard, &ci, pesCube, NULL, NULL) < 0) return -1; MT_Exclusive(); pmr->CubeDecPtr->esDouble = *pesCube; } else { memcpy(aarOutput, pmr->CubeDecPtr->aarOutput, sizeof(aarOutput)); memcpy(aarStdDev, pmr->CubeDecPtr->aarStdDev, sizeof(aarStdDev)); } FindCubeDecision(arDouble, aarOutput, &ci); if (doubleError) *doubleError = arDouble[OUTPUT_TAKE] - arDouble[OUTPUT_DROP]; memcpy(pmr->CubeDecPtr->aarOutput, aarOutput, sizeof(aarOutput)); memcpy(pmr->CubeDecPtr->aarStdDev, aarStdDev, sizeof(aarStdDev)); rSkill = arDouble[OUTPUT_TAKE] < arDouble[OUTPUT_DROP] ? arDouble[OUTPUT_TAKE] - arDouble[OUTPUT_OPTIMAL] : arDouble[OUTPUT_DROP] - arDouble[OUTPUT_OPTIMAL]; pmr->stCube = Skill(rSkill); } else if (doubleError) *doubleError = ERR_VAL; } if (psc) updateStatcontext(psc, pmr, pms, plParentGame); break; case MOVE_TAKE: if (analysePlayers && !analysePlayers[pmr->fPlayer]) /* we do not analyse this player */ break; tt = (taketype) DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (tt > TT_NORMAL) /* TODO: analyse beavers */ break; if (fAnalyseCube && pmgi->fCubeUse && doubleError && (*doubleError != ERR_VAL)) { GetMatchStateCubeInfo(&ci, pms); pmr->stCube = Skill(-*doubleError); } if (psc) updateStatcontext(psc, pmr, pms, plParentGame); break; case MOVE_DROP: if (analysePlayers && !analysePlayers[pmr->fPlayer]) /* we do not analyse this player */ break; tt = (taketype) DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (tt > TT_NORMAL) /* TODO: analyse beavers */ break; if (fAnalyseCube && pmgi->fCubeUse && doubleError && (*doubleError != ERR_VAL)) { GetMatchStateCubeInfo(&ci, pms); pmr->stCube = Skill(*doubleError); } if (psc) updateStatcontext(psc, pmr, pms, plParentGame); break; case MOVE_RESIGN: /* swap board if player not on roll resigned */ if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } if (analysePlayers && !analysePlayers[pmr->fPlayer]) /* we do not analyse this player */ break; if (pesCube->et != EVAL_NONE) { float rBefore, rAfter; GetMatchStateCubeInfo(&ci, pms); if (cmp_evalsetup(pesCube, &pmr->r.esResign) > 0) { getResignation(pmr->r.arResign, pms->anBoard, &ci, pesCube); } getResignEquities(pmr->r.arResign, &ci, pmr->r.nResigned, &rBefore, &rAfter); pmr->r.esResign = *pesCube; pmr->r.stResign = pmr->r.stAccept = SKILL_NONE; if (rAfter < rBefore) { /* wrong resign */ pmr->r.stResign = Skill(rAfter - rBefore); pmr->r.stAccept = SKILL_NONE; } if (rBefore < rAfter) { /* wrong accept */ pmr->r.stAccept = Skill(rBefore - rAfter); pmr->r.stResign = SKILL_NONE; } } break; case MOVE_SETDICE: if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } if (analysePlayers && !analysePlayers[pmr->fPlayer]) /* we do not analyse this player */ break; GetMatchStateCubeInfo(&ci, pms); if (fAnalyseDice) { pmr->rLuck = LuckAnalysis((ConstTanBoard) pms->anBoard, pmr->anDice[0], pmr->anDice[1], pms); pmr->lt = Luck(pmr->rLuck); } if (psc) updateStatcontext(psc, pmr, pms, plParentGame); break; case MOVE_SETBOARD: case MOVE_SETCUBEVAL: case MOVE_SETCUBEPOS: break; } ApplyMoveRecord(pms, plParentGame, pmr); if (psc) { psc->fMoves = fAnalyseMove; psc->fCube = fAnalyseCube; psc->fDice = fAnalyseDice; } MT_Release(); return fInterrupt ? -1 : 0; } static int NumberMovesGame(listOLD * plGame) { int nMoves = 0; listOLD *pl; for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) nMoves++; return nMoves; } static gboolean UpdateProgressBar(gpointer UNUSED(unused)) { ProgressValue(MT_GetDoneTasks()); return TRUE; } static void AnalyseMoveMT(Task * task) { AnalyseMoveTask *amt; float doubleError = 0.0f; analyzeDouble: amt = (AnalyseMoveTask *) task; if (AnalyzeMove(amt->pmr, &amt->ms, amt->plGame, amt->psc, &esAnalysisChequer, &esAnalysisCube, aamfAnalysis, afAnalysePlayers, &doubleError) < 0) MT_AbortTasks(); if (task->pLinkedTask) { /* Need to analyze take/drop decision in sequence */ task = task->pLinkedTask; goto analyzeDouble; } } static int AnalyzeGame(listOLD * plGame, int wait) { unsigned int i; listOLD *pl = plGame->plNext; moverecord *pmr = pl->p; statcontext *psc = &pmr->g.sc; matchstate msAnalyse; unsigned int numMoves = NumberMovesGame(plGame); AnalyseMoveTask *pt = NULL, *pParentTask = NULL; /* Analyse first move record (gameinfo) */ g_assert(pmr->mt == MOVE_GAMEINFO); if (AnalyzeMove(pmr, &msAnalyse, plGame, psc, &esAnalysisChequer, &esAnalysisCube, aamfAnalysis, afAnalysePlayers, NULL) < 0) return -1; /* Interrupted */ numMoves--; /* Done one - the gameinfo */ for (i = 0; i < numMoves; i++) { pl = pl->plNext; pmr = pl->p; if (pmr == NULL) { /* corrupt moves list */ g_assert_not_reached(); break; } if (!pParentTask) pt = (AnalyseMoveTask *) malloc(sizeof(AnalyseMoveTask)); pt->task.fun = (AsyncFun) AnalyseMoveMT; pt->task.data = pt; pt->task.pLinkedTask = NULL; pt->pmr = pmr; pt->plGame = plGame; pt->psc = psc; memcpy(&pt->ms, &msAnalyse, sizeof(msAnalyse)); if (pmr->mt == MOVE_DOUBLE) { doubletype dt = DoubleType(msAnalyse.fDoubled, msAnalyse.fMove, msAnalyse.fTurn); moverecord *pNextmr = (moverecord *) pl->plNext->p; if (pNextmr && dt == DT_NORMAL) { /* Need to link the two tasks so executed together */ pParentTask = pt; pt = (AnalyseMoveTask *) malloc(sizeof(AnalyseMoveTask)); pParentTask->task.pLinkedTask = (Task *) pt; } } else { if (pParentTask) { pt = pParentTask; pParentTask = NULL; } multi_debug("add task: analysis"); MT_AddTask((Task *) pt, TRUE); } FixMatchState(&msAnalyse, pmr); if ((pmr->fPlayer != msAnalyse.fMove) && (pmr->mt == MOVE_NORMAL || pmr->mt == MOVE_RESIGN || pmr->mt == MOVE_SETDICE)) { SwapSides(msAnalyse.anBoard); msAnalyse.fMove = pmr->fPlayer; } ApplyMoveRecord(&msAnalyse, plGame, pmr); } g_assert(pl->plNext == plGame); if (wait) { int result; multi_debug("wait for all task: analysis"); result = MT_WaitForTasks(UpdateProgressBar, 250, fAutoSaveAnalysis); if (result == -1) IniStatcontext(psc); return result; } else return 0; } static void UpdateVariance(float *prVariance, const float rSum, const float rSumAdd, const int nGames) { if (!nGames || nGames == 1) { *prVariance = 0; return; } else { /* See * for formula */ float rDelta = rSumAdd; float rMuNew = rSum / (float) nGames; float rMuOld = (rSum - rDelta) / (float) (nGames - 1); float rDeltaMu = rMuNew - rMuOld; *prVariance = *prVariance * (1.0f - 1.0f / ((float) (nGames - 1))) + (float) nGames * rDeltaMu * rDeltaMu; return; } } extern void AddStatcontext(const statcontext * pscA, statcontext * pscB) { /* pscB = pscB + pscA */ int i, j; MT_Exclusive(); pscB->nGames++; pscB->fMoves |= pscA->fMoves; pscB->fDice |= pscA->fDice; pscB->fCube |= pscA->fCube; for (i = 0; i < 2; i++) { pscB->anUnforcedMoves[i] += pscA->anUnforcedMoves[i]; pscB->anTotalMoves[i] += pscA->anTotalMoves[i]; pscB->anTotalCube[i] += pscA->anTotalCube[i]; pscB->anCloseCube[i] += pscA->anCloseCube[i]; pscB->anDouble[i] += pscA->anDouble[i]; pscB->anTake[i] += pscA->anTake[i]; pscB->anPass[i] += pscA->anPass[i]; for (j = 0; j < N_SKILLS; j++) pscB->anMoves[i][j] += pscA->anMoves[i][j]; for (j = 0; j < N_LUCKS; j++) pscB->anLuck[i][j] += pscA->anLuck[i][j]; pscB->anCubeMissedDoubleDP[i] += pscA->anCubeMissedDoubleDP[i]; pscB->anCubeMissedDoubleTG[i] += pscA->anCubeMissedDoubleTG[i]; pscB->anCubeWrongDoubleDP[i] += pscA->anCubeWrongDoubleDP[i]; pscB->anCubeWrongDoubleTG[i] += pscA->anCubeWrongDoubleTG[i]; pscB->anCubeWrongTake[i] += pscA->anCubeWrongTake[i]; pscB->anCubeWrongPass[i] += pscA->anCubeWrongPass[i]; for (j = 0; j < 2; j++) { pscB->arErrorCheckerplay[i][j] += pscA->arErrorCheckerplay[i][j]; pscB->arErrorMissedDoubleDP[i][j] += pscA->arErrorMissedDoubleDP[i][j]; pscB->arErrorMissedDoubleTG[i][j] += pscA->arErrorMissedDoubleTG[i][j]; pscB->arErrorWrongDoubleDP[i][j] += pscA->arErrorWrongDoubleDP[i][j]; pscB->arErrorWrongDoubleTG[i][j] += pscA->arErrorWrongDoubleTG[i][j]; pscB->arErrorWrongTake[i][j] += pscA->arErrorWrongTake[i][j]; pscB->arErrorWrongPass[i][j] += pscA->arErrorWrongPass[i][j]; pscB->arLuck[i][j] += pscA->arLuck[i][j]; } } if (pscA->arActualResult[0] >= 0.0f || pscA->arActualResult[1] >= 0.0f) { /* actual result is calculated */ for (i = 0; i < 2; ++i) { /* separate loop, else arLuck[ 1 ] is not calculated for i=0 */ pscB->arActualResult[i] += pscA->arActualResult[i]; pscB->arLuckAdj[i] += pscA->arLuckAdj[i]; UpdateVariance(&pscB->arVarianceActual[i], pscB->arActualResult[i], pscA->arActualResult[i], pscB->nGames); UpdateVariance(&pscB->arVarianceLuckAdj[i], pscB->arLuckAdj[i], pscA->arLuckAdj[i], pscB->nGames); } } MT_Release(); } static int CheckSettings(void) { if (!fAnalyseCube && !fAnalyseDice && !fAnalyseMove) { outputl(_("No analysis selected, you must specify at least one type of analysis to perform")); return -1; } return 0; } static int NumberMovesMatch(listOLD * plMatch) { int nMoves = 0; listOLD *pl; for (pl = plMatch->plNext; pl != plMatch; pl = pl->plNext) nMoves += NumberMovesGame(pl->p); return nMoves; } extern void CommandAnalyseGame(char *UNUSED(sz)) { int nMoves; int fStore_crawford; if (!CheckGameExists()) return; if (CheckSettings()) return; fStore_crawford = ms.fCrawford; nMoves = NumberMovesGame(plGame); /* see explanations in CommandAnalyseMatch()*/ #if defined(USE_GTK) if (fBackgroundAnalysis && fX) { fAnalysisRunning = TRUE; ProgressStartValue(_("Background analysis. Browsing-only mode: " "feel free to browse and check the early analysis results."), nMoves); ShowBoard(); /* hide unallowd toolbar items*/ GTKRegenerateGames(); /* hide unallowed menu items*/ } else #endif ProgressStartValue(_("Analysing game"), nMoves); AnalyzeGame(plGame, TRUE); ProgressEnd(); if (fBackgroundAnalysis) { fAnalysisRunning = FALSE; ShowBoard(); /* hide unallowd toolbar items*/ #if defined(USE_GTK) GTKRegenerateGames(); /* hide unallowed menu items*/ #endif } #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif ms.fCrawford = fStore_crawford; playSound(SOUND_ANALYSIS_FINISHED); } extern void CommandAnalyseMatch(char *UNUSED(sz)) { listOLD *pl; moverecord *pmr; int nMoves; int fStore_crawford; if (!CheckGameExists()) return; if (CheckSettings()) return; fStore_crawford = ms.fCrawford; nMoves = NumberMovesMatch(&lMatch); /* if we analyze in the background, we turn on a global flag to disable all sorts of buttons during the analysis */ #if defined(USE_GTK) if(fBackgroundAnalysis && fX) { fAnalysisRunning = TRUE; ProgressStartValue(_("Background analysis. Browsing-only mode: " "feel free to browse and check the early analysis results."), nMoves); ShowBoard(); /* hide unallowd toolbar items*/ GTKRegenerateGames(); /* hide unallowed menu items*/ } else #endif { /* this was supposed to show nMoves, but it's not used at the end; on the right side we see "n/nTotal"; so we update the text */ // ProgressStartValue(_("Analysing match; move:"), nMoves); ProgressStartValue(_("Analysing match"), nMoves); } IniStatcontext(&scMatch); for (pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext) { if (AnalyzeGame(pl->p, FALSE) < 0) { /* analysis incomplete; erase partial summary */ IniStatcontext(&scMatch); break; } pmr = (moverecord *) ((listOLD *) pl->p)->plNext->p; g_assert(pmr->mt == MOVE_GAMEINFO); AddStatcontext(&pmr->g.sc, &scMatch); } multi_debug("wait for all task: analysis"); MT_WaitForTasks(UpdateProgressBar, 250, fAutoSaveAnalysis); ProgressEnd(); #if defined(USE_GTK) if (fBackgroundAnalysis && fX) { fAnalysisRunning = FALSE; // CalculateBoard(); ShowBoard(); /* show toolbar items*/ GTKRegenerateGames(); /* show menu items*/ } #endif #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif ms.fCrawford = fStore_crawford; playSound(SOUND_ANALYSIS_FINISHED); } extern void CommandAnalyseSession(char *sz) { CommandAnalyseMatch(sz); } extern void IniStatcontext(statcontext * psc) { /* Initialize statcontext with all zeroes */ int i, j; psc->fMoves = psc->fCube = psc->fDice = FALSE; for (i = 0; i < 2; i++) { psc->anUnforcedMoves[i] = 0; psc->anTotalMoves[i] = 0; psc->anTotalCube[i] = 0; psc->anCloseCube[i] = 0; psc->anDouble[i] = 0; psc->anTake[i] = 0; psc->anPass[i] = 0; for (j = 0; j < N_SKILLS; j++) psc->anMoves[i][j] = 0; for (j = 0; j <= LUCK_VERYGOOD; j++) psc->anLuck[i][j] = 0; psc->anCubeMissedDoubleDP[i] = 0; psc->anCubeMissedDoubleTG[i] = 0; psc->anCubeWrongDoubleDP[i] = 0; psc->anCubeWrongDoubleTG[i] = 0; psc->anCubeWrongTake[i] = 0; psc->anCubeWrongPass[i] = 0; for (j = 0; j < 2; j++) { psc->arErrorCheckerplay[i][j] = 0.0; psc->arErrorMissedDoubleDP[i][j] = 0.0; psc->arErrorMissedDoubleTG[i][j] = 0.0; psc->arErrorWrongDoubleDP[i][j] = 0.0; psc->arErrorWrongDoubleTG[i][j] = 0.0; psc->arErrorWrongTake[i][j] = 0.0; psc->arErrorWrongPass[i][j] = 0.0; psc->arLuck[i][j] = 0.0; } psc->arActualResult[i] = 0.0f; psc->arLuckAdj[i] = 0.0f; psc->arVarianceActual[i] = 0.0f; psc->arVarianceLuckAdj[i] = 0.0f; } psc->nGames = 0; } extern float relativeFibsRating(float r, int n) { float const x = -2000.0f / sqrtf((float) n) * log10f(1.0f / r - 1.0f); return (x < -2100.0f) ? -2100.0f : x; } /* * Calculated the amount of rating lost by chequer play errors. * * a2(N) * EPM * * where a2(N) = 8798 + 25526/N * */ extern float absoluteFibsRatingChequer(const float rChequer, const int n) { return rChequer * (8798.0f + 25526.0f / (float) n); } /* * Calculated the amount of rating lost by cube play errors. * * b(N) * EPM * * where b(N) = 863 - 519/N. * */ extern float absoluteFibsRatingCube(const float rCube, const int n) { return rCube * (863.0f - 519.0f / (float) n); } /* * Calculate an estimated rating based Kees van den Doels work. * (see manual for details) * * absolute rating = R0 + a2(N)*EPM+b(N)*EPC, * where EPM is error rate per move, EPC is the error per cubedecision * and a2(N) = 8798 + 2526/N and b(N) = 863 - 519/N. * */ extern float absoluteFibsRating(const float rChequer, const float rCube, const int n, const float rOffset) { return rOffset - (absoluteFibsRatingChequer(rChequer, n) + absoluteFibsRatingCube(rCube, n)); } extern void getMWCFromError(const statcontext * psc, float aaaar[3][2][2][2]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) { /* chequer play */ aaaar[CHEQUERPLAY][TOTAL][i][j] = psc->arErrorCheckerplay[i][j]; if (psc->anUnforcedMoves[i]) aaaar[CHEQUERPLAY][PERMOVE][i][j] = aaaar[0][0][i][j] / (float) psc->anUnforcedMoves[i]; else aaaar[CHEQUERPLAY][PERMOVE][i][j] = 0.0f; /* cube decisions */ aaaar[CUBEDECISION][TOTAL][i][j] = psc->arErrorMissedDoubleDP[i][j] + psc->arErrorMissedDoubleTG[i][j] + psc->arErrorWrongDoubleDP[i][j] + psc->arErrorWrongDoubleTG[i][j] + psc->arErrorWrongTake[i][j] + psc->arErrorWrongPass[i][j]; if (psc->anCloseCube[i]) aaaar[CUBEDECISION][PERMOVE][i][j] = aaaar[CUBEDECISION][TOTAL][i][j] / (float) psc->anCloseCube[i]; else aaaar[CUBEDECISION][PERMOVE][i][j] = 0.0f; /* sum chequer play and cube decisions */ /* FIXME: what average should be used? */ aaaar[COMBINED][TOTAL][i][j] = aaaar[CHEQUERPLAY][TOTAL][i][j] + aaaar[CUBEDECISION][TOTAL][i][j]; if (psc->anUnforcedMoves[i] + psc->anCloseCube[i]) aaaar[COMBINED][PERMOVE][i][j] = aaaar[COMBINED][TOTAL][i][j] / (float) (psc->anUnforcedMoves[i] + psc->anCloseCube[i]); else aaaar[COMBINED][PERMOVE][i][j] = 0.0f; } } #define DSCFORMAT "%-40s %-23s %-23s\n" extern void DumpStatcontext(char *szOutput, const statcontext * psc, const char *player, const char *op, int nMatchTo) { /* header */ sprintf(szOutput, DSCFORMAT, _("Player"), player, op); strcat(szOutput, "\n"); if (psc->fMoves) { GList *list = formatGS(psc, nMatchTo, FORMATGS_CHEQUER); GList *pl; strcat(szOutput, _("Chequerplay statistics")); strcat(szOutput, "\n\n"); for (pl = g_list_first(list); pl; pl = g_list_next(pl)) { char **asz = pl->data; sprintf(strchr(szOutput, 0), DSCFORMAT, asz[0], asz[1], asz[2]); } strcat(szOutput, "\n\n"); freeGS(list); } if (psc->fDice) { GList *list = formatGS(psc, nMatchTo, FORMATGS_LUCK); GList *pl; strcat(szOutput, _("Luck statistics")); strcat(szOutput, "\n\n"); for (pl = g_list_first(list); pl; pl = g_list_next(pl)) { char **asz = pl->data; sprintf(strchr(szOutput, 0), DSCFORMAT, asz[0], asz[1], asz[2]); } strcat(szOutput, "\n\n"); freeGS(list); } if (psc->fCube) { GList *list = formatGS(psc, nMatchTo, FORMATGS_CUBE); GList *pl; strcat(szOutput, _("Cube statistics")); strcat(szOutput, "\n\n"); for (pl = g_list_first(list); pl; pl = g_list_next(pl)) { char **asz = pl->data; sprintf(strchr(szOutput, 0), DSCFORMAT, asz[0], asz[1], asz[2]); } strcat(szOutput, "\n\n"); freeGS(list); } { GList *list = formatGS(psc, nMatchTo, FORMATGS_OVERALL); GList *pl; strcat(szOutput, _("Overall statistics")); strcat(szOutput, "\n\n"); for (pl = g_list_first(list); pl; pl = g_list_next(pl)) { char **asz = pl->data; sprintf(strchr(szOutput, 0), DSCFORMAT, asz[0], asz[1], asz[2]); } strcat(szOutput, "\n\n"); freeGS(list); } } extern void CommandShowStatisticsMatch(char *UNUSED(sz)) { char szOutput[STATCONTEXT_MAXSIZE]; updateStatisticsMatch(&lMatch); #if defined(USE_GTK) if (fX) { GTKDumpStatcontext(0); return; } #endif DumpStatcontext(szOutput, &scMatch, ap[0].szName, ap[1].szName, ms.nMatchTo); outputl(szOutput); } extern void CommandShowStatisticsSession(char *sz) { CommandShowStatisticsMatch(sz); } extern void CommandShowStatisticsGame(char *UNUSED(sz)) { moverecord *pmr; char szOutput[STATCONTEXT_MAXSIZE]; if (!CheckGameExists()) return; updateStatisticsGame(plGame); pmr = plGame->plNext->p; g_assert(pmr->mt == MOVE_GAMEINFO); #if defined(USE_GTK) if (fX) { GTKDumpStatcontext(getGameNumber(plGame) + 1); return; } #endif DumpStatcontext(szOutput, &pmr->g.sc, ap[0].szName, ap[1].szName, ms.nMatchTo); outputl(szOutput); } extern void CommandAnalyseMove(char *UNUSED(sz)) { if (!CheckGameExists()) return; if (plLastMove && plLastMove->plNext && plLastMove->plNext->p) { /* analyse move */ moveData md; matchstate msx; md.pmr = plLastMove->plNext->p; if (md.pmr->mt == MOVE_TAKE) { outputerrf("%s", _("Please use 'analyse move' on the double decision")); return; } memcpy(&msx, &ms, sizeof(matchstate)); md.pms = &msx; md.pesChequer = &esAnalysisChequer; md.pesCube = &esAnalysisCube; md.aamf = aamfAnalysis; RunAsyncProcess((AsyncFun) asyncAnalyzeMove, &md, _("Analysing move...")); #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif } else outputerrf("%s", _("Please use `hint' on unfinished moves")); } static void updateStatisticsMove(const moverecord * pmr, matchstate * pms, const listOLD * plGame, statcontext * psc) { FixMatchState(pms, pmr); switch (pmr->mt) { case MOVE_GAMEINFO: IniStatcontext(psc); updateStatcontext(psc, pmr, pms, plGame); break; case MOVE_NORMAL: if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } updateStatcontext(psc, pmr, pms, plGame); break; case MOVE_DOUBLE: if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } updateStatcontext(psc, pmr, pms, plGame); break; case MOVE_TAKE: case MOVE_DROP: updateStatcontext(psc, pmr, pms, plGame); break; default: break; } ApplyMoveRecord(pms, plGame, pmr); psc->fMoves = fAnalyseMove; psc->fCube = fAnalyseCube; psc->fDice = fAnalyseDice; } extern void updateStatisticsGame(const listOLD * plGame) { listOLD *pl; moverecord *pmrx = plGame->plNext->p; matchstate msAnalyse; g_assert(pmrx->mt == MOVE_GAMEINFO); for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) { moverecord *pmr = pl->p; updateStatisticsMove(pmr, &msAnalyse, plGame, &pmrx->g.sc); } } extern void updateStatisticsMatch(listOLD * plMatch) { listOLD *pl; moverecord *pmr; if (ListEmpty(plMatch)) /* no match in progress */ return; IniStatcontext(&scMatch); for (pl = plMatch->plNext; pl != plMatch; pl = pl->plNext) { updateStatisticsGame(pl->p); pmr = ((listOLD *) pl->p)->plNext->p; g_assert(pmr->mt == MOVE_GAMEINFO); AddStatcontext(&pmr->g.sc, &scMatch); } } extern lucktype getLuckRating(float rLuck) { return Luck(rLuck * 10); } static void AnalyseClearMove(moverecord * pmr) { if (!pmr) return; switch (pmr->mt) { case MOVE_GAMEINFO: IniStatcontext(&pmr->g.sc); break; case MOVE_NORMAL: pmr->CubeDecPtr->esDouble.et = pmr->esChequer.et = EVAL_NONE; pmr->n.stMove = pmr->stCube = SKILL_NONE; pmr->rLuck = ERR_VAL; pmr->lt = LUCK_NONE; if (pmr->ml.amMoves) { g_free(pmr->ml.amMoves); pmr->ml.amMoves = NULL; } pmr->ml.cMoves = 0; break; case MOVE_DOUBLE: case MOVE_TAKE: case MOVE_DROP: pmr->CubeDecPtr->esDouble.et = EVAL_NONE; pmr->stCube = SKILL_NONE; break; case MOVE_RESIGN: pmr->r.esResign.et = EVAL_NONE; pmr->r.stResign = pmr->r.stAccept = SKILL_NONE; break; case MOVE_SETDICE: pmr->lt = LUCK_NONE; pmr->rLuck = ERR_VAL; break; default: /* no-op */ break; } } static void AnalyseClearGame(listOLD * plGame) { listOLD *pl; if (!plGame || ListEmpty(plGame)) return; for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) AnalyseClearMove(pl->p); } extern void CommandAnalyseClearMove(char *UNUSED(sz)) { if (plLastMove && plLastMove->plNext && plLastMove->plNext->p) { AnalyseClearMove(plLastMove->plNext->p); #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif } else outputl(_("Cannot clear analysis on this move")); } extern void CommandAnalyseClearGame(char *UNUSED(sz)) { if (!CheckGameExists()) return; AnalyseClearGame(plGame); #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif } extern void CommandAnalyseClearMatch(char *UNUSED(sz)) { listOLD *pl; if (!CheckGameExists()) return; for (pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext) AnalyseClearGame(pl->p); #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif } static int MoveAnalysed(moverecord * pmr, matchstate * pms, listOLD * plGame, evalsetup * UNUSED(pesChequer), evalsetup * pesCube, movefilter UNUSED(aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES])) { static TanBoard anBoardMove; static positionkey key; static cubeinfo ci; static evalsetup esDouble; /* shared between the * double and subsequent take/drop */ doubletype dt; taketype tt; const xmovegameinfo *pmgi = &((moverecord *) plGame->plNext->p)->g; int is_initial_position = 1; /* analyze this move */ FixMatchState(pms, pmr); /* check if it's the initial position: no cube analysis and special * luck analysis */ if (pmr->mt != MOVE_GAMEINFO) { InitBoard(anBoardMove, pms->bgv); is_initial_position = !memcmp(anBoardMove, pms->anBoard, 2 * 25 * sizeof(int)); } switch (pmr->mt) { case MOVE_GAMEINFO: break; case MOVE_NORMAL: if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } GetMatchStateCubeInfo(&ci, pms); /* cube action? */ if (!is_initial_position && pmgi->fCubeUse && GetDPEq(NULL, NULL, &ci)) { if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return FALSE; } /* luck analysis */ if (pmr->rLuck == ERR_VAL) return FALSE; /* evaluate move */ memcpy(anBoardMove, pms->anBoard, sizeof(anBoardMove)); ApplyMove(anBoardMove, pmr->n.anMove, FALSE); PositionKey((ConstTanBoard) anBoardMove, &key); if (pmr->esChequer.et == EVAL_NONE && pmr->n.iMove != UINT_MAX) return FALSE; break; case MOVE_DOUBLE: /* always analyse MOVE_DOUBLEs as they are shared with the subsequent * MOVE_TAKEs or MOVE_DROPs. */ dt = DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (dt != DT_NORMAL) break; /* cube action */ if (pmgi->fCubeUse) { GetMatchStateCubeInfo(&ci, pms); if (GetDPEq(NULL, NULL, &ci) || ci.fCubeOwner < 0 || ci.fCubeOwner == ci.fMove) { if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return FALSE; } } break; case MOVE_TAKE: tt = (taketype) DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (tt > TT_NORMAL) break; if (fAnalyseCube && pmgi->fCubeUse && esDouble.et != EVAL_NONE) { GetMatchStateCubeInfo(&ci, pms); if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return FALSE; } break; case MOVE_DROP: tt = (taketype) DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); if (tt > TT_NORMAL) break; if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return FALSE; break; case MOVE_RESIGN: /* swap board if player not on roll resigned */ if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } if (pesCube->et != EVAL_NONE) { float rBefore, rAfter; GetMatchStateCubeInfo(&ci, pms); getResignEquities(pmr->r.arResign, &ci, pmr->r.nResigned, &rBefore, &rAfter); pmr->r.esResign = *pesCube; pmr->r.stResign = pmr->r.stAccept = SKILL_NONE; if (rAfter < rBefore) { /* wrong resign */ pmr->r.stResign = Skill(rAfter - rBefore); pmr->r.stAccept = SKILL_NONE; } if (rBefore < rAfter) { /* wrong accept */ pmr->r.stAccept = Skill(rBefore - rAfter); pmr->r.stResign = SKILL_NONE; } } break; case MOVE_SETDICE: if (pmr->fPlayer != pms->fMove) { SwapSides(pms->anBoard); pms->fMove = pmr->fPlayer; } if (!afAnalysePlayers[pmr->fPlayer]) /* we do not analyse this player */ break; GetMatchStateCubeInfo(&ci, pms); break; case MOVE_SETBOARD: case MOVE_SETCUBEVAL: case MOVE_SETCUBEPOS: break; default: g_assert_not_reached(); } ApplyMoveRecord(pms, plGame, pmr); return TRUE; } static int GameAnalysed(listOLD * plGame) { listOLD *pl; matchstate msAnalyse; #if !defined(G_DISABLE_ASSERT) moverecord *pmrx = (moverecord *) plGame->plNext->p; g_assert(pmrx->mt == MOVE_GAMEINFO); #endif for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) { if (!MoveAnalysed(pl->p, &msAnalyse, plGame, &esAnalysisChequer, &esAnalysisCube, aamfAnalysis)) return FALSE; } return TRUE; } extern int MatchAnalysed(void) { listOLD *pl; for (pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext) { if (!GameAnalysed(pl->p)) return FALSE; } return TRUE; } static void cmark_cube_show(GString * gsz, const matchstate * UNUSED(pms), const moverecord * pmr, int movenr) { g_return_if_fail(pmr); g_return_if_fail(pmr->mt == MOVE_NORMAL || pmr->mt == MOVE_DOUBLE || pmr->mt == MOVE_TAKE || pmr->mt == MOVE_DROP); g_return_if_fail(pmr->CubeDecPtr); if (pmr->CubeDecPtr->cmark) g_string_append_printf(gsz, _("Move %d\nCube marked\n"), movenr); } static void cmark_cube_set(moverecord * pmr, CMark cmark) { g_return_if_fail(pmr); g_return_if_fail(pmr->mt == MOVE_NORMAL || pmr->mt == MOVE_DOUBLE || pmr->mt == MOVE_TAKE || pmr->mt == MOVE_DROP); g_return_if_fail(pmr->CubeDecPtr); pmr->CubeDecPtr->cmark = cmark; } static void cmark_move_show(GString * gsz, const matchstate * UNUSED(pms), const moverecord * pmr, int movenr) { guint i; gchar sz[FORMATEDMOVESIZE]; int found = 0; g_return_if_fail(pmr); g_return_if_fail(gsz); for (i = 0; i < pmr->ml.cMoves; i++) { if (pmr->ml.amMoves[i].cmark) { if (!found++) g_string_append_printf(gsz, _("Move %d\n"), movenr); FormatMove(sz, msBoard(), pmr->ml.amMoves[i].anMove); g_string_append_printf(gsz, _("%u (%s) marked\n"), i + 1, sz); } } } static void cmark_game_show(GString * gsz, listOLD * game, int game_number) { listOLD *pl, *pl_hint = NULL; matchstate ms_local; moverecord *pmr; int movenr = 1; g_return_if_fail(gsz); g_return_if_fail(game); if (game_is_last(game)) pl_hint = game_add_pmr_hint(game); g_string_append_printf(gsz, _("Game %d\n"), game_number); for (pl = game->plNext; pl != game; pl = pl->plNext) { pmr = pl->p; FixMatchState(&ms_local, pmr); switch (pmr->mt) { case MOVE_GAMEINFO: ApplyMoveRecord(&ms_local, game, pmr); break; case MOVE_NORMAL: if (pmr->fPlayer != ms_local.fMove) SwapSides(ms_local.anBoard); ms_local.fTurn = ms_local.fMove = pmr->fPlayer; cmark_cube_show(gsz, &ms_local, pmr, movenr); ms_local.anDice[0] = pmr->anDice[0]; ms_local.anDice[1] = pmr->anDice[1]; cmark_move_show(gsz, &ms_local, pmr, movenr); movenr++; ApplyMoveRecord(&ms_local, game, pmr); break; case MOVE_DOUBLE: cmark_cube_show(gsz, &ms_local, pmr, movenr); movenr++; ApplyMoveRecord(&ms_local, game, pmr); break; case MOVE_TAKE: case MOVE_DROP: movenr++; ApplyMoveRecord(&ms_local, game, pmr); break; default: ApplyMoveRecord(&ms_local, game, pmr); break; } } if (pl_hint) game_remove_pmr_hint(pl_hint); } static void cmark_match_show(GString * gsz, const listOLD * match) { listOLD *pl; int game_number = 1; for (pl = match->plNext; pl != match; pl = pl->plNext) { cmark_game_show(gsz, pl->p, game_number++); } } static void cmark_move_set(moverecord * pmr, gchar * sz, CMark cmark) { gint c; gint n; GSList *list = NULL, *pl = NULL; g_return_if_fail(sz); g_return_if_fail(pmr); g_return_if_fail(pmr->ml.cMoves); c = pmr->ml.cMoves; while ((n = (int) g_ascii_strtoll(sz, &sz, 10)) != 0) { if (n > c) { outputerrf(_("Only %d legal moves, cannot mark move %d\n"), c, n); g_slist_free(list); return; } if (!g_slist_find(list, GINT_TO_POINTER(n))) list = g_slist_append(list, GINT_TO_POINTER(n)); } if (g_slist_length(list) == 0) { outputerrf(_("Not a valid list of moves\n")); return; } for (pl = list; pl; pl = g_slist_next(pl)) { gint i = GPOINTER_TO_INT(pl->data) - 1; pmr->ml.amMoves[i].cmark = cmark; } g_slist_free(list); } static void cmark_move_clear(moverecord * pmr) { guint j; g_return_if_fail(pmr); for (j = 0; j < pmr->ml.cMoves; j++) pmr->ml.amMoves[j].cmark = CMARK_NONE; } static void cmark_game_clear(listOLD * game) { listOLD *pl, *pl_hint = NULL; g_return_if_fail(game); if (game_is_last(game)) pl_hint = game_add_pmr_hint(game); for (pl = game->plNext; pl != game; pl = pl->plNext) { moverecord *pmr = pl->p; if (!pmr) continue; switch (pmr->mt) { case MOVE_NORMAL: cmark_move_clear(pmr); cmark_cube_set(pmr, CMARK_NONE); break; case MOVE_DOUBLE: cmark_cube_set(pmr, CMARK_NONE); break; default: break; } } if (pl_hint) game_remove_pmr_hint(pl_hint); } static void cmark_match_clear(listOLD * match) { listOLD *pl; for (pl = match->plNext; pl != match; pl = pl->plNext) { cmark_game_clear(pl->p); } } static int cmark_move_rollout(moverecord * pmr, gboolean destroy) { gchar(*asz)[FORMATEDMOVESIZE]; cubeinfo ci; cubeinfo **ppci; GSList *pl = NULL; gint c; guint j; gint res; move **ppm; void *p; GSList *list = NULL; positionkey key = { {0, 0, 0, 0, 0, 0, 0} }; g_return_val_if_fail(pmr, -1); for (j = 0; j < pmr->ml.cMoves; j++) { if (pmr->ml.amMoves[j].cmark == CMARK_ROLLOUT) list = g_slist_append(list, GINT_TO_POINTER(j)); } if ((c = g_slist_length(list)) == 0) { return 0; } ppm = g_new(move *, c); ppci = g_new(cubeinfo *, c); asz = (char (*)[FORMATEDMOVESIZE]) g_malloc(FORMATEDMOVESIZE * c); if (pmr->n.iMove != UINT_MAX) CopyKey(pmr->ml.amMoves[pmr->n.iMove].key, key); GetMatchStateCubeInfo(&ci, &ms); for (pl = list, j = 0; pl; pl = g_slist_next(pl), j++) { gint i = GPOINTER_TO_INT(pl->data); move *m = ppm[j] = &pmr->ml.amMoves[i]; ppci[j] = &ci; FormatMove(asz[j], msBoard(), m->anMove); } RolloutProgressStart(&ci, c, NULL, &rcRollout, asz, TRUE, &p); ScoreMoveRollout(ppm, ppci, c, RolloutProgress, p); res = RolloutProgressEnd(&p, destroy); g_free(asz); g_free(ppm); g_free(ppci); RefreshMoveList(&pmr->ml, NULL); if (pmr->n.iMove != UINT_MAX) for (pmr->n.iMove = 0; pmr->n.iMove < pmr->ml.cMoves; pmr->n.iMove++) if (EqualKeys(key, pmr->ml.amMoves[pmr->n.iMove].key)) { pmr->n.stMove = Skill(pmr->ml.amMoves[pmr->n.iMove].rScore - pmr->ml.amMoves[0].rScore); break; } #if defined(USE_GTK) if (fX) ChangeGame(NULL); else #endif ShowBoard(); return res == 0 ? c : res; } static evalsetup * setup_cube_rollout(evalsetup * pes, moverecord * pmr, float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS]) { if (pes->et != EVAL_ROLLOUT) { pes->rc = rcRollout; pes->rc.nGamesDone = 0; } else { pes->rc.nTrials = rcRollout.nTrials; pes->rc.fStopOnSTD = rcRollout.fStopOnSTD; pes->rc.nMinimumGames = rcRollout.nMinimumGames; pes->rc.rStdLimit = rcRollout.rStdLimit; memcpy(aarOutput, pmr->CubeDecPtr->aarOutput, 2 * NUM_ROLLOUT_OUTPUTS * sizeof(float)); memcpy(aarStdDev, pmr->CubeDecPtr->aarStdDev, 2 * NUM_ROLLOUT_OUTPUTS * sizeof(float)); } return pes; } static int cmark_cube_rollout(moverecord * pmr, gboolean destroy) { evalsetup *pes; cubeinfo ci; float aarOutput[2][NUM_ROLLOUT_OUTPUTS]; float aarStdDev[2][NUM_ROLLOUT_OUTPUTS]; rolloutstat aarsStatistics[2][2]; gchar asz[2][FORMATEDMOVESIZE]; void *p; int res; if (!pmr->CubeDecPtr || pmr->CubeDecPtr->cmark != CMARK_ROLLOUT) return 0; pes = setup_cube_rollout(&pmr->CubeDecPtr->esDouble, pmr, aarOutput, aarStdDev); GetMatchStateCubeInfo(&ci, &ms); FormatCubePositions(&ci, asz); RolloutProgressStart(&ci, 2, aarsStatistics, &pes->rc, asz, TRUE, &p); GeneralCubeDecisionR(aarOutput, aarStdDev, aarsStatistics, (ConstTanBoard) msBoard(), &ci, &pes->rc, pes, RolloutProgress, p); res = RolloutProgressEnd(&p, destroy); memcpy(pmr->CubeDecPtr->aarOutput, aarOutput, 2 * NUM_ROLLOUT_OUTPUTS * sizeof(float)); memcpy(pmr->CubeDecPtr->aarStdDev, aarStdDev, 2 * NUM_ROLLOUT_OUTPUTS * sizeof(float)); if (pes->et != EVAL_ROLLOUT) memcpy(&pmr->CubeDecPtr->esDouble.rc, &rcRollout, sizeof(rcRollout)); pmr->CubeDecPtr->esDouble.et = EVAL_ROLLOUT; #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif ShowBoard(); return res; } static int move_change(listOLD * new_game, const listOLD * new_move) { g_return_val_if_fail(new_game, FALSE); g_return_val_if_fail(new_move, FALSE); if (plGame != new_game) ChangeGame(new_game); if (plLastMove == new_move) return 1; while (plLastMove->plNext->p && plLastMove != new_move) { plLastMove = plLastMove->plNext; FixMatchState(&ms, plLastMove->p); ApplyMoveRecord(&ms, plGame, plLastMove->p); } UpdateGame(FALSE); if (plLastMove->plNext && plLastMove->plNext->p) FixMatchState(&ms, plLastMove->plNext->p); SetMoveRecord(plLastMove->p); return (plLastMove == new_move); } static int cmark_game_rollout(listOLD * game) { listOLD *pl, *pl_hint = NULL; g_return_val_if_fail(game, -1); if (game_is_last(game)) pl_hint = game_add_pmr_hint(game); ChangeGame(game); for (pl = game->plNext; pl != game; pl = pl->plNext) { moverecord *pmr_prev; moverecord *pmr = pl->p; if (!pmr) continue; switch (pmr->mt) { case MOVE_NORMAL: if (!move_change(game, pl->plPrev)) goto finished; if (cmark_move_rollout(pmr, TRUE) < -1) goto finished; if (cmark_cube_rollout(pmr, TRUE) < -1) goto finished; break; case MOVE_DOUBLE: pmr_prev = game->plPrev->p; if (pmr_prev->mt == MOVE_DOUBLE) break; if (!move_change(game, pl->plPrev)) goto finished; if (cmark_cube_rollout(pmr, TRUE) < -1) goto finished; break; default: break; } } if (pl_hint) game_remove_pmr_hint(pl_hint); return 0; finished: if (pl_hint) game_remove_pmr_hint(pl_hint); return -1; } static void cmark_match_rollout(listOLD * match) { listOLD *pl; for (pl = match->plNext; pl != match; pl = pl->plNext) { if (cmark_game_rollout(pl->p) < 0) break; } } static gint check_cube_in_pmr(const moverecord * pmr) { if (!pmr) { outputerrf(_("No moverecord stored for this cube.")); return 0; } if (pmr->mt != MOVE_NORMAL && pmr->mt != MOVE_DOUBLE && pmr->mt != MOVE_TAKE && pmr->mt != MOVE_DROP) { outputerrf(_("This move doesn't imply a cube action. Cannot mark.")); return 0; } return 1; } static guint check_cmoves_in_pmr(const moverecord * pmr) { guint c; if (!pmr) { outputerrf(_("No moverecord stored for this move.")); return 0; } if (pmr->mt != MOVE_NORMAL) { outputerrf(_("This is not a normal chequer move. " "Cannot mark.")); return 0; } if ((c = pmr->ml.cMoves) == 0) { outputerrf(_("No moves to analyse")); return 0; } return c; } extern void CommandCMarkCubeShow(char *UNUSED(sz)) { GString *gsz; moverecord *pmr = get_current_moverecord(NULL); if (!check_cube_in_pmr(pmr)) return; gsz = g_string_new(NULL); cmark_cube_show(gsz, &ms, pmr, getMoveNumber(plGame, pmr)); outputf("%s", gsz->str); g_string_free(gsz, TRUE); } extern void CommandCMarkCubeSetNone(char *UNUSED(sz)) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cube_in_pmr(pmr)) return; cmark_cube_set(pmr, CMARK_NONE); } extern void CommandCMarkCubeSetRollout(char *UNUSED(sz)) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cube_in_pmr(pmr)) return; cmark_cube_set(pmr, CMARK_ROLLOUT); } extern void CommandCMarkMoveClear(char *UNUSED(sz)) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cmoves_in_pmr(pmr)) return; cmark_move_clear(pmr); } extern void CommandCMarkGameClear(char *UNUSED(sz)) { if (!CheckGameExists()) return; cmark_game_clear(plGame); } extern void CommandCMarkMatchClear(char *UNUSED(sz)) { if (!CheckGameExists()) return; cmark_match_clear(&lMatch); } extern void CommandCMarkMoveSetNone(char *sz) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cmoves_in_pmr(pmr)) return; if (sz && *sz) cmark_move_set(pmr, sz, CMARK_NONE); else outputerrf(_("`cmark move set none' requires a list of moves to set")); } extern void CommandCMarkMoveSetRollout(char *sz) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cmoves_in_pmr(pmr)) return; if (sz && *sz) cmark_move_set(pmr, sz, CMARK_ROLLOUT); else outputerrf(_("`cmark move set rollout' requires a list of moves to set")); } extern void CommandCMarkMoveShow(char *UNUSED(sz)) { GString *gsz; moverecord *pmr = get_current_moverecord(NULL); if (!check_cmoves_in_pmr(pmr)) return; gsz = g_string_new(NULL); cmark_move_show(gsz, &ms, pmr, getMoveNumber(plGame, pmr)); outputf("%s", gsz->str); g_string_free(gsz, TRUE); } extern void CommandCMarkGameShow(char *UNUSED(sz)) { GString *gsz; if (!CheckGameExists()) return; gsz = g_string_new(NULL); cmark_game_show(gsz, plGame, getGameNumber(plGame)); outputf("%s", gsz->str); g_string_free(gsz, TRUE); } extern void CommandCMarkMatchShow(char *UNUSED(sz)) { GString *gsz; if (!CheckGameExists()) return; if ((gsz = g_string_new(NULL))) { cmark_match_show(gsz, &lMatch); outputf("%s", gsz->str); g_string_free(gsz, TRUE); } else g_assert_not_reached(); } extern void CommandAnalyseRolloutCube(char *UNUSED(sz)) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cube_in_pmr(pmr)) return; cmark_cube_set(pmr, CMARK_ROLLOUT); cmark_cube_rollout(pmr, FALSE); cmark_cube_set(pmr, CMARK_NONE); } extern void CommandAnalyseRolloutMove(char *sz) { moverecord *pmr = get_current_moverecord(NULL); if (!check_cmoves_in_pmr(pmr)) return; if (sz && *sz) cmark_move_set(pmr, sz, CMARK_ROLLOUT); if (cmark_move_rollout(pmr, FALSE) == 0) { outputerrf(_("No moves marked for rollout")); outputerrf("\n"); return; } cmark_move_clear(pmr); } extern void CommandAnalyseRolloutGame(char *UNUSED(sz)) { if (!CheckGameExists()) return; cmark_game_rollout(plGame); } extern void CommandAnalyseRolloutMatch(char *UNUSED(sz)) { if (!CheckGameExists()) return; cmark_match_rollout(&lMatch); } gnubg-1.08.003/pylocdefs.h000644 001751 000024 00000003254 14574155047 015001 0ustar00pmstaff000000 000000 /* * Copyright (C) 2014-2015 Michael Petch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: pylocdefs.h,v 1.9 2019/12/16 21:46:23 plm Exp $ */ #ifndef PYLOCDEFS_H #define PYLOCDEFS_H #include "config.h" #if defined(USE_PYTHON) #if PY_MAJOR_VERSION >= 3 #define MOD_ERROR_VAL NULL #define MOD_SUCCESS_VAL(val) val #define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) #define MOD_DEF(ob, name, doc, methods) \ static struct PyModuleDef moduledef = { \ PyModuleDef_HEAD_INIT, name, doc, -1, methods, \ NULL, NULL, NULL, NULL, }; \ ob = PyModule_Create(&moduledef) #else #define MOD_ERROR_VAL #define MOD_SUCCESS_VAL(val) #define MOD_INIT(name) void init##name(void) #define MOD_DEF(ob, name, doc, methods) \ ob = Py_InitModule3(name, methods, doc) #endif #if PY_MAJOR_VERSION >= 3 #define PyInt_Check PyLong_Check #define PyInt_AsLong PyLong_AsLong #define PyInt_FromLong PyLong_FromLong #define PyExc_StandardError PyExc_Exception #endif #endif /* USE_PYTHON */ #endif gnubg-1.08.003/ltmain.sh000644 001751 000024 00001212353 14600637117 014454 0ustar00pmstaff000000 000000 #! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 # libtool (GNU libtool) 2.4.7 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.7 package_revision=2.4.7 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2004-2019, 2021 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # These NLS vars are set unconditionally (bootstrap issue #24). Unset those # in case the environment reset is needed later and the $save_* variant is not # defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # func_unset VAR # -------------- # Portably unset VAR. # In some shells, an 'unset VAR' statement leaves a non-zero return # status if VAR is already unset, which might be problematic if the # statement is used at the end of a function (thus poisoning its return # value) or when 'set -e' is active (causing even a spurious abort of # the script in this case). func_unset () { { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } } # Make sure CDPATH doesn't cause `cd` commands to output the target dir. func_unset CDPATH # Make sure ${,E,F}GREP behave sanely. func_unset GREP_OPTIONS ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" # require_check_ifs_backslash # --------------------------- # Check if we can use backslash as IFS='\' separator, and set # $check_ifs_backshlash_broken to ':' or 'false'. require_check_ifs_backslash=func_require_check_ifs_backslash func_require_check_ifs_backslash () { _G_save_IFS=$IFS IFS='\' _G_check_ifs_backshlash='a\\b' for _G_i in $_G_check_ifs_backshlash do case $_G_i in a) check_ifs_backshlash_broken=false ;; '') break ;; *) check_ifs_backshlash_broken=: break ;; esac done IFS=$_G_save_IFS require_check_ifs_backslash=: } ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1=\$$1\\ \$func_quote_arg_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_portable EVAL ARG # ---------------------------- # Internal function to portably implement func_quote_arg. Note that we still # keep attention to performance here so we as much as possible try to avoid # calling sed binary (so far O(N) complexity as long as func_append is O(1)). func_quote_portable () { $debug_cmd $require_check_ifs_backslash func_quote_portable_result=$2 # one-time-loop (easy break) while true do if $1; then func_quote_portable_result=`$ECHO "$2" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` break fi # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string # contains the shell wildcard characters. case $check_ifs_backshlash_broken$func_quote_portable_result in :*|*[\[\*\?]*) func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ | $SED "$sed_quote_subst"` break ;; esac func_quote_portable_old_IFS=$IFS for _G_char in '\' '`' '"' '$' do # STATE($1) PREV($2) SEPARATOR($3) set start "" "" func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy IFS=$_G_char for _G_part in $func_quote_portable_result do case $1 in quote) func_append func_quote_portable_result "$3$2" set quote "$_G_part" "\\$_G_char" ;; start) set first "" "" func_quote_portable_result= ;; first) set quote "$_G_part" "" ;; esac done done IFS=$func_quote_portable_old_IFS ;; *) ;; esac break done func_quote_portable_unquoted_result=$func_quote_portable_result case $func_quote_portable_result in # double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # many bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_portable_result=\"$func_quote_portable_result\" ;; esac } # func_quotefast_eval ARG # ----------------------- # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then printf -v _GL_test_printf_tilde %q '~' if test '\~' = "$_GL_test_printf_tilde"; then func_quotefast_eval () { printf -v func_quotefast_eval_result %q "$1" } else # Broken older Bash implementations. Make those faster too if possible. func_quotefast_eval () { case $1 in '~'*) func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result ;; *) printf -v func_quotefast_eval_result %q "$1" ;; esac } fi else func_quotefast_eval () { func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result } fi # func_quote_arg MODEs ARG # ------------------------ # Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result # double-quoted (when needed), suitable for a subsequent eval # ii) func_quote_arg_unquoted_result # has all characters that are still active within double # quotes backslashified. Available only if 'unquoted' is specified. # # Available modes: # ---------------- # 'eval' (default) # - escape shell special characters # 'expand' # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might # be used later in func_quote to get output like: 'echo "a b"' instead # of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. # # Examples for 'func_quote_arg pretty,unquoted string': # # string | *_result | *_unquoted_result # ------------+-----------------------+------------------- # " | \" | \" # a b | "a b" | a b # "a b" | "\"a b\"" | \"a b\" # * | "*" | * # z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" # # Examples for 'func_quote_arg pretty,unquoted,expand string': # # string | *_result | *_unquoted_result # --------------+---------------------+-------------------- # z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" func_quote_arg () { _G_quote_expand=false case ,$1, in *,expand,*) _G_quote_expand=: ;; esac case ,$1, in *,pretty,*|*,expand,*|*,unquoted,*) func_quote_portable $_G_quote_expand "$2" func_quote_arg_result=$func_quote_portable_result func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) # Faster quote-for-eval for some shells. func_quotefast_eval "$2" func_quote_arg_result=$func_quotefast_eval_result ;; esac } # func_quote MODEs ARGs... # ------------------------ # Quote all ARGs to be evaled later and join them into single command. See # func_quote_arg's description for more info. func_quote () { $debug_cmd _G_func_quote_mode=$1 ; shift func_quote_result= while test 0 -lt $#; do func_quote_arg "$_G_func_quote_mode" "$1" if test -n "$func_quote_result"; then func_append func_quote_result " $func_quote_arg_result" else func_append func_quote_result "$func_quote_arg_result" fi shift done } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_arg pretty,expand "$_G_cmd" eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_arg expand,pretty "$_G_cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2010-2019, 2021 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # # Set a version string for this script. scriptversion=2019-02-19.15; # UTC ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # in the main code. A hook is just a list of function names that can be # run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of hook functions to be called by # FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_propagate_result FUNC_NAME_A FUNC_NAME_B # --------------------------------------------- # If the *_result variable of FUNC_NAME_A _is set_, assign its value to # *_result variable of FUNC_NAME_B. func_propagate_result () { $debug_cmd func_propagate_result_result=: if eval "test \"\${${1}_result+set}\" = set" then eval "${2}_result=\$${1}_result" else func_propagate_result_result=false fi } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do func_unset "${_G_hook}_result" eval $_G_hook '${1+"$@"}' func_propagate_result $_G_hook func_run_hooks if $func_propagate_result_result; then eval set dummy "$func_run_hooks_result"; shift fi done } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list from your hook function. You may remove # or edit any options that you action, and then pass back the remaining # unprocessed options in '_result', escaped # suitably for 'eval'. # # The '_result' variable is automatically unset # before your hook gets called; for best performance, only set the # *_result variable when necessary (i.e. don't call the 'func_quote' # function unnecessarily because it can be an expensive operation on some # machines). # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). Leave # # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@" in case we need it later, # # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd func_run_hooks func_options ${1+"$@"} func_propagate_result func_run_hooks func_options_finish } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do func_unset func_${my_func}_result func_unset func_run_hooks_result eval func_$my_func '${1+"$@"}' func_propagate_result func_$my_func func_options if $func_propagate_result_result; then eval set dummy "$func_options_result"; shift _G_options_quoted=: fi done $_G_options_quoted || { # As we (func_options) are top-level options-parser function and # nobody quoted "$@" for us yet, we need to do it explicitly for # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result } } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} func_propagate_result func_run_hooks func_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} func_propagate_result func_run_hooks func_parse_options if $func_propagate_result_result; then eval set dummy "$func_parse_options_result"; shift # Even though we may have changed "$@", we passed the "$@" array # down into the hook and it quoted it for us (because we are in # this if-branch). No need to quote it again. _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break # We expect that one of the options parsed in this function matches # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" >&2 $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_parse_options_requote=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac if $_G_match_parse_options; then _G_parse_options_requote=: fi done if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables # after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} if test "x$func_split_equals_lhs" = "x$1"; then func_split_equals_rhs= fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. # The version message is extracted from the calling file's header # comments, with leading '# ' stripped: # 1. First display the progname and version # 2. Followed by the header comment line matching /^# Written by / # 3. Then a blank line followed by the first following line matching # /^# Copyright / # 4. Immediately followed by any lines between the previous matches, # except lines preceding the intervening completely blank line. # For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /^# Written by /!b s|^# ||; p; n :fwd2blnk /./ { n b fwd2blnk } p; n :holdwrnt s|^# || s|^# *$|| /^Copyright /!{ /./H n b holdwrnt } s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| G s|\(\n\)\n*|\1|g p; q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.7' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname (GNU libtool) 2.4.7 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote eval ${1+"$@"} libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_arg pretty "$libobj" test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_arg pretty "$srcfile" qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wa,FLAG -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_arg pretty "$nonopt" install_prog="$func_quote_arg_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_arg pretty "$arg" func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_arg pretty "$arg" func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then func_quote_arg pretty "$arg2" fi func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_arg pretty "$install_override_mode" func_append install_shared_prog " -m $func_quote_arg_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_arg expand,pretty "$relink_command" eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" func_quote_arg pretty "$ECHO" qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_arg pretty,unquoted "$arg" qarg=$func_quote_arg_unquoted_result func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xassembler) func_append compiler_flags " -Xassembler $qarg" prev= func_append compile_command " -Xassembler $qarg" func_append finalize_command " -Xassembler $qarg" continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. -pthread) case $host in *solaris2*) ;; *) case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac ;; esac continue ;; -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $func_quote_arg_result" func_append compiler_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $wl$func_quote_arg_result" func_append compiler_flags " $wl$func_quote_arg_result" func_append linker_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xassembler) prev=xassembler continue ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC # -Wa,* Pass flags directly to the assembler -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*|-fuse-ld=*|-Wa,*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_arg pretty "$arg" arg=$func_quote_arg_result fi ;; # Some other compiler flag. -* | +*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf | midnightbsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty "$var_value" relink_command="$var=$func_quote_arg_result; export $var; $relink_command" fi done func_quote eval cd "`pwd`" func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" relink_command=$func_quote_arg_unquoted_result fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty,unquoted "$var_value" relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" fi done # Quote the link command for shipping. func_quote eval cd "`pwd`" relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" func_quote_arg pretty,unquoted "$relink_command" relink_command=$func_quote_arg_unquoted_result if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: gnubg-1.08.003/matchequity.h000644 001751 000024 00000007363 14575642432 015353 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2003 Joern Thyssen * Copyright (C) 2000-2013 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: matchequity.h,v 1.31 2020/07/15 20:45:47 plm Exp $ */ #ifndef MATCHEQUITY_H #define MATCHEQUITY_H #include "eval.h" #define MAXSCORE 64 #define MAXCUBELEVEL 7 /* Structure for information about match equity table */ typedef struct { gchar *szName; /* Name of match equity table */ gchar *szFileName; /* File name of MET */ gchar *szDescription; /* Description of MET */ int nLength; /* Native length of MET or -1 if pure calculated table */ } metinfo; /* macros for getting match equities */ #define GET_MET(i,j,aafMET) ( ( (i) < 0 ) ? 1.0f : ( ( (j) < 0 ) ? 0.0f : \ (aafMET [ i ][ j ]) ) ) #define GET_METPostCrawford(i,afBtilde) ( (i) < 0 ? 1.0f : afBtilde [ i ] ) /* current match equity table used by gnubg */ extern float aafMET[MAXSCORE][MAXSCORE]; extern float aafMETPostCrawford[2][MAXSCORE]; /* gammon prices (calculated once for efficiency) */ extern float aaaafGammonPrices[MAXCUBELEVEL] [MAXSCORE][MAXSCORE][4]; extern float aaaafGammonPricesPostCrawford[MAXCUBELEVEL] [MAXSCORE][2][4]; extern metinfo miCurrent; extern float getME(const int nScore0, const int nScore1, const int nMatchTo, const int fPlayer, const int nPoints, const int fWhoWins, const int fCrawford, float aafMET[MAXSCORE][MAXSCORE], float aafMETPostCrawford[2][MAXSCORE]); extern float getMEAtScore(const int nScore0, const int nScore1, const int nMatchTo, const int fPlayer, const int fCrawford, float aafMET[MAXSCORE][MAXSCORE], float aafMETPostCrawford[2][MAXSCORE]); /* Initialise match equity table */ void InitMatchEquity(const char *szFileName); /* Get double points */ extern int GetPoints(float arOutput[5], const cubeinfo * pci, float arCP[2]); extern float GetDoublePointDeadCube(float arOutput[5], cubeinfo * pci); extern void invertMET(void); /* enums for the entries in the arrays returned by getMEMultiple * DoublePass, DoubleTakeWin, DoubleTakeWinGammon... for the first 8 * then the same values using CubePrimeValues * DP = Double/Pass, DTWG = double/take/wing gammon, etc * DPP = double/Pass with CubePrime values, etc. */ typedef enum { /* player 0 wins, first cube value */ DP = 0, NDW = 0, DTW = 1, NDWG = 1, NDWB, DTWG, DTWB, /* player 0 loses, first cube value */ NDL, DTL = 6, NDLG = 6, NDLB, DTLG, DTLB, /* player 0 wins, 2nd cube value */ DPP0, DTWP0, NDWBP0, DTWGP0, DTWBP0, /* player 0 loses, 2nd cube value */ NDLP0, DTLP0, NDLBP0, DTLGP0, DTLBP0, /* player 0 wins, 3rd cube value */ DPP1, DTWP1, NDWBP1, DTWGP1, DTWBP1, /* player 0 loses, 3rd cube value */ NDLP1, DTLP1, NDLBP1, DTLGP1, DTLBP1 } met_indices; extern void getMEMultiple(const int nScore0, const int nScore1, const int nMatchTo, const int nCube, const int nCubePrime0, const int nCubePrime1, const int fCrawford, float aafMET[MAXSCORE][MAXSCORE], float aafMETPostCrawford[2][MAXSCORE], float *player0, float *player1); #endif gnubg-1.08.003/gtkgame.c000644 001751 000024 00001176547 14610037046 014431 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2003 Gary Wong * Copyright (C) 2001-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "gnubgmodule.h" #include "gtkuidefs.h" #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_UNISTD_H) #include #endif #if defined(HAVE_LIB_READLINE) #include #include #endif #if defined(WIN32) #include #endif #include "analysis.h" #include "backgammon.h" #include "sgf.h" #include "dice.h" #include "drawboard.h" #include "gtkboard.h" #include "gtkchequer.h" #include "gtkcube.h" #include "gtkgame.h" #include "gtkmet.h" #include "gtkmovefilter.h" #include "gtkprefs.h" #include "gtksplash.h" #include "gtkrelational.h" #include "gtkfile.h" #include "matchequity.h" #include "openurl.h" #include "positionid.h" #include "sound.h" #include "gtkoptions.h" #include "gtktoolbar.h" #include "format.h" #include "formatgs.h" #include "renderprefs.h" #include "credits.h" #include "matchid.h" #include "gtkwindows.h" #include "export.h" #include "gtkmovelistctrl.h" #include "rollout.h" #include "util.h" #include "gtkscoremap.h" #if defined(USE_BOARD3D) #include "inc3d.h" #endif #include "gnubgstock.h" #define KEY_ESCAPE -229 #if defined(USE_BOARD3D) gboolean widget3dValid; #if defined(USE_GTKITEMFACTORY) /* Offset action to avoid predefined values */ #define MENU_OFFSET 50 #endif #endif #if !defined(USE_GTKITEMFACTORY) static void TogglePanel(guint iType, guint iActionID, GtkToggleAction * action, GtkToggleAction * alt, gpointer user_data); static void ToolbarStyle(guint iType, guint iActionID, GtkRadioAction * action, GtkRadioAction * alt, gpointer user_data); #endif static char *newLang; /* Hack this for now to stop re-entering - should be fixed when menu switched to actions */ int inCallback = FALSE; /* Enumeration to be used as index to the table of command strings below * (since GTK will only let us put integers into a GtkItemFactoryEntry, * and that might not be big enough to hold a pointer). Must be kept in * sync with the string array aszCommands! */ typedef enum { CMD_ACCEPT, CMD_ANALYSE_CLEAR_MOVE, CMD_ANALYSE_CLEAR_GAME, CMD_ANALYSE_CLEAR_MATCH, CMD_ANALYSE_MOVE, CMD_ANALYSE_GAME, CMD_ANALYSE_MATCH, CMD_ANALYSE_ROLLOUT_CUBE, CMD_ANALYSE_ROLLOUT_MOVE, CMD_ANALYSE_ROLLOUT_GAME, CMD_ANALYSE_ROLLOUT_MATCH, CMD_CLEAR_TURN, CMD_CMARK_CUBE_CLEAR, CMD_CMARK_CUBE_SHOW, CMD_CMARK_MOVE_CLEAR, CMD_CMARK_MOVE_SHOW, CMD_CMARK_GAME_CLEAR, CMD_CMARK_GAME_SHOW, CMD_CMARK_MATCH_CLEAR, CMD_CMARK_MATCH_SHOW, CMD_END_GAME, CMD_DECLINE, CMD_DOUBLE, CMD_EVAL, CMD_HELP, CMD_HINT, CMD_LIST_GAME, CMD_NEXT, CMD_NEXT_GAME, CMD_NEXT_MARKED, CMD_NEXT_CMARKED, CMD_NEXT_ROLL, CMD_NEXT_ROLLED, CMD_PLAY, CMD_PREV, CMD_PREV_GAME, CMD_PREV_MARKED, CMD_PREV_CMARKED, CMD_PREV_ROLL, CMD_PREV_ROLLED, CMD_QUIT, CMD_REJECT, CMD_RELATIONAL_ADD_MATCH, CMD_ROLL, CMD_ROLLOUT, CMD_SET_ANNOTATION_ON, CMD_SET_APPEARANCE, CMD_SET_MESSAGE_ON, CMD_SET_TURN_0, CMD_SET_TURN_1, CMD_SHOW_CALIBRATION, CMD_SHOW_COPYING, CMD_SHOW_ENGINE, CMD_SHOW_EXPORT, CMD_SHOW_HISTORY, CMD_SHOW_MARKETWINDOW, CMD_SHOW_MATCHEQUITYTABLE, CMD_SHOW_KLEINMAN, CMD_SHOW_MANUAL_ABOUT, CMD_SHOW_MANUAL_WEB, CMD_SHOW_ROLLS, CMD_SHOW_STATISTICS_MATCH, CMD_SHOW_TEMPERATURE_MAP, CMD_SHOW_TEMPERATURE_MAP_CUBE, CMD_SHOW_SCORE_MAP_CUBE, CMD_SHOW_SCORE_MAP_MOVE, CMD_SHOW_VERSION, CMD_SHOW_WARRANTY, CMD_SWAP_PLAYERS, NUM_CMDS, TOGGLE_GAMELIST, TOGGLE_ANALYSIS, TOGGLE_COMMENTARY, TOGGLE_MESSAGE, TOGGLE_THEORY, TOGGLE_COMMAND, VIEW_TOOLBAR_ICONSONLY, VIEW_TOOLBAR_TEXTONLY, VIEW_TOOLBAR_BOTH } gnubgcommand; /* TRUE if GNUbg is automatically setting the state of a menu item. */ static int fAutoCommand; #if !defined(USE_GTKITEMFACTORY) /* * Some of the callback functions below, either explicit or * constructed with macros, are unused (were they added "just in case" ?) * Keep them for reference, but between #if 0 / #endif to avoid * compiler warnings. */ #if 0 static void ExecToggleActionCommand_internal(guint UNUSED(iWidgetType), guint UNUSED(iCommand), gchar *szCommand, gpointer *widget, gpointer *UNUSED(widgetalt), gpointer UNUSED(user_data)) { char sz[80]; if (fAutoCommand) return; sprintf(sz, "%s %s", szCommand, gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget)) ? "on" : "off"); UserCommand(sz); return; } #endif static void ExecRadioActionCommand_internal(guint UNUSED(iWidgetType), guint iCommand, gchar * UNUSED(szCommand), gpointer * widget, gpointer * UNUSED(widgetalt), gpointer UNUSED(user_data)) { char sz[80]; gint actionID; if (fAutoCommand) return; actionID = gtk_radio_action_get_current_value(GTK_RADIO_ACTION(widget)); switch (actionID) { case CMD_SET_TURN_0: case CMD_SET_TURN_1: sprintf(sz, "set turn %s", ap[actionID - iCommand].szName); UserCommand(sz); break; } return; } static void ExecActionCommand_internal(guint UNUSED(iWidgetType), guint iCommand, gchar * szCommand, gpointer * UNUSED(widget), gpointer * UNUSED(widgetalt), gpointer UNUSED(user_data)) { char sz[80]; if (fAutoCommand) return; switch (iCommand) { case CMD_SET_APPEARANCE: BoardPreferences(pwBoard); return; case CMD_SET_TURN_0: case CMD_SET_TURN_1: sprintf(sz, "set turn %s", ap[iCommand - CMD_SET_TURN_0].szName); UserCommand(sz); return; case CMD_ANALYSE_MATCH: UserCommand("analyse match"); if (fAutoDB) { /* add match to db */ CommandRelationalAddMatch(NULL); } UserCommand("show statistics match"); return; default: UserCommand(szCommand); } } #define CREATE_CMD_ACTION_CALLBACK(CMDID, szCommand) \ static void CMDID##_action_cb ( GtkAction *action, gpointer user_data ) \ { \ ExecActionCommand_internal ( 0, CMDID, szCommand, (gpointer)action, NULL, user_data ); \ return; \ } ; #if 0 #define CREATE_CMD_TOGGLE_CALLBACK(CMDID, szCommand) \ static void CMDID##_toggle_cb ( GtkToggleAction *action, gpointer user_data ) \ { \ ExecToggleActionCommand_internal ( 1, CMDID, szCommand, (gpointer)action, NULL, user_data ); \ return; \ } ; #endif #define CREATE_CMD_RADIO_CALLBACK(CMDID, szCommand) \ static void CMDID##_radio_cb ( GtkRadioAction *action, GtkRadioAction *current, gpointer user_data ) \ { \ ExecRadioActionCommand_internal ( 2, CMDID, szCommand, (gpointer)action, (gpointer)current, user_data ); \ return; \ } ; #if 0 #define CREATE_GENERIC_ACTION_CALLBACK(ACTIONID, callbackfunc) \ static void ACTIONID##_action_g_cb ( GtkAction *action, gpointer user_data ) \ { \ callbackfunc ( 0, ACTIONID, action, NULL, user_data ); \ return; \ } ; #endif #define CREATE_GENERIC_TOGGLE_CALLBACK(ACTIONID, callbackfunc) \ static void ACTIONID##_toggle_g_cb ( GtkToggleAction *action, gpointer user_data ) \ { \ callbackfunc ( 1, ACTIONID, action, NULL, user_data ); \ return; \ } ; #define CREATE_GENERIC_RADIO_CALLBACK(ACTIONID, callbackfunc) \ static void ACTIONID##_radio_g_cb ( GtkRadioAction *action, GtkRadioAction *current, gpointer user_data ) \ { \ callbackfunc ( 2, ACTIONID, action, current, user_data ); \ return; \ } ; #define CMD_ACTION_CALLBACK_FROMID(CMDID) (GCallback)CMDID##_action_cb #if 0 #define CMD_TOGGLE_CALLBACK_FROMID(CMDID) (GCallback)CMDID##_toggle_cb #endif #define CMD_RADIO_CALLBACK_FROMID(CMDID) (GCallback)CMDID##_radio_cb #if 0 #define GENERIC_ACTION_CALLBACK_FROMID(ACTIONID) (GCallback)ACTIONID##_action_g_cb #endif #define GENERIC_TOGGLE_CALLBACK_FROMID(ACTIONID) (GCallback)ACTIONID##_toggle_g_cb #define GENERIC_RADIO_CALLBACK_FROMID(ACTIONID) (GCallback)ACTIONID##_radio_g_cb /* Create callback functions for all the commands. These do no need to be in any particular order */ CREATE_CMD_ACTION_CALLBACK(CMD_ACCEPT, "accept"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_CLEAR_MOVE, "analyse clear move"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_CLEAR_GAME, "analyse clear game"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_CLEAR_MATCH, "analyse clear match"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_MOVE, "analyse move"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_GAME, "analyse game"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_MATCH, "analyse match"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_ROLLOUT_CUBE, "analyse rollout cube"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_ROLLOUT_MOVE, "analyse rollout move"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_ROLLOUT_GAME, "analyse rollout game"); CREATE_CMD_ACTION_CALLBACK(CMD_ANALYSE_ROLLOUT_MATCH, "analyse rollout match"); CREATE_CMD_ACTION_CALLBACK(CMD_CLEAR_TURN, "clear turn"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_CUBE_CLEAR, "cmark cube clear"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_CUBE_SHOW, "cmark cube show"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_MOVE_CLEAR, "cmark move clear"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_MOVE_SHOW, "cmark move show"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_GAME_CLEAR, "cmark game clear"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_GAME_SHOW, "cmark game show"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_MATCH_CLEAR, "cmark match clear"); CREATE_CMD_ACTION_CALLBACK(CMD_CMARK_MATCH_SHOW, "cmark match show"); CREATE_CMD_ACTION_CALLBACK(CMD_END_GAME, "end game"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_DECLINE, "decline"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_DOUBLE, "double"); CREATE_CMD_ACTION_CALLBACK(CMD_EVAL, "eval"); CREATE_CMD_ACTION_CALLBACK(CMD_HELP, "help"); CREATE_CMD_ACTION_CALLBACK(CMD_HINT, "hint"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_LIST_GAME, "list game"); CREATE_CMD_ACTION_CALLBACK(CMD_NEXT, "next"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_NEXT_GAME, "next game"); CREATE_CMD_ACTION_CALLBACK(CMD_NEXT_MARKED, "next marked"); CREATE_CMD_ACTION_CALLBACK(CMD_NEXT_CMARKED, "next cmarked"); CREATE_CMD_ACTION_CALLBACK(CMD_NEXT_ROLL, "next roll"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_NEXT_ROLLED, "next rolled"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_PLAY, "play"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_PREV, "previous"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_PREV_GAME, "previous game"); CREATE_CMD_ACTION_CALLBACK(CMD_PREV_MARKED, "previous marked"); CREATE_CMD_ACTION_CALLBACK(CMD_PREV_CMARKED, "previous cmarked"); CREATE_CMD_ACTION_CALLBACK(CMD_PREV_ROLL, "previous roll"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_PREV_ROLLED, "previous rolled"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_QUIT, "quit"); CREATE_CMD_ACTION_CALLBACK(CMD_REJECT, "reject"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_RELATIONAL_ADD_MATCH, "relational add match"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_ROLL, "roll"); CREATE_CMD_ACTION_CALLBACK(CMD_ROLLOUT, "rollout"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_SET_ANNOTATION_ON, "set annotation on"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_SET_APPEARANCE, NULL); /* set appearance */ #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_SET_MESSAGE_ON, "set message on"); CREATE_CMD_ACTION_CALLBACK(CMD_SET_TURN_0, NULL); /* set turn 0 */ CREATE_CMD_ACTION_CALLBACK(CMD_SET_TURN_1, NULL); /* set turn 1 */ #endif CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_CALIBRATION, "show calibration"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_COPYING, "show copying"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_ENGINE, "show engine"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_EXPORT, "show export"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_HISTORY, "show history"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_MARKETWINDOW, "show marketwindow"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_MATCHEQUITYTABLE, "show matchequitytable"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_KLEINMAN, "show kleinman"); /* opens race theory window */ CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_MANUAL_ABOUT, "show manual about"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_MANUAL_WEB, "show manual web"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_ROLLS, "show rolls"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_STATISTICS_MATCH, "show statistics match"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_TEMPERATURE_MAP, "show temperaturemap"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_TEMPERATURE_MAP_CUBE, "show temperaturemap =cube"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_SCORE_MAP_CUBE, "show scoremap"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_SCORE_MAP_MOVE, "show scoremap =move"); CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_VERSION, "show version"); #if 0 CREATE_CMD_ACTION_CALLBACK(CMD_SHOW_WARRANTY, "show warranty"); #endif CREATE_CMD_ACTION_CALLBACK(CMD_SWAP_PLAYERS, "swap players"); CREATE_GENERIC_TOGGLE_CALLBACK(TOGGLE_GAMELIST, TogglePanel); CREATE_GENERIC_TOGGLE_CALLBACK(TOGGLE_COMMENTARY, TogglePanel); CREATE_GENERIC_TOGGLE_CALLBACK(TOGGLE_MESSAGE, TogglePanel); CREATE_GENERIC_TOGGLE_CALLBACK(TOGGLE_ANALYSIS, TogglePanel); CREATE_GENERIC_TOGGLE_CALLBACK(TOGGLE_THEORY, TogglePanel); CREATE_GENERIC_TOGGLE_CALLBACK(TOGGLE_COMMAND, TogglePanel); CREATE_GENERIC_RADIO_CALLBACK(VIEW_TOOLBAR_ICONSONLY, ToolbarStyle); CREATE_CMD_RADIO_CALLBACK(CMD_SET_TURN_0, NULL); #else static const char *aszCommands[NUM_CMDS] = { "accept", "analyse clear move", "analyse clear game", "analyse clear match", "analyse move", "analyse game", "analyse match", "analyse rollout cube", "analyse rollout move", "analyse rollout game", "analyse rollout match", "clear turn", "cmark cube clear", "cmark cube show", "cmark move clear", "cmark move show", "cmark game clear", "cmark game show", "cmark match clear", "cmark match show", "end game", "decline", "double", "eval", "help", "hint", "list game", "next", "next game", "next marked", "next cmarked", "next roll", "next rolled", "play", "previous", "previous game", "previous marked", "previous cmarked", "previous roll", "previous rolled", "quit", "reject", "relational add match", "roll", "rollout", "set annotation on", NULL, /* set appearance */ "set message on", NULL, /* set turn 0 */ NULL, /* set turn 1 */ "show calibration", "show copying", "show engine", "show export", "show history", "show marketwindow", "show matchequitytable", "show kleinman", /* opens race theory window */ "show manual about", "show manual web", "show rolls", "show statistics match", "show temperaturemap", "show temperaturemap =cube", "show scoremap", "show scoremap =move", "show version", "show warranty", "swap players", }; static void Command(gpointer UNUSED(p), guint iCommand, GtkWidget * widget) { char sz[80]; if (fAutoCommand) return; /* FIXME this isn't very good -- if UserCommand fails, the setting * won't have been changed, but the widget will automatically have * updated itself. */ if (GTK_IS_RADIO_MENU_ITEM(widget)) { if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return; } else if (GTK_IS_CHECK_MENU_ITEM(widget)) { sprintf(sz, "%s %s", aszCommands[iCommand], gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)) ? "on" : "off"); UserCommand(sz); return; } switch (iCommand) { case CMD_SET_APPEARANCE: BoardPreferences(pwBoard); return; case CMD_SET_TURN_0: case CMD_SET_TURN_1: sprintf(sz, "set turn %s", ap[iCommand - CMD_SET_TURN_0].szName); UserCommand(sz); return; case CMD_ANALYSE_MATCH: UserCommand(aszCommands[CMD_ANALYSE_MATCH]); if (fAutoDB) { /* add match to db */ CommandRelationalAddMatch(NULL); } UserCommand(aszCommands[CMD_SHOW_STATISTICS_MATCH]); return; default: UserCommand(aszCommands[iCommand]); } } #endif typedef struct { const char *title; evalcontext *esChequer; movefilter *mfChequer; evalcontext *esCube; movefilter *mfCube; GtkWidget *pwCube, *pwChequer, *pwOptionMenu, *pwSettingWidgets; int cubeDisabled; int fWeakLevels; } AnalysisDetails; typedef struct { evalsetup esChequer; evalsetup esCube; movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; evalsetup esEvalChequer; evalsetup esEvalCube; movefilter aaEvalmf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; GtkWidget *pwNoteBook; GtkAdjustment *apadjSkill[3], *apadjLuck[4]; GtkWidget *pwMoves, *pwCube, *pwLuck, *pwHintSame, *pwCubeSummary; GtkWidget *apwAnalysePlayers[2]; GtkWidget *pwAutoDB; GtkWidget *pwBackgroundAnalysis; GtkWidget *apwAnalyzeFileSetting[NUM_AnalyzeFileSettings]; GtkWidget *pwScoreMap; GtkWidget *apwScoreMapPly[NUM_PLY]; GtkWidget *apwScoreMapMatchLength[NUM_MATCH_LENGTH]; GtkWidget *apwScoreMapLabel[NUM_LABEL]; GtkWidget *apwScoreMapJacoby[NUM_JACOBY]; GtkWidget *apwScoreMapCubeEquityDisplay[NUM_CUBEDISP]; GtkWidget *apwScoreMapMoveEquityDisplay[NUM_MOVEDISP]; GtkWidget *apwScoreMapColour[NUM_COLOUR]; GtkWidget *apwScoreMapLayout[NUM_LAYOUT]; /* defining these just to be able to g_free them */ AnalysisDetails *pAnalDetailSettings1; AnalysisDetails *pAnalDetailSettings2; } analysiswidget; /* A dummy widget that can grab events when others shouldn't see them. */ GtkWidget *pwGrab; GtkWidget *pwOldGrab; GtkWidget *pwBoard; GtkWidget *pwMain = NULL; static GtkWidget *pwMenuBar; GtkWidget *pwToolbar; static GtkWidget *pwStatus; static GtkWidget *pwIDBox; GtkWidget *pwGnubgID; static GtkWidget *pwProgress; GtkWidget *pwMessageText; GtkWidget *pwPanelVbox; GtkWidget *pwAnalysis; GtkWidget *pwCommentary; static moverecord *pmrAnnotation; GtkAccelGroup *pagMain; #if defined(USE_GTKITEMFACTORY) GtkItemFactory *pif; #else GtkUIManager *puim = NULL; #endif guint nNextTurn = 0; /* GTK idle function */ static guint idOutput, idProgress; int fTTY = TRUE; int fGUISetWindowPos = TRUE; int frozen = FALSE; static GString *output_str = NULL; static int fullScreenOnStartup = FALSE; static guint nStdin, nDisabledCount = 1; static GIOChannel *pStdin; /* Save state of windows for full screen */ static int showingPanels, showingIDs, maximised; static gulong grabIdSignal; static int suspendCount = 0; static GtkWidget *grabbedWidget; /* Language selection code */ static GtkWidget *curSel; static GtkWidget *pwLangDialog, *pwLangRadio1, *pwLangRadio2, *pwLangTable; static GtkWidget *pwHelpTree, *pwHelpLabel; GtkWidget *hpaned; static GtkWidget *pwGameBox; static GtkWidget *pwPanelGameBox; static GtkWidget *pwEventBox; static int panelSize = 325; static GtkWidget *pwStop; extern void GTKSuspendInput(void) { if (!fX) return; /* when the fBackgroundAnalysis global variable is set, we allow the user to * (1) continue browsing and (2) stop the computation; * else we grab the focus and kill any user input */ if (!fBackgroundAnalysis) { if (suspendCount == 0 && pwGrab && GDK_IS_WINDOW(gtk_widget_get_window(pwGrab))) { /* Grab events so that the board window knows this is a re-entrant */ /* call, and won't allow commands like roll, move or double. */ grabbedWidget = pwGrab; if (pwGrab == pwStop) { gtk_widget_grab_focus(pwStop); gtk_widget_set_sensitive(pwStop, TRUE); } gtk_grab_add(pwGrab); grabIdSignal = g_signal_connect_after(G_OBJECT(pwGrab), "key-press-event", G_CALLBACK(gtk_true), NULL); } /* Don't check stdin here; readline isn't ready yet. */ GTKDisallowStdin(); } else { if (pwGrab == pwStop) { gtk_widget_grab_focus(pwStop); gtk_widget_set_sensitive(pwStop, TRUE); } } suspendCount++; } extern void GTKResumeInput(void) { if (!fX) return; g_assert(suspendCount > 0); suspendCount--; if (suspendCount == 0) { if (GTK_IS_WIDGET(grabbedWidget) && gtk_widget_has_grab(grabbedWidget)) { if (g_signal_handler_is_connected(G_OBJECT(grabbedWidget), grabIdSignal)) g_signal_handler_disconnect(G_OBJECT(grabbedWidget), grabIdSignal); gtk_grab_remove(grabbedWidget); } if (pwGrab == pwStop) gtk_widget_set_sensitive(pwStop, FALSE); } GTKAllowStdin(); } static gboolean StdinReadNotify(GIOChannel * UNUSED(source), GIOCondition UNUSED(cond), gpointer UNUSED(p)) { #if defined(HAVE_LIB_READLINE) /* Handle "next turn" processing before more input (otherwise we might * not even have a readline handler installed!) */ while (nNextTurn) NextTurnNotify(NULL); rl_callback_read_char(); return TRUE; #else char sz[2048], *pch; while (nNextTurn) NextTurnNotify(NULL); if (fgets(sz, sizeof(sz), stdin) == NULL) { if (!isatty(STDIN_FILENO)) exit(EXIT_SUCCESS); PromptForExit(); return TRUE; } if ((pch = strchr(sz, '\n'))) *pch = 0; fInterrupt = FALSE; HandleCommand(sz, acTop); ResetInterrupt(); if (nNextTurn) fNeedPrompt = TRUE; else Prompt(); return TRUE; #endif } extern void GTKAllowStdin(void) { if (!fTTY || !nDisabledCount) return; if (!--nDisabledCount) { pStdin = g_io_channel_unix_new(STDIN_FILENO); nStdin = g_io_add_watch_full(pStdin, G_PRIORITY_HIGH, G_IO_IN | G_IO_PRI, StdinReadNotify, NULL, NULL); } } extern void GTKDisallowStdin(void) { if (!fTTY) return; nDisabledCount++; if (nStdin) { g_source_remove(nStdin); g_io_channel_unref(pStdin); nStdin = 0; } } int fEndDelay; extern void GTKDelay(void) { GTKSuspendInput(); while (!fInterrupt && !fEndDelay) gtk_main_iteration(); fEndDelay = FALSE; GTKResumeInput(); } static void gui_clear_turn(GtkWidget * UNUSED(pw), GtkWidget * dialog) { if (dialog) gtk_widget_destroy(dialog); CommandClearTurn(NULL); } extern int GTKGetManualDice(unsigned int an[2]) { GtkWidget *dialog; GtkWidget *dice; GtkWidget *buttons; GtkWidget *clear; BoardData *bd = BOARD(pwBoard)->board_data; manualDiceType mdt; if (ToolbarIsEditing(pwToolbar)) mdt = MT_EDIT; else if (plLastMove && ((moverecord *) plLastMove->p)->mt == MOVE_GAMEINFO) mdt = MT_FIRSTMOVE; else mdt = MT_STANDARD; dialog = GTKCreateDialog(_("GNU Backgammon - Dice"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_CLOSEBUTTON, NULL, NULL); dice = board_dice_widget(BOARD(pwBoard), mdt); gtk_container_add(GTK_CONTAINER(DialogArea(dialog, DA_MAIN)), dice); buttons = DialogArea(dialog, DA_BUTTONS); clear = gtk_button_new_with_label(_("Clear Dice")); gtk_container_add(GTK_CONTAINER(buttons), clear); g_signal_connect(G_OBJECT(clear), "clicked", G_CALLBACK(gui_clear_turn), dialog); gtk_widget_set_sensitive(GTK_WIDGET(clear), bd->diceShown == DICE_ON_BOARD); g_object_set_data(G_OBJECT(dice), "user_data", an); an[0] = 0; GTKRunDialog(dialog); if (mdt == MT_EDIT && an[0]) { if (an[0] > an[1] && bd->turn != -1) UserCommand("set turn 0"); else if (an[0] < an[1] && bd->turn != 1) UserCommand("set turn 1"); } return an[0] ? 0 : -1; } extern void GTKSetDice(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { unsigned int an[2]; if (!GTKGetManualDice(an)) { char sz[13]; /* "set dice x y" */ sprintf(sz, "set dice %u %u", an[0], an[1]); UserCommand(sz); } } extern void GTKSetCube(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { gchar *sz; GtkWidget *pwDialog, *pwCube; int an[2]; int valChanged; if (ms.gs != GAME_PLAYING || ms.fCrawford || !ms.fCubeUse) return; pwDialog = GTKCreateDialog(_("GNU Backgammon - Cube"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_CLOSEBUTTON, NULL, NULL); pwCube = board_cube_widget(BOARD(pwBoard)); an[0] = -1; gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwCube); g_object_set_data(G_OBJECT(pwCube), "user_data", an); g_signal_connect(G_OBJECT(pwCube), "destroy", G_CALLBACK(DestroySetCube), pwDialog); GTKRunDialog(pwDialog); if (an[0] < 0) return; valChanged = (1 << an[0] != ms.nCube); if (valChanged) { sz = g_strdup_printf("set cube value %d", 1 << an[0]); UserCommand(sz); g_free(sz); } if (an[1] != ms.fCubeOwner) { if (an[1] >= 0) { sz = g_strdup_printf("set cube owner %d", an[1]); UserCommand(sz); g_free(sz); } else UserCommand("set cube centre"); } } static int fAutoCommentaryChange; extern void CommentaryChanged(GtkWidget * UNUSED(pw), GtkTextBuffer * buffer) { char *pch; GtkTextIter begin, end; if (fAutoCommentaryChange) return; g_assert(pmrAnnotation); /* FIXME Copying the entire text every time it's changed is horribly * inefficient, but the only alternatives seem to be lazy copying * (which is much harder to get right) or requiring a specific command * to update the text (which is probably inconvenient for the user). */ if (pmrAnnotation->sz) g_free(pmrAnnotation->sz); gtk_text_buffer_get_bounds(buffer, &begin, &end); pch = gtk_text_buffer_get_text(buffer, &begin, &end, FALSE); /* This copy is absolutely disgusting, but is necessary because GTK * insists on giving us something allocated with g_malloc() instead * of malloc(). */ pmrAnnotation->sz = g_strdup(pch); g_free(pch); } extern void GTKFreeze(void) { frozen = TRUE; } extern void GTKThaw(void) { frozen = FALSE; /* Make sure analysis window is correct */ if (plLastMove) GTKSetMoveRecord(plLastMove->p); } static GtkWidget * ResignAnalysis(float arResign[NUM_ROLLOUT_OUTPUTS], int nResigned, evalsetup * pesResign) { cubeinfo ci; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwGrid = gtk_grid_new(); #else GtkWidget *pwTable = gtk_table_new(3, 2, FALSE); #endif GtkWidget *pwLabel; float rAfter, rBefore; char sz[64]; if (pesResign->et == EVAL_NONE) return NULL; GetMatchStateCubeInfo(&ci, &ms); /* First column with text */ pwLabel = gtk_label_new(_("Equity before resignation: ")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 0, 0, 1, 1); gtk_widget_set_hexpand(pwLabel, TRUE); gtk_widget_set_vexpand(pwLabel, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pwLabel, 8); gtk_widget_set_margin_end(pwLabel, 8); #else gtk_widget_set_margin_left(pwLabel, 8); gtk_widget_set_margin_right(pwLabel, 8); #endif gtk_widget_set_margin_top(pwLabel, 2); gtk_widget_set_margin_bottom(pwLabel, 2); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2); #endif pwLabel = gtk_label_new(_("Equity after resignation: ")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 0, 1, 1, 1); gtk_widget_set_hexpand(pwLabel, TRUE); gtk_widget_set_vexpand(pwLabel, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pwLabel, 8); gtk_widget_set_margin_end(pwLabel, 8); #else gtk_widget_set_margin_left(pwLabel, 8); gtk_widget_set_margin_right(pwLabel, 8); #endif gtk_widget_set_margin_top(pwLabel, 2); gtk_widget_set_margin_bottom(pwLabel, 2); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2); #endif pwLabel = gtk_label_new(_("Difference: ")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 0, 2, 1, 1); gtk_widget_set_hexpand(pwLabel, TRUE); gtk_widget_set_vexpand(pwLabel, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pwLabel, 8); gtk_widget_set_margin_end(pwLabel, 8); #else gtk_widget_set_margin_left(pwLabel, 8); gtk_widget_set_margin_right(pwLabel, 8); #endif gtk_widget_set_margin_top(pwLabel, 2); gtk_widget_set_margin_bottom(pwLabel, 2); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 0, 1, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2); #endif /* Second column: equities/mwc */ getResignEquities(arResign, &ci, nResigned, &rBefore, &rAfter); if (fOutputMWC && ms.nMatchTo) sprintf(sz, "%6.2f%%", eq2mwc(rBefore, &ci) * 100.0f); else sprintf(sz, "%+6.3f", rBefore); pwLabel = gtk_label_new(sz); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_END); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 1, 0, 1, 1); gtk_widget_set_hexpand(pwLabel, TRUE); gtk_widget_set_vexpand(pwLabel, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pwLabel, 8); gtk_widget_set_margin_end(pwLabel, 8); #else gtk_widget_set_margin_left(pwLabel, 8); gtk_widget_set_margin_right(pwLabel, 8); #endif gtk_widget_set_margin_top(pwLabel, 2); gtk_widget_set_margin_bottom(pwLabel, 2); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 1, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2); #endif if (fOutputMWC && ms.nMatchTo) sprintf(sz, "%6.2f%%", eq2mwc(rAfter, &ci) * 100.0f); else sprintf(sz, "%+6.3f", rAfter); pwLabel = gtk_label_new(sz); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_END); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 1, 1, 1, 1); gtk_widget_set_hexpand(pwLabel, TRUE); gtk_widget_set_vexpand(pwLabel, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pwLabel, 8); gtk_widget_set_margin_end(pwLabel, 8); #else gtk_widget_set_margin_left(pwLabel, 8); gtk_widget_set_margin_right(pwLabel, 8); #endif gtk_widget_set_margin_top(pwLabel, 2); gtk_widget_set_margin_bottom(pwLabel, 2); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 1, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2); #endif if (fOutputMWC && ms.nMatchTo) sprintf(sz, "%+6.2f%%", (eq2mwc(rAfter, &ci) - eq2mwc(rBefore, &ci)) * 100.0f); else sprintf(sz, "%+6.3f", rAfter - rBefore); pwLabel = gtk_label_new(sz); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_END); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 1, 2, 1, 1); gtk_widget_set_hexpand(pwLabel, TRUE); gtk_widget_set_vexpand(pwLabel, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pwLabel, 8); gtk_widget_set_margin_end(pwLabel, 8); #else gtk_widget_set_margin_left(pwLabel, 8); gtk_widget_set_margin_right(pwLabel, 8); #endif gtk_widget_set_margin_top(pwLabel, 2); gtk_widget_set_margin_bottom(pwLabel, 2); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 1, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2); #endif #if GTK_CHECK_VERSION(3,0,0) return pwGrid; #else return pwTable; #endif } GtkWidget *pwMoveAnalysis = NULL; static GtkWidget * luck_label(lucktype lt) { GtkWidget *label; gchar *markup; const gchar *skill; const gchar *color[N_LUCKS] = { "red", "orange", "black", "green", "white" }; label = gtk_label_new(NULL); skill = aszLuckType[lt] ? gettext(aszLuckType[lt]) : ""; markup = g_strdup_printf("%s", color[lt], skill); gtk_label_set_markup(GTK_LABEL(label), markup); g_free(markup); return label; } static GtkWidget * skill_label(skilltype st) { GtkWidget *label; gchar *markup; const gchar *skill; const gchar *color[N_SKILLS] = { "red", "orange", "yellow", "black" }; label = gtk_label_new(NULL); skill = aszSkillType[st] ? gettext(aszSkillType[st]) : ""; markup = g_strdup_printf("%s", color[st], skill); gtk_label_set_markup(GTK_LABEL(label), markup); g_free(markup); return label; } extern void SetAnnotation(moverecord * pmr) { GtkWidget *pwParent = gtk_widget_get_parent(pwAnalysis), *pw = NULL; listOLD *pl; GtkWidget *pwCubeAnalysis = NULL; doubletype dt; taketype tt; cubeinfo ci; GtkTextBuffer *buffer; pwMoveAnalysis = NULL; /* Select the moverecord _after_ pmr. FIXME this is very ugly! */ pmrCurAnn = pmr; for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) if (pl->p == pmr) { pmr = pl->plNext->p; break; } if (pl == plGame) pmr = NULL; pmrAnnotation = pmr; /* FIXME optimise by ignoring set if pmr is unchanged */ if (pwAnalysis) { gtk_widget_destroy(pwAnalysis); pwAnalysis = NULL; } gtk_widget_set_sensitive(pwCommentary, pmr != NULL); fAutoCommentaryChange = TRUE; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwCommentary)); gtk_text_buffer_set_text(buffer, "", -1); fAutoCommentaryChange = FALSE; if (pmr) { GtkWidget *pwBox; #if !GTK_CHECK_VERSION(3,0,0) GtkWidget *pwAlign; #endif GList *pl; char sz[64], *pch; int fMoveOld, fTurnOld; if (pmr->sz) { fAutoCommentaryChange = TRUE; gtk_text_buffer_set_text(buffer, pmr->sz, -1); fAutoCommentaryChange = FALSE; } switch (pmr->mt) { case MOVE_NORMAL: fMoveOld = ms.fMove; fTurnOld = ms.fTurn; #if GTK_CHECK_VERSION(3,0,0) pwAnalysis = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); pwBox = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pwBox), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pwBox), TRUE); #else pwAnalysis = gtk_vbox_new(FALSE, 0); pwBox = gtk_table_new(2, 3, TRUE); #endif gtk_box_pack_start(GTK_BOX(pwAnalysis), pwBox, FALSE, FALSE, 4); ms.fMove = ms.fTurn = pmr->fPlayer; /* * Skill and luck */ /* Skill for cube */ GetMatchStateCubeInfo(&ci, &ms); if (GetDPEq(NULL, NULL, &ci)) { #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwBox), gtk_label_new(pmr->stCube == SKILL_NONE ? "" : _("Didn't double")), 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(pwBox), skill_label(pmr->stCube), 0, 1, 1, 1); } else { /* Neeeded for proper layout of grid but not for table */ gtk_grid_attach(GTK_GRID(pwBox), gtk_label_new(""), 0, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwBox), gtk_label_new(pmr->stCube == SKILL_NONE ? "" : _("Didn't double")), 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(pwBox), skill_label(pmr->stCube), 0, 1, 1, 2); #endif } /* luck */ pch = sz + sprintf(sz, _("Rolled %u%u"), pmr->anDice[0], pmr->anDice[1]); if (pmr->rLuck != ERR_VAL) { if (fOutputMWC && ms.nMatchTo) sprintf(pch, " (%+0.3f%%)", 100.0f * (eq2mwc(pmr->rLuck, &ci) - eq2mwc(0.0f, &ci))); else sprintf(pch, " (%+0.3f)", pmr->rLuck); } #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwBox), gtk_label_new(sz), 1, 0, 1, 1); gtk_grid_attach(GTK_GRID(pwBox), luck_label(pmr->lt), 1, 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwBox), gtk_label_new(sz), 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(pwBox), luck_label(pmr->lt), 1, 2, 1, 2); #endif /* chequer play skill */ strcpy(sz, _("Moved ")); FormatMove(sz + strlen(_("Moved ")), msBoard(), pmr->n.anMove); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwBox), gtk_label_new(sz), 2, 0, 1, 1); gtk_grid_attach(GTK_GRID(pwBox), skill_label(pmr->n.stMove), 2, 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwBox), gtk_label_new(sz), 2, 3, 0, 1); gtk_table_attach_defaults(GTK_TABLE(pwBox), skill_label(pmr->n.stMove), 2, 3, 1, 2); #endif /* cube */ pwCubeAnalysis = CreateCubeAnalysis(pmr, &ms, FALSE, -1, TRUE); /* move */ if (pmr->ml.cMoves) pwMoveAnalysis = CreateMoveList(pmr, TRUE, FALSE, !IsPanelDocked(WINDOW_ANALYSIS), TRUE); if (pwMoveAnalysis && pwCubeAnalysis) { /* notebook with analysis */ pw = gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(pwAnalysis), pw, TRUE, TRUE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(pw), pwCubeAnalysis, gtk_label_new(_("Cube decision"))); gtk_notebook_append_page(GTK_NOTEBOOK(pw), pwMoveAnalysis, gtk_label_new(_("Chequer play"))); } else if (pwMoveAnalysis) { if (IsPanelDocked(WINDOW_ANALYSIS)) gtk_widget_set_size_request(GTK_WIDGET(pwMoveAnalysis), 0, 200); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwMoveAnalysis, TRUE, TRUE, 0); } else if (pwCubeAnalysis) gtk_box_pack_start(GTK_BOX(pwAnalysis), pwCubeAnalysis, TRUE, TRUE, 0); if (!g_list_first(pl = gtk_container_get_children(GTK_CONTAINER(GTK_BOX(pwAnalysis))))) { gtk_widget_destroy(pwAnalysis); pwAnalysis = NULL; g_list_free(pl); } ms.fMove = fMoveOld; ms.fTurn = fTurnOld; break; case MOVE_DOUBLE: dt = DoubleType(ms.fDoubled, ms.fMove, ms.fTurn); #if GTK_CHECK_VERSION(3,0,0) pwAnalysis = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); pwBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwAnalysis = gtk_vbox_new(FALSE, 0); pwBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(Q_(aszDoubleTypes[dt])), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwBox), skill_label(pmr->stCube), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwBox, FALSE, FALSE, 0); if (dt == DT_NORMAL || dt == DT_BEAVER) { if ((pw = CreateCubeAnalysis(pmr, &ms, TRUE, -1, TRUE))) gtk_box_pack_start(GTK_BOX(pwAnalysis), pw, FALSE, FALSE, 0); } else gtk_box_pack_start(GTK_BOX(pwAnalysis), gtk_label_new(_("GNU Backgammon cannot " "analyse neither beavers " "nor raccoons yet")), FALSE, FALSE, 0); break; case MOVE_TAKE: case MOVE_DROP: tt = (taketype) DoubleType(ms.fDoubled, ms.fMove, ms.fTurn); #if GTK_CHECK_VERSION(3,0,0) pwAnalysis = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); pwBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwAnalysis = gtk_vbox_new(FALSE, 0); pwBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(pmr->mt == MOVE_TAKE ? _("Take") : _("Drop")), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwBox), skill_label(pmr->stCube), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwBox, FALSE, FALSE, 0); if (tt <= TT_NORMAL) { if ((pw = CreateCubeAnalysis(pmr, &ms, -1, pmr->mt == MOVE_TAKE, TRUE))) gtk_box_pack_start(GTK_BOX(pwAnalysis), pw, FALSE, FALSE, 0); } else gtk_box_pack_start(GTK_BOX(pwAnalysis), gtk_label_new(_("GNU Backgammon cannot " "analyse neither beavers " "nor raccoons yet")), FALSE, FALSE, 0); break; case MOVE_RESIGN: #if GTK_CHECK_VERSION(3,0,0) pwAnalysis = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwAnalysis = gtk_vbox_new(FALSE, 0); #endif /* equities for resign */ if ((pw = ResignAnalysis(pmr->r.arResign, pmr->r.nResigned, &pmr->r.esResign))) gtk_box_pack_start(GTK_BOX(pwAnalysis), pw, FALSE, FALSE, 0); /* skill for resignation */ #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_set_halign(pwBox, GTK_ALIGN_CENTER); gtk_widget_set_valign(pwBox, GTK_ALIGN_CENTER); gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Resign")), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwBox, FALSE, FALSE, 0); #else pwBox = gtk_hbox_new(FALSE, 0); pwAlign = gtk_alignment_new(0.5f, 0.5f, 0.0f, 0.0f); gtk_container_add(GTK_CONTAINER(pwAlign), pwBox); gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Resign")), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwAlign, FALSE, FALSE, 0); #endif /* skill for accept */ #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_set_halign(pwBox, GTK_ALIGN_CENTER); gtk_widget_set_valign(pwBox, GTK_ALIGN_CENTER); gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Accept")), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwBox, FALSE, FALSE, 0); #else pwBox = gtk_hbox_new(FALSE, 0); pwAlign = gtk_alignment_new(0.5f, 0.5f, 0.0f, 0.0f); gtk_container_add(GTK_CONTAINER(pwAlign), pwBox); gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Accept")), FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(pwAnalysis), pwAlign, FALSE, FALSE, 0); #endif break; default: break; } } if (!pwAnalysis) pwAnalysis = gtk_label_new(_("No analysis available.")); if (!IsPanelDocked(WINDOW_ANALYSIS)) gtk_paned_pack1(GTK_PANED(pwParent), pwAnalysis, TRUE, FALSE); else gtk_box_pack_start(GTK_BOX(pwParent), pwAnalysis, TRUE, TRUE, 0); gtk_widget_show_all(pwAnalysis); if (pmr && pmr->mt == MOVE_NORMAL && pwMoveAnalysis && pwCubeAnalysis) { if (badSkill(pmr->stCube)) gtk_notebook_set_current_page(GTK_NOTEBOOK(pw), 0); else gtk_notebook_set_current_page(GTK_NOTEBOOK(pw), 1); } } extern void GTKSaveSettings(void) { char *sz = g_build_filename(szHomeDirectory, "gnubgmenurc", NULL); gtk_accel_map_save(sz); g_free(sz); } static gboolean main_delete(GtkWidget * UNUSED(pw)) { getWindowGeometry(WINDOW_MAIN); PromptForExit(); return TRUE; } /* The brain-damaged gtk_statusbar_pop interface doesn't return a value, * so we have to use a signal to see if anything was actually popped. */ static int fFinishedPopping; static void TextPopped(GtkWidget * UNUSED(pw), guint UNUSED(id), gchar * text, void *UNUSED(p)) { if (!text) fFinishedPopping = TRUE; } extern int GetPanelSize(void) { if (!fFullScreen && fX && gtk_widget_get_realized(pwMain)) { int pos = gtk_paned_get_position(GTK_PANED(hpaned)); GtkAllocation allocation; gtk_widget_get_allocation(pwMain, &allocation); return allocation.width - pos; } else return panelSize; } extern void SetPanelWidth(int size) { panelSize = size; if (gtk_widget_get_realized(pwMain)) { GtkAllocation allocation; gtk_widget_get_allocation(pwMain, &allocation); if (panelSize > allocation.width * .8) panelSize = (int) (allocation.width * .8); } } extern void SwapBoardToPanel(int ToPanel, int updateEvents) { /* Show/Hide panel on right of screen */ GtkAllocation allocation; gtk_widget_get_allocation(pwMain, &allocation); if (ToPanel) { #if GTK_CHECK_VERSION(3,0,0) g_object_ref(pwEventBox); gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(pwEventBox))), GTK_WIDGET(pwEventBox)); gtk_container_add(GTK_CONTAINER(pwPanelGameBox), GTK_WIDGET(pwEventBox)); g_object_unref(pwEventBox); #else gtk_widget_reparent(pwEventBox, pwPanelGameBox); #endif gtk_widget_show(hpaned); if (updateEvents) ProcessEvents(); gtk_widget_hide(pwGameBox); gtk_paned_set_position(GTK_PANED(hpaned), allocation.width - panelSize); #if ! GTK_CHECK_VERSION(3,0,0) { /* Hack to sort out widget positions - may be removed if works in later version of gtk */ GtkAllocation temp = allocation; temp.height++; gtk_widget_size_allocate(pwMain, &temp); temp.height--; gtk_widget_size_allocate(pwMain, &temp); } #endif } else { /* Need to hide these, as handle box seems to be buggy and gets confused */ gtk_widget_hide(gtk_widget_get_parent(pwMenuBar)); if (fToolbarShowing) gtk_widget_hide(gtk_widget_get_parent(pwToolbar)); #if GTK_CHECK_VERSION(3,0,0) g_object_ref(pwEventBox); gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(pwEventBox))), GTK_WIDGET(pwEventBox)); gtk_container_add(GTK_CONTAINER(pwGameBox), GTK_WIDGET(pwEventBox)); g_object_unref(pwEventBox); #else gtk_widget_reparent(pwEventBox, pwGameBox); #endif gtk_widget_show(pwGameBox); if (updateEvents) ProcessEvents(); if (gtk_widget_get_visible(hpaned)) { panelSize = GetPanelSize(); gtk_widget_hide(hpaned); } gtk_widget_show(gtk_widget_get_parent(pwMenuBar)); if (fToolbarShowing) gtk_widget_show(gtk_widget_get_parent(pwToolbar)); } } #if ! GTK_CHECK_VERSION(3,0,0) static void MainSize(GtkWidget * pw, GtkRequisition * preq, gpointer p) { /* Give the main window a size big enough that the board widget gets * board_size=4, if it will fit on the screen. */ int width; if (gtk_widget_get_realized(pw)) g_signal_handlers_disconnect_by_func(G_OBJECT(pw), (gpointer) G_CALLBACK(MainSize), p); else if (!SetMainWindowSize()) gtk_window_set_default_size(GTK_WINDOW(pw), MAX(480, preq->width), MIN(preq->height + 79 * 3, gdk_screen_height() - 20)); width = GetPanelWidth(WINDOW_MAIN); if (width) gtk_paned_set_position(GTK_PANED(hpaned), width - panelSize); else gtk_paned_set_position(GTK_PANED(hpaned), preq->width - panelSize); } #endif #if defined(USE_GTKITEMFACTORY) static gchar * GTKTranslate(const gchar * path, gpointer UNUSED(func_data)) { return (gchar *) gettext((const char *) path); } #endif #if !defined(USE_GTKITEMFACTORY) static void ToolbarStyle(guint UNUSED(iType), guint UNUSED(iActionID), GtkRadioAction * action, GtkRadioAction * UNUSED(alt), gpointer UNUSED(user_data)) { guint actionID = gtk_radio_action_get_current_value(GTK_RADIO_ACTION(action)); /* If radio button has been selected set style */ SetToolbarStyle(actionID - VIEW_TOOLBAR_ICONSONLY); } #else static void ToolbarStyle(gpointer UNUSED(callback_data), guint callback_action, GtkWidget * widget) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) { /* If radio button has been selected set style */ SetToolbarStyle(callback_action - TOOLBAR_ACTION_OFFSET); } } #endif static GtkClipboard *clipboard = NULL; static void PasteIDs(void) { char *text = gtk_clipboard_wait_for_text(clipboard); int editing = ToolbarIsEditing(pwToolbar); char *sz; if (!text) return; if (editing) click_edit(); sz = g_strdup_printf("set gnubgid %s", text); g_free(text); UserCommand(sz); g_free(sz); strcpy(ap[0].szName, default_names[0]); strcpy(ap[1].szName, default_names[1]); #if USE_GTK if (fX) GTKSet(ap); #endif /* USE_GTK */ if (editing) click_edit(); } extern void GTKTextToClipboard(const char *text) { gtk_clipboard_set_text(clipboard, text, -1); } static gboolean configure_event(GtkWidget * UNUSED(widget), GdkEventConfigure * eCon, void *UNUSED(null)) { /* Maintain panel size */ if (DockedPanelsShowing()) gtk_paned_set_position(GTK_PANED(hpaned), eCon->width - GetPanelSize()); return FALSE; } static void NewClicked(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GTKNew(); } static void CopyAsGOL(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { UserCommand("export position bgo2clipboard"); } static void CopyIDs(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { /* Copy the position and match ids to the clipboard */ char buffer[L_MATCHID + 1 + L_POSITIONID + 1]; if (ms.gs == GAME_NONE) { output(_("No game in progress.")); outputx(); return; } sprintf(buffer, "%s:%s", PositionID(msBoard()), MatchIDFromMatchState(&ms)); GTKTextToClipboard(buffer); gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idOutput, _("Position and Match IDs copied to the clipboard")); } static void CopyMatchID(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { /* Copy the position and match ids to the clipboard */ gchar *sz; if (ms.gs == GAME_NONE) { output(_("No game in progress.")); outputx(); return; } sz = g_strdup_printf("%s %s", _("Match ID:"), MatchIDFromMatchState(&ms)); GTKTextToClipboard(sz); g_free(sz); gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idOutput, _("Match ID copied to the clipboard")); } static void CopyPositionID(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { /* Copy the position and match ids to the clipboard */ gchar *sz; if (ms.gs == GAME_NONE) { output(_("No game in progress.")); outputx(); return; } sz = g_strdup_printf("%s %s", _("Position ID:"), PositionID(msBoard())); GTKTextToClipboard(sz); g_free(sz); gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idOutput, _("Position ID copied to the clipboard")); } #if !defined(USE_GTKITEMFACTORY) static void TogglePanel(guint UNUSED(iType), guint iActionID, GtkToggleAction * action, GtkToggleAction * UNUSED(alt), gpointer UNUSED(user_data)) { int f; gnubgwindow panel = WINDOW_MAIN; f = gtk_toggle_action_get_active(action); switch (iActionID) { case TOGGLE_ANALYSIS: panel = WINDOW_ANALYSIS; break; case TOGGLE_COMMENTARY: panel = WINDOW_ANNOTATION; break; case TOGGLE_GAMELIST: panel = WINDOW_GAME; break; case TOGGLE_MESSAGE: panel = WINDOW_MESSAGE; break; case TOGGLE_THEORY: panel = WINDOW_THEORY; break; case TOGGLE_COMMAND: panel = WINDOW_COMMAND; break; default: g_assert_not_reached(); } if (f) PanelShow(panel); else PanelHide(panel); /* Resize screen */ SetMainWindowSize(); } #else static void TogglePanel(gpointer UNUSED(p), guint n, GtkWidget * pw) { int f; gnubgwindow panel = WINDOW_MAIN; g_assert(GTK_IS_CHECK_MENU_ITEM(pw)); f = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(pw)); switch (n) { case TOGGLE_ANALYSIS: panel = WINDOW_ANALYSIS; break; case TOGGLE_COMMENTARY: panel = WINDOW_ANNOTATION; break; case TOGGLE_GAMELIST: panel = WINDOW_GAME; break; case TOGGLE_MESSAGE: panel = WINDOW_MESSAGE; break; case TOGGLE_THEORY: panel = WINDOW_THEORY; break; case TOGGLE_COMMAND: panel = WINDOW_COMMAND; break; default: g_assert_not_reached(); } if (f) PanelShow(panel); else PanelHide(panel); /* Resize screen */ SetMainWindowSize(); } #endif extern void GTKUndo(void) { BoardData *bd = BOARD(pwBoard)->board_data; if (bd->drag_point >= 0) { /* Drop piece */ GdkEventButton dummyEvent; dummyEvent.x = dummyEvent.y = 0; board_button_release(pwBoard, &dummyEvent, bd); } ShowBoard(); UpdateTheoryData(bd, TT_RETURNHITS, msBoard()); } #if defined(USE_BOARD3D) extern void SetSwitchModeMenuText(void) { /* Update menu text */ BoardData *bd = BOARD(pwBoard)->board_data; #if !defined(USE_GTKITEMFACTORY) GtkWidget *pMenuItem = gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/SwitchMode"); #else GtkWidget *pMenuItem = gtk_item_factory_get_widget_by_action(pif, TOOLBAR_ACTION_OFFSET + MENU_OFFSET); #endif char *text; if (display_is_2d(bd->rd)) text = _("Switch to 3D view"); else text = _("Switch to 2D view"); gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(pMenuItem))), text); gtk_widget_set_sensitive(pMenuItem, widget3dValid); } static void SwitchDisplayMode(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { BoardData *bd = BOARD(pwBoard)->board_data; BoardData3d *bd3d = bd->bd3d; renderdata *prd = bd->rd; if (display_is_2d(prd)) { prd->fDisplayType = DT_3D; /* Reset 3d settings */ MakeCurrent3d(bd3d); preDraw3d(bd, bd3d, prd); UpdateShadows(bd->bd3d); if (bd->diceShown == DICE_ON_BOARD) setDicePos(bd, bd3d); /* Make sure dice appear ok */ /* Needed for 2d dice+chequer widgets */ board_free_pixmaps(bd); board_create_pixmaps(pwBoard, bd); } else { prd->fDisplayType = DT_2D; /* Make sure 2d pixmaps are correct */ board_free_pixmaps(bd); board_create_pixmaps(pwBoard, bd); /* Make sure dice are visible if rolled */ if (bd->diceShown == DICE_ON_BOARD && bd->x_dice[0] <= 0) RollDice2d(bd); } DisplayCorrectBoardType(bd, bd3d, prd); SetSwitchModeMenuText(); /* Make sure chequers correct below board */ gtk_widget_queue_draw(bd->table); } #endif #if !defined(USE_GTKITEMFACTORY) static void ToggleShowingIDs(GtkToggleAction * action, gpointer UNUSED(user_data)) { int newValue = gtk_toggle_action_get_active(action); char *sz = g_strdup_printf("set gui showids %s", newValue ? "on" : "off"); UserCommand(sz); g_free(sz); UserCommand("save settings"); } #else static void ToggleShowingIDs(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * pw) { int newValue = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(pw)); char *sz = g_strdup_printf("set gui showids %s", newValue ? "on" : "off"); UserCommand(sz); g_free(sz); UserCommand("save settings"); } #endif int fToolbarShowing = TRUE; extern void ShowToolbar(void) { GtkWidget *pwHandle = gtk_widget_get_parent(pwToolbar); gtk_widget_show(pwToolbar); gtk_widget_show(pwHandle); #if !defined(USE_GTKITEMFACTORY) gtk_widget_show((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/HideToolBar"))); gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/ShowToolBar"))); gtk_widget_set_sensitive((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/TextOnly")), TRUE); gtk_widget_set_sensitive((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/IconsOnly")), TRUE); gtk_widget_set_sensitive((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/Both")), TRUE); #else gtk_widget_show(gtk_item_factory_get_widget(pif, "/View/Toolbar/Hide Toolbar")); gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Toolbar/Show Toolbar")); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Text only"), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Icons only"), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Both"), TRUE); #endif fToolbarShowing = TRUE; UserCommand("save settings"); } extern void HideToolbar(void) { GtkWidget *pwHandle = gtk_widget_get_parent(pwToolbar); gtk_widget_hide(pwToolbar); gtk_widget_hide(pwHandle); #if !defined(USE_GTKITEMFACTORY) gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/HideToolBar"))); gtk_widget_show((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/ShowToolBar"))); gtk_widget_set_sensitive((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/TextOnly")), FALSE); gtk_widget_set_sensitive((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/IconsOnly")), FALSE); gtk_widget_set_sensitive((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/Both")), FALSE); #else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Toolbar/Hide Toolbar")); gtk_widget_show(gtk_item_factory_get_widget(pif, "/View/Toolbar/Show Toolbar")); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Text only"), FALSE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Icons only"), FALSE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Both"), FALSE); #endif fToolbarShowing = FALSE; UserCommand("save settings"); } static gboolean EndFullScreen(GtkWidget * UNUSED(widget), GdkEventKey * event, gpointer UNUSED(user_data)) { short k = (short) event->keyval; if (k == KEY_ESCAPE) FullScreenMode(FALSE); return FALSE; } static void SetFullscreenWindowSettings(int panels, int ids, int maxed) { showingPanels = panels; showingIDs = ids; maximised = maxed; } static void DoFullScreenMode(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { BoardData *bd = BOARD(pwBoard)->board_data; GtkWindow *ptl = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(bd->table))); GtkWidget *pwHandle = gtk_widget_get_parent(pwToolbar); static gulong id; static int changedRP, changedDP; #if !defined(USE_GTKITEMFACTORY) GtkWidget *pmiRP = gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/RestorePanels"); GtkWidget *pmiDP = gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/DockPanels"); #else GtkWidget *pmiRP = gtk_item_factory_get_widget(pif, "/View/Restore panels"); GtkWidget *pmiDP = gtk_item_factory_get_widget(pif, "/View/Dock panels"); #endif #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Stop any 3d animations */ StopIdle3d(bd, bd->bd3d); } #endif #if !defined(USE_GTKITEMFACTORY) fFullScreen = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/FullScreen"))); #else fFullScreen = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(pif, "/View/Full screen"))); #endif if (fFullScreen) { if (!fullScreenOnStartup) GTKShowWarning(WARN_FULLSCREEN_EXIT, NULL); else fullScreenOnStartup = FALSE; bd->rd->fShowGameInfo = FALSE; if (pmiRP && gtk_widget_get_visible(pmiRP) && gtk_widget_is_sensitive(pmiRP)) changedRP = TRUE; if (pmiDP && gtk_widget_get_visible(pmiDP) && gtk_widget_is_sensitive(pmiDP)) changedDP = TRUE; /* Check if window is maximized */ { GdkWindowState state = gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(ptl))); int maxed = ((state & GDK_WINDOW_STATE_MAXIMIZED) == GDK_WINDOW_STATE_MAXIMIZED); SetFullscreenWindowSettings(ArePanelsShowing(), fShowIDs, maxed); } id = g_signal_connect(G_OBJECT(ptl), "key-press-event", G_CALLBACK(EndFullScreen), 0); gtk_widget_hide(GTK_WIDGET(bd->table)); gtk_widget_hide(GTK_WIDGET(bd->dice_area)); gtk_widget_hide(pwStatus); gtk_widget_hide(pwProgress); gtk_widget_hide(pwStop); fFullScreen = FALSE; DoHideAllPanels(FALSE); fFullScreen = TRUE; fShowIDs = FALSE; gtk_widget_hide(pwToolbar); gtk_widget_hide(pwHandle); gtk_window_fullscreen(ptl); gtk_window_set_decorated(ptl, FALSE); if (pmiRP) gtk_widget_set_sensitive(pmiRP, FALSE); if (pmiDP) gtk_widget_set_sensitive(pmiDP, FALSE); } else { bd->rd->fShowGameInfo = TRUE; gtk_widget_show(pwMenuBar); if (fToolbarShowing) { gtk_widget_show(pwToolbar); gtk_widget_show(pwHandle); } gtk_widget_show(GTK_WIDGET(bd->table)); #if defined(USE_BOARD3D) /* Only show 2d dice below board if in 2d */ if (display_is_2d(bd->rd)) #endif gtk_widget_show(GTK_WIDGET(bd->dice_area)); gtk_widget_show(pwStatus); gtk_widget_show(pwProgress); gtk_widget_show(pwStop); GetFullscreenWindowSettings(&showingPanels, &fShowIDs, &maximised); if (g_signal_handler_is_connected(G_OBJECT(ptl), id)) g_signal_handler_disconnect(G_OBJECT(ptl), id); gtk_window_unfullscreen(ptl); gtk_window_set_decorated(ptl, TRUE); if (showingPanels) { fFullScreen = TRUE; /* Avoid panel sizing code */ ShowAllPanels(NULL, 0, NULL); fFullScreen = FALSE; } if (changedRP) { gtk_widget_set_sensitive(pmiRP, TRUE); changedRP = FALSE; } if (changedDP) { gtk_widget_set_sensitive(pmiDP, TRUE); changedDP = FALSE; } } UpdateSetting(&fShowIDs); } extern void FullScreenMode(int state) { BoardData *bd = BOARD(pwBoard)->board_data; #if !defined(USE_GTKITEMFACTORY) GtkWidget *pw = gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/FullScreen"); #else GtkWidget *pw = gtk_item_factory_get_widget(pif, "/View/Full screen"); #endif if (gtk_widget_get_realized(bd->table)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pw), state); } void GetFullscreenWindowSettings(int *panels, int *ids, int *maxed) { *panels = showingPanels; *ids = showingIDs; *maxed = maximised; } static void FinishMove(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { int anMove[8]; char sz[FORMATEDMOVESIZE]; if (!GTKGetMove(anMove)) /* no valid move */ return; UserCommand(FormatMove(sz, msBoard(), anMove)); } typedef struct { evalcontext *pec; movefilter *pmf; GtkWidget *pwCubeful, *pwUsePrune, *pwDeterministic; GtkAdjustment *padjPlies, *padjNoise; int *pfOK; GtkWidget *pwOptionMenu; int fMoveFilter; GtkWidget *pwMoveFilter; } evalwidget; static void EvalGetValues(evalcontext * pec, evalwidget * pew) { pec->nPlies = (unsigned int) gtk_adjustment_get_value(pew->padjPlies); pec->fCubeful = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pew->pwCubeful)); pec->fUsePrune = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pew->pwUsePrune)); pec->rNoise = (float) gtk_adjustment_get_value(pew->padjNoise); pec->fDeterministic = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pew->pwDeterministic)); } static void EvalChanged(GtkWidget * UNUSED(pw), evalwidget * pew) { evalcontext ecCurrent; int fFound = FALSE; EvalGetValues(&ecCurrent, pew); /* update predefined settings menu */ for (int i = 0; i < NUM_SETTINGS; i++) { int fEval = !cmp_evalcontext(&aecSettings[i], &ecCurrent); int fMoveFilter = !aecSettings[i].nPlies || (!pew->fMoveFilter || equal_movefilters((movefilter(*)[MAX_FILTER_PLIES]) pew->pmf, aaamfMoveFilterSettings[aiSettingsMoveFilter[i]])); if (fEval && fMoveFilter) { /* current settings equal to a predefined setting */ gtk_combo_box_set_active(GTK_COMBO_BOX(pew->pwOptionMenu), i); fFound = TRUE; break; } } /* user defined setting */ if (!fFound) gtk_combo_box_set_active(GTK_COMBO_BOX(pew->pwOptionMenu), NUM_SETTINGS); if (pew->fMoveFilter) gtk_widget_set_sensitive(GTK_WIDGET(pew->pwMoveFilter), ecCurrent.nPlies); } static void EvalNoiseValueChanged(GtkAdjustment * padj, evalwidget * pew) { gtk_widget_set_sensitive(pew->pwDeterministic, gtk_adjustment_get_value(padj) != 0.0); EvalChanged(NULL, pew); } static void EvalPliesValueChanged(GtkAdjustment * padj, evalwidget * pew) { gtk_widget_set_sensitive(pew->pwUsePrune, gtk_adjustment_get_value(padj) > 0); EvalChanged(NULL, pew); } static void SettingsMenuActivate(GtkComboBox * box, evalwidget * pew) { evalcontext *pec; int iSelected; iSelected = gtk_combo_box_get_active(box); if (iSelected == NUM_SETTINGS) return; /* user defined */ /* set all widgets to predefined values */ pec = &aecSettings[iSelected]; gtk_adjustment_set_value(pew->padjPlies, pec->nPlies); gtk_adjustment_set_value(pew->padjNoise, pec->rNoise); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pew->pwUsePrune), pec->fUsePrune); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pew->pwCubeful), pec->fCubeful); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pew->pwDeterministic), pec->fDeterministic); if (pew->fMoveFilter) MoveFilterSetPredefined(pew->pwMoveFilter, aiSettingsMoveFilter[iSelected]); } /* * Create widget for displaying evaluation settings * */ static GtkWidget * EvalWidget(evalcontext * pec, movefilter * pmf, int *pfOK, const int fMoveFilter) { evalwidget *pew; GtkWidget *pwEval, *pw; GtkWidget *pwFrame, *pwFrame2; GtkWidget *pw2, *pw3; GtkWidget *pwev; int i; if (pfOK) *pfOK = FALSE; #if GTK_CHECK_VERSION(3,0,0) pwEval = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwEval = gtk_vbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pwEval), 8); pew = g_malloc(sizeof *pew); /* * Frame with prefined settings */ pwev = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwev), FALSE); gtk_container_add(GTK_CONTAINER(pwEval), pwev); pwFrame = gtk_frame_new(_("Predefined settings")); gtk_container_add(GTK_CONTAINER(pwev), pwFrame); #if GTK_CHECK_VERSION(3,0,0) pw2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); #else pw2 = gtk_vbox_new(FALSE, 8); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pw2); gtk_container_set_border_width(GTK_CONTAINER(pw2), 8); /* option menu with selection of predefined settings */ gtk_container_add(GTK_CONTAINER(pw2), gtk_label_new(_("Select a predefined setting:"))); gtk_widget_set_tooltip_text(pwev, _("Select a predefined setting, ranging from " "beginner's play to the 4ply setting.")); pew->pwOptionMenu = gtk_combo_box_text_new(); for (i = 0; i < NUM_SETTINGS; i++) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pew->pwOptionMenu), Q_(aszSettings[i])); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pew->pwOptionMenu), _("user defined")); g_signal_connect(G_OBJECT(pew->pwOptionMenu), "changed", G_CALLBACK(SettingsMenuActivate), pew); gtk_container_add(GTK_CONTAINER(pw2), pew->pwOptionMenu); /* * Frame with user settings */ pwFrame = gtk_frame_new(_("User defined settings")); gtk_container_add(GTK_CONTAINER(pwEval), pwFrame); #if GTK_CHECK_VERSION(3,0,0) pw2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); #else pw2 = gtk_vbox_new(FALSE, 8); #endif gtk_container_set_border_width(GTK_CONTAINER(pw2), 8); gtk_container_add(GTK_CONTAINER(pwFrame), pw2); /* lookahead */ pwev = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwev), FALSE); gtk_container_add(GTK_CONTAINER(pw2), pwev); gtk_widget_set_tooltip_text(pwev, _("Specify how many rolls GNU Backgammon should " "lookahead. Each ply costs approximately a factor " "of 21 in computational time. Also note that " "2-ply is equivalent to Snowie and XG's 3-ply setting.")); pwFrame2 = gtk_frame_new(_("Lookahead")); gtk_container_add(GTK_CONTAINER(pwev), pwFrame2); #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame2), pw); pew->padjPlies = GTK_ADJUSTMENT(gtk_adjustment_new(pec->nPlies, 0, 7, 1, 1, 0)); gtk_container_add(GTK_CONTAINER(pw), gtk_label_new(_("Plies:"))); gtk_container_add(GTK_CONTAINER(pw), gtk_spin_button_new(pew->padjPlies, 1, 0)); /* Use pruning neural nets */ pwFrame2 = gtk_frame_new(_("Pruning neural nets")); gtk_container_add(GTK_CONTAINER(pw2), pwFrame2); gtk_container_add(GTK_CONTAINER(pwFrame2), pew->pwUsePrune = gtk_check_button_new_with_label(_("Use neural net pruning"))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pew->pwUsePrune), pec->fUsePrune); gtk_widget_set_tooltip_text(pew->pwUsePrune, _("Instruct GNU Backgammon to use a set of neural networks " "just to prune away move candidates within a deeper ply search. " "This increases the speed considerably at a negligible cost in playing strength. " "It is recommended to enable this option.")); /* cubeful */ pwFrame2 = gtk_frame_new(_("Cubeful evaluations")); gtk_container_add(GTK_CONTAINER(pw2), pwFrame2); gtk_container_add(GTK_CONTAINER(pwFrame2), pew->pwCubeful = gtk_check_button_new_with_label(_("Cubeful chequer evaluation"))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pew->pwCubeful), pec->fCubeful); if (fMoveFilter) /* checker play */ gtk_widget_set_tooltip_text(pew->pwCubeful, _("Instruct GNU Backgammon to use cubeful " "evaluations, i.e., include the value of " "cube ownership in the evaluations. It is " "recommended to enable this option.")); else /* checker play */ gtk_widget_set_tooltip_text(pew->pwCubeful, _("GNU Backgammon will always perform " "cubeful evaluations for cube decisions. " "Disabling this option will make GNU Backgammon " "use cubeless evaluations in the interval nodes " "of higher ply evaluations. It is recommended " "to enable this option.")); /* noise */ pwev = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwev), FALSE); gtk_container_add(GTK_CONTAINER(pw2), pwev); gtk_widget_set_tooltip_text(pwev, _("You can use this option to introduce noise " "or errors in the evaluations. This is useful for " "introducing levels below 0-ply. The weaker levels " "(beginner to advanced) use this technique. " "The introduced noise can be " "deterministic, i.e., always the same noise for " "the same position, or it can be random.")); pwFrame2 = gtk_frame_new(_("Noise")); gtk_container_add(GTK_CONTAINER(pwev), pwFrame2); #if GTK_CHECK_VERSION(3,0,0) pw3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pw3 = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame2), pw3); pew->padjNoise = GTK_ADJUSTMENT(gtk_adjustment_new(pec->rNoise, 0, 1, 0.001, 0.001, 0.0)); #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pw3), pw); gtk_container_add(GTK_CONTAINER(pw), gtk_label_new(_("Noise:"))); gtk_container_add(GTK_CONTAINER(pw), gtk_spin_button_new(pew->padjNoise, 0.001, 3)); gtk_container_add(GTK_CONTAINER(pw3), pew->pwDeterministic = gtk_check_button_new_with_label(_("Deterministic noise"))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pew->pwDeterministic), pec->fDeterministic); /* misc data */ pew->fMoveFilter = fMoveFilter; pew->pec = pec; pew->pmf = pmf; pew->pfOK = pfOK; /* move filter */ if (fMoveFilter) { pew->pwMoveFilter = MoveFilterWidget(pmf, pfOK, G_CALLBACK(EvalChanged), pew); pwev = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwev), FALSE); gtk_container_add(GTK_CONTAINER(pwEval), pwev); gtk_container_add(GTK_CONTAINER(pwev), pew->pwMoveFilter); gtk_widget_set_tooltip_text(pwev, _("GNU Backgammon will evaluate all moves at " "0-ply. The move filter controls how many " "moves will be evaluated at higher plies. " "A \"smaller\" filter will be faster, but " "GNU Backgammon may not find the best move. " "Power users may set up their own filters " "by clicking on the [Modify] button.")); } else pew->pwMoveFilter = NULL; /* setup signals */ g_signal_connect(G_OBJECT(pew->padjPlies), "value-changed", G_CALLBACK(EvalPliesValueChanged), pew); EvalPliesValueChanged(pew->padjPlies, pew); g_signal_connect(G_OBJECT(pew->padjNoise), "value-changed", G_CALLBACK(EvalNoiseValueChanged), pew); EvalNoiseValueChanged(pew->padjNoise, pew); g_signal_connect(G_OBJECT(pew->pwDeterministic), "toggled", G_CALLBACK(EvalChanged), pew); g_signal_connect(G_OBJECT(pew->pwCubeful), "toggled", G_CALLBACK(EvalChanged), pew); g_signal_connect(G_OBJECT(pew->pwUsePrune), "toggled", G_CALLBACK(EvalChanged), pew); g_object_set_data_full(G_OBJECT(pwEval), "user_data", pew, g_free); return pwEval; } static void EvalOK(GtkWidget * pw, void *p) { GtkWidget *pwEval = GTK_WIDGET(p); evalwidget *pew = g_object_get_data(G_OBJECT(pwEval), "user_data"); if (pew->pfOK) *pew->pfOK = TRUE; EvalGetValues(pew->pec, pew); if (pew->pfOK) gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void SetEvalCommands(const char *szPrefix, evalcontext * pec, evalcontext * pecOrig) { char sz[256]; outputpostpone(); if (pec->nPlies != pecOrig->nPlies) { sprintf(sz, "%s plies %u", szPrefix, pec->nPlies); UserCommand(sz); } if (pec->fUsePrune != pecOrig->fUsePrune) { sprintf(sz, "%s prune %s", szPrefix, pec->fUsePrune ? "on" : "off"); UserCommand(sz); } if (pec->fCubeful != pecOrig->fCubeful) { sprintf(sz, "%s cubeful %s", szPrefix, pec->fCubeful ? "on" : "off"); UserCommand(sz); } if (pec->rNoise != pecOrig->rNoise) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; sprintf(sz, "%s noise %s", szPrefix, g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.3f", pec->rNoise)); UserCommand(sz); } if (pec->fDeterministic != pecOrig->fDeterministic) { sprintf(sz, "%s deterministic %s", szPrefix, pec->fDeterministic ? "on" : "off"); UserCommand(sz); } outputresume(); } static void DetailedAnalysisOK(GtkWidget * pw, AnalysisDetails * pDetails) { EvalOK(pDetails->pwChequer, pDetails->pwChequer); EvalOK(pDetails->pwCube, pDetails->pwCube); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static int EvalDefaultSetting(evalcontext * pec, movefilter * pmf) { /* Look for predefined settings */ for (int i = 0; i < NUM_SETTINGS; i++) { int fEval = !cmp_evalcontext(&aecSettings[i], pec); int fMoveFilter = !aecSettings[i].nPlies || (!pmf || equal_movefilters((movefilter(*)[MAX_FILTER_PLIES]) pmf, aaamfMoveFilterSettings [aiSettingsMoveFilter[i]])); if (fEval && fMoveFilter) return i; } return NUM_SETTINGS; } static void UpdateSummaryEvalMenuSetting(AnalysisDetails * pAnalDetails) { int chequerDefault = EvalDefaultSetting(pAnalDetails->esChequer, pAnalDetails->mfChequer); int cubeDefault = EvalDefaultSetting(pAnalDetails->esCube, pAnalDetails->mfCube); int setting = NUM_SETTINGS; if (chequerDefault == cubeDefault /* Special case as cube_supremo==cube_worldclass */ || (chequerDefault == SETTINGS_SUPREMO && cubeDefault == SETTINGS_WORLDCLASS)) setting = chequerDefault; setting -= (pAnalDetails->fWeakLevels ? 0 : SETTINGS_EXPERT); if (setting < 0) /* This combo box doesn't accept weak levels * but one of them was selected through user defined */ setting = NUM_SETTINGS - (pAnalDetails->fWeakLevels ? 0 : SETTINGS_EXPERT); gtk_combo_box_set_active(GTK_COMBO_BOX(pAnalDetails->pwOptionMenu), setting); } static void ShowDetailedAnalysis(GtkWidget * button, AnalysisDetails * pDetails) { GtkWidget *pwvbox, *pwFrame, *pwDialog, *hbox; pwDialog = GTKCreateDialog(pDetails->title, DT_INFO, button, DIALOG_FLAG_MODAL | DIALOG_FLAG_CLOSEBUTTON, G_CALLBACK(DetailedAnalysisOK), pDetails); #if GTK_CHECK_VERSION(3,0,0) hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hbox = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), hbox); pwFrame = gtk_frame_new(_("Chequer play")); gtk_box_pack_start(GTK_BOX(hbox), pwFrame, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); gtk_container_add(GTK_CONTAINER(pwFrame), pDetails->pwChequer = EvalWidget(pDetails->esChequer, pDetails->mfChequer, NULL, pDetails->mfChequer != NULL)); pwFrame = gtk_frame_new(_("Cube decisions")); gtk_box_pack_start(GTK_BOX(hbox), pwFrame, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwvbox); gtk_box_pack_start(GTK_BOX(pwvbox), pDetails->pwCube = EvalWidget(pDetails->esCube, (movefilter *) & pDetails->mfCube[9], NULL, pDetails->mfCube != NULL), FALSE, FALSE, 0); if (pDetails->cubeDisabled) gtk_widget_set_sensitive(pDetails->pwCube, FALSE); GTKRunDialog(pwDialog); UpdateSummaryEvalMenuSetting(pDetails); } static void SummaryMenuActivate(GtkComboBox * box, AnalysisDetails * pAnalDetails) { int selected = gtk_combo_box_get_active(box) + (pAnalDetails->fWeakLevels ? 0 : SETTINGS_EXPERT); if (selected == NUM_SETTINGS) return; /* user defined */ /* set eval settings to predefined values */ *pAnalDetails->esChequer = aecSettings[selected]; *pAnalDetails->esCube = aecSettings[selected]; if (pAnalDetails->mfChequer && aiSettingsMoveFilter[selected] >= 0) memcpy(pAnalDetails->mfChequer, aaamfMoveFilterSettings[aiSettingsMoveFilter[selected]], sizeof(aaamfMoveFilterSettings[aiSettingsMoveFilter[selected]])); if (pAnalDetails->mfCube && aiSettingsMoveFilter[selected] >= 0) memcpy(pAnalDetails->mfCube, aaamfMoveFilterSettings[aiSettingsMoveFilter[selected]], sizeof(aaamfMoveFilterSettings[aiSettingsMoveFilter[selected]])); } static GtkWidget * AddLevelSettings(GtkWidget * pwFrame, AnalysisDetails * pAnalDetails) { GtkWidget *vbox, *hbox, *pw2, *pwAdvanced, *vboxSpacer; int i; #if GTK_CHECK_VERSION(3,0,0) vboxSpacer = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vboxSpacer = gtk_vbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(vboxSpacer), 8); gtk_container_add(GTK_CONTAINER(pwFrame), vboxSpacer); #if GTK_CHECK_VERSION(3,0,0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(vboxSpacer), vbox); /* * Frame with prefined settings */ #if GTK_CHECK_VERSION(3,0,0) pw2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); #else pw2 = gtk_vbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(vbox), pw2, FALSE, FALSE, 0); /* option menu with selection of predefined settings */ pAnalDetails->pwOptionMenu = gtk_combo_box_text_new(); for (i = (pAnalDetails->fWeakLevels ? 0 : SETTINGS_EXPERT); i < NUM_SETTINGS; i++) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pAnalDetails->pwOptionMenu), Q_(aszSettings[i])); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pAnalDetails->pwOptionMenu), _("user defined")); g_signal_connect(G_OBJECT(pAnalDetails->pwOptionMenu), "changed", G_CALLBACK(SummaryMenuActivate), pAnalDetails); gtk_container_add(GTK_CONTAINER(pw2), pAnalDetails->pwOptionMenu); pwAdvanced = gtk_button_new_with_label(_("Advanced Settings...")); g_signal_connect(G_OBJECT(pwAdvanced), "clicked", G_CALLBACK(ShowDetailedAnalysis), (void *) pAnalDetails); #if GTK_CHECK_VERSION(3,0,0) hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hbox), pwAdvanced, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 4); UpdateSummaryEvalMenuSetting(pAnalDetails); return vboxSpacer; /* Container */ } #define CHECKUPDATE(button,flag,string) \ n = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( (button) ) ); \ if ( n != (flag)){ \ sprintf(sz, (string), n ? "on" : "off"); \ UserCommand(sz); \ } #define ADJUSTSKILLUPDATE(button,flag,string) \ if( gtk_adjustment_get_value ( paw->apadjSkill[(button)] ) != (gdouble)arSkillLevel[(flag)] ) \ { \ gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; \ sprintf(sz, (string), g_ascii_formatd( buf, G_ASCII_DTOSTR_BUF_SIZE, \ "%0.3f", (gdouble) gtk_adjustment_get_value( paw->apadjSkill[(button)] ) ) ); \ UserCommand(sz); \ } #define ADJUSTLUCKUPDATE(button,flag,string) \ if( gtk_adjustment_get_value( paw->apadjLuck[(button)] ) != (gdouble)arLuckLevel[(flag)] ) \ { \ gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; \ sprintf(sz, (string), g_ascii_formatd( buf, G_ASCII_DTOSTR_BUF_SIZE, \ "%0.3f", (gdouble) gtk_adjustment_get_value( paw->apadjLuck[(button)] ) ) ); \ UserCommand(sz); \ } static void AnalysisOK(GtkWidget * pw, analysiswidget * paw) { char sz[128]; int n, i; gtk_widget_hide(gtk_widget_get_toplevel(pw)); CHECKUPDATE(paw->pwMoves, fAnalyseMove, "set analysis moves %s") CHECKUPDATE(paw->pwCube, fAnalyseCube, "set analysis cube %s") CHECKUPDATE(paw->pwLuck, fAnalyseDice, "set analysis luck %s") CHECKUPDATE(paw->apwAnalysePlayers[0], afAnalysePlayers[0], "set analysis player 0 analyse %s") CHECKUPDATE(paw->apwAnalysePlayers[1], afAnalysePlayers[1], "set analysis player 1 analyse %s") CHECKUPDATE(paw->pwAutoDB, fAutoDB, "set automatic db %s") CHECKUPDATE(paw->pwBackgroundAnalysis, fBackgroundAnalysis, "set analysis background %s") ADJUSTSKILLUPDATE(0, SKILL_DOUBTFUL, "set analysis threshold doubtful %s") ADJUSTSKILLUPDATE(1, SKILL_BAD, "set analysis threshold bad %s") ADJUSTSKILLUPDATE(2, SKILL_VERYBAD, "set analysis threshold verybad %s") ADJUSTLUCKUPDATE(0, LUCK_VERYGOOD, "set analysis threshold verylucky %s") ADJUSTLUCKUPDATE(1, LUCK_GOOD, "set analysis threshold lucky %s") ADJUSTLUCKUPDATE(2, LUCK_BAD, "set analysis threshold unlucky %s") ADJUSTLUCKUPDATE(3, LUCK_VERYBAD, "set analysis threshold veryunlucky %s") for (i = 0; i < NUM_AnalyzeFileSettings; ++i) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwAnalyzeFileSetting[i])) && AnalyzeFileSettingDef != (analyzeFileSetting) i) { // g_message("new def: %d->%d\n", AnalyzeFileSettingDef,i); sprintf(sz, "set analysis filesetting %s", aszAnalyzeFileSettingCommands[i]); UserCommand(sz); break; } /* Score Map */ for (i = 0; i < NUM_PLY; ++i) {if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapPly[i])) && scoreMapPlyDefault != (scoreMapPly) i) { sprintf(sz, "set scoremapply %s", aszScoreMapPlyCommands[i]); UserCommand(sz); break; } } for (i = 0; i < NUM_MATCH_LENGTH; ++i){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapMatchLength[i])) && scoreMapMatchLengthDefIdx != (scoreMapMatchLength) i) { sprintf(sz, "set scoremapmatchlength %s", aszScoreMapMatchLengthCommands[i]); UserCommand(sz); break; } } for (i = 0; i < NUM_LABEL; ++i) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapLabel[i])) && scoreMapLabelDef != (scoreMapLabel) i) { sprintf(sz, "set scoremaplabel %s", aszScoreMapLabelCommands[i]); UserCommand(sz); break; } for (i = 0; i < NUM_JACOBY; ++i) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapJacoby[i])) && scoreMapJacobyDef != (scoreMapJacoby) i) { sprintf(sz, "set scoremapjacoby %s", aszScoreMapJacobyCommands[i]); UserCommand(sz); break; }} for (i = 0; i < NUM_CUBEDISP; ++i) {if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapCubeEquityDisplay[i])) && scoreMapCubeEquityDisplayDef != (scoreMapCubeEquityDisplay) i) { sprintf(sz, "set scoremapcubeequitydisplay %s", aszScoreMapCubeEquityDisplayCommands[i]); UserCommand(sz); break; } } for (i = 0; i < NUM_MOVEDISP; ++i) {if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapMoveEquityDisplay[i])) && scoreMapMoveEquityDisplayDef != (scoreMapMoveEquityDisplay) i) { sprintf(sz, "set scoremapmoveequitydisplay %s", aszScoreMapMoveEquityDisplayCommands[i]); UserCommand(sz); break; }} for (i = 0; i < NUM_COLOUR; ++i) {if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapColour[i])) && scoreMapColourDef != (scoreMapColour) i) { sprintf(sz, "set scoremapcolour %s", aszScoreMapColourCommands[i]); UserCommand(sz); break; }} for (i = 0; i < NUM_LAYOUT; ++i) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapLayout[i])) && scoreMapLayoutDef != (scoreMapLayout) i) { sprintf(sz, "set scoremaplayout %s", aszScoreMapLayoutCommands[i]); UserCommand(sz); break; }} /* Group output in one batch */ outputpostpone(); SetEvalCommands("set analysis chequerplay eval", &paw->esChequer.ec, &esAnalysisChequer.ec); SetMovefilterCommands("set analysis movefilter", paw->aamf, aamfAnalysis); SetEvalCommands("set analysis cubedecision eval", &paw->esCube.ec, &esAnalysisCube.ec); n = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->pwHintSame)); if (n != fEvalSameAsAnalysis) { sprintf(sz, "set eval sameasanalysis %s", n ? "yes" : "no"); UserCommand(sz); } if (!fEvalSameAsAnalysis) { SetEvalCommands("set evaluation chequer eval", &paw->esEvalChequer.ec, &GetEvalChequer()->ec); SetMovefilterCommands("set evaluation movefilter", paw->aaEvalmf, *GetEvalMoveFilter()); SetEvalCommands("set evaluation cubedecision eval", &paw->esEvalCube.ec, &GetEvalCube()->ec); } UserCommand("save settings"); outputresume(); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } #undef CHECKUPDATE #undef ADJUSTSKILLUPDATE #undef ADJUSTLUCKUPDATE static void AnalysisSet(analysiswidget * paw) { int i; //char sz[128]; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->pwMoves), fAnalyseMove); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->pwCube), fAnalyseCube); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->pwLuck), fAnalyseDice); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->pwAutoDB), fAutoDB); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->pwBackgroundAnalysis), fBackgroundAnalysis); for (i = 0; i < 2; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwAnalysePlayers[i]), afAnalysePlayers[i]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjSkill[0]), arSkillLevel[SKILL_DOUBTFUL]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjSkill[1]), arSkillLevel[SKILL_BAD]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjSkill[2]), arSkillLevel[SKILL_VERYBAD]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjLuck[0]), arLuckLevel[LUCK_VERYGOOD]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjLuck[1]), arLuckLevel[LUCK_GOOD]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjLuck[2]), arLuckLevel[LUCK_BAD]); gtk_adjustment_set_value(GTK_ADJUSTMENT(paw->apadjLuck[3]), arLuckLevel[LUCK_VERYBAD]); // g_message("initial def: %d\n", AnalyzeFileSettingDef); for (i = 0; i < NUM_AnalyzeFileSettings; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwAnalyzeFileSetting[i]), AnalyzeFileSettingDef == (analyzeFileSetting) i); /*Score Map*/ for (i = 0; i < NUM_PLY; ++i){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapPly[i]), scoreMapPlyDefault == (scoreMapPly)i); } for (i = 0; i < NUM_MATCH_LENGTH; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapMatchLength[i]), scoreMapMatchLengthDefIdx == (scoreMapMatchLength)i); for (i = 0; i < NUM_LABEL; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapLabel[i]), scoreMapLabelDef == (scoreMapLabel) i); for (i = 0; i < NUM_JACOBY; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapJacoby[i]), scoreMapJacobyDef == (scoreMapJacoby) i); for (i = 0; i < NUM_CUBEDISP; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapCubeEquityDisplay[i]), scoreMapCubeEquityDisplayDef == (scoreMapCubeEquityDisplay) i); for (i = 0; i < NUM_MOVEDISP; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapMoveEquityDisplay[i]), scoreMapMoveEquityDisplayDef == (scoreMapMoveEquityDisplay) i); for (i = 0; i < NUM_COLOUR; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapColour[i]), scoreMapColourDef == (scoreMapColour) i); for (i = 0; i < NUM_LAYOUT; ++i) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->apwScoreMapLayout[i]), scoreMapLayoutDef == (scoreMapLayout) i); } static void HintSameToggled(GtkWidget * UNUSED(notused), analysiswidget * paw) { int active = !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->pwHintSame))); gtk_widget_set_sensitive(paw->pwCubeSummary, active); } static AnalysisDetails * CreateEvalSettings(GtkWidget * pwParent, const char *title, evalcontext * pechequer, movefilter * pmfchequer, evalcontext * pecube, movefilter * pmfcube, int fWeakLevels) { AnalysisDetails *pAnalDetail = g_malloc(sizeof(AnalysisDetails)); pAnalDetail->title = title; pAnalDetail->esChequer = pechequer; pAnalDetail->mfChequer = pmfchequer; pAnalDetail->esCube = pecube; pAnalDetail->mfCube = pmfcube; pAnalDetail->cubeDisabled = FALSE; pAnalDetail->fWeakLevels = fWeakLevels; pAnalDetail->pwSettingWidgets = AddLevelSettings(pwParent, pAnalDetail); return pAnalDetail; } //Module to add text extern void AddText(GtkWidget* pwBox, char* Text) { GtkRcStyle * ps = gtk_rc_style_new(); GtkWidget * pwText = gtk_label_new(Text); GtkWidget * pwHBox; #if GTK_CHECK_VERSION(3,0,0) pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), pwHBox, FALSE, FALSE, 4); ps->font_desc = pango_font_description_new(); //pango_font_description_set_family_static(ps->font_desc, "serif"); //pango_font_description_set_size(ps->font_desc, 8 * PANGO_SCALE); gtk_widget_modify_style(pwText, ps); g_object_unref(ps); gtk_box_pack_start(GTK_BOX(pwHBox), pwText, FALSE, FALSE, 0); } static void BuildRadioButtons(GtkWidget* pwvbox, GtkWidget* apwScoreMapFrame[], const char* frameTitle, const char* frameToolTip, const char* labelStrings[], int labelStringsLen, int toggleDefault) { /* Sub-function to build a new box with a new set of labels, with a whole bunch of needed parameters - pwvbox ---------- | --title----------| | -- pwh2 -------- | | |text | options| | | ---------------- | -------------------- */ int* pi; int i; // GtkWidget* pwFrame; GtkWidget* pwh2; AddText(pwvbox, _(frameTitle)); // pwFrame = gtk_frame_new(_(frameTitle)); // gtk_box_pack_start(GTK_BOX(pwScoreMapBox), pwFrame, vAlignExpand, FALSE, 0); // gtk_widget_set_tooltip_text(pwFrame, _(frameToolTip)); // gtk_widget_set_sensitive(pwFrame, sensitive); #if GTK_CHECK_VERSION(3,0,0) pwh2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwh2 = gtk_hbox_new(FALSE, 8); #endif // gtk_container_add(GTK_CONTAINER(pwFrame), pwh2); gtk_box_pack_start(GTK_BOX(pwvbox), pwh2, FALSE, FALSE, 0); AddText(pwh2, (" ")); for (i = 0; i < labelStringsLen; i++) { if (i == 0) apwScoreMapFrame[0] = gtk_radio_button_new_with_label(NULL, _(labelStrings[0])); // First radio button else apwScoreMapFrame[i] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(apwScoreMapFrame[0]), _(labelStrings[i])); // Associate this to the other radio buttons gtk_box_pack_start(GTK_BOX(pwh2), apwScoreMapFrame[i], FALSE, FALSE, 0); gtk_widget_set_tooltip_text(apwScoreMapFrame[i], _(frameToolTip)); pi = (int*)g_malloc(sizeof(int)); *pi = (int)i; // here use "=(int)labelEnum[i];" and put it in the input of the function if needed, while // defining sth like " int labelEnum[] = { NUMBERS, ENGLISH, BOTH };" before calling the function g_object_set_data_full(G_OBJECT(apwScoreMapFrame[i]), "user_data", pi, g_free); if (toggleDefault == i) // again use "if (DefaultLabel==labelEnum[i])" if needed gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apwScoreMapFrame[i]), 1); //we set this to toggle it on in case it's the default option //g_signal_connect(G_OBJECT(pw), "toggled", G_CALLBACK((*functionWhenToggled)), psm); }} static void append_scoremap_options(analysiswidget* paw) { GtkWidget* pwvbox; GtkWidget* pwFrame; GtkWidget* pwv; #if !GTK_CHECK_VERSION(3,0,0) GtkWidget* pwp; #endif //BoardData* bd = BOARD(pwBoard)->board_data; int vAlignExpand = FALSE; // set to true to expand vertically the group of frames rather than packing them to the top //int evalPlies = 3; /* Display options */ #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_widget_set_halign(pwvbox, GTK_ALIGN_START); gtk_widget_set_valign(pwvbox, GTK_ALIGN_START); gtk_container_set_border_width(GTK_CONTAINER(pwvbox), 4); gtk_notebook_append_page(GTK_NOTEBOOK(paw->pwNoteBook), pwvbox, gtk_label_new(_("ScoreMap"))); #else pwvbox = gtk_vbox_new(FALSE, 0); pwp = gtk_alignment_new(0, 0, 0, 0); gtk_container_set_border_width(GTK_CONTAINER(pwp), 4); gtk_notebook_append_page(GTK_NOTEBOOK(paw->pwNoteBook), pwp, gtk_label_new(_("ScoreMap"))); gtk_container_add(GTK_CONTAINER(pwp), pwvbox); #endif // #if GTK_CHECK_VERSION(3,0,0) // pwScoreMapBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); // #else // pwScoreMapBox = gtk_hbox_new(FALSE, 0); // #endif // gtk_box_pack_start(GTK_BOX(pwvbox), pwScoreMapBox, FALSE, FALSE, 0); // AddText(pwvbox, _(frameTitle)); pwFrame = gtk_frame_new(_("Default ScoreMap settings")); gtk_box_pack_start(GTK_BOX(pwvbox), pwFrame, vAlignExpand, FALSE, 0); gtk_widget_set_tooltip_text(pwFrame, _("Select the settings with which to initialize each new ScoreMap window")); gtk_widget_set_sensitive(pwFrame, TRUE); #if GTK_CHECK_VERSION(3,0,0) pwv = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); #else pwv = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwv); BuildRadioButtons(pwv, paw->apwScoreMapPly,_("Evaluation strength:"), _("Select the ply at which to evaluate the equity at each score"), aszScoreMapPly, NUM_PLY, scoreMapPlyDefault); BuildRadioButtons(pwv, paw->apwScoreMapMatchLength,_("Simulated match length:"), _("Select the default match length for which to draw the ScoreMap; a variable length picks a length of 3 for current real short matches, 7 for long, and 5 otherwise."), aszScoreMapMatchLength, NUM_MATCH_LENGTH, scoreMapMatchLengthDefIdx); BuildRadioButtons(pwv, paw->apwScoreMapJacoby,_("Money-play analysis:"), _("Select the default Jacoby option in the money play analysis of the top-left ScoreMap square"), aszScoreMapJacoby, NUM_JACOBY, scoreMapJacobyDef); BuildRadioButtons(pwv, paw->apwScoreMapCubeEquityDisplay,_("Cube equity display:"), _("Select the default equity text to display in the squares of the cube ScoreMap"), aszScoreMapCubeEquityDisplay, NUM_CUBEDISP, scoreMapCubeEquityDisplayDef); BuildRadioButtons(pwv, paw->apwScoreMapMoveEquityDisplay,_("Move equity display:"), _("Select the default equity text to display in the squares of the move ScoreMap"), aszScoreMapMoveEquityDisplay, NUM_MOVEDISP, scoreMapMoveEquityDisplayDef); BuildRadioButtons(pwv, paw->apwScoreMapColour,_("In cube ScoreMaps, colour by:"), _("Select what equity to use when deciding to colour the cube ScoreMap"), aszScoreMapColour, NUM_COLOUR, scoreMapColourDef); BuildRadioButtons(pwv, paw->apwScoreMapLabel,_("Axis orientation:"), _("Select how to orient the ScoreMap axes by default"), aszScoreMapLabel, NUM_LABEL, scoreMapLabelDef); BuildRadioButtons(pwv, paw->apwScoreMapLayout,_("Option pane location:"), _("Decide where to place the options with respect to the ScoreMap table"), aszScoreMapLayout, NUM_LAYOUT, scoreMapLayoutDef); } static void append_analysis_options(analysiswidget * paw) { const char *aszSkillLabel[3] = { N_("Doubtful:"), N_("Bad:"), N_("Very bad:") }; const char *aszLuckLabel[4] = { N_("Very lucky:"), N_("Lucky:"), N_("Unlucky:"), N_("Very unlucky:") }; int i; // AnalysisDetails *pAnalDetailSettings1,*pAnalDetailSettings2; GtkWidget *pwPage, *pwFrame, *pwLabel, *pwSpin; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwGrid; #else GtkWidget *pwTable; GtkWidget* pwp; #endif GtkWidget *hboxTop, *hboxMid, *hboxBottom, *vbox1, *vbox2, *vbox3, *hbox, *pwvbox; memcpy(&paw->esCube, &esAnalysisCube, sizeof(paw->esCube)); memcpy(&paw->esChequer, &esAnalysisChequer, sizeof(paw->esChequer)); memcpy(&paw->aamf, aamfAnalysis, sizeof(paw->aamf)); memcpy(&paw->esEvalChequer, &esEvalChequer, sizeof(paw->esEvalChequer)); memcpy(&paw->esEvalCube, &esEvalCube, sizeof(paw->esEvalCube)); memcpy(&paw->aaEvalmf, aamfEval, sizeof(paw->aaEvalmf)); /* //Older version: memcpy(&aw.esCube, &esAnalysisCube, sizeof(aw.esCube)); memcpy(&aw.esChequer, &esAnalysisChequer, sizeof(aw.esChequer)); memcpy(&aw.aamf, aamfAnalysis, sizeof(aw.aamf)); memcpy(&aw.esEvalChequer, &esEvalChequer, sizeof esEvalChequer); memcpy(&aw.esEvalCube, &esEvalCube, sizeof esEvalCube); memcpy(aw.aaEvalmf, aamfEval, sizeof(aamfEval)); */ #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_widget_set_halign(pwvbox, GTK_ALIGN_START); gtk_widget_set_valign(pwvbox, GTK_ALIGN_START); gtk_container_set_border_width(GTK_CONTAINER(pwvbox), 4); gtk_notebook_append_page(GTK_NOTEBOOK(paw->pwNoteBook), pwvbox, gtk_label_new(_("Analysis"))); #else pwvbox = gtk_vbox_new(FALSE, 0); pwp = gtk_alignment_new(0, 0, 0, 0); gtk_container_set_border_width(GTK_CONTAINER(pwp), 4); gtk_notebook_append_page(GTK_NOTEBOOK(paw->pwNoteBook), pwp, gtk_label_new(_("Analysis"))); gtk_container_add(GTK_CONTAINER(pwp), pwvbox); #endif #if GTK_CHECK_VERSION(3,0,0) pwPage = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); #else pwPage = gtk_hbox_new(FALSE, 6); #endif gtk_container_set_border_width(GTK_CONTAINER(pwPage), 8); gtk_box_pack_start(GTK_BOX(pwvbox), pwPage, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox1 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwPage), vbox1, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) hboxTop = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hboxTop = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(vbox1), hboxTop, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) hboxMid = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); hboxBottom = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hboxMid = gtk_hbox_new(FALSE, 0); hboxBottom = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(vbox1), hboxMid, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pwvbox), hboxBottom, TRUE, TRUE, 0); pwFrame = gtk_frame_new(_("Analysis")); gtk_box_pack_start(GTK_BOX(hboxTop), pwFrame, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), vbox2); paw->pwMoves = gtk_check_button_new_with_label(_("Chequer play")); gtk_box_pack_start(GTK_BOX(vbox2), paw->pwMoves, FALSE, FALSE, 0); paw->pwCube = gtk_check_button_new_with_label(_("Cube decisions")); gtk_box_pack_start(GTK_BOX(vbox2), paw->pwCube, FALSE, FALSE, 0); paw->pwLuck = gtk_check_button_new_with_label(_("Luck")); gtk_box_pack_start(GTK_BOX(vbox2), paw->pwLuck, FALSE, FALSE, 0); for (i = 0; i < 2; ++i) { gchar *sz = g_strdup_printf(_("Analyse player %s"), ap[i].szName); paw->apwAnalysePlayers[i] = gtk_check_button_new_with_label(sz); gtk_box_pack_start(GTK_BOX(vbox2), paw->apwAnalysePlayers[i], FALSE, FALSE, 0); g_free(sz); } pwFrame = gtk_frame_new(_("Skill thresholds")); gtk_box_pack_start(GTK_BOX(hboxMid), pwFrame, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) pwGrid = gtk_grid_new(); gtk_container_add(GTK_CONTAINER(pwFrame), pwGrid); #else pwTable = gtk_table_new(5, 2, FALSE); gtk_container_add(GTK_CONTAINER(pwFrame), pwTable); #endif for (i = 0; i < 3; i++) { pwLabel = gtk_label_new(gettext(aszSkillLabel[i])); gtk_label_set_justify(GTK_LABEL(pwLabel), GTK_JUSTIFY_RIGHT); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 0, i, 1, 1); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 0, 1, i, i + 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); #endif } for (i = 0; i < 3; i++) { paw->apadjSkill[i] = GTK_ADJUSTMENT(gtk_adjustment_new(1, 0, 1, 0.01, 0.05, 0)); pwSpin = gtk_spin_button_new(GTK_ADJUSTMENT(paw->apadjSkill[i]), 1, 3); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pwSpin, 1, i, 1, 1); gtk_widget_set_hexpand(pwSpin, TRUE); #else gtk_table_attach(GTK_TABLE(pwTable), pwSpin, 1, 2, i, i + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); #endif gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(pwSpin), TRUE); } pwFrame = gtk_frame_new(_("Luck thresholds")); gtk_box_pack_start(GTK_BOX(hboxMid), pwFrame, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) pwGrid = gtk_grid_new(); gtk_container_add(GTK_CONTAINER(pwFrame), pwGrid); #else pwTable = gtk_table_new(4, 2, FALSE); gtk_container_add(GTK_CONTAINER(pwFrame), pwTable); #endif for (i = 0; i < 4; i++) { pwLabel = gtk_label_new(gettext(aszLuckLabel[i])); gtk_label_set_justify(GTK_LABEL(pwLabel), GTK_JUSTIFY_RIGHT); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwGrid), pwLabel, 0, i, 1, 1); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pwLabel, 0, 1, i, i + 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); #endif } for (i = 0; i < 4; i++) { paw->apadjLuck[i] = GTK_ADJUSTMENT(gtk_adjustment_new(1, 0, 1, 0.01, 0.05, 0)); pwSpin = gtk_spin_button_new(GTK_ADJUSTMENT(paw->apadjLuck[i]), 1, 2); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pwSpin, 1, i, 1, 1); gtk_widget_set_hexpand(pwSpin, TRUE); #else gtk_table_attach(GTK_TABLE(pwTable), pwSpin, 1, 2, i, i + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); #endif gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(pwSpin), TRUE); } pwFrame = gtk_frame_new(_("Analysis Level")); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox1 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hboxTop), vbox1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), pwFrame, FALSE, FALSE, 0); /*giving a name to be able to g_free it later*/ paw->pAnalDetailSettings1 = CreateEvalSettings(pwFrame, _("Analysis settings"), &paw->esChequer.ec, (movefilter *) &paw->aamf, &paw->esCube.ec, NULL, FALSE); // pAnalDetailSettings1 = CreateEvalSettings(pwFrame, _("Analysis settings"), // &aw.esChequer.ec, (movefilter *) & aw.aamf, &aw.esCube.ec, NULL, FALSE); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwPage), gtk_separator_new(GTK_ORIENTATION_VERTICAL), TRUE, TRUE, 0); #else gtk_box_pack_start(GTK_BOX(pwPage), gtk_vseparator_new(), TRUE, TRUE, 0); #endif pwFrame = gtk_frame_new(_("Eval Hint/Tutor Level")); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(vbox2), pwFrame, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwPage), vbox2, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox1 = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), vbox1); paw->pwHintSame = gtk_check_button_new_with_label(_("Same as analysis")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paw->pwHintSame), fEvalSameAsAnalysis); g_signal_connect(G_OBJECT(paw->pwHintSame), "toggled", G_CALLBACK(HintSameToggled), paw); #if GTK_CHECK_VERSION(3,0,0) hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hbox), paw->pwHintSame, FALSE, FALSE, 8); gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); paw->pAnalDetailSettings2 = CreateEvalSettings(vbox1, _("Hint/Tutor settings"), &paw->esEvalChequer.ec, (movefilter *) &paw->aaEvalmf, &paw->esEvalCube.ec, NULL, FALSE); paw->pwCubeSummary = paw->pAnalDetailSettings2->pwSettingWidgets; //gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwPage); //AnalysisSet(paw); gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(paw->pwHintSame)); HintSameToggled(NULL, paw); #if GTK_CHECK_VERSION(3,0,0) vbox3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); #else vbox3 = gtk_vbox_new(FALSE, 0); //gtk_vbox_new (gboolean homogeneous, gint spacing); #endif gtk_box_pack_start(GTK_BOX(hboxBottom), vbox3, TRUE, TRUE, 0); paw->pwAutoDB= gtk_check_button_new_with_label(_("Automatically add analysis to database")); gtk_box_pack_start(GTK_BOX(vbox3), paw->pwAutoDB, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(paw->pwAutoDB, _("Whenever the analysis of a game or match is complete, automatically " "add it to the database. The database needs to have been defined in " "Settings -> Options -> Database")); paw->pwBackgroundAnalysis= gtk_check_button_new_with_label(_("Allow background analysis (experimental) ")); gtk_box_pack_start(GTK_BOX(vbox3), paw->pwBackgroundAnalysis, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(paw->pwBackgroundAnalysis, _("Allow browsing a match and its early analysis results while " "analysis is still running in the background. Some features may be " "disabled until the analysis is over.")); BuildRadioButtons(vbox3, paw->apwAnalyzeFileSetting, _("Select the default file analysis settings (hover for details):"), _("- Batch analysis can analyze several files, but does not allow browsing the results at the same time\n " "- Single-file analysis can only analyze one file, but can work in the background. \n" "- Smart analysis will open the latest file in the most recently opened folder and/or the default import " "folder, then run the single-file analysis."), aszAnalyzeFileSetting, NUM_AnalyzeFileSettings, AnalyzeFileSettingDef); // BuildRadioButtons(vbox3, paw->apwAnalyzeFileSetting, _("Select:"), _("- Baanalysis."), aszAnalyzeFileSetting, NUM_AnalyzeFileSettings, AnalyzeFileSettingDef); // g_free(pAnalDetailSettings2); //<- not sure where to put it // g_free(pAnalDetailSettings1); } static GtkWidget * AnalysisPages(analysiswidget * paw) { paw->pwNoteBook = gtk_notebook_new(); gtk_container_set_border_width(GTK_CONTAINER(paw->pwNoteBook), 8); append_analysis_options(paw); append_scoremap_options(paw); AnalysisSet(paw); return paw->pwNoteBook; } static void AnalysisPageChange(GtkNotebook * UNUSED(notebook), gpointer * UNUSED(page), gint UNUSED(tabNumber), gpointer UNUSED(data)) { // if (tabNumber == relPage && !relPageActivated) { // RelationalOptionsShown(); // relPageActivated = TRUE; // } } extern void SetAnalysis(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GtkWidget *pwDialog, *pwAnalysisSettings; analysiswidget aw; // AnalysisDetails *pAnalDetailSettings1 = NULL; // AnalysisDetails *pAnalDetailSettings2 = NULL; pwDialog = GTKCreateDialog(_("GNU Backgammon - Analysis Settings"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(AnalysisOK), &aw); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwAnalysisSettings = AnalysisPages(&aw)); g_signal_connect(G_OBJECT(pwAnalysisSettings), "switch-page", G_CALLBACK(AnalysisPageChange), NULL); AnalysisSet(&aw); GTKRunDialog(pwDialog); g_free(aw.pAnalDetailSettings1); g_free(aw.pAnalDetailSettings2); } typedef struct { int *pfOK; player *ap; GtkWidget *apwName[2], *apwRadio[2][3], *apwSocket[2], *apwExternal[2]; char aszSocket[2][128]; evalsetup esChequer[2]; evalsetup esCube[2]; AnalysisDetails *pLevelSettings[2]; } playerswidget; static void PlayerTypeToggled(GtkWidget * UNUSED(pw), playerswidget * ppw) { int i; for (i = 0; i < 2; i++) { gtk_widget_set_sensitive(ppw->pLevelSettings[i]->pwSettingWidgets, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ppw->apwRadio[i][1]))); gtk_widget_set_sensitive(ppw->apwExternal[i], gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ppw->apwRadio[i][2]))); } } static GtkWidget * PlayersPage(playerswidget * ppw, int i, const char *title) { GtkWidget *pw, *pwFrame, *pwVBox; pwFrame = gtk_frame_new(title); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 4); #if GTK_CHECK_VERSION(3,0,0) pwVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwVBox); #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pw), 4); gtk_container_add(GTK_CONTAINER(pwVBox), pw); gtk_container_add(GTK_CONTAINER(pw), gtk_label_new(_("Default Name:"))); gtk_container_add(GTK_CONTAINER(pw), ppw->apwName[i] = gtk_entry_new()); gtk_entry_set_text(GTK_ENTRY(ppw->apwName[i]), (ppw->ap[i].szName)); gtk_container_add(GTK_CONTAINER(pwVBox), ppw->apwRadio[i][0] = gtk_radio_button_new_with_label(NULL, _("Human"))); gtk_container_add(GTK_CONTAINER(pwVBox), ppw->apwRadio[i][1] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(ppw->apwRadio[i][0]), _("GNU Backgammon"))); memcpy(&ppw->esCube[i], &ppw->ap[i].esChequer.ec, sizeof(ppw->esCube[i])); memcpy(&ppw->esChequer[i], &ppw->ap[i].esCube.ec, sizeof(ppw->esChequer[i])); ppw->pLevelSettings[i] = CreateEvalSettings(pwVBox, _("GNU Backgammon settings"), &ppw->ap[i].esChequer.ec, (movefilter *) ppw->ap[i].aamf, &ppw->ap[i].esCube.ec, NULL, TRUE); gtk_container_add(GTK_CONTAINER(pwVBox), ppw->apwRadio[i][2] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(ppw->apwRadio[i][0]), _("External"))); #if GTK_CHECK_VERSION(3,0,0) ppw->apwExternal[i] = pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else ppw->apwExternal[i] = pw = gtk_hbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pw), 4); gtk_widget_set_sensitive(pw, ap[i].pt == PLAYER_EXTERNAL); gtk_container_add(GTK_CONTAINER(pwVBox), pw); gtk_container_add(GTK_CONTAINER(pw), gtk_label_new(_("Socket:"))); gtk_container_add(GTK_CONTAINER(pw), ppw->apwSocket[i] = gtk_entry_new()); if (ap[i].szSocket) gtk_entry_set_text(GTK_ENTRY(ppw->apwSocket[i]), ap[i].szSocket); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ppw->apwRadio[i][ap[i].pt]), TRUE); g_signal_connect(G_OBJECT(ppw->apwRadio[i][1]), "toggled", G_CALLBACK(PlayerTypeToggled), ppw); g_signal_connect(G_OBJECT(ppw->apwRadio[i][2]), "toggled", G_CALLBACK(PlayerTypeToggled), ppw); return pwFrame; } static void PlayersOK(GtkWidget * pw, playerswidget * pplw) { int i; playertype j; *pplw->pfOK = TRUE; for (i = 0; i < 2; i++) { g_strlcpy(pplw->ap[i].szName, gtk_entry_get_text(GTK_ENTRY(pplw->apwName[i])), MAX_NAME_LEN); for (j = (playertype) 0; j < (playertype) 3; j++) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pplw->apwRadio[i][j]))) { pplw->ap[i].pt = j; break; } g_strlcpy(pplw->aszSocket[i], gtk_entry_get_text(GTK_ENTRY(pplw->apwSocket[i])), 128); } gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void SetPlayers(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GtkWidget *pwDialog, *pwHBox; int fOK = FALSE; player apTemp[2]; playerswidget plw; memcpy(apTemp, ap, sizeof ap); plw.ap = apTemp; plw.pfOK = &fOK; pwDialog = GTKCreateDialog(_("GNU Backgammon - Players"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(PlayersOK), &plw); #if GTK_CHECK_VERSION(3,0,0) pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwHBox); gtk_box_pack_start(GTK_BOX(pwHBox), PlayersPage(&plw, 0, _("Player 0")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwHBox), PlayersPage(&plw, 1, _("Player 1")), FALSE, FALSE, 0); PlayerTypeToggled(NULL, &plw); GTKRunDialog(pwDialog); free(plw.pLevelSettings[0]); free(plw.pLevelSettings[1]); if (fOK) { char sz[256]; outputpostpone(); sprintf(sz, "set defaultnames \"%s\" \"%s\"", apTemp[0].szName, apTemp[1].szName); UserCommand(sz); for (int i = 0; i < 2; i++) { /* NB: this comparison is case-sensitive, and does not use * CompareNames(), so that the user can modify the case of * names. */ switch (apTemp[i].pt) { case PLAYER_HUMAN: if (ap[i].pt != PLAYER_HUMAN) { sprintf(sz, "set player %d human", i); UserCommand(sz); } break; case PLAYER_GNU: if (ap[i].pt != PLAYER_GNU) { sprintf(sz, "set player %d gnubg", i); UserCommand(sz); } /* FIXME another temporary hack (should be some way to set * chequer and cube parameters independently) */ sprintf(sz, "set player %d chequer evaluation", i); SetEvalCommands(sz, &apTemp[i].esChequer.ec, &ap[i].esChequer.ec); sprintf(sz, "set player %d movefilter", i); SetMovefilterCommands(sz, apTemp[i].aamf, ap[i].aamf); sprintf(sz, "set player %d cube evaluation", i); SetEvalCommands(sz, &apTemp[i].esCube.ec, &ap[i].esCube.ec); break; case PLAYER_EXTERNAL: if (ap[i].pt != PLAYER_EXTERNAL || strcmp(ap[i].szSocket, plw.aszSocket[i])) { sprintf(sz, "set player %d external %s", i, plw.aszSocket[i]); UserCommand(sz); } break; } } UserCommand("save settings"); outputresume(); } } static void SetOptions(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GTKSetOptions(); } /* Language screen name, code and flag name */ static char *aaszLang[][3] = { {N_("System default"), "system", NULL}, {N_("Czech"), "cs_CZ.UTF-8", "flags/czech.png"}, {N_("Danish"), "da_DK.UTF-8", "flags/denmark.png"}, {N_("English (GB)"), "en_GB.UTF-8", "flags/england.png"}, {N_("English (US)"), "en_US.UTF-8", "flags/usa.png"}, {N_("Finnish"), "fi_FI.UTF-8", "flags/finland.png"}, {N_("French"), "fr_FR.UTF-8", "flags/france.png"}, {N_("German"), "de_DE.UTF-8", "flags/germany.png"}, {N_("Greek"), "el_GR.UTF-8", "flags/greece.png"}, {N_("Icelandic"), "is_IS.UTF-8", "flags/iceland.png"}, {N_("Italian"), "it_IT.UTF-8", "flags/italy.png"}, {N_("Japanese"), "ja_JP.UTF-8", "flags/japan.png"}, {N_("Romanian"), "ro_RO.UTF-8", "flags/romania.png"}, {N_("Russian"), "ru_RU.UTF-8", "flags/russia.png"}, {N_("Spanish"), "es_ES.UTF-8", "flags/spain.png"}, {N_("Turkish"), "tr_TR.UTF-8", "flags/turkey.png"}, {NULL, NULL, NULL} }; static void TranslateWidgets(GtkWidget * p) { if (GTK_IS_CONTAINER(p)) { GList *pl = gtk_container_get_children(GTK_CONTAINER(p)); while (pl) { TranslateWidgets(pl->data); pl = pl->next; } g_list_free(pl); } if (GTK_IS_LABEL(p)) { char *name = (char *) g_object_get_data(G_OBJECT(p), "lang"); gtk_label_set_text(GTK_LABEL(p), _(name)); } } static void SetLangDialogText(void) { gtk_window_set_title(GTK_WINDOW(pwLangDialog), _("Select language")); TranslateWidgets(pwLangDialog); } static void SetLangOk(void) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwLangRadio1))) newLang = aaszLang[0][1]; else newLang = (char *) g_object_get_data(G_OBJECT(curSel), "lang"); gtk_widget_destroy(pwLangDialog); } static gboolean FlagClicked(GtkWidget * pw, GdkEventButton * event, void *UNUSED(dummy)) { /* Manually highlight clicked flag */ GtkWidget *frame, *eb; #if GTK_CHECK_VERSION(3,0,0) GdkRGBA color; #endif if (event && event->type == GDK_2BUTTON_PRESS && curSel == pw) SetLangOk(); if (curSel == pw) return FALSE; if (curSel) { /* Reset old item */ frame = gtk_bin_get_child(GTK_BIN(curSel)); eb = gtk_bin_get_child(GTK_BIN(frame)); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, NULL); #else gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, NULL); #endif } curSel = pw; frame = gtk_bin_get_child(GTK_BIN(pw)); eb = gtk_bin_get_child(GTK_BIN(frame)); gtk_frame_set_shadow_type(GTK_FRAME(gtk_bin_get_child(GTK_BIN(pw))), GTK_SHADOW_ETCHED_OUT); #if GTK_CHECK_VERSION(3,0,0) gtk_style_context_get_background_color(gtk_widget_get_style_context(eb), GTK_STATE_FLAG_SELECTED, &color); gtk_widget_override_background_color(eb, GTK_STATE_FLAG_NORMAL, &color); #else gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, >k_widget_get_style(pwMain)->bg[GTK_STATE_SELECTED]); #endif if (SetupLanguage((char *) g_object_get_data(G_OBJECT(curSel), "lang"))) /* Immediately translate this dialog */ SetLangDialogText(); else outputerrf(_("Locale '%s' not supported by C library."), (char *) g_object_get_data(G_OBJECT(curSel), "lang")); gtk_widget_set_sensitive(DialogArea(pwLangDialog, DA_OK), TRUE); return FALSE; } static GtkWidget * GetFlagWidget(char *language, char *langCode, const char *flagfilename) { /* Create a flag */ GtkWidget *eb, *eb2, *vbox, *lab1; GtkWidget *frame; #if GTK_CHECK_VERSION(3,0,0) GdkRGBA color; #endif GError *pix_error = NULL; eb = gtk_event_box_new(); #if GTK_CHECK_VERSION(3,0,0) gtk_style_context_get_background_color(gtk_widget_get_style_context(eb), GTK_STATE_FLAG_NORMAL, &color); gtk_widget_override_background_color(eb, GTK_STATE_FLAG_INSENSITIVE, &color); #else gtk_widget_modify_bg(eb, GTK_STATE_INSENSITIVE, >k_widget_get_style(pwMain)->bg[GTK_STATE_NORMAL]); #endif frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(eb), frame); eb2 = gtk_event_box_new(); #if GTK_CHECK_VERSION(3,0,0) gtk_style_context_get_background_color(gtk_widget_get_style_context(eb2), GTK_STATE_FLAG_NORMAL, &color); gtk_widget_override_background_color(eb2, GTK_STATE_FLAG_INSENSITIVE, &color); #else gtk_widget_modify_bg(eb2, GTK_STATE_INSENSITIVE, >k_widget_get_style(pwMain)->bg[GTK_STATE_NORMAL]); #endif gtk_container_add(GTK_CONTAINER(frame), eb2); #if GTK_CHECK_VERSION(3,0,0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); #else vbox = gtk_vbox_new(FALSE, 5); #endif gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); gtk_container_add(GTK_CONTAINER(eb2), vbox); if (flagfilename) { char *file = BuildFilename(flagfilename); GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(file, &pix_error); if (pix_error) outputerrf(_("Failed to open flag image: %s\n"), file); else { GtkWidget *image = gtk_image_new_from_pixbuf(pixbuf); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0); } g_free(file); } lab1 = gtk_label_new(NULL); gtk_widget_set_size_request(lab1, 80, -1); gtk_box_pack_start(GTK_BOX(vbox), lab1, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(lab1), "lang", language); g_signal_connect(G_OBJECT(eb), "button_press_event", G_CALLBACK(FlagClicked), NULL); g_object_set_data(G_OBJECT(eb), "lang", langCode); return eb; } static int defclick(GtkWidget * UNUSED(pw), void *UNUSED(dummy), GtkWidget * table) { gtk_widget_set_sensitive(table, FALSE); SetupLanguage(""); SetLangDialogText(); gtk_widget_set_sensitive(DialogArea(pwLangDialog, DA_OK), TRUE); return FALSE; } static int selclick(GtkWidget * UNUSED(pw), void *UNUSED(dummy), GtkWidget * table) { gtk_widget_set_sensitive(table, TRUE); if (curSel) { SetupLanguage((char *) g_object_get_data(G_OBJECT(curSel), "lang")); SetLangDialogText(); } else gtk_widget_set_sensitive(DialogArea(pwLangDialog, DA_OK), FALSE); return FALSE; } static void SetWidgetLabelLang(GtkWidget * pw, char *text) { if (GTK_IS_CONTAINER(pw)) { GList *pl = gtk_container_get_children(GTK_CONTAINER(pw)); while (pl) { SetWidgetLabelLang(pl->data, text); pl = pl->next; } g_list_free(pl); } if (GTK_IS_LABEL(pw)) g_object_set_data(G_OBJECT(pw), "lang", text); } static void AddLangWidgets(GtkWidget * cont) { int i, numLangs; GtkWidget *pwVbox, *pwHbox, *selLang = NULL; #if GTK_CHECK_VERSION(3,0,0) pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(cont), pwVbox); pwLangRadio1 = gtk_radio_button_new_with_label(NULL, ""); SetWidgetLabelLang(pwLangRadio1, N_("System default")); pwLangRadio2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwLangRadio1), ""); SetWidgetLabelLang(pwLangRadio2, N_("Select language")); gtk_box_pack_start(GTK_BOX(pwVbox), pwLangRadio1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwVbox), pwLangRadio2, FALSE, FALSE, 0); numLangs = 0; while (*aaszLang[numLangs]) numLangs++; numLangs--; /* Don't count system default */ #define NUM_COLS 4 /* Display in 4 columns */ #if GTK_CHECK_VERSION(3,0,0) pwLangTable = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pwLangTable), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pwLangTable), TRUE); #else pwLangTable = gtk_table_new(numLangs / NUM_COLS + 1, NUM_COLS, TRUE); #endif for (i = 0; i < numLangs; i++) { GtkWidget *pwFlag = GetFlagWidget(aaszLang[i + 1][0], aaszLang[i + 1][1], aaszLang[i + 1][2]); int row = i / NUM_COLS; int col = i - row * NUM_COLS; #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwLangTable), pwFlag, col, row, 1, 1); #else gtk_table_attach(GTK_TABLE(pwLangTable), pwFlag, col, col + 1, row, row + 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); #endif if (!StrCaseCmp(szLang, aaszLang[i + 1][1])) selLang = pwFlag; } #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwHbox), pwLangTable, FALSE, FALSE, 20); if (selLang == NULL) defclick(0, 0, pwLangTable); else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwLangRadio2), TRUE); FlagClicked(selLang, 0, 0); } g_signal_connect(G_OBJECT(pwLangRadio1), "button_press_event", G_CALLBACK(defclick), pwLangTable); g_signal_connect(G_OBJECT(pwLangRadio2), "button_press_event", G_CALLBACK(selclick), pwLangTable); } static void SetLanguage(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(w)) { GList *pl; pwLangDialog = GTKCreateDialog(NULL, DT_QUESTION, NULL, DIALOG_FLAG_MODAL, SetLangOk, NULL); pl = gtk_container_get_children(GTK_CONTAINER(DialogArea(pwLangDialog, DA_BUTTONS))); SetWidgetLabelLang(GTK_WIDGET(pl->data), N_("Cancel")); SetWidgetLabelLang(GTK_WIDGET(pl->next->data), N_("OK")); g_list_free(pl); curSel = NULL; newLang = NULL; AddLangWidgets(DialogArea(pwLangDialog, DA_MAIN)); GTKRunDialog(pwLangDialog); if (newLang) CommandSetLang(newLang); /* Set new language (after dialog has closed) */ else SetupLanguage(szLang); /* If cancelled make sure language stays the same */ } static void ReportBug(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pwEvent)) { OpenURL("https://savannah.gnu.org/bugs/?func=additem&group=gnubg"); } #if !defined(USE_GTKITEMFACTORY) static GtkActionEntry actionEntries[] = { { "FileMenuAction", NULL, N_("_File"), NULL, NULL, G_CALLBACK(NULL) }, { "FileNewAction", GTK_STOCK_NEW, N_("_New..."), "N", N_("Start new game, match, session or position"), G_CALLBACK(NewClicked) }, { "FileOpenAction", GTK_STOCK_OPEN, N_("_Open"), "O", N_("Open game, match, session or position"), G_CALLBACK(GTKOpen) }, { "FileSaveAction", GTK_STOCK_SAVE, N_("_Save"), "S", N_("Save match, session, game or position"), G_CALLBACK(GTKSave) }, { "FileCommandsOpenAction", NULL, N_("Open _Commands..."), NULL, NULL, G_CALLBACK(GTKCommandsOpen) }, { "FileMatchInfoAction", NULL, N_("Match information..."), NULL, NULL, G_CALLBACK(GTKMatchInfo) }, #if defined(WIN32) { "FileExitAction", NULL, N_("E_xit"), "Q", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_QUIT) }, #else { "FileExitAction", NULL, N_("_Quit"), "Q", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_QUIT) }, #endif { "EditMenuAction", NULL, N_("_Edit"), NULL, NULL, G_CALLBACK(NULL) }, { "UndoAction", GTK_STOCK_UNDO, N_("_Undo"), "Z", N_("Undo moves"), G_CALLBACK(GTKUndo) }, { "CopyIDMenuAction", NULL, N_("_Copy ID to Clipboard"), NULL, NULL, G_CALLBACK(NULL) }, { "CopyGNUBGIDAction", NULL, N_("GNUbg ID"), "C", NULL, G_CALLBACK(CopyIDs) }, { "CopyMatchIDAction", NULL, N_("Match ID"), "M", NULL, G_CALLBACK(CopyMatchID) }, { "CopyPositionIDAction", NULL, N_("Position ID"), "P", NULL, G_CALLBACK(CopyPositionID) }, { "CopyAsMenuAction", NULL, N_("Copy as"), NULL, NULL, G_CALLBACK(NULL) }, { "CopyPosAsAsciiAction", NULL, N_("Position as ASCII"), NULL, NULL, G_CALLBACK(CommandCopy) }, { "CopyAsGammOnLineAction", NULL, N_("BGonline (HTML)"), NULL, NULL, G_CALLBACK(CopyAsGOL) }, { "PasteIDAction", GTK_STOCK_PASTE, N_("_Paste ID"), "V", NULL, G_CALLBACK(PasteIDs) }, { "ViewMenuAction", NULL, N_("_View"), NULL, NULL, G_CALLBACK(NULL) }, { "PanelsMenuAction", NULL, N_("_Panels"), NULL, NULL, G_CALLBACK(NULL) }, { "RestorePanelsAction", NULL, N_("Restore panels"), NULL, NULL, G_CALLBACK(ShowAllPanels) }, { "HidePanelsAction", NULL, N_("Hide panels"), NULL, NULL, G_CALLBACK(HideAllPanels) }, { "ToolBarMenuAction", NULL, N_("_Toolbar"), NULL, NULL, G_CALLBACK(NULL) }, { "HideToolBarAction", NULL, N_("_Hide Toolbar"), NULL, NULL, G_CALLBACK(HideToolbar) }, { "ShowToolBarAction", NULL, N_("_Show Toolbar"), NULL, NULL, G_CALLBACK(ShowToolbar) }, #if defined(USE_BOARD3D) { "SwitchModeAction", NULL, N_("Switch to xD view"), NULL, NULL, G_CALLBACK(SwitchDisplayMode) }, #endif { "GameMenuAction", NULL, N_("_Game"), NULL, NULL, G_CALLBACK(NULL) }, { "RollAction", NULL, N_("_Roll"), "R", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ROLL) }, { "FinishMoveAction", NULL, N_("_Finish move"), "F", NULL, G_CALLBACK(FinishMove) }, { "DoubleAction", GNUBG_STOCK_DOUBLE, N_("_Double"), "D", N_("Double or redouble(beaver)"), CMD_ACTION_CALLBACK_FROMID(CMD_DOUBLE) }, { "ResignAction", GNUBG_STOCK_RESIGN, N_("Re_sign"), NULL, N_("Resign the current game"), G_CALLBACK(GTKResign) }, { "AcceptAction", GNUBG_STOCK_ACCEPT, N_("_Accept"), NULL, N_("Take the offered cube or accept the offered resignation"), CMD_ACTION_CALLBACK_FROMID(CMD_ACCEPT) }, { "RejectAction", GNUBG_STOCK_REJECT, N_("Re_ject"), NULL, N_("Drop the offered cube or decline the offered resignation"), CMD_ACTION_CALLBACK_FROMID(CMD_REJECT) }, { "PlayComputerTurnAction", NULL, N_("Play computer turn"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_PLAY) }, { "EndGameAction", GNUBG_STOCK_END_GAME, N_("_End Game"), "G", N_("Let the computer end the game"), CMD_ACTION_CALLBACK_FROMID(CMD_END_GAME) }, { "SwapPlayersAction", NULL, N_("Swap players"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SWAP_PLAYERS) }, { "SetCubeAction", NULL, N_("Set cube..."), NULL, NULL, G_CALLBACK(GTKSetCube) }, { "SetDiceAction", NULL, N_("Set _dice..."), NULL, NULL, G_CALLBACK(GTKSetDice) }, { "SetTurnMenuAction", NULL, N_("Set _turn"), NULL, NULL, G_CALLBACK(NULL) }, { "ClearTurnAction", NULL, N_("Clear turn"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CLEAR_TURN) }, { "AnalyseMenuAction", NULL, N_("_Analyse"), NULL, NULL, G_CALLBACK(NULL) }, { "EvaluateAction", NULL, N_("_Evaluate"), "E", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_EVAL) }, { "HintAction", GNUBG_STOCK_HINT, N_("_Hint"), "H", N_("Show the best moves or cube action"), CMD_ACTION_CALLBACK_FROMID(CMD_HINT) }, { "RolloutAction", NULL, N_("_Rollout position"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ROLLOUT) }, { "AnalyseMoveAction", NULL, N_("Analyse move"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_MOVE) }, { "AnalyseGameAction", NULL, N_("Analyse game"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_GAME) }, { "AnalyseMatchAction", NULL, N_("Analyse match or session"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_MATCH) }, { "ClearAnalysisMenuAction", NULL, N_("Clear analysis"), NULL, NULL, G_CALLBACK(NULL) }, { "ClearAnalysisMoveAction", GTK_STOCK_CLEAR, N_("Move"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_CLEAR_MOVE) }, { "ClearAnalysisGameAction", GTK_STOCK_CLEAR, N_("_Game"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_CLEAR_GAME) }, { "ClearAnalysisMatchOrSessionAction", GTK_STOCK_CLEAR, N_("_Match or session"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_CLEAR_MATCH) }, { "CMarkMenuAction", NULL, N_("CMark"), NULL, NULL, G_CALLBACK(NULL) }, { "CMarkCubeMenuAction", NULL, N_("Cube"), NULL, NULL, G_CALLBACK(NULL) }, { "CMarkCubeClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_CUBE_CLEAR) }, { "CMarkCubeShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_CUBE_SHOW) }, { "CMarkMoveMenuAction", NULL, N_("Move"), NULL, NULL, G_CALLBACK(NULL) }, { "CMarkMoveClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MOVE_CLEAR) }, { "CMarkMoveShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MOVE_SHOW) }, { "CMarkGameMenuAction", NULL, N_("Game"), NULL, NULL, G_CALLBACK(NULL) }, { "CMarkGameClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_GAME_CLEAR) }, { "CMarkGameShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_GAME_SHOW) }, { "CMarkMatchMenuAction", NULL, N_("Match"), NULL, NULL, G_CALLBACK(NULL) }, { "CMarkMatchClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MATCH_CLEAR) }, { "CMarkMatchShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MATCH_SHOW) }, { "RolloutMenuAction", NULL, N_("Rollout"), NULL, NULL, G_CALLBACK(NULL) }, { "RolloutCubeAction", NULL, N_("Cube"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_CUBE) }, { "RolloutMoveAction", NULL, N_("CMarked from Move"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_MOVE) }, { "RolloutGameAction", NULL, N_("CMarked from Game"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_GAME) }, { "RolloutMatchAction", NULL, N_("CMarked from Match"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_MATCH) }, { "AnalyseCurrentAction", GTK_STOCK_EXECUTE, N_("Analyse"), NULL, N_("Analyse current match (set default behavior in Settings -> Analysis)"), G_CALLBACK(GTKAnalyzeCurrent) }, { "AnalyseFileAction", GTK_STOCK_DIRECTORY, N_("Analyse File"), NULL, N_("Analyze match from file (set default behaviour in Settings -> Analysis -> Analysis Buttons)"), G_CALLBACK(GTKAnalyzeFile) }, { "BatchAnalyseAction", NULL, N_("Batch analyse..."), NULL, NULL, G_CALLBACK(GTKBatchAnalyse) }, { "MatchOrSessionStatsAction", NULL, N_("Match or session statistics"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_STATISTICS_MATCH) }, { "AddMatchOrSessionStatsToDBAction", GTK_STOCK_ADD, N_("Add match or session to database"), NULL, NULL, G_CALLBACK(GtkRelationalAddMatch) }, { "ShowRecordsAction", NULL, N_("Show Records"), NULL, NULL, G_CALLBACK(GtkShowRelational) }, { "PlotHistoryAction", NULL, N_("Plot History"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_HISTORY) }, { "DistributionOfRollsAction", NULL, N_("Distribution of rolls"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_ROLLS) }, { "TemperatureMapAction", NULL, N_("Temperature Map"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_TEMPERATURE_MAP) }, { "TemperatureMapCubeAction", NULL, N_("Temperature Map (cube decision)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_TEMPERATURE_MAP_CUBE) }, { "ScoreMapCubeAction", NULL, N_("ScoreMap (cube decision)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_SCORE_MAP_CUBE) }, { "ScoreMapMoveAction", NULL, N_("ScoreMap (move decision)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_SCORE_MAP_MOVE) }, { "RaceTheoryAction", NULL, N_("_Race Theory"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_KLEINMAN) }, { "MarketWindowAction", NULL, N_("_Market window"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MARKETWINDOW) }, { "MatchEquityTableAction", NULL, N_("M_atch equity table"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MATCHEQUITYTABLE) }, { "EvaluationSpeedAction", NULL, N_("Evaluation speed"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_CALIBRATION) }, { "SettingsMenuAction", NULL, N_("_Settings"), NULL, NULL, G_CALLBACK(NULL) }, { "SettingsAnalysisAction", NULL, N_("_Analysis..."), NULL, NULL, G_CALLBACK(SetAnalysis) }, { "SettingsBoardAppearanceAction", NULL, N_("_Board Appearance..."), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SET_APPEARANCE) }, { "SettingsExportAction", NULL, N_("E_xport..."), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_EXPORT) }, { "SettingsPlayersAction", NULL, N_("_Players..."), NULL, NULL, G_CALLBACK(SetPlayers) }, { "SettingsRolloutsAction", NULL, N_("_Rollouts..."), NULL, NULL, G_CALLBACK(SetRollouts) }, { "SettingsOptionsAction", NULL, N_("_Options..."), NULL, NULL, G_CALLBACK(SetOptions) }, { "SettingsLanguageAction", NULL, N_("_Language..."), NULL, NULL, G_CALLBACK(SetLanguage) }, { "GoMenuAction", NULL, N_("G_o"), NULL, NULL, G_CALLBACK(NULL) }, { "GoPreviousMarkedMoveAction", GNUBG_STOCK_GO_PREV_MARKED, N_("Previous marked move"), "Page_Up", N_("Go to Previous Marked"), CMD_ACTION_CALLBACK_FROMID(CMD_PREV_MARKED) }, { "GoPreviousCMarkedMoveAction", GNUBG_STOCK_GO_PREV_CMARKED, N_("Previous cmarked move"), "Page_Up", N_("Go to Previous CMarked"), CMD_ACTION_CALLBACK_FROMID(CMD_PREV_CMARKED) }, { "GoPreviousRollAction", GNUBG_STOCK_GO_PREV, N_("Previous rol_l"), "Page_Up", N_("Go to Previous Roll"), CMD_ACTION_CALLBACK_FROMID(CMD_PREV_ROLL) }, { "GoPreviousGameAction", GNUBG_STOCK_GO_PREV_GAME, N_("Pre_vious game"), "Page_Up", N_("Go to Previous Game"), CMD_ACTION_CALLBACK_FROMID(CMD_PREV_GAME) }, { "GoNextGameAction", GNUBG_STOCK_GO_NEXT_GAME, N_("Next _game"), "Page_Down", N_("Go to Next Game"), CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_GAME) }, { "GoNextRollAction", GNUBG_STOCK_GO_NEXT, N_("Next _roll"), "Page_Down", N_("Go to Next Roll"), CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_ROLL) }, { "GoNextCMarkedMoveAction", GNUBG_STOCK_GO_NEXT_CMARKED, N_("Next cmarked move"), "Page_Down", N_("Go to Next CMarked"), CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_CMARKED) }, { "GoNextMarkedMoveAction", GNUBG_STOCK_GO_NEXT_MARKED, N_("Next marked move"), "Page_Down", N_("Go to Next Marked"), CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_MARKED) }, { "HelpMenuAction", NULL, N_("_Help"), NULL, NULL, G_CALLBACK(NULL) }, { "HelpCommandsAction", NULL, N_("_Commands"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_HELP) }, { "HelpManualAllAboutAction", NULL, N_("_Manual (all about)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MANUAL_ABOUT) }, { "HelpManualWebAction", NULL, N_("Manual (_web)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MANUAL_WEB) }, { "HelpAboutGNUBGAction", GTK_STOCK_ABOUT, N_("_About GNU Backgammon"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_VERSION) } }; static GtkToggleActionEntry toggleActionEntries[] = { { "EditPositionAction", GTK_STOCK_EDIT, N_("_Edit Position"), NULL, N_("Toggle Edit Mode"), G_CALLBACK(ToggleEdit), FALSE }, { "PanelGameRecordAction", NULL, N_("_Game record"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_GAMELIST), FALSE }, /* TOGGLE */ { "PanelAnalysisAction", NULL, N_("_Analysis"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_ANALYSIS), FALSE }, /* TOGGLE */ { "PanelCommentaryAction", NULL, N_("_Commentary"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_COMMENTARY), FALSE }, /* TOGGLE */ { "PanelMessageAction", NULL, N_("_Message"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_MESSAGE), FALSE }, /* TOGGLE */ { "PanelTheoryAction", NULL, N_("_Theory"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_THEORY), FALSE }, /* TOGGLE */ { "PanelCommandAction", NULL, N_("Command"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_COMMAND), FALSE }, /* TOGGLE */ { "DockPanelsAction", NULL, N_("_Dock panels"), NULL, NULL, G_CALLBACK(ToggleDockPanels), FALSE }, { "ShowIDStatusBarAction", NULL, N_("Show _ID in status bar"), NULL, NULL, G_CALLBACK(ToggleShowingIDs), FALSE }, /* TOGGLE */ { "FullScreenAction", NULL, N_("Full screen"), "F11", NULL, G_CALLBACK(DoFullScreenMode), FALSE }, /* TOGGLE */ { "PlayClockwiseAction", NULL, N_("Play _Clockwise"), NULL, N_("Reverse direction of play"), G_CALLBACK(ToggleClockwise), FALSE } /* TOGGLE */ }; static GtkRadioActionEntry toolbarRadioActionEntries[] = { { "TextOnlyToolBarAction", NULL, N_("_Text only"), NULL, NULL, VIEW_TOOLBAR_TEXTONLY }, { "IconsOnlyToolBarAction", NULL, N_("_Icons only"), NULL, NULL, VIEW_TOOLBAR_ICONSONLY }, { "BothToolBarAction", NULL, N_("_Both"), NULL, NULL, VIEW_TOOLBAR_BOTH } }; static GtkRadioActionEntry setTurnRadioActionEntries[] = { { "SetTurnPlayer0Action", NULL, "0", NULL, NULL, CMD_SET_TURN_0 }, { "SetTurnPlayer1Action", NULL, "1", NULL, NULL, CMD_SET_TURN_1 }, }; #else static GtkItemFactoryEntry aife[] = { { N_("/_File"), NULL, NULL, 0, "", NULL }, { N_("/_File/_New..."), "N", G_CALLBACK(NewClicked), 0, "", GTK_STOCK_NEW }, { N_("/_File/_Open..."), "O", G_CALLBACK(GTKOpen), 0, "", GTK_STOCK_OPEN }, { N_("/_File/_Save..."), "S", G_CALLBACK(GTKSave), 0, "", GTK_STOCK_SAVE }, { N_("/_File/-"), NULL, NULL, 0, "", NULL }, { N_("/_File/Open _Commands..."), NULL, G_CALLBACK(GTKCommandsOpen), 0, NULL, NULL }, { N_("/_File/-"), NULL, NULL, 0, "", NULL }, { N_("/_File/Match information..."), NULL, GTKMatchInfo, 0, NULL, NULL }, { N_("/_File/-"), NULL, NULL, 0, "", NULL }, { #if defined(WIN32) N_("/_File/E_xit"), #else N_("/_File/_Quit"), #endif "Q", G_CALLBACK(Command), CMD_QUIT, "", GTK_STOCK_QUIT }, { N_("/_Edit"), NULL, NULL, 0, "", NULL }, { N_("/_Edit/_Undo"), "Z", GTKUndo, 0, "", GTK_STOCK_UNDO }, { N_("/_Edit/-"), NULL, NULL, 0, "", NULL }, { N_("/_Edit/_Copy ID to Clipboard"), NULL, NULL, 0, "", NULL }, { N_("/_Edit/_Copy ID to Clipboard/GNUbg ID"), "C", G_CALLBACK(CopyIDs), 0, NULL, NULL }, { N_("/_Edit/_Copy ID to Clipboard/Match ID"), "M", G_CALLBACK(CopyMatchID), 0, NULL, NULL }, { N_("/_Edit/_Copy ID to Clipboard/Position ID"), "P", G_CALLBACK(CopyPositionID), 0, NULL, NULL }, { N_("/_Edit/Copy as"), NULL, NULL, 0, "", NULL }, { N_("/_Edit/Copy as/Position as ASCII"), NULL, G_CALLBACK(CommandCopy), 0, NULL, NULL }, { N_("/_Edit/Copy as/BGonline (HTML)"), NULL, G_CALLBACK(CopyAsGOL), 0, NULL, NULL }, { N_("/_Edit/_Paste ID"), "V", PasteIDs, 0, "", GTK_STOCK_PASTE }, { N_("/_Edit/-"), NULL, NULL, 0, "", NULL }, { N_("/_Edit/_Edit Position"), NULL, click_edit, 0, "", NULL }, { N_("/_View"), NULL, NULL, 0, "", NULL }, { N_("/_View/_Panels"), NULL, NULL, 0, "", NULL }, { N_("/_View/_Panels/_Game record"), NULL, G_CALLBACK(TogglePanel), TOGGLE_GAMELIST, "", NULL }, { N_("/_View/_Panels/_Analysis"), NULL, G_CALLBACK(TogglePanel), TOGGLE_ANALYSIS, "", NULL }, { N_("/_View/_Panels/_Commentary"), NULL, G_CALLBACK(TogglePanel), TOGGLE_COMMENTARY, "", NULL }, { N_("/_View/_Panels/_Message"), NULL, G_CALLBACK(TogglePanel), TOGGLE_MESSAGE, "", NULL }, { N_("/_View/_Panels/_Theory"), NULL, G_CALLBACK(TogglePanel), TOGGLE_THEORY, "", NULL }, { N_("/_View/_Panels/_Command"), NULL, G_CALLBACK(TogglePanel), TOGGLE_COMMAND, "", NULL }, { N_("/_View/_Dock panels"), NULL, G_CALLBACK(ToggleDockPanels), 0, "", NULL }, { N_("/_View/Restore panels"), NULL, G_CALLBACK(ShowAllPanels), 0, NULL, NULL }, { N_("/_View/Hide panels"), NULL, G_CALLBACK(HideAllPanels), 0, NULL, NULL }, { N_("/_View/-"), NULL, NULL, 0, "", NULL }, { N_("/_View/Show _ID in status bar"), NULL, G_CALLBACK(ToggleShowingIDs), 0, "", NULL }, { N_("/_View/_Toolbar"), NULL, NULL, 0, "", NULL }, { N_("/_View/_Toolbar/_Hide Toolbar"), NULL, HideToolbar, 0, NULL, NULL }, { N_("/_View/_Toolbar/_Show Toolbar"), NULL, ShowToolbar, 0, NULL, NULL }, { N_("/_View/_Toolbar/-"), NULL, NULL, 0, "", NULL }, { N_("/_View/_Toolbar/_Text only"), NULL, G_CALLBACK(ToolbarStyle), TOOLBAR_ACTION_OFFSET + GTK_TOOLBAR_TEXT, "", NULL }, { N_("/_View/_Toolbar/_Icons only"), NULL, G_CALLBACK(ToolbarStyle), TOOLBAR_ACTION_OFFSET + GTK_TOOLBAR_ICONS, "/View/Toolbar/Text only", NULL }, { N_("/_View/_Toolbar/_Both"), NULL, G_CALLBACK(ToolbarStyle), TOOLBAR_ACTION_OFFSET + GTK_TOOLBAR_BOTH, "/View/Toolbar/Text only", NULL }, { N_("/_View/Full screen"), "F11", G_CALLBACK(DoFullScreenMode), 0, "", NULL }, { N_("/_View/-"), NULL, NULL, 0, "", NULL }, { N_("/_View/Play _Clockwise"), NULL, click_swapdirection, 0, "", NULL }, #if defined(USE_BOARD3D) { N_("/_View/-"), NULL, NULL, 0, "", NULL }, { N_("/_View/Switch to xD view"), NULL, G_CALLBACK(SwitchDisplayMode), TOOLBAR_ACTION_OFFSET + MENU_OFFSET, NULL, NULL }, #endif { N_("/_Game"), NULL, NULL, 0, "", NULL }, { N_("/_Game/_Roll"), "R", G_CALLBACK(Command), CMD_ROLL, NULL, NULL }, { N_("/_Game/_Finish move"), "F", G_CALLBACK(FinishMove), 0, NULL, NULL }, { N_("/_Game/-"), NULL, NULL, 0, "", NULL }, { N_("/_Game/_Double"), "D", G_CALLBACK(Command), CMD_DOUBLE, "", GNUBG_STOCK_DOUBLE }, { N_("/_Game/Re_sign"), NULL, G_CALLBACK(GTKResign), 0, "", GNUBG_STOCK_RESIGN }, { N_("/_Game/-"), NULL, NULL, 0, "", NULL }, { N_("/_Game/_Accept"), NULL, G_CALLBACK(Command), CMD_ACCEPT, "", GNUBG_STOCK_ACCEPT }, { N_("/_Game/Re_ject"), NULL, G_CALLBACK(Command), CMD_REJECT, "", GNUBG_STOCK_REJECT }, { N_("/_Game/-"), NULL, NULL, 0, "", NULL }, { N_("/_Game/Play computer turn"), NULL, G_CALLBACK(Command), CMD_PLAY, NULL, NULL }, { N_("/_Game/_End Game"), "G", G_CALLBACK(Command), CMD_END_GAME, "", GNUBG_STOCK_END_GAME }, { N_("/_Game/-"), NULL, NULL, 0, "", NULL }, { N_("/_Game/Swap players"), NULL, G_CALLBACK(Command), CMD_SWAP_PLAYERS, NULL, NULL }, { N_("/_Game/-"), NULL, NULL, 0, "", NULL }, { N_("/_Game/Set cube..."), NULL, G_CALLBACK(GTKSetCube), 0, NULL, NULL }, { N_("/_Game/Set _dice..."), NULL, G_CALLBACK(GTKSetDice), 0, NULL, NULL }, { N_("/_Game/Set _turn"), NULL, NULL, 0, "", NULL }, { N_("/_Game/Set turn/0"), NULL, G_CALLBACK(Command), CMD_SET_TURN_0, "", NULL }, { N_("/_Game/Set turn/1"), NULL, G_CALLBACK(Command), CMD_SET_TURN_1, "/Game/Set turn/0", NULL }, { N_("/_Game/Clear turn"), NULL, G_CALLBACK(Command), CMD_CLEAR_TURN, NULL, NULL }, { N_("/_Analyse"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/_Evaluate"), "E", G_CALLBACK(Command), CMD_EVAL, NULL, NULL }, { N_("/_Analyse/_Hint"), "H", G_CALLBACK(Command), CMD_HINT, "", GNUBG_STOCK_HINT }, { N_("/_Analyse/_Rollout position"), NULL, G_CALLBACK(Command), CMD_ROLLOUT, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Analyse move"), NULL, G_CALLBACK(Command), CMD_ANALYSE_MOVE, NULL, NULL }, { N_("/_Analyse/Analyse game"), NULL, G_CALLBACK(Command), CMD_ANALYSE_GAME, NULL, NULL }, { N_("/_Analyse/Analyse match or session"), NULL, G_CALLBACK(Command), CMD_ANALYSE_MATCH, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Clear analysis"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Clear analysis/Move"), NULL, G_CALLBACK(Command), CMD_ANALYSE_CLEAR_MOVE, "", GTK_STOCK_CLEAR }, { N_("/_Analyse/Clear analysis/_Game"), NULL, G_CALLBACK(Command), CMD_ANALYSE_CLEAR_GAME, "", GTK_STOCK_CLEAR }, { N_("/_Analyse/Clear analysis/_Match or session"), NULL, G_CALLBACK(Command), CMD_ANALYSE_CLEAR_MATCH, "", GTK_STOCK_CLEAR }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/CMark"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/CMark/Cube"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/CMark/Cube/Clear"), NULL, G_CALLBACK(Command), CMD_CMARK_CUBE_CLEAR, NULL, NULL }, { N_("/_Analyse/CMark/Cube/Show"), NULL, G_CALLBACK(Command), CMD_CMARK_CUBE_SHOW, NULL, NULL }, { N_("/_Analyse/CMark/Move"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/CMark/Move/Clear"), NULL, G_CALLBACK(Command), CMD_CMARK_MOVE_CLEAR, NULL, NULL }, { N_("/_Analyse/CMark/Move/Show"), NULL, G_CALLBACK(Command), CMD_CMARK_MOVE_SHOW, NULL, NULL }, { N_("/_Analyse/CMark/Game"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/CMark/Game/Clear"), NULL, G_CALLBACK(Command), CMD_CMARK_GAME_CLEAR, NULL, NULL }, { N_("/_Analyse/CMark/Game/Show"), NULL, G_CALLBACK(Command), CMD_CMARK_GAME_SHOW, NULL, NULL }, { N_("/_Analyse/CMark/Match"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/CMark/Match/Clear"), NULL, G_CALLBACK(Command), CMD_CMARK_MATCH_CLEAR, NULL, NULL }, { N_("/_Analyse/CMark/Match/Show"), NULL, G_CALLBACK(Command), CMD_CMARK_MATCH_SHOW, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Rollout"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Rollout/Cube"), NULL, G_CALLBACK(Command), CMD_ANALYSE_ROLLOUT_CUBE, NULL, NULL }, { N_("/_Analyse/Rollout/CMarked from Move"), NULL, G_CALLBACK(Command), CMD_ANALYSE_ROLLOUT_MOVE, NULL, NULL }, { N_("/_Analyse/Rollout/CMarked from Game"), NULL, G_CALLBACK(Command), CMD_ANALYSE_ROLLOUT_GAME, NULL, NULL }, { N_("/_Analyse/Rollout/CMarked from Match"), NULL, G_CALLBACK(Command), CMD_ANALYSE_ROLLOUT_MATCH, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Analyse File"), NULL, GTKAnalyzeFile, 0, NULL, NULL }, { N_("/_Analyse/Batch analyse..."), NULL, G_CALLBACK(GTKBatchAnalyse), 0, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Match or session statistics"), NULL, G_CALLBACK(Command), CMD_SHOW_STATISTICS_MATCH, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Add match or session to database"), NULL, G_CALLBACK(GtkRelationalAddMatch), 0, "", GTK_STOCK_ADD }, { N_("/_Analyse/Show Records"), NULL, G_CALLBACK(GtkShowRelational), 0, NULL, NULL }, { N_("/_Analyse/Plot History"), NULL, G_CALLBACK(Command), CMD_SHOW_HISTORY, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Distribution of rolls"), NULL, G_CALLBACK(Command), CMD_SHOW_ROLLS, NULL, NULL }, { N_("/_Analyse/Temperature Map"), NULL, G_CALLBACK(Command), CMD_SHOW_TEMPERATURE_MAP, NULL, NULL }, { N_("/_Analyse/Temperature Map (cube decision)"), NULL, G_CALLBACK(Command), CMD_SHOW_TEMPERATURE_MAP_CUBE, NULL, NULL }, { N_("/_Analyse/ScoreMap (move decision)"), NULL, G_CALLBACK(Command), CMD_SHOW_SCORE_MAP_MOVE, NULL, NULL }, { N_("/_Analyse/ScoreMap (cube decision)"), NULL, G_CALLBACK(Command), CMD_SHOW_SCORE_MAP_CUBE, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/_Race Theory"), NULL, G_CALLBACK(Command), CMD_SHOW_KLEINMAN, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/_Market window"), NULL, G_CALLBACK(Command), CMD_SHOW_MARKETWINDOW, NULL, NULL }, { N_("/_Analyse/M_atch equity table"), NULL, G_CALLBACK(Command), CMD_SHOW_MATCHEQUITYTABLE, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "", NULL }, { N_("/_Analyse/Evaluation speed"), NULL, G_CALLBACK(Command), CMD_SHOW_CALIBRATION, NULL, NULL }, { N_("/_Settings"), NULL, NULL, 0, "", NULL }, { N_("/_Settings/_Analysis..."), NULL, G_CALLBACK(SetAnalysis), 0, NULL, NULL }, { N_("/_Settings/_Board Appearance..."), NULL, G_CALLBACK(Command), CMD_SET_APPEARANCE, NULL, NULL }, { N_("/_Settings/E_xport..."), NULL, G_CALLBACK(Command), CMD_SHOW_EXPORT, NULL, NULL }, { N_("/_Settings/_Players..."), NULL, G_CALLBACK(SetPlayers), 0, NULL, NULL }, { N_("/_Settings/_Rollouts..."), NULL, G_CALLBACK(SetRollouts), 0, NULL, NULL }, { N_("/_Settings/-"), NULL, NULL, 0, "", NULL }, { N_("/_Settings/_Options..."), NULL, G_CALLBACK(SetOptions), 0, NULL, NULL }, { N_("/_Settings/_Language..."), NULL, G_CALLBACK(SetLanguage), 0, NULL, NULL }, { N_("/G_o"), NULL, NULL, 0, "", NULL }, { N_("/G_o/Previous marked move"), "Page_Up", G_CALLBACK(Command), CMD_PREV_MARKED, "", GNUBG_STOCK_GO_PREV_MARKED }, { N_("/G_o/Previous cmarked move"), "Page_Up", G_CALLBACK(Command), CMD_PREV_CMARKED, "", GNUBG_STOCK_GO_PREV_CMARKED }, { N_("/G_o/Previous rol_l"), "Page_Up", G_CALLBACK(Command), CMD_PREV_ROLL, "", GNUBG_STOCK_GO_PREV }, { N_("/G_o/Pre_vious game"), "Page_Up", G_CALLBACK(Command), CMD_PREV_GAME, "", GNUBG_STOCK_GO_PREV_GAME }, { N_("/G_o/-"), NULL, NULL, 0, "", NULL }, { N_("/G_o/Next _game"), "Page_Down", G_CALLBACK(Command), CMD_NEXT_GAME, "", GNUBG_STOCK_GO_NEXT_GAME }, { N_("/G_o/Next _roll"), "Page_Down", G_CALLBACK(Command), CMD_NEXT_ROLL, "", GNUBG_STOCK_GO_NEXT }, { N_("/G_o/Next cmarked move"), "Page_Down", G_CALLBACK(Command), CMD_NEXT_CMARKED, "", GNUBG_STOCK_GO_NEXT_CMARKED }, { N_("/G_o/Next marked move"), "Page_Down", G_CALLBACK(Command), CMD_NEXT_MARKED, "", GNUBG_STOCK_GO_NEXT_MARKED }, { N_("/_Help"), NULL, NULL, 0, "", NULL }, { N_("/_Help/_Commands"), NULL, G_CALLBACK(Command), CMD_HELP, NULL, NULL }, { N_("/_Help/-"), NULL, NULL, 0, "", NULL }, { N_("/_Help/_Manual (all about)"), NULL, G_CALLBACK(Command), CMD_SHOW_MANUAL_ABOUT, NULL, NULL }, { N_("/_Help/Manual (_web)"), NULL, G_CALLBACK(Command), CMD_SHOW_MANUAL_WEB, NULL, NULL }, { N_("/_Help/-"), NULL, NULL, 0, "", NULL }, { N_("/_Help/_About GNU Backgammon"), NULL, G_CALLBACK(Command), CMD_SHOW_VERSION, "", GTK_STOCK_ABOUT } }; #endif static void Stop(GtkWidget *pw, gpointer UNUSED(unused)) { if (automaticTask) StopAutomaticPlay(); else if (!GTKShowWarning(WARN_STOP, pw)) return; fInterrupt = TRUE; #if defined(USE_BOARD3D) { BoardData *bd = BOARD(pwBoard)->board_data; if (display_is_3d(bd->rd)) { StopIdle3d(bd, bd->bd3d); } } #endif gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idOutput, _("Process interrupted")); } static gboolean StopAnyAnimations(void) { #if defined(USE_BOARD3D) BoardData *bd = BOARD(pwBoard)->board_data; if (display_is_3d(bd->rd)) { if (Animating3d(bd->bd3d)) { StopIdle3d(bd, bd->bd3d); return TRUE; } } else #endif if (!animation_finished) { fInterrupt = TRUE; return TRUE; } return FALSE; } static void StopNotButton(GtkWidget * UNUSED(pw), gpointer UNUSED(unused)) { /* Interrupt any animations or show message in status bar */ if (!StopAnyAnimations()) gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idOutput, _("Press the stop button to interrupt the current process")); } static void FileDragDropped(GtkWidget * UNUSED(widget), GdkDragContext * UNUSED(drag_context), gint UNUSED(x), gint UNUSED(y), GtkSelectionData * data, guint UNUSED(info), guint UNUSED(time)) { gchar **list; list = g_uri_list_extract_uris((const gchar *) gtk_selection_data_get_data(data)); if (list[0]) { char *next, *file, *quoted; char *uri = (char *) list[0]; if (StrNCaseCmp("file:", uri, 5) != 0) { outputerrf(_("Only local files supported in dnd")); g_strfreev(list); return; } file = g_filename_from_uri(uri, NULL, NULL); if (!file) { outputerrf(_("Failed to parse uri")); g_strfreev(list); return; } next = strchr(file, '\r'); if (next) *next = 0; quoted = g_strdup_printf("\"%s\"", file); CommandImportAuto(quoted); g_free(quoted); g_free(file); } if (list) g_strfreev(list); } static gboolean ContextMenu(GtkWidget * UNUSED(widget), GdkEventButton * event, GtkWidget * menu) { if (event->type != GDK_BUTTON_PRESS || event->button != 3) return FALSE; #if GTK_CHECK_VERSION(3,22,0) gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event); #else gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); #endif return TRUE; } static void CreateMainWindow(void) { GtkWidget *pwVbox, *pwHbox, *pwHbox2, *pwHandle, *pwPanelHbox, *pwStopButton, *idMenu, *menu_item, *pwFrame; GtkTargetEntry fileDrop = { "text/uri-list", GTK_TARGET_OTHER_APP, 1 }; #if !defined(USE_GTKITEMFACTORY) GError *error = NULL; GtkActionGroup *action_group; #endif pwMain = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_maximize(GTK_WINDOW(pwMain)); SetPanelWidget(WINDOW_MAIN, pwMain); gtk_window_set_role(GTK_WINDOW(pwMain), "main"); gtk_window_set_type_hint(GTK_WINDOW(pwMain), GDK_WINDOW_TYPE_HINT_NORMAL); gtk_window_set_title(GTK_WINDOW(pwMain), _("GNU Backgammon")); /* Enable dropping of files on to main window */ gtk_drag_dest_set(pwMain, GTK_DEST_DEFAULT_ALL, &fileDrop, 1, GDK_ACTION_DEFAULT); g_signal_connect(G_OBJECT(pwMain), "drag_data_received", G_CALLBACK(FileDragDropped), NULL); #if GTK_CHECK_VERSION(3,0,0) pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwMain), pwVbox); #if !defined(USE_GTKITEMFACTORY) puim = gtk_ui_manager_new(); action_group = gtk_action_group_new("Actions"); gtk_action_group_set_translation_domain(action_group, GETTEXT_PACKAGE); gtk_action_group_add_actions(action_group, actionEntries, G_N_ELEMENTS(actionEntries), NULL); gtk_action_group_add_toggle_actions(action_group, toggleActionEntries, G_N_ELEMENTS(toggleActionEntries), NULL); gtk_action_group_add_radio_actions(action_group, toolbarRadioActionEntries, G_N_ELEMENTS(toolbarRadioActionEntries), 0, GENERIC_RADIO_CALLBACK_FROMID(VIEW_TOOLBAR_ICONSONLY), NULL); gtk_action_group_add_radio_actions(action_group, setTurnRadioActionEntries, G_N_ELEMENTS(setTurnRadioActionEntries), 0, CMD_RADIO_CALLBACK_FROMID(CMD_SET_TURN_0), NULL); gtk_ui_manager_insert_action_group(puim, action_group, 0); gtk_ui_manager_add_ui_from_string(puim, GNUBG_MAIN_UI, -1, &error); if (error) { g_warning(_("Cannot load UI: %s"), error->message); g_error_free(error); error = NULL; } #if defined(USE_BOARD3D) gtk_ui_manager_add_ui_from_string(puim, UIADDITIONS3D, -1, &error); if (error) { g_warning(_("Cannot load UI: %s"), error->message); g_error_free(error); error = NULL; } #endif /* Bind the accelerators */ gtk_window_add_accel_group(GTK_WINDOW(pwMain), pagMain = gtk_ui_manager_get_accel_group(puim)); #else pagMain = gtk_accel_group_new(); pif = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", pagMain); gtk_item_factory_set_translate_func(pif, GTKTranslate, NULL, NULL); gtk_item_factory_create_items(pif, sizeof(aife) / sizeof(aife[0]), aife, NULL); /* Tick default toolbar style */ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (gtk_item_factory_get_widget_by_action(pif, nToolbarStyle + TOOLBAR_ACTION_OFFSET)), TRUE); gtk_window_add_accel_group(GTK_WINDOW(pwMain), pagMain); #endif #if GTK_CHECK_VERSION(3,0,0) pwHandle = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwHandle = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHandle, FALSE, FALSE, 0); #if !defined(USE_GTKITEMFACTORY) pwMenuBar = gtk_ui_manager_get_widget(puim, "/MainMenu"); gtk_container_add(GTK_CONTAINER(pwHandle), pwMenuBar); #else gtk_container_add(GTK_CONTAINER(pwHandle), pwMenuBar = gtk_item_factory_get_widget(pif, "
")); #endif #if GTK_CHECK_VERSION(3,0,0) pwHandle = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwHandle = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHandle, FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(pwHandle), pwToolbar = ToolbarNew()); #if GTK_CHECK_VERSION(3,0,0) pwGameBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwGameBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwGameBox, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); #else hpaned = gtk_hpaned_new(); #endif gtk_box_pack_start(GTK_BOX(pwVbox), hpaned, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) pwPanelGameBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwPanelGameBox = gtk_hbox_new(FALSE, 0); #endif gtk_paned_pack1(GTK_PANED(hpaned), pwPanelGameBox, TRUE, TRUE); gtk_container_add(GTK_CONTAINER(pwPanelGameBox), pwEventBox = gtk_event_box_new()); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwEventBox), FALSE); gtk_container_add(GTK_CONTAINER(pwEventBox), pwBoard = board_new(GetMainAppearance(), FALSE)); g_signal_connect(G_OBJECT(pwEventBox), "button-press-event", G_CALLBACK(board_button_press), BOARD(pwBoard)->board_data); #if GTK_CHECK_VERSION(3,0,0) pwPanelHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwPanelHbox = gtk_hbox_new(FALSE, 0); #endif gtk_paned_pack2(GTK_PANED(hpaned), pwPanelHbox, TRUE, FALSE); #if GTK_CHECK_VERSION(3,0,0) pwPanelVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); #else pwPanelVbox = gtk_vbox_new(FALSE, 1); #endif gtk_box_pack_start(GTK_BOX(pwPanelHbox), pwPanelVbox, TRUE, TRUE, 0); /* Do this so that the menu is packed now instead of in the idle loop */ #if !defined(USE_GTKITEMFACTORY) gtk_ui_manager_ensure_update(puim); #endif DockPanels(); /* Status bar */ #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwVbox), pwHbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwHbox), pwStatus = gtk_statusbar_new(), TRUE, TRUE, 0); gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(pwStatus), FALSE); /* It's a bit naughty to access pwStatus->label, but its default alignment * is ugly, and GTK gives us no other way to change it. */ #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(get_statusbar_label(GTK_STATUSBAR(pwStatus)), GTK_ALIGN_START); gtk_widget_set_valign(get_statusbar_label(GTK_STATUSBAR(pwStatus)), GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(get_statusbar_label(GTK_STATUSBAR(pwStatus))), 0, 0.5); #endif idOutput = gtk_statusbar_get_context_id(GTK_STATUSBAR(pwStatus), "gnubg output"); idProgress = gtk_statusbar_get_context_id(GTK_STATUSBAR(pwStatus), "progress"); g_signal_connect(G_OBJECT(pwStatus), "text-popped", G_CALLBACK(TextPopped), NULL); idMenu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label(_("Copy GNUbg ID")); gtk_menu_shell_append(GTK_MENU_SHELL(idMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(CopyIDs), NULL); menu_item = gtk_menu_item_new_with_label(_("Paste GNUbg ID")); gtk_menu_shell_append(GTK_MENU_SHELL(idMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(PasteIDs), NULL); pwIDBox = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(pwHbox), pwIDBox, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) pwHbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox2 = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwIDBox), pwHbox2); gtk_box_pack_start(GTK_BOX(pwHbox2), gtk_label_new("GNUbg ID:"), FALSE, FALSE, 0); pwFrame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(pwHbox2), pwFrame, FALSE, FALSE, 0); pwGnubgID = gtk_label_new(""); gtk_container_add(GTK_CONTAINER(pwFrame), pwGnubgID); gtk_container_set_border_width(GTK_CONTAINER(pwFrame), 2); gtk_widget_set_tooltip_text(pwIDBox, _("This is a unique id for this position." " Ctrl+C copies the current ID and Ctrl+V pastes an ID from the clipboard.")); g_signal_connect(G_OBJECT(pwIDBox), "button-press-event", G_CALLBACK(ContextMenu), idMenu); pwStop = gtk_event_box_new(); pwStopButton = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(pwStop), pwStopButton); gtk_container_add(GTK_CONTAINER(pwStopButton), gtk_image_new_from_icon_name("process-stop", GTK_ICON_SIZE_SMALL_TOOLBAR)); gtk_box_pack_start(GTK_BOX(pwHbox), pwStop, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(pwStop), "button-press-event", G_CALLBACK(StopNotButton), NULL); g_signal_connect(G_OBJECT(pwStopButton), "button-press-event", G_CALLBACK(Stop), NULL); gtk_widget_set_sensitive(pwStop, FALSE); pwGrab = pwStop; gtk_box_pack_start(GTK_BOX(pwHbox), pwProgress = gtk_progress_bar_new(), FALSE, FALSE, 0); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pwProgress), 0.0); #if GTK_CHECK_VERSION(3,0,0) gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(pwProgress), TRUE); #endif /* This is a kludge to work around an ugly bug in GTK: we don't want to * show text in the progress bar yet, but we might later. So we have to * pretend we want text in order to be sized correctly, and then set the * format string to something so we don't get the default text. */ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pwProgress), " "); g_signal_connect(G_OBJECT(pwMain), "configure_event", G_CALLBACK(configure_event), NULL); #if ! GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(pwMain), "size-request", G_CALLBACK(MainSize), NULL); #endif g_signal_connect(G_OBJECT(pwMain), "delete_event", G_CALLBACK(main_delete), NULL); g_signal_connect(G_OBJECT(pwMain), "destroy", G_CALLBACK(gtk_main_quit), NULL); } #if !defined(WIN32) /* g_object_unref() with suitable signature to pass it to g_list_foreach() */ static inline void my_g_object_unref(gpointer data, gpointer UNUSED(user_data)) { g_object_unref(data); } #endif static void gnubg_set_default_icon(void) { /* win32 uses the ico file for this */ /* adapted from pidgin */ #if !defined(WIN32) GList *icons = NULL; GdkPixbuf *icon = NULL; struct { const char *dir; const char *fn; } is[] = { { "16x16", "gnubg.png"}, { "24x24", "gnubg.png"}, { "32x32", "gnubg.png"}, { "48x48", "gnubg.png"} }; for (guint i = 0; i < G_N_ELEMENTS(is); i++) { char *ip = g_build_filename(getDataDir(), "icons", "hicolor", is[i].dir, "apps", is[i].fn, NULL); icon = gdk_pixbuf_new_from_file(ip, NULL); g_free(ip); if (icon) icons = g_list_append(icons, icon); /* fail silently */ } gtk_window_set_default_icon_list(icons); g_list_foreach(icons, my_g_object_unref, NULL); g_list_free(icons); #endif } #if GTK_CHECK_VERSION(3,0,0) static void ApplyDefaultCss(void) { GtkCssProvider *cssProvider; char *cssPath; cssProvider = gtk_css_provider_new(); if (cssProvider == NULL) return; cssPath = BuildFilename("gnubg.css"); gtk_css_provider_load_from_path(cssProvider, cssPath, NULL); gtk_style_context_add_provider_for_screen(gtk_window_get_screen(GTK_WINDOW(pwMain)), GTK_STYLE_PROVIDER(cssProvider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_free(cssPath); g_object_unref(G_OBJECT(cssProvider)); } #endif extern void InitGTK(int *argc, char ***argv) { char *sz; GtkIconFactory *picf; GdkAtom cb; #if ! GTK_CHECK_VERSION(3,0,0) sz = BuildFilename("gnubg.gtkrc"); gtk_rc_add_default_file(sz); g_free(sz); sz = g_build_filename(szHomeDirectory, "gnubg.gtkrc", NULL); gtk_rc_add_default_file(sz); g_free(sz); #endif sz = g_build_filename(szHomeDirectory, "gnubgmenurc", NULL); gtk_accel_map_load(sz); g_free(sz); fX = gtk_init_check(argc, argv); if (!fX) return; gnubg_stock_init(); #if defined(USE_BOARD3D) widget3dValid = InitGTK3d(argc, argv); #endif /*add two xpm based icons */ picf = gtk_icon_factory_new(); gtk_icon_factory_add_default(picf); gnubg_set_default_icon(); CreateMainWindow(); #if GTK_CHECK_VERSION(3,0,0) ApplyDefaultCss(); #endif /*Create string for handling messages from output* functions */ output_str = g_string_new(NULL); cb = gdk_atom_intern("CLIPBOARD", TRUE); clipboard = gtk_clipboard_get(cb); } enum { RE_NONE, RE_LANGUAGE_CHANGE }; static int reasonExited; extern void RunGTK(GtkWidget * pwSplash, char *commands, char *python_script, char *match) { #if defined(USE_BOARD3D) /* Use 1st predefined board settings if none have been loaded */ Default3dSettings(BOARD(pwBoard)->board_data); #endif do { reasonExited = RE_NONE; GTKSet(&ms.fCubeOwner); GTKSet(&ms.nCube); GTKSet(ap); GTKSet(&ms.fTurn); GTKSet(&ms.gs); GTKSet(&ms.fJacoby); PushSplash(pwSplash, _("Rendering"), _("Board")); GTKAllowStdin(); if (fTTY) { #if defined(HAVE_LIB_READLINE) fReadingCommand = TRUE; rl_callback_handler_install(FormatPrompt(), ProcessInput); atexit(rl_callback_handler_remove); #else Prompt(); #endif } /* Show everything */ gtk_widget_show_all(pwMain); GTKSet(&fShowIDs); /* Set the default arrow cursor in the stop window so obvious it can be clicked */ gdk_window_set_cursor(gtk_widget_get_window(pwStop), gdk_cursor_new_for_display(gtk_widget_get_display(pwStop), GDK_LEFT_PTR)); /* Make sure toolbar looks correct */ { int style = nToolbarStyle; nToolbarStyle = 2; /* Default style is fine */ SetToolbarStyle(style); #if !defined(USE_GTKITEMFACTORY) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/Both")), nToolbarStyle); #endif } #if defined(USE_BOARD3D) { BoardData *bd = BOARD(pwBoard)->board_data; BoardData3d *bd3d = bd->bd3d; renderdata *prd = bd->rd; SetSwitchModeMenuText(); DisplayCorrectBoardType(bd, bd3d, prd); } #endif DestroySplash(pwSplash); pwSplash = NULL; /* Display any other windows now */ DisplayWindows(); /* Make sure some things stay hidden */ if (!ArePanelsDocked()) { gtk_widget_hide(hpaned); #if !defined(USE_GTKITEMFACTORY) gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/PanelsMenu/Commentary"))); gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/HidePanels"))); gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/RestorePanels"))); #else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Panels/Commentary")); gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Hide panels")); gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Restore panels")); #endif } else { if (ArePanelsShowing()) { #if !defined(USE_GTKITEMFACTORY) gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/RestorePanels"))); #else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Restore panels")); #endif gtk_widget_hide(pwGameBox); } else #if !defined(USE_GTKITEMFACTORY) gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/HidePanels"))); #else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Hide panels")); #endif } /* Make sure main window is on top */ gdk_window_raise(gtk_widget_get_window(pwMain)); /* force update of board; needed to display board correctly if user * has special settings, e.g., clockwise or nackgammon */ ShowBoard(); if (fToolbarShowing) #if !defined(USE_GTKITEMFACTORY) gtk_widget_hide((gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ToolBarMenu/ShowToolBar"))); #else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Toolbar/Show Toolbar")); #endif if (fFullScreen) { /* Change to full screen (but hide warning) */ fullScreenOnStartup = TRUE; FullScreenMode(TRUE); } else if (!fToolbarShowing) HideToolbar(); if (match) { CommandImportAuto(match); g_free(match); match = NULL; } if (commands) { CommandLoadCommands(commands); g_free(commands); commands = NULL; } if (python_script) { #if defined(WIN32) outputerrf(_ ("The Windows GTK interface does not support the '-p' option. Use the command-line interface instead.")); #else #if defined(USE_PYTHON) g_idle_add(python_run_file, g_strdup(python_script)); #endif #endif g_free(python_script); python_script = NULL; } /* initialize by saying there is no analysis running now in the background*/ if(fBackgroundAnalysis) fAnalysisRunning = FALSE; gtk_main(); if (reasonExited == RE_LANGUAGE_CHANGE) { /* Recreate main window with new language */ CreateMainWindow(); setWindowGeometry(WINDOW_MAIN); } } while (reasonExited != RE_NONE); } extern void GtkChangeLanguage(void) { setlocale(LC_ALL, ""); if (pwMain && gtk_widget_get_realized(pwMain)) { reasonExited = RE_LANGUAGE_CHANGE; custom_cell_renderer_invalidate_size(); /* Recalculate widget sizes */ ClosePanels(); getWindowGeometry(WINDOW_MAIN); DestroyPanel(WINDOW_MAIN); GTKGameSelectDestroy(); pwProgress = NULL; } } extern void ShowList(char *psz[], const char *szTitle, GtkWidget * parent) { GString *gst = g_string_new(NULL); while (*psz) g_string_append_printf(gst, "%s\n", *psz++); GTKTextWindow(gst->str, szTitle, DT_INFO, parent); g_string_free(gst, TRUE); } extern void OK(GtkWidget * pw, int *pf) { if (pf) *pf = TRUE; gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } /* * put up a tutor window with a message about how bad the intended * play is. Allow selections: * Continue (play it anyway) * Cancel (rethink) * returns TRUE if play it anyway */ static void TutorEnd(GtkWidget * pw, int *pf) { if (pf) *pf = TRUE; fTutor = FALSE; gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void TutorHint(GtkWidget * pw, void *UNUSED(unused)) { gtk_widget_destroy(gtk_widget_get_toplevel(pw)); UserCommand("hint"); } static void TutorRethink(GtkWidget * pw, void *UNUSED(unused)) { gtk_widget_destroy(gtk_widget_get_toplevel(pw)); ShowBoard(); } extern int GtkTutor(char *sz) { int f = FALSE; GtkWidget *pwTutorDialog, *pwOK, *pwCancel, *pwEndTutor, *pwButtons, *pwPrompt, *pwHint; pwTutorDialog = GTKCreateDialog(_("GNU Backgammon - Tutor"), DT_CUSTOM, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(OK), (void *) &f); pwOK = DialogArea(pwTutorDialog, DA_OK); gtk_button_set_label(GTK_BUTTON(pwOK), _("Play Anyway")); pwCancel = gtk_button_new_with_label(_("Rethink")); pwEndTutor = gtk_button_new_with_label(_("End Tutor Mode")); pwHint = gtk_button_new_with_label(_("Hint")); pwButtons = DialogArea(pwTutorDialog, DA_BUTTONS); gtk_container_add(GTK_CONTAINER(pwButtons), pwCancel); g_signal_connect(G_OBJECT(pwCancel), "clicked", G_CALLBACK(TutorRethink), (void *) &f); gtk_container_add(GTK_CONTAINER(pwButtons), pwEndTutor); g_signal_connect(G_OBJECT(pwEndTutor), "clicked", G_CALLBACK(TutorEnd), (void *) &f); gtk_container_add(GTK_CONTAINER(pwButtons), pwHint); g_signal_connect(G_OBJECT(pwHint), "clicked", G_CALLBACK(TutorHint), (void *) &f); pwPrompt = gtk_label_new(sz); #if GTK_CHECK_VERSION(3,0,0) g_object_set(pwPrompt, "margin", 8, NULL); #else gtk_misc_set_padding(GTK_MISC(pwPrompt), 8, 8); #endif gtk_label_set_justify(GTK_LABEL(pwPrompt), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap(GTK_LABEL(pwPrompt), TRUE); gtk_container_add(GTK_CONTAINER(DialogArea(pwTutorDialog, DA_MAIN)), pwPrompt); gtk_window_set_resizable(GTK_WINDOW(pwTutorDialog), FALSE); /* This dialog should be REALLY modal -- disable "next turn" idle * processing and stdin handler, to avoid reentrancy problems. */ if (nNextTurn) g_source_remove(nNextTurn); GTKRunDialog(pwTutorDialog); if (nNextTurn) nNextTurn = g_idle_add(NextTurnNotify, NULL); /* if tutor mode was disabled, update the checklist */ if (!fTutor) { GTKSet((void *) &fTutor); } return f; } extern void GTKOutput(const char *sz) { if (!sz || !*sz) return; g_string_append(output_str, sz); } extern void GTKOutputX(void) { gchar *str; if (output_str->len == 0) return; str = g_strchomp(output_str->str); if (PanelShowing(WINDOW_MESSAGE)) { GtkTextBuffer *buffer; GtkTextIter iter; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwMessageText)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert(buffer, &iter, "\n", -1); gtk_text_buffer_insert(buffer, &iter, g_strchomp(str), -1); gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(pwMessageText), gtk_text_buffer_create_mark(buffer, "last", &iter, FALSE), 0.0, TRUE, 0.0, 1.0); } else if (output_str->len > 80 || strchr(str, '\n')) { GTKMessage(str, DT_INFO); } else { gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idOutput, str); } g_string_set_size(output_str, 0); } extern void GTKOutputErr(const char *sz) { GtkTextIter iter; GTKMessage(sz, DT_ERROR); if (PanelShowing(WINDOW_MESSAGE)) { GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwMessageText)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert(buffer, &iter, sz, -1); gtk_text_buffer_insert(buffer, &iter, "\n", -1); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(pwMessageText), &iter, 0.0, FALSE, 0.0, 1.0); } } extern void GTKOutputNew(void) { /* This is horribly ugly, but fFinishedPopping will never be set if * the progress bar leaves a message in the status stack. There should * be at most one message, so we get rid of it here. */ gtk_statusbar_pop(GTK_STATUSBAR(pwStatus), idProgress); fFinishedPopping = FALSE; do gtk_statusbar_pop(GTK_STATUSBAR(pwStatus), idOutput); while (!fFinishedPopping); } typedef struct { GtkWidget *pwCPS, *pwML, *pwGNUvsHuman, *pwHumanHuman, *pwManualDice, *pwTutorMode; } newwidget; static GtkWidget * button_from_image(GtkWidget * pwImage) { GtkWidget *pw = gtk_button_new(); gtk_container_add(GTK_CONTAINER(pw), pwImage); return pw; } static void UpdatePlayerSettings(newwidget * pnw) { int fManDice = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwManualDice)); int fTM = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwTutorMode)); int fCPS = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwCPS)); int fGH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwGNUvsHuman)); int fHH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwHumanHuman)); if (!fCPS) { if (fGH) { UserCommand("set player 0 gnubg"); UserCommand("set player 1 human"); } if (fHH) { UserCommand("set player 0 human"); UserCommand("set player 1 human"); } } /* apply the default names chosen by the user, not the names used in the random previous match */ strcpy(ap[0].szName, default_names[0]); strcpy(ap[1].szName, default_names[1]); if ((fManDice) && (rngCurrent != RNG_MANUAL)) UserCommand("set rng manual"); if ((!fManDice) && (rngCurrent == RNG_MANUAL)) UserCommand("set rng mersenne"); if ((fTM) && (!fTutor)) UserCommand("set tutor mode on"); if ((!fTM) && (fTutor)) UserCommand("set tutor mode off"); UserCommand("save settings"); } static void SettingsPressed(GtkWidget * pw, gpointer UNUSED(data)) { GTKSetCurrentParent(pw); SetPlayers(NULL, 0, NULL); } static void ToolButtonPressedMS(GtkWidget * pw, newwidget * pnw) { UpdatePlayerSettings(pnw); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); UserCommand("new session"); } static void ToolButtonPressed(GtkWidget * pw, newwidget * pnw) { char sz[40]; int *pi; pi = (int *) g_object_get_data(G_OBJECT(pw), "user_data"); sprintf(sz, "new match %d", *pi); UpdatePlayerSettings(pnw); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); UserCommand(sz); } extern int edit_new(unsigned int length) { matchstate lms; lms.anDice[0] = ms.anDice[0]; lms.anDice[1] = ms.anDice[1]; lms.fTurn = lms.fMove = 1; lms.fResigned = 0; lms.fDoubled = 0; if (ms.fCubeOwner == -1) lms.fCubeOwner = ms.fCubeOwner; else lms.fCubeOwner = (ms.fTurn == 1 ? ms.fCubeOwner : !ms.fCubeOwner); lms.fCrawford = FALSE; lms.fJacoby = fJacoby; lms.anScore[0] = lms.anScore[1] = 0; lms.nCube = ms.nCube; lms.gs = GAME_PLAYING; lms.nMatchTo = length; CommandSetMatchID(MatchIDFromMatchState(&lms)); return 0; } static void edit_new_clicked(GtkWidget * pw, newwidget * pnw) { unsigned int length = (unsigned int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(pnw->pwML)); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); edit_new(length); if (!ToolbarIsEditing(NULL)) click_edit(); } static GtkWidget * NewWidget(newwidget * pnw) { int i, j = 1; GtkWidget *pwVbox, *pwHbox, *pwLabel, *pwToolbar2; GtkWidget *pwButtons, *pwFrame, *pwVbox2; GtkToolItem *pwToolButton; #if GTK_CHECK_VERSION(3,0,0) pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVbox = gtk_vbox_new(FALSE, 0); #endif pwToolbar2 = gtk_toolbar_new(); gtk_orientable_set_orientation(GTK_ORIENTABLE(pwToolbar2), GTK_ORIENTATION_HORIZONTAL); gtk_toolbar_set_style(GTK_TOOLBAR(pwToolbar2), GTK_TOOLBAR_ICONS); gtk_toolbar_set_show_arrow(GTK_TOOLBAR(pwToolbar2), FALSE); pwFrame = gtk_frame_new(_("Shortcut buttons")); gtk_box_pack_start(GTK_BOX(pwVbox), pwFrame, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(pwFrame), pwToolbar2); gtk_container_set_border_width(GTK_CONTAINER(pwToolbar2), 4); /* Edit button */ pwToolButton = gtk_tool_button_new_from_stock(GTK_STOCK_EDIT); gtk_widget_set_tooltip_text(GTK_WIDGET(pwToolButton), _("Edit position")); gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar2), pwToolButton, -1); g_signal_connect(pwToolButton, "clicked", G_CALLBACK(edit_new_clicked), pnw); gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar2), gtk_separator_tool_item_new(), -1); pwToolButton = gtk_tool_button_new_from_stock(GNUBG_STOCK_NEW0); gtk_widget_set_tooltip_text(GTK_WIDGET(pwToolButton), _("Start a new money game session")); gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar2), pwToolButton, -1); g_signal_connect(G_OBJECT(pwToolButton), "clicked", G_CALLBACK(ToolButtonPressedMS), pnw); gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar2), gtk_separator_tool_item_new(), -1); for (i = 1; i < 19; i = i + 2, j++) { gchar *sz; gchar stock[50]; int *pi; sz = g_strdup_printf(ngettext("Start a new %d point match", "Start a new %d points match", i), i); sprintf(stock, "gnubg-stock-new%d", i); pwToolButton = gtk_tool_button_new_from_stock(stock); gtk_widget_set_tooltip_text(GTK_WIDGET(pwToolButton), sz); gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar2), pwToolButton, -1); gtk_tool_item_set_homogeneous(pwToolButton, FALSE); g_free(sz); pi = g_malloc(sizeof(int)); *pi = i; g_object_set_data_full(G_OBJECT(pwToolButton), "user_data", pi, g_free); g_signal_connect(G_OBJECT(pwToolButton), "clicked", G_CALLBACK(ToolButtonPressed), pnw); } pwFrame = gtk_frame_new(_("Match settings")); #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); #endif pwLabel = gtk_label_new(_("Length:")); gtk_label_set_justify(GTK_LABEL(pwLabel), GTK_JUSTIFY_RIGHT); pnw->pwML = gtk_spin_button_new_with_range(0, MAXSCORE, 1); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(pnw->pwML), TRUE); gtk_box_pack_start(GTK_BOX(pwHbox), pwLabel, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pwHbox), pnw->pwML, FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(pwFrame), pwHbox); gtk_container_add(GTK_CONTAINER(pwVbox), pwFrame); /* Here the simplified player settings starts */ pwFrame = gtk_frame_new(_("Player settings")); #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pwVbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); pwVbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwHbox), pwVbox2); pnw->pwCPS = gtk_radio_button_new_with_label(NULL, _("Current player settings")); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwCPS, FALSE, FALSE, 0); pnw->pwGNUvsHuman = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pnw->pwCPS), _("GNU Backgammon vs. Human")); pnw->pwHumanHuman = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pnw->pwCPS), _("Human vs. Human")); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwGNUvsHuman, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwHumanHuman, FALSE, FALSE, 0); pwButtons = gtk_button_new_with_label(_("Modify player settings...")); gtk_container_set_border_width(GTK_CONTAINER(pwButtons), 10); gtk_container_add(GTK_CONTAINER(pwVbox2), pwButtons); g_signal_connect(G_OBJECT(pwButtons), "clicked", G_CALLBACK(SettingsPressed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwVbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwHbox), pwVbox2); pnw->pwManualDice = gtk_check_button_new_with_label(_("Manual dice")); pnw->pwTutorMode = gtk_check_button_new_with_label(_("Tutor mode")); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwManualDice, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwTutorMode, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(pwFrame), pwHbox); gtk_container_add(GTK_CONTAINER(pwVbox), pwFrame); return pwVbox; } static void NewOK(GtkWidget * pw, newwidget * pnw) { char sz[40]; unsigned int Mlength = (unsigned int) gtk_spin_button_get_value(GTK_SPIN_BUTTON(pnw->pwML)); UpdatePlayerSettings(pnw); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); if (ToolbarIsEditing(NULL)) click_edit(); /* Come out of editing mode */ sprintf(sz, "new match %u", Mlength); UserCommand(sz); GL_SetNames(); } static void NewSet(newwidget * pnw) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pnw->pwTutorMode), fTutor); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pnw->pwManualDice), rngCurrent == RNG_MANUAL); gtk_spin_button_set_value(GTK_SPIN_BUTTON(pnw->pwML), nDefaultLength); } extern void GTKNew(void) { GtkWidget *pwDialog; newwidget nw; GtkAllocation allocation; pwDialog = GTKCreateDialog(_("GNU Backgammon - New"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(NewOK), &nw); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), NewWidget(&nw)); gtk_widget_get_allocation(pwToolbar, &allocation); gtk_widget_set_size_request(pwToolbar, allocation.width, allocation.height); gtk_widget_grab_focus(DialogArea(pwDialog, DA_OK)); NewSet(&nw); GTKRunDialog(pwDialog); } extern void SetMET(GtkWidget * UNUSED(pw), gpointer p) { gchar *met_dir = BuildFilename("met"); gchar *filename = GTKFileSelect(_("Set match equity table"), "*.xml", met_dir, NULL, GTK_FILE_CHOOSER_ACTION_OPEN); g_free(met_dir); if (filename) { gchar *command = g_strconcat("set matchequitytable \"", filename, "\"", NULL); UserCommand(command); g_free(command); g_free(filename); /* update filename on option page */ if (p && gtk_widget_get_visible(p)) gtk_label_set_text(GTK_LABEL(p), (char *) miCurrent.szFileName); } UserCommand("save settings"); } typedef struct { int *pfOK; evalcontext *precCube, *precCheq; movefilter *pmf; } rolloutpagewidget; typedef struct { int *pfOK; GtkWidget *pwCubeful, *pwVarRedn, *pwInitial, *pwRotate, *pwDoLate; GtkWidget *pwDoTrunc, *pwCubeEqualChequer, *pwPlayersAreSame; GtkWidget *pwTruncEqualPlayer0; GtkWidget *pwTruncBearoff2, *pwTruncBearoffOS, *pwTruncBearoffOpts; GtkWidget *pwAdjLatePlies, *pwAdjTruncPlies, *pwAdjMinGames; GtkWidget *pwDoSTDStop, *pwAdjMaxError; GtkWidget *pwJsdDoStop; GtkWidget *pwJsdMinGames, *pwJsdAdjMinGames, *pwAdjJsdLimit; GtkAdjustment *padjTrials, *padjTruncPlies, *padjLatePlies; GtkAdjustment *padjSeed, *padjMinGames, *padjMaxError; GtkAdjustment *padjJsdMinGames, *padjJsdLimit; GtkWidget *pwMinGames, *pwMaxError, *pwJsdLimit; } rolloutpagegeneral; typedef struct { rolloutcontext rcRollout; rolloutpagegeneral *prwGeneral; rolloutpagewidget *prpwPages[4], *prpwTrunc; GtkWidget *RolloutNotebook, *frame[2]; AnalysisDetails *analysisDetails[5]; int fCubeEqualChequer, fPlayersAreSame, fTruncEqualPlayer0; int *pfOK; int *psaveAs; int *ploadRS; } rolloutwidget; /*************************************************************************** ***** ***** Change SGF_ROLLOUT_VER in eval.h if rollout settings change ***** such that previous .sgf files won't be able to extend rollouts ***** ***************************************************************************/ static void GetRolloutSettings(GtkWidget * pw, rolloutwidget * prw) { int fCubeEqChequer, fSamePlayers; prw->rcRollout.nTrials = (int) gtk_adjustment_get_value(prw->prwGeneral->padjTrials); prw->rcRollout.nTruncate = (unsigned short) gtk_adjustment_get_value(prw->prwGeneral->padjTruncPlies); prw->rcRollout.fDoTruncate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoTrunc)); prw->rcRollout.nSeed = (int) gtk_adjustment_get_value(prw->prwGeneral->padjSeed); prw->rcRollout.fCubeful = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwCubeful)); prw->rcRollout.fVarRedn = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwVarRedn)); prw->rcRollout.fRotate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwRotate)); prw->rcRollout.fInitial = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwInitial)); prw->rcRollout.fTruncBearoff2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwTruncBearoff2)); prw->rcRollout.fTruncBearoffOS = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwTruncBearoffOS)); prw->rcRollout.nLate = (unsigned short) gtk_adjustment_get_value(prw->prwGeneral->padjLatePlies); prw->rcRollout.fLateEvals = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoLate)); fCubeEqChequer = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwCubeEqualChequer)); fSamePlayers = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwPlayersAreSame)); prw->rcRollout.fStopOnSTD = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoSTDStop)); prw->rcRollout.nMinimumGames = (unsigned int) gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(prw->prwGeneral->pwMinGames)); prw->rcRollout.rStdLimit = (float) gtk_spin_button_get_value(GTK_SPIN_BUTTON(prw->prwGeneral->pwMaxError)); prw->rcRollout.fStopOnJsd = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwJsdDoStop)); prw->rcRollout.nMinimumJsdGames = (unsigned int) gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(prw->prwGeneral->pwJsdMinGames)); prw->rcRollout.rJsdLimit = (float) gtk_spin_button_get_value(GTK_SPIN_BUTTON(prw->prwGeneral->pwJsdLimit)); /* if the players are the same, copy player 0 settings to player 1 */ if (fSamePlayers) { int p0, p1; for (p0 = 0, p1 = 1; p0 < 4; p0 += 2, p1 += 2) { memcpy(prw->prpwPages[p1]->precCheq, prw->prpwPages[p0]->precCheq, sizeof(evalcontext)); memcpy(prw->prpwPages[p1]->precCube, prw->prpwPages[p0]->precCube, sizeof(evalcontext)); memcpy(prw->prpwPages[p1]->pmf, prw->prpwPages[p0]->pmf, MAX_FILTER_PLIES * MAX_FILTER_PLIES * sizeof(movefilter)); } } /* if cube is same as chequer, copy the chequer settings to the * cube settings */ if (fCubeEqChequer) { for (int i = 0; i < 4; ++i) { memcpy(prw->prpwPages[i]->precCube, prw->prpwPages[i]->precCheq, sizeof(evalcontext)); } memcpy(prw->prpwTrunc->precCube, prw->prpwTrunc->precCheq, sizeof(evalcontext)); } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwTruncEqualPlayer0))) { memcpy(prw->prpwTrunc->precCube, prw->prpwPages[0]->precCheq, sizeof(evalcontext)); memcpy(prw->prpwTrunc->precCheq, prw->prpwPages[0]->precCube, sizeof(evalcontext)); } gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void SetRolloutsOK(GtkWidget * pw, rolloutwidget * prw) { *prw->pfOK = TRUE; GetRolloutSettings(pw, prw); } static void save_rollout_as_clicked(GtkWidget * pw, rolloutwidget * prw) { *prw->psaveAs = TRUE; GetRolloutSettings(pw, prw); } static void load_rs_clicked(GtkWidget * pw, rolloutwidget * prw) { *prw->ploadRS = TRUE; gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } /* create one page for rollout settings for play & truncation */ static AnalysisDetails * RolloutPage(rolloutpagewidget * prpw, const char *title, const int UNUSED(fMoveFilter), GtkWidget ** frameRet) { GtkWidget *pwFrame; pwFrame = gtk_frame_new(title); if (frameRet) *frameRet = pwFrame; return CreateEvalSettings(pwFrame, title, prpw->precCheq, prpw->pmf, prpw->precCube, NULL, FALSE); } static void LateEvalToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int do_late = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoLate)); int are_same = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwPlayersAreSame)); /* turn on/off the late pages */ gtk_widget_set_sensitive(prw->analysisDetails[2]->pwSettingWidgets, do_late); gtk_widget_set_sensitive(prw->analysisDetails[3]->pwSettingWidgets, do_late && !are_same); /* turn on/off the ply setting in the general page */ gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwAdjLatePlies), do_late); } static void STDStopToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int do_std_stop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoSTDStop)); gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwAdjMinGames), do_std_stop); gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwAdjMaxError), do_std_stop); } static void JsdStopToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int do_jsd_stop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwJsdDoStop)); gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwJsdAdjMinGames), do_jsd_stop); gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwAdjJsdLimit), do_jsd_stop); } static void TruncEnableToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int do_trunc = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoTrunc)); int sameas_p0 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwTruncEqualPlayer0)); /* turn on/off the truncation page */ gtk_widget_set_sensitive(prw->analysisDetails[4]->pwSettingWidgets, do_trunc && !sameas_p0); /* turn on/off the truncation ply setting */ gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwAdjTruncPlies), do_trunc); } static void TruncEqualPlayer0Toggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int do_trunc = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoTrunc)); int sameas_p0 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwTruncEqualPlayer0)); prw->fTruncEqualPlayer0 = sameas_p0; /* turn on/off the truncation page */ gtk_widget_set_sensitive(prw->analysisDetails[4]->pwSettingWidgets, do_trunc && !sameas_p0); } static void CubeEqCheqToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int i, are_same = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwCubeEqualChequer)); prw->fCubeEqualChequer = are_same; for (i = 0; i < 5; ++i) prw->analysisDetails[i]->cubeDisabled = are_same; } static void CubefulToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int f = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwCubeful)); gtk_widget_set_sensitive(GTK_WIDGET(prw->prwGeneral->pwTruncBearoffOS), !f); } static void PlayersSameToggled(GtkWidget * UNUSED(pw), rolloutwidget * prw) { int are_same = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwPlayersAreSame)); int do_late = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoLate)); prw->fPlayersAreSame = are_same; gtk_widget_set_sensitive(prw->analysisDetails[1]->pwSettingWidgets, !are_same); gtk_widget_set_sensitive(prw->analysisDetails[3]->pwSettingWidgets, !are_same && do_late); prw->analysisDetails[0]->title = are_same ? _("First Play Both") : _("First Play (0) "); gtk_frame_set_label(GTK_FRAME(prw->frame[0]), prw->analysisDetails[0]->title); prw->analysisDetails[2]->title = are_same ? _("Later Play Both") : _("Later Play (0) "); gtk_frame_set_label(GTK_FRAME(prw->frame[1]), prw->analysisDetails[2]->title); } /* create the General page for rollouts */ static GtkWidget * RolloutPageGeneral(rolloutpagegeneral * prpw, rolloutwidget * prw) { GtkWidget *pwPage; GtkWidget *pwh, *pwv, *pwHBox; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwGrid; #else GtkWidget *pwTable; #endif GtkWidget *pwFrame; GtkWidget *pwLabel; #if GTK_CHECK_VERSION(3,0,0) pwPage = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwPage = gtk_vbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pwPage), 8); prpw->padjSeed = GTK_ADJUSTMENT(gtk_adjustment_new((gdouble) prw->rcRollout.nSeed, 0, INT_MAX, 1, 1, 0)); prpw->padjTrials = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.nTrials, 1, 36 * 1296 * 1296, 36, 36, 0)); #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwh = gtk_hbox_new(FALSE, 8); #endif gtk_box_pack_start(GTK_BOX(pwPage), pwh, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwh), pwLabel = gtk_label_new(_("Seed:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwh), gtk_spin_button_new(prpw->padjSeed, 1, 0), FALSE, FALSE, 4); gtk_widget_set_tooltip_text(pwLabel, _("The seed is a number used to initialise the dice rolls generator. Reusing the same seed allows to reproduce the rollout results. 0 is a special value that leaves GNU Backgammon use a random value.")); gtk_box_pack_end(GTK_BOX(pwh), gtk_spin_button_new(prpw->padjTrials, 36, 0), FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwh), pwLabel = gtk_label_new(_("Trials:")), FALSE, FALSE, 4); gtk_widget_set_tooltip_text(pwLabel, _("The number of games to play out; the standard deviation of the results decreases like the square root of the trials number. It is recommended to use a multiple of 36 or 1296.")); pwFrame = gtk_frame_new(_("Truncation")); gtk_box_pack_start(GTK_BOX(pwPage), pwFrame, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(pwFrame, _("Truncated rollouts are rollouts played to a certain number of moves as opposed to the end of the game or a double/pass cube action. " "They are faster and their results have a lower variance than full rollouts, but their accuracy depends on that of the static evaluation at the trucation point.")); #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwh = gtk_hbox_new(FALSE, 8); #endif gtk_container_set_border_width(GTK_CONTAINER(pwh), 8); gtk_container_add(GTK_CONTAINER(pwFrame), pwh); prpw->pwDoTrunc = gtk_check_button_new_with_label(_("Truncate Rollouts")); gtk_box_pack_start(GTK_BOX(pwh), prpw->pwDoTrunc, FALSE, FALSE, 4); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwDoTrunc), prw->rcRollout.fDoTruncate); g_signal_connect(G_OBJECT(prpw->pwDoTrunc), "toggled", G_CALLBACK(TruncEnableToggled), prw); #if GTK_CHECK_VERSION(3,0,0) prpw->pwAdjTruncPlies = pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else prpw->pwAdjTruncPlies = pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwh), pwHBox, FALSE, FALSE, 4); prpw->padjTruncPlies = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.nTruncate, 1, 1000, 1, 1, 0)); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_spin_button_new(prpw->padjTruncPlies, 1, 0), FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_label_new(_("Truncate at ply:")), FALSE, FALSE, 4); pwFrame = gtk_frame_new(_("Evaluation for later plies")); gtk_box_pack_start(GTK_BOX(pwPage), pwFrame, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(pwFrame, _("It can be useful to use a different (higher) level of evaluation for the first few plies if one thinks that the current position is complex but will quickly evolve into simpler ones that will be adequately handled by a lower level.")); #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwh = gtk_hbox_new(FALSE, 8); #endif gtk_container_set_border_width(GTK_CONTAINER(pwh), 8); gtk_container_add(GTK_CONTAINER(pwFrame), pwh); prpw->pwDoLate = gtk_check_button_new_with_label(_("Enable separate evaluations ")); gtk_box_pack_start(GTK_BOX(pwh), prpw->pwDoLate, FALSE, FALSE, 4); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoLate), prw->rcRollout.fLateEvals); g_signal_connect(G_OBJECT(prw->prwGeneral->pwDoLate), "toggled", G_CALLBACK(LateEvalToggled), prw); #if GTK_CHECK_VERSION(3,0,0) prpw->pwAdjLatePlies = pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else prpw->pwAdjLatePlies = pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwh), pwHBox, FALSE, FALSE, 4); prpw->padjLatePlies = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.nLate, 1, 1000, 1, 1, 0)); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_spin_button_new(prpw->padjLatePlies, 1, 0), FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_label_new(_("Change eval after ply:")), FALSE, FALSE, 4); pwFrame = gtk_frame_new(_("Stop when result is accurate")); gtk_box_pack_start(GTK_BOX(pwPage), pwFrame, FALSE, FALSE, 0); /* an hbox for the frame */ #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwh = gtk_hbox_new(FALSE, 8); #endif gtk_container_set_border_width(GTK_CONTAINER(pwh), 8); gtk_container_add(GTK_CONTAINER(pwFrame), pwh); prpw->pwDoSTDStop = gtk_check_button_new_with_label(_("Stop when SE is small enough ")); gtk_box_pack_start(GTK_BOX(pwh), prpw->pwDoSTDStop, FALSE, FALSE, 4); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwDoSTDStop), prw->rcRollout.fStopOnSTD); g_signal_connect(G_OBJECT(prw->prwGeneral->pwDoSTDStop), "toggled", G_CALLBACK(STDStopToggled), prw); gtk_widget_set_tooltip_text(prpw->pwDoSTDStop, _("Standard Error (SE) of the candidate play equity is a measure of " "the accuracy of the current rollout result. " "If the rollout were to be continued indefinitely, its result would " "have about 95 chances out of 100 to be in an interval of +/-2 SE " "around the current result.")); /* a vbox for the adjusters */ #if GTK_CHECK_VERSION(3,0,0) pwv = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwv = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwh), pwv, FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) prpw->pwAdjMinGames = pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else prpw->pwAdjMinGames = pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwv), pwHBox, TRUE, TRUE, 0); prpw->padjMinGames = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.nMinimumGames, 1, 36 * 1296 * 1296, 36, 36, 0)); prpw->pwMinGames = gtk_spin_button_new(prpw->padjMinGames, 1, 0); gtk_box_pack_end(GTK_BOX(pwHBox), prpw->pwMinGames, FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_label_new(_("Minimum Trials:")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) prpw->pwAdjMaxError = pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else prpw->pwAdjMaxError = pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwv), pwHBox, TRUE, TRUE, 0); prpw->padjMaxError = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.rStdLimit, 0, 1, .0001, .0001, 0)); prpw->pwMaxError = gtk_spin_button_new(prpw->padjMaxError, .0001, 4); gtk_box_pack_end(GTK_BOX(pwHBox), prpw->pwMaxError, FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_label_new(_("Equity SE threshold:")), FALSE, FALSE, 4); pwFrame = gtk_frame_new(_("Stop when result is clear")); gtk_box_pack_start(GTK_BOX(pwPage), pwFrame, FALSE, FALSE, 0); /* an hbox for the frame */ #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwh = gtk_hbox_new(FALSE, 8); #endif gtk_container_set_border_width(GTK_CONTAINER(pwh), 8); gtk_container_add(GTK_CONTAINER(pwFrame), pwh); prpw->pwJsdDoStop = gtk_check_button_new_with_label(_("Stop when JSD margin is high enough")); gtk_box_pack_start(GTK_BOX(pwh), prpw->pwJsdDoStop, FALSE, FALSE, 4); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prw->prwGeneral->pwJsdDoStop), prw->rcRollout.fStopOnJsd); g_signal_connect(G_OBJECT(prw->prwGeneral->pwJsdDoStop), "toggled", G_CALLBACK(JsdStopToggled), prw); gtk_widget_set_tooltip_text(prpw->pwJsdDoStop, _("The number of Joint Standard Deviations (JSD) between " "the current favourite and another candidate decision is a " "measure of how unlikely continuing the rollout is to " "change the current result. " "A candidate trailing by 2.33 JSD has about 1 chance out of 100 to " "end as winner if the rollout were to be continued indefinitely.")); /* a vbox for the adjusters */ #if GTK_CHECK_VERSION(3,0,0) pwv = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwv = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwh), pwv, FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) prpw->pwJsdAdjMinGames = pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else prpw->pwJsdAdjMinGames = pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwv), pwHBox, TRUE, TRUE, 0); prpw->padjJsdMinGames = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.nMinimumJsdGames, 1, 36 * 1296 * 1296, 36, 36, 0)); prpw->pwJsdMinGames = gtk_spin_button_new(prpw->padjJsdMinGames, 1, 0); gtk_box_pack_end(GTK_BOX(pwHBox), prpw->pwJsdMinGames, FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_label_new(_("Minimum Trials:")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) prpw->pwAdjJsdLimit = pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else prpw->pwAdjJsdLimit = pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(pwv), pwHBox, TRUE, TRUE, 0); prpw->padjJsdLimit = GTK_ADJUSTMENT(gtk_adjustment_new(prw->rcRollout.rJsdLimit, 0, 8, .0001, .0001, 0)); prpw->pwJsdLimit = gtk_spin_button_new(prpw->padjJsdLimit, .0001, 4); gtk_box_pack_end(GTK_BOX(pwHBox), prpw->pwJsdLimit, FALSE, FALSE, 4); gtk_box_pack_end(GTK_BOX(pwHBox), gtk_label_new(_("JSD threshold:")), FALSE, FALSE, 4); pwFrame = gtk_frame_new(_("Bearoff Truncation")); gtk_box_pack_start(GTK_BOX(pwPage), pwFrame, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(pwFrame, _("Truncating the rollouts when reaching the bearoff databases slighly improves the speed and decrease their variance. " "The first option is totally accurate and should be selected for practical use; the second one can be slightly inaccurate but is useful on average and its use is recommended.")); #if GTK_CHECK_VERSION(3,0,0) prpw->pwTruncBearoffOpts = pwv = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); #else prpw->pwTruncBearoffOpts = pwv = gtk_vbox_new(FALSE, 8); #endif gtk_container_set_border_width(GTK_CONTAINER(pwv), 8); gtk_container_add(GTK_CONTAINER(pwFrame), pwv); prpw->pwTruncBearoff2 = gtk_check_button_new_with_label(_("Truncate cubeless and cubeful money at exact bearoff database")); gtk_box_pack_start(GTK_BOX(pwv), prpw->pwTruncBearoff2, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwTruncBearoff2), prw->rcRollout.fTruncBearoff2); prpw->pwTruncBearoffOS = gtk_check_button_new_with_label(_("Truncate cubeless at one-sided bearoff database")); gtk_box_pack_start(GTK_BOX(pwv), prpw->pwTruncBearoffOS, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwTruncBearoffOS), prw->rcRollout.fTruncBearoffOS); #if GTK_CHECK_VERSION(3,0,0) pwGrid = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pwGrid), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pwGrid), TRUE); gtk_container_add(GTK_CONTAINER(pwPage), pwGrid); #else pwTable = gtk_table_new(2, 2, TRUE); gtk_container_add(GTK_CONTAINER(pwPage), pwTable); #endif prpw->pwCubeful = gtk_check_button_new_with_label(_("Cubeful rollout")); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), prpw->pwCubeful, 0, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(prpw->pwCubeful, 2); gtk_widget_set_margin_end(prpw->pwCubeful, 2); #else gtk_widget_set_margin_left(prpw->pwCubeful, 2); gtk_widget_set_margin_right(prpw->pwCubeful, 2); #endif gtk_widget_set_margin_top(prpw->pwCubeful, 2); gtk_widget_set_margin_bottom(prpw->pwCubeful, 2); #else gtk_table_attach(GTK_TABLE(pwTable), prpw->pwCubeful, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 2, 2); #endif gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwCubeful), prw->rcRollout.fCubeful); g_signal_connect(G_OBJECT(prpw->pwCubeful), "toggled", G_CALLBACK(CubefulToggled), prw); gtk_widget_set_tooltip_text(prpw->pwCubeful, _("A cubeful rollout means that it is using the cube in the rollout. " "It is recommended to enable this option when analyzing cubeful play.")); prpw->pwVarRedn = gtk_check_button_new_with_label(_("Use variance reduction")); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), prpw->pwVarRedn, 1, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(prpw->pwVarRedn, 2); gtk_widget_set_margin_end(prpw->pwVarRedn, 2); #else gtk_widget_set_margin_left(prpw->pwVarRedn, 2); gtk_widget_set_margin_right(prpw->pwVarRedn, 2); #endif gtk_widget_set_margin_top(prpw->pwVarRedn, 2); gtk_widget_set_margin_bottom(prpw->pwVarRedn, 2); #else gtk_table_attach(GTK_TABLE(pwTable), prpw->pwVarRedn, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 2, 2); #endif gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwVarRedn), prw->rcRollout.fVarRedn); gtk_widget_set_tooltip_text(prpw->pwVarRedn, _("Variance Reduction is a procedure used to considerably increase " "the accuracy of rollout results. " "It has a significant cost for 0-ply rollouts " "(but is still valuable on an accuracy per elapsed-time basis) " "and is almost free for higher plies. " "It is recommended to enable this option.")); prpw->pwRotate = gtk_check_button_new_with_label(_("Use quasi-random dice")); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), prpw->pwRotate, 0, 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(prpw->pwRotate, 2); gtk_widget_set_margin_end(prpw->pwRotate, 2); #else gtk_widget_set_margin_left(prpw->pwRotate, 2); gtk_widget_set_margin_right(prpw->pwRotate, 2); #endif gtk_widget_set_margin_top(prpw->pwRotate, 2); gtk_widget_set_margin_bottom(prpw->pwRotate, 2); #else gtk_table_attach(GTK_TABLE(pwTable), prpw->pwRotate, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 2, 2); #endif gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwRotate), prw->rcRollout.fRotate); gtk_widget_set_tooltip_text(prpw->pwRotate, _("This option ensures that every possible roll appears once in each set of 36 trials. This is only moderately useful if variance reduction is used but important if it isn't. It is recommended to enable this option.")); prpw->pwInitial = gtk_check_button_new_with_label(_("Rollout as initial position")); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), prpw->pwInitial, 1, 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(prpw->pwInitial, 2); gtk_widget_set_margin_end(prpw->pwInitial, 2); #else gtk_widget_set_margin_left(prpw->pwInitial, 2); gtk_widget_set_margin_right(prpw->pwInitial, 2); #endif gtk_widget_set_margin_top(prpw->pwInitial, 2); gtk_widget_set_margin_bottom(prpw->pwInitial, 2); #else gtk_table_attach(GTK_TABLE(pwTable), prpw->pwInitial, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 2, 2); #endif gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prpw->pwInitial), prw->rcRollout.fInitial); gtk_widget_set_tooltip_text(prpw->pwInitial, _("This option ensures that the first ply roll is not a doublet.")); return pwPage; } static void gtk_save_rollout_settings(void) { char *filename; char *folder; FILE *pf; folder = g_build_filename(szHomeDirectory, "rol", NULL); if (!g_file_test(folder, G_FILE_TEST_IS_DIR)) { g_mkdir(folder, 0700); if (!g_file_test(folder, G_FILE_TEST_IS_DIR)) { outputerrf(_("Failed to create %s"), folder); return; } } filename = GTKFileSelect(_("Save Rollout Settings As (*.rol)"), "*.rol", folder, NULL, GTK_FILE_CHOOSER_ACTION_SAVE); if (!filename) return; if (!g_str_has_suffix(filename, ".rol")) { char *tmp = g_strdup(filename); g_free(filename); filename = g_strconcat(tmp, ".rol", NULL); g_free(tmp); } errno = 0; pf = g_fopen(filename, "w"); if (!pf) { outputerr(filename); g_free(filename); return; } SaveRolloutSettings(pf, "set rollout", &rcRollout); fclose(pf); if (errno) outputerr(filename); g_free(filename); return; } static void gtk_load_rollout_settings(void) { gchar *folder = g_build_filename(szHomeDirectory, "rol", NULL); gchar *filename = GTKFileSelect(_("Open rollout settings (*.rol)"), "*.rol", folder, NULL, GTK_FILE_CHOOSER_ACTION_OPEN); if (filename) { gchar *command = g_strconcat("load commands \"", filename, "\"", NULL); outputoff(); UserCommand(command); outputon(); g_free(command); g_free(filename); } } extern void SetRollouts(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pwIgnore)) { int fOK = FALSE; int saveAs = TRUE; int loadRS = TRUE; rolloutwidget rw; rolloutpagegeneral RPGeneral; rolloutpagewidget RPPlayer0, RPPlayer1, RPPlayer0Late, RPPlayer1Late, RPTrunc; char sz[256]; int i; const float epsilon = 1.0e-6f; while (saveAs || loadRS) { GtkWidget *pwDialog, *pwVBox; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwGrid; GtkWidget *pw; #else GtkWidget *pwTable; #endif GtkWidget *saveAsButton, *loadRSButton; memcpy(&rw.rcRollout, &rcRollout, sizeof(rcRollout)); rw.prwGeneral = &RPGeneral; rw.prpwPages[0] = &RPPlayer0; rw.prpwPages[1] = &RPPlayer1; rw.prpwPages[2] = &RPPlayer0Late; rw.prpwPages[3] = &RPPlayer1Late; rw.prpwTrunc = &RPTrunc; rw.fCubeEqualChequer = fCubeEqualChequer; rw.fPlayersAreSame = fPlayersAreSame; rw.fTruncEqualPlayer0 = fTruncEqualPlayer0; rw.pfOK = &fOK; rw.psaveAs = &saveAs; rw.ploadRS = &loadRS; RPPlayer0.precCube = &rw.rcRollout.aecCube[0]; RPPlayer0.precCheq = &rw.rcRollout.aecChequer[0]; RPPlayer0.pmf = (movefilter *) rw.rcRollout.aaamfChequer[0]; RPPlayer0Late.precCube = &rw.rcRollout.aecCubeLate[0]; RPPlayer0Late.precCheq = &rw.rcRollout.aecChequerLate[0]; RPPlayer0Late.pmf = (movefilter *) rw.rcRollout.aaamfLate[0]; RPPlayer1.precCube = &rw.rcRollout.aecCube[1]; RPPlayer1.precCheq = &rw.rcRollout.aecChequer[1]; RPPlayer1.pmf = (movefilter *) rw.rcRollout.aaamfChequer[1]; RPPlayer1Late.precCube = &rw.rcRollout.aecCubeLate[1]; RPPlayer1Late.precCheq = &rw.rcRollout.aecChequerLate[1]; RPPlayer1Late.pmf = (movefilter *) rw.rcRollout.aaamfLate[1]; RPTrunc.precCube = &rw.rcRollout.aecCubeTrunc; RPTrunc.precCheq = &rw.rcRollout.aecChequerTrunc; saveAs = FALSE; loadRS = FALSE; pwDialog = GTKCreateDialog(_("GNU Backgammon - Rollouts"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(SetRolloutsOK), &rw); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_BUTTONS)), saveAsButton = gtk_button_new_with_label(_("Save As"))); g_signal_connect(saveAsButton, "clicked", G_CALLBACK(save_rollout_as_clicked), &rw); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_BUTTONS)), loadRSButton = gtk_button_new_with_label(_("Load"))); g_signal_connect(loadRSButton, "clicked", G_CALLBACK(load_rs_clicked), &rw); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), rw.RolloutNotebook = gtk_notebook_new()); gtk_container_set_border_width(GTK_CONTAINER(rw.RolloutNotebook), 4); gtk_notebook_append_page(GTK_NOTEBOOK(rw.RolloutNotebook), RolloutPageGeneral(rw.prwGeneral, &rw), gtk_label_new(_("General Settings"))); #if GTK_CHECK_VERSION(3,0,0) pwVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVBox = gtk_vbox_new(FALSE, 0); #endif gtk_notebook_append_page(GTK_NOTEBOOK(rw.RolloutNotebook), pwVBox, gtk_label_new(_("Play Settings"))); #if GTK_CHECK_VERSION(3,0,0) pwGrid = gtk_grid_new(); gtk_box_pack_start(GTK_BOX(pwVBox), pwGrid, FALSE, FALSE, 0); #else pwTable = gtk_table_new(3, 2, FALSE); gtk_box_pack_start(GTK_BOX(pwVBox), pwTable, FALSE, FALSE, 0); #endif rw.analysisDetails[0] = RolloutPage(rw.prpwPages[0], _("First Play (0) "), TRUE, &rw.frame[0]); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_widget_get_parent(rw.analysisDetails[0]->pwSettingWidgets), 0, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), gtk_widget_get_parent(rw.analysisDetails[0]->pwSettingWidgets), 0, 1, 0, 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 4, 4); #endif rw.analysisDetails[1] = RolloutPage(rw.prpwPages[1], _("First Play (1) "), TRUE, NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_widget_get_parent(rw.analysisDetails[1]->pwSettingWidgets), 1, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), gtk_widget_get_parent(rw.analysisDetails[1]->pwSettingWidgets), 1, 2, 0, 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 4, 4); #endif rw.analysisDetails[2] = RolloutPage(rw.prpwPages[2], _("Later Play (0) "), TRUE, &rw.frame[1]); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_widget_get_parent(rw.analysisDetails[2]->pwSettingWidgets), 0, 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), gtk_widget_get_parent(rw.analysisDetails[2]->pwSettingWidgets), 0, 1, 1, 2, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 4, 4); #endif rw.analysisDetails[3] = RolloutPage(rw.prpwPages[3], _("Later Play (1) "), TRUE, NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_widget_get_parent(rw.analysisDetails[3]->pwSettingWidgets), 1, 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), gtk_widget_get_parent(rw.analysisDetails[3]->pwSettingWidgets), 1, 2, 1, 2, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 4, 4); #endif rw.prpwTrunc->pmf = NULL; rw.analysisDetails[4] = RolloutPage(rw.prpwTrunc, _("Eval. at Truncation Point"), FALSE, NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_widget_get_parent(rw.analysisDetails[4]->pwSettingWidgets), 0, 2, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), gtk_widget_get_parent(rw.analysisDetails[4]->pwSettingWidgets), 0, 1, 2, 3, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 4, 4); #endif RPGeneral.pwPlayersAreSame = gtk_check_button_new_with_label(_("Use same settings for both players")); gtk_box_pack_start(GTK_BOX(pwVBox), RPGeneral.pwPlayersAreSame, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RPGeneral.pwPlayersAreSame), rw.fPlayersAreSame); g_signal_connect(G_OBJECT(RPGeneral.pwPlayersAreSame), "toggled", G_CALLBACK(PlayersSameToggled), &rw); RPGeneral.pwCubeEqualChequer = gtk_check_button_new_with_label(_("Cube decisions use same settings as chequer play")); gtk_box_pack_start(GTK_BOX(pwVBox), RPGeneral.pwCubeEqualChequer, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RPGeneral.pwCubeEqualChequer), rw.fCubeEqualChequer); g_signal_connect(G_OBJECT(RPGeneral.pwCubeEqualChequer), "toggled", G_CALLBACK(CubeEqCheqToggled), &rw); RPGeneral.pwTruncEqualPlayer0 = gtk_check_button_new_with_label(_("Use player 0 setting for truncation point")); gtk_box_pack_start(GTK_BOX(pwVBox), RPGeneral.pwTruncEqualPlayer0, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(RPGeneral.pwTruncEqualPlayer0), rw.fTruncEqualPlayer0); g_signal_connect(G_OBJECT(RPGeneral.pwTruncEqualPlayer0), "toggled", G_CALLBACK(TruncEqualPlayer0Toggled), &rw); /* Set things up correctly */ LateEvalToggled(NULL, &rw); STDStopToggled(NULL, &rw); JsdStopToggled(NULL, &rw); TruncEnableToggled(NULL, &rw); CubeEqCheqToggled(NULL, &rw); PlayersSameToggled(NULL, &rw); CubefulToggled(NULL, &rw); GTKRunDialog(pwDialog); for (i = 0; i < 5; i++) free(rw.analysisDetails[i]); if (fOK || saveAs) { unsigned int fCubeful; outputoff(); if ((fCubeful = rw.rcRollout.fCubeful) != rcRollout.fCubeful) { sprintf(sz, "set rollout cubeful %s", fCubeful ? "on" : "off"); UserCommand(sz); for (i = 0; i < 2; ++i) { /* replicate main page cubeful on/of in all evals */ rw.rcRollout.aecChequer[i].fCubeful = fCubeful; rw.rcRollout.aecChequerLate[i].fCubeful = fCubeful; rw.rcRollout.aecCube[i].fCubeful = fCubeful; rw.rcRollout.aecCubeLate[i].fCubeful = fCubeful; } rw.rcRollout.aecCubeTrunc.fCubeful = rw.rcRollout.aecChequerTrunc.fCubeful = fCubeful; } for (i = 0; i < 2; ++i) { if (EvalCmp(&rw.rcRollout.aecCube[i], &rcRollout.aecCube[i], 1)) { sprintf(sz, "set rollout player %d cubedecision", i); SetEvalCommands(sz, &rw.rcRollout.aecCube[i], &rcRollout.aecCube[i]); } if (EvalCmp(&rw.rcRollout.aecChequer[i], &rcRollout.aecChequer[i], 1)) { sprintf(sz, "set rollout player %d chequer", i); SetEvalCommands(sz, &rw.rcRollout.aecChequer[i], &rcRollout.aecChequer[i]); } sprintf(sz, "set rollout player %d movefilter", i); SetMovefilterCommands(sz, rw.rcRollout.aaamfChequer[i], rcRollout.aaamfChequer[i]); if (EvalCmp(&rw.rcRollout.aecCubeLate[i], &rcRollout.aecCubeLate[i], 1)) { sprintf(sz, "set rollout late player %d cube", i); SetEvalCommands(sz, &rw.rcRollout.aecCubeLate[i], &rcRollout.aecCubeLate[i]); } if (EvalCmp(&rw.rcRollout.aecChequerLate[i], &rcRollout.aecChequerLate[i], 1)) { sprintf(sz, "set rollout late player %d chequer", i); SetEvalCommands(sz, &rw.rcRollout.aecChequerLate[i], &rcRollout.aecChequerLate[i]); } sprintf(sz, "set rollout late player %d movefilter", i); SetMovefilterCommands(sz, rw.rcRollout.aaamfLate[i], rcRollout.aaamfLate[i]); } if (EvalCmp(&rw.rcRollout.aecCubeTrunc, &rcRollout.aecCubeTrunc, 1)) { SetEvalCommands("set rollout truncation cube", &rw.rcRollout.aecCubeTrunc, &rcRollout.aecCubeTrunc); } if (EvalCmp(&rw.rcRollout.aecChequerTrunc, &rcRollout.aecChequerTrunc, 1)) { SetEvalCommands("set rollout truncation chequer", &rw.rcRollout.aecChequerTrunc, &rcRollout.aecChequerTrunc); } if (rw.rcRollout.fCubeful != rcRollout.fCubeful) { sprintf(sz, "set rollout cubeful %s", rw.rcRollout.fCubeful ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.fVarRedn != rcRollout.fVarRedn) { sprintf(sz, "set rollout varredn %s", rw.rcRollout.fVarRedn ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.fInitial != rcRollout.fInitial) { sprintf(sz, "set rollout initial %s", rw.rcRollout.fInitial ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.fRotate != rcRollout.fRotate) { sprintf(sz, "set rollout quasirandom %s", rw.rcRollout.fRotate ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.fLateEvals != rcRollout.fLateEvals) { sprintf(sz, "set rollout late enable %s", rw.rcRollout.fLateEvals ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.fDoTruncate != rcRollout.fDoTruncate) { sprintf(sz, "set rollout truncation enable %s", rw.rcRollout.fDoTruncate ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.nTruncate != rcRollout.nTruncate) { sprintf(sz, "set rollout truncation plies %u", rw.rcRollout.nTruncate); UserCommand(sz); } if (rw.rcRollout.nTrials != rcRollout.nTrials) { sprintf(sz, "set rollout trials %u", rw.rcRollout.nTrials); UserCommand(sz); } if (rw.rcRollout.fStopOnSTD != rcRollout.fStopOnSTD) { sprintf(sz, "set rollout limit enable %s", rw.rcRollout.fStopOnSTD ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.nMinimumGames != rcRollout.nMinimumGames) { sprintf(sz, "set rollout limit minimumgames %u", rw.rcRollout.nMinimumGames); UserCommand(sz); } if (fabsf(rw.rcRollout.rStdLimit - rcRollout.rStdLimit) > epsilon) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; sprintf(sz, "set rollout limit maxerr %s", g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%5.4f", rw.rcRollout.rStdLimit)); UserCommand(sz); } /* ======================= */ if (rw.rcRollout.fStopOnJsd != rcRollout.fStopOnJsd) { sprintf(sz, "set rollout jsd stop %s", rw.rcRollout.fStopOnJsd ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.nMinimumJsdGames != rcRollout.nMinimumJsdGames) { sprintf(sz, "set rollout jsd minimumgames %u", rw.rcRollout.nMinimumJsdGames); UserCommand(sz); } if (fabsf(rw.rcRollout.rJsdLimit - rcRollout.rJsdLimit) > epsilon) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; sprintf(sz, "set rollout jsd limit %s", g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%5.4f", rw.rcRollout.rJsdLimit)); UserCommand(sz); } if (rw.rcRollout.nLate != rcRollout.nLate) { sprintf(sz, "set rollout late plies %u", rw.rcRollout.nLate); UserCommand(sz); } if (rw.rcRollout.nSeed != rcRollout.nSeed) { sprintf(sz, "set rollout seed %lu", rw.rcRollout.nSeed); UserCommand(sz); } if (rw.rcRollout.fTruncBearoff2 != rcRollout.fTruncBearoff2) { sprintf(sz, "set rollout bearofftruncation exact %s", rw.rcRollout.fTruncBearoff2 ? "on" : "off"); UserCommand(sz); } if (rw.rcRollout.fTruncBearoffOS != rcRollout.fTruncBearoffOS) { sprintf(sz, "set rollout bearofftruncation onesided %s", rw.rcRollout.fTruncBearoffOS ? "on" : "off"); UserCommand(sz); } if (rw.fCubeEqualChequer != fCubeEqualChequer) { sprintf(sz, "set rollout cube-equal-chequer %s", rw.fCubeEqualChequer ? "on" : "off"); UserCommand(sz); } if (rw.fPlayersAreSame != fPlayersAreSame) { sprintf(sz, "set rollout players-are-same %s", rw.fPlayersAreSame ? "on" : "off"); UserCommand(sz); } if (rw.fTruncEqualPlayer0 != fTruncEqualPlayer0) { sprintf(sz, "set rollout truncate-equal-player0 %s", rw.fTruncEqualPlayer0 ? "on" : "off"); UserCommand(sz); } UserCommand("save settings"); outputon(); if (saveAs) gtk_save_rollout_settings(); else if (fOK) break; } if (loadRS) gtk_load_rollout_settings(); } } void GTKTextWindow(const char *szOutput, const char *title, const dialogtype type, GtkWidget * parent) { GtkWidget *pwDialog = GTKCreateDialog(title, type, parent, 0, NULL, NULL); GtkWidget *pwText; GtkWidget *sw; GtkWidget *notice; GtkWidget *pwh, *pwv; GtkTextBuffer *buffer; GtkTextIter iter; GtkRequisition req; gchar *sz; GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text(clipboard, szOutput, -1); pwText = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(pwText), GTK_WRAP_NONE); gtk_text_view_set_editable(GTK_TEXT_VIEW(pwText), FALSE); buffer = gtk_text_buffer_new(NULL); gtk_text_buffer_create_tag(buffer, "monospace", "family", "monospace", NULL); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, szOutput, -1, "monospace", NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW(pwText), buffer); sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw), pwText); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_get_preferred_size(GTK_WIDGET(pwText), &req, NULL); #else gtk_widget_size_request(GTK_WIDGET(pwText), &req); #endif sz = g_strdup_printf(_("%s copied to clipboard"), title); notice = gtk_label_new(sz); g_free(sz); #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pwv = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwh = gtk_hbox_new(FALSE, 0); pwv = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwh), pwv, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pwv), sw, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(pwv), notice, FALSE, FALSE, 0); gtk_window_set_default_size(GTK_WINDOW(pwDialog), -1, MIN(500, req.height + 200)); gtk_box_pack_start(GTK_BOX(DialogArea(pwDialog, DA_MAIN)), pwh, TRUE, TRUE, 0); gtk_window_set_modal(GTK_WINDOW(pwDialog), TRUE); gtk_window_set_transient_for(GTK_WINDOW(pwDialog), GTK_WINDOW(pwMain)); g_signal_connect(G_OBJECT(pwDialog), "destroy", G_CALLBACK(gtk_main_quit), NULL); GTKRunDialog(pwDialog); } extern void GTKEval(char *szOutput) { GTKTextWindow(szOutput, _("GNU Backgammon - Evaluation"), DT_INFO, NULL); } static void DestroyHint(gpointer p, GObject * UNUSED(obj)) { movelist *pml = p; if (pml) { if (pml->amMoves) g_free(pml->amMoves); g_free(pml); } SetPanelWidget(WINDOW_HINT, NULL); } static void HintOK(GtkWidget * UNUSED(pw), void *UNUSED(unused)) { getWindowGeometry(WINDOW_HINT); DestroyPanel(WINDOW_HINT); } extern void GTKCubeHint(moverecord * pmr, const matchstate * pms, int did_double, int did_take, int hist) { GtkWidget *pw, *pwHint; if (GetPanelWidget(WINDOW_HINT)) gtk_widget_destroy(GetPanelWidget(WINDOW_HINT)); pwHint = GTKCreateDialog(_("GNU Backgammon - Hint"), DT_INFO, NULL, DIALOG_FLAG_NOTIDY, G_CALLBACK(HintOK), NULL); SetPanelWidget(WINDOW_HINT, pwHint); pw = CreateCubeAnalysis(pmr, pms, did_double, did_take, hist); gtk_container_add(GTK_CONTAINER(DialogArea(pwHint, DA_MAIN)), pw); gtk_widget_grab_focus(DialogArea(pwHint, DA_OK)); setWindowGeometry(WINDOW_HINT); g_object_weak_ref(G_OBJECT(pwHint), DestroyHint, NULL); gtk_window_set_default_size(GTK_WINDOW(pwHint), 400, 300); gtk_widget_show_all(pwHint); } /* * Give hints for resignation * * Input: * rEqBefore: equity before resignation * rEqAfter: equity after resignation * pci: cubeinfo * fOUtputMWC: output in MWC or equity * * FIXME: Include arOutput in the dialog, so the the user * can see how many gammons/backgammons she'll win. * FIXME: This only handles the acceptance / refusal side. * Comment on the resignation itself as well. */ extern void GTKResignHint(float UNUSED(arOutput[]), float rEqBefore, float rEqAfter, cubeinfo * pci, int fMWC) { GtkWidget *pwDialog = GTKCreateDialog(_("GNU Backgammon - Hint"), DT_INFO, NULL, DIALOG_FLAG_MODAL, NULL, NULL); GtkWidget *pw; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwGrid; #else GtkWidget *pwTable; #endif char *pch, sz[16]; #if GTK_CHECK_VERSION(3,0,0) pwGrid = gtk_grid_new(); #else pwTable = gtk_table_new(2, 3, FALSE); #endif /* equity before resignation */ #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(fMWC ? _("MWC before resignation") : _("Equity before resignation")), 0, 0, 1, 1); gtk_widget_set_hexpand(pw, TRUE); gtk_widget_set_vexpand(pw, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_halign(pw, GTK_ALIGN_START); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(fMWC ? _("MWC before resignation") : _("Equity before resignation")), 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 4, 0); gtk_misc_set_alignment(GTK_MISC(pw), 0.0, 0.5); #endif if (fMWC) sprintf(sz, "%6.2f%%", 100.0f * (eq2mwc(-rEqBefore, pci))); else sprintf(sz, "%+6.3f", -rEqBefore); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(sz), 1, 0, 1, 1); gtk_widget_set_hexpand(pw, TRUE); gtk_widget_set_vexpand(pw, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_halign(pw, GTK_ALIGN_END); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(sz), 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 4, 0); gtk_misc_set_alignment(GTK_MISC(pw), 1.0, 0.5); #endif /* equity after resignation */ #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(fMWC ? _("MWC after resignation") : _("Equity after resignation")), 0, 1, 1, 1); gtk_widget_set_hexpand(pw, TRUE); gtk_widget_set_vexpand(pw, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_halign(pw, GTK_ALIGN_START); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(fMWC ? _("MWC after resignation") : _("Equity after resignation")), 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 4, 0); gtk_misc_set_alignment(GTK_MISC(pw), 0.0, 0.5); #endif if (fMWC) sprintf(sz, "%6.2f%%", 100.0f * eq2mwc(-rEqAfter, pci)); else sprintf(sz, "%+6.3f", -rEqAfter); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(sz), 1, 1, 1, 1); gtk_widget_set_hexpand(pw, TRUE); gtk_widget_set_vexpand(pw, TRUE); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_halign(pw, GTK_ALIGN_END); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(sz), 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 4, 0); gtk_misc_set_alignment(GTK_MISC(pw), 1.0, 0.5); #endif if (-rEqAfter >= -rEqBefore) pch = _("You should accept the resignation!"); else pch = _("You should reject the resignation!"); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(pch), 0, 2, 2, 1); gtk_widget_set_hexpand(pw, TRUE); gtk_widget_set_vexpand(pw, TRUE); gtk_widget_set_margin_top(pw, 8); gtk_widget_set_margin_bottom(pw, 8); gtk_container_set_border_width(GTK_CONTAINER(pwGrid), 8); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwGrid); #else gtk_table_attach(GTK_TABLE(pwTable), gtk_label_new(pch), 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 8); gtk_container_set_border_width(GTK_CONTAINER(pwTable), 8); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwTable); #endif GTKRunDialog(pwDialog); } extern void GTKHint(moverecord * pmr, int hist) { GtkWidget *pwMoves, *pwHint; if (!pmr || pmr->ml.cMoves < 1) { outputerrf(_("There are no legal moves. Figure it out yourself.")); return; } if (GetPanelWidget(WINDOW_HINT)) gtk_widget_destroy(GetPanelWidget(WINDOW_HINT)); pwMoves = CreateMoveList(pmr, TRUE, TRUE, TRUE, hist); /* create dialog */ pwHint = GTKCreateDialog(_("GNU Backgammon - Hint"), DT_INFO, NULL, DIALOG_FLAG_NONE, G_CALLBACK(HintOK), NULL); SetPanelWidget(WINDOW_HINT, pwHint); gtk_container_add(GTK_CONTAINER(DialogArea(pwHint, DA_MAIN)), pwMoves); setWindowGeometry(WINDOW_HINT); g_object_weak_ref(G_OBJECT(pwHint), DestroyHint, NULL); if (!IsPanelDocked(WINDOW_HINT)) gtk_window_set_default_size(GTK_WINDOW(pwHint), 400, 300); gtk_widget_show_all(pwHint); } static void SetMouseCursor(GdkCursorType cursorType) { if (!GDK_IS_WINDOW(gtk_widget_get_window(pwMain))) { g_assert_not_reached(); return; } if (cursorType) { GdkCursor *cursor; cursor = gdk_cursor_new_for_display(gtk_widget_get_display(pwMain), cursorType); gdk_window_set_cursor(gtk_widget_get_window(pwMain), cursor); #if GTK_CHECK_VERSION(3,0,0) g_object_unref(cursor); #else gdk_cursor_unref(cursor); #endif } else gdk_window_set_cursor(gtk_widget_get_window(pwMain), NULL); } extern void GTKProgressStart(const char *sz) { GTKSuspendInput(); if (sz) gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idProgress, sz); SetMouseCursor(GDK_WATCH); } extern void GTKProgressStartValue(char *sz, int UNUSED(iMax)) { GTKSuspendInput(); if (sz) gtk_statusbar_push(GTK_STATUSBAR(pwStatus), idProgress, sz); SetMouseCursor(GDK_WATCH); } extern void GTKProgressValue(int iValue, int iMax) { gchar *gsz; gdouble frac = 1.0 * iValue / (1.0 * iMax); gsz = g_strdup_printf("%d/%d (%.0f%%)", iValue, iMax, 100 * frac); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pwProgress), gsz); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pwProgress), frac); g_free(gsz); ProcessEvents(); } extern void GTKProgress(void) { gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pwProgress)); ProcessEvents(); } extern void GTKProgressEnd(void) { GTKResumeInput(); if (!pwProgress) /*safe guard on language change */ return; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pwProgress), 0.0); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pwProgress), " "); gtk_statusbar_pop(GTK_STATUSBAR(pwStatus), idProgress); SetMouseCursor(GDK_X_CURSOR); } extern void GTKShowScoreSheet(void) { GtkWidget *pwDialog, *pwBox; GtkWidget *hbox; GtkWidget *view; GtkWidget *pwScrolled; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkListStore *store; char title[100]; listOLD *pl; sprintf(title, "%s - ", _("Score Sheet")); if (ms.nMatchTo > 0) sprintf(title + strlen(title), ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); else strcat(title, _("Money Session")); pwDialog = GTKCreateDialog(title, DT_INFO, NULL, DIALOG_FLAG_MODAL, NULL, NULL); #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pwBox), 8); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwBox); gtk_container_set_border_width(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), 4); #if GTK_CHECK_VERSION(3,0,0) hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hbox = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), hbox); store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_INT); for (pl = lMatch.plNext; pl->p; pl = pl->plNext) { int score[2]; GtkTreeIter iter; listOLD *plg = pl->plNext->p; if (plg) { moverecord *pmr = plg->plNext->p; score[0] = pmr->g.anScore[0]; score[1] = pmr->g.anScore[1]; } else { moverecord *pmr; plg = pl->p; if (!plg) continue; pmr = plg->plNext->p; score[0] = pmr->g.anScore[0]; score[1] = pmr->g.anScore[1]; if (pmr->g.fWinner == -1) { if (pl == lMatch.plNext) { /* First game */ score[0] = score[1] = 0; } else continue; } else score[pmr->g.fWinner] += pmr->g.nPoints; } gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, score[0], 1, score[1], -1); } pwScrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(ap[0].szName, renderer, "text", 0, NULL); gtk_tree_view_column_set_min_width(column, 75); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(ap[1].szName, renderer, "text", 1, NULL); gtk_tree_view_column_set_min_width(column, 75); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); gtk_container_add(GTK_CONTAINER(pwScrolled), view); gtk_box_pack_start(GTK_BOX(hbox), pwScrolled, TRUE, TRUE, 0); GTKRunDialog(pwDialog); } static void GtkShowCopying(GtkWidget * parent) { ShowList(aszCopying, _("Copying"), parent); } static void GtkShowWarranty(GtkWidget * parent) { ShowList(aszWarranty, _("Warranty"), parent); } static void GtkShowEngine(GtkWidget * parent) { char *szBuffer[2]; szBuffer[0] = g_new0(char, 4096); szBuffer[1] = NULL; EvalStatus(szBuffer[0]); ShowList(szBuffer, _("Evaluation Engine"), parent); g_free(szBuffer[0]); } extern void GTKShowVersion(void) { GtkWidget *pwDialog, *pwButtonBox, *pwButton; GtkWidget *image; gchar *fn; pwDialog = GTKCreateDialog(_("About GNU Backgammon"), DT_CUSTOM, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_CLOSEBUTTON, NULL, NULL); gtk_window_set_resizable(GTK_WINDOW(pwDialog), FALSE); fn = g_build_filename(getPkgDataDir(), "pixmaps", "gnubg-big.png", NULL); image = gtk_image_new_from_file(fn); g_free(fn); #if GTK_CHECK_VERSION(3,0,0) g_object_set(image, "margin", 8, NULL); #else gtk_misc_set_padding(GTK_MISC(image), 8, 8); #endif gtk_box_pack_start(GTK_BOX(DialogArea(pwDialog, DA_MAIN)), image, FALSE, FALSE, 0); /* Buttons on right side */ #if GTK_CHECK_VERSION(3,0,0) pwButtonBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwButtonBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(DialogArea(pwDialog, DA_MAIN)), pwButtonBox, FALSE, FALSE, 8); gtk_box_pack_start(GTK_BOX(pwButtonBox), pwButton = gtk_button_new_with_label(_("Credits")), FALSE, FALSE, 8); g_signal_connect(G_OBJECT(pwButton), "clicked", G_CALLBACK(GTKCommandShowCredits), pwDialog); gtk_box_pack_start(GTK_BOX(pwButtonBox), pwButton = gtk_button_new_with_label(_("Build Info")), FALSE, FALSE, 8); g_signal_connect(G_OBJECT(pwButton), "clicked", G_CALLBACK(GTKShowBuildInfo), pwDialog); gtk_box_pack_start(GTK_BOX(pwButtonBox), pwButton = gtk_button_new_with_label(_("Copying conditions")), FALSE, FALSE, 8); g_signal_connect(G_OBJECT(pwButton), "clicked", G_CALLBACK(GtkShowCopying), pwDialog); gtk_box_pack_start(GTK_BOX(pwButtonBox), pwButton = gtk_button_new_with_label(_("Warranty")), FALSE, FALSE, 8); g_signal_connect(G_OBJECT(pwButton), "clicked", G_CALLBACK(GtkShowWarranty), NULL); gtk_box_pack_start(GTK_BOX(pwButtonBox), pwButton = gtk_button_new_with_label(_("Report Bug")), FALSE, FALSE, 8); g_signal_connect(G_OBJECT(pwButton), "clicked", G_CALLBACK(ReportBug), NULL); gtk_box_pack_start(GTK_BOX(pwButtonBox), pwButton = gtk_button_new_with_label(_("Evaluation Engine")), FALSE, FALSE, 8); g_signal_connect(G_OBJECT(pwButton), "clicked", G_CALLBACK(GtkShowEngine), pwDialog); GTKRunDialog(pwDialog); } static GtkWidget * SelectableLabel(GtkWidget * UNUSED(reference), const char *text) { GtkWidget *pwLabel = gtk_label_new(text); gtk_label_set_selectable(GTK_LABEL(pwLabel), TRUE); return pwLabel; } extern void GTKShowBuildInfo(GtkWidget * UNUSED(pw), GtkWidget * pwParent) { GtkWidget *pwDialog, *pwBox, *pwPrompt; const char *pch; pwDialog = GTKCreateDialog(_("GNU Backgammon - Build Info"), DT_INFO, pwParent, DIALOG_FLAG_MODAL, NULL, NULL); #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pwBox), 8); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwBox); gtk_box_pack_start(GTK_BOX(pwBox), SelectableLabel(pwDialog, VERSION_STRING), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwBox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4); #else gtk_box_pack_start(GTK_BOX(pwBox), gtk_hseparator_new(), FALSE, FALSE, 4); #endif while ((pch = GetBuildInfoString())) gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(gettext(pch)), FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwBox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4); #else gtk_box_pack_start(GTK_BOX(pwBox), gtk_hseparator_new(), FALSE, FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_(aszCOPYRIGHT)), FALSE, FALSE, 4); pwPrompt = gtk_label_new(_(intro_string)); gtk_box_pack_start(GTK_BOX(pwBox), pwPrompt, FALSE, FALSE, 4); gtk_label_set_line_wrap(GTK_LABEL(pwPrompt), TRUE); GTKRunDialog(pwDialog); } /* Stores names in credits so not duplicated in list at bottom */ static listOLD names; static void AddTitle(GtkWidget * pwBox, char *Title) { GtkRcStyle *ps = gtk_rc_style_new(); GtkWidget *pwTitle = gtk_label_new(Title), *pwHBox; #if GTK_CHECK_VERSION(3,0,0) pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), pwHBox, FALSE, FALSE, 4); ps->font_desc = pango_font_description_new(); pango_font_description_set_family_static(ps->font_desc, "serif"); pango_font_description_set_size(ps->font_desc, 16 * PANGO_SCALE); gtk_widget_modify_style(pwTitle, ps); g_object_unref(ps); gtk_box_pack_start(GTK_BOX(pwHBox), pwTitle, TRUE, FALSE, 0); } static void AddName(GtkWidget * pwBox, char *name, const char *type) { char buf[255]; if (type) sprintf(buf, "%s: %s", type, name); else strcpy(buf, name); gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(buf), FALSE, FALSE, 0); ListInsert(&names, name); } static int FindName(listOLD * pList, const char *name) { listOLD *pl; for (pl = pList->plNext; pl != pList; pl = pl->plNext) { if (!strcmp(pl->p, name)) return TRUE; } return FALSE; } extern void GTKCommandShowCredits(GtkWidget * UNUSED(pw), GtkWidget * pwParent) { GtkWidget *pwDialog; GtkWidget *pwBox; GtkWidget *pwMainHBox; GtkWidget *pwHBox = 0; GtkWidget *pwVBox; GtkWidget *pwScrolled; GtkWidget *treeview; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkListStore *store; GtkTreeIter iter; int i = 0; credits *credit = &creditList[0]; pwScrolled = gtk_scrolled_window_new(NULL, NULL); ListCreate(&names); pwDialog = GTKCreateDialog(_("GNU Backgammon - Credits"), DT_INFO, pwParent, DIALOG_FLAG_MODAL, NULL, NULL); #if GTK_CHECK_VERSION(3,0,0) pwMainHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwMainHBox = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwMainHBox); #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwMainHBox), pwBox, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(pwBox), 8); while (credit->Title) { credEntry *ce; /* Two columns, so new hbox every-other one */ if (i % 2 == 0) { #if GTK_CHECK_VERSION(3,0,0) pwHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), pwHBox, TRUE, FALSE, 0); } #if GTK_CHECK_VERSION(3,0,0) pwVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwHBox), pwVBox, TRUE, FALSE, 0); AddTitle(pwVBox, _(credit->Title)); ce = credit->Entry; while (ce->Name) { AddName(pwVBox, ce->Name, _(ce->Type)); ce++; } if (i == 1) #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwBox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4); #else gtk_box_pack_start(GTK_BOX(pwBox), gtk_hseparator_new(), FALSE, FALSE, 4); #endif credit++; i++; } #if GTK_CHECK_VERSION(3,0,0) pwVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwMainHBox), pwVBox, FALSE, FALSE, 0); AddTitle(pwVBox, _("Special thanks")); /* create list store */ store = gtk_list_store_new(1, G_TYPE_STRING); /* add data to the list store */ for (i = 0; ceCredits[i].Name; i++) { if (!FindName(&names, ceCredits[i].Name)) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, ceCredits[i].Name, -1); } } /* create tree view */ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Contributors"), renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); while (names.plNext->p) ListDelete(names.plNext); gtk_container_set_border_width(GTK_CONTAINER(pwVBox), 8); gtk_box_pack_start(GTK_BOX(pwVBox), pwScrolled, TRUE, TRUE, 0); gtk_widget_set_size_request(pwScrolled, 150, -1); #if GTK_CHECK_VERSION(3, 8, 0) gtk_container_add(GTK_CONTAINER(pwScrolled), treeview); #else gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pwScrolled), treeview); #endif gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); GTKRunDialog(pwDialog); } static void GTKHelpAdd(GtkTreeStore * pts, GtkTreeIter * ptiParent, command * pc) { GtkTreeIter ti; for (; pc->sz; pc++) if (pc->szHelp) { gtk_tree_store_append(pts, &ti, ptiParent); gtk_tree_store_set(pts, &ti, 0, pc->sz, 1, Q_(pc->szHelp), 2, pc, -1); if (pc->pc && pc->pc->sz) GTKHelpAdd(pts, &ti, pc->pc); } } static void GTKHelpSelect(GtkTreeSelection * pts, gpointer UNUSED(p)) { GtkTreeModel *ptm; GtkTreeIter ti; command **apc; char szCommand[128], *pchCommand = szCommand, szUsage[128], *pchUsage = szUsage; if (gtk_tree_selection_get_selected(pts, &ptm, &ti)) { char *pLabel; GtkTreePath *ptp = gtk_tree_model_get_path(ptm, &ti); int c = gtk_tree_path_get_depth(ptp); apc = g_malloc(c * sizeof(command *)); for (int i = c - 1;; i--) { gtk_tree_model_get(ptm, &ti, 2, apc + i, -1); if (!i) break; gtk_tree_path_up(ptp); gtk_tree_model_get_iter(ptm, &ti, ptp); } for (int i = 0; i < c; i++) { /* accumulate command and usage strings from path */ /* FIXME use markup a la gtk_label_set_markup for this */ const char *pch = apc[i]->sz; while (*pch) *pchCommand++ = *pchUsage++ = *pch++; *pchCommand++ = ' '; *pchCommand = 0; *pchUsage++ = ' '; *pchUsage = 0; if ((pch = apc[i]->szUsage)) { while (*pch) *pchUsage++ = *pch++; *pchUsage++ = ' '; *pchUsage = 0; } } /* Use szUsage as is, at this point it has already been translated by GTKHelpAdd() */ pLabel = g_strdup_printf("%s - %s\n\n%s %s%s\n", szCommand, gettext(apc[c - 1]->szHelp), _("Usage:"), szUsage, (apc[c - 1]->pc && apc[c - 1]->pc->sz) ? _(" ") : ""); gtk_label_set_text(GTK_LABEL(pwHelpLabel), pLabel); g_free(pLabel); g_free(apc); gtk_tree_path_free(ptp); } else gtk_label_set_text(GTK_LABEL(pwHelpLabel), NULL); } extern void GTKHelp(char *sz) { static GtkWidget *pw = NULL; GtkWidget *pwPaned, *pwScrolled; GtkTreeStore *pts; GtkTreeIter ti, tiSearch; GtkTreePath *ptp, *ptpExpand; GtkTreeSelection *treeSelection; char *pch; command *pc, *pcTest, *pcStart; int i, c, *pn; void (*pf) (char *); if (pw) { gtk_window_present(GTK_WINDOW(pw)); return; } pts = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); GTKHelpAdd(pts, NULL, acTop); pw = GTKCreateDialog(_("Help - command reference"), DT_INFO, NULL, DIALOG_FLAG_NONE, NULL, NULL); g_object_add_weak_pointer(G_OBJECT(pw), (void *) &pw); gtk_window_set_title(GTK_WINDOW(pw), _("Help - command reference")); gtk_window_set_default_size(GTK_WINDOW(pw), 500, 400); g_signal_connect_swapped(pw, "response", G_CALLBACK(gtk_widget_destroy), pw); #if GTK_CHECK_VERSION(3,0,0) pwPaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL); #else pwPaned = gtk_vpaned_new(); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pw, DA_MAIN)), pwPaned); gtk_paned_pack1(GTK_PANED(pwPaned), pwScrolled = gtk_scrolled_window_new(NULL, NULL), TRUE, FALSE); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pwScrolled), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(pwScrolled), pwHelpTree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pts))); treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pwHelpTree)); g_object_unref(G_OBJECT(pts)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pwHelpTree), FALSE); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pwHelpTree), 0, NULL, gtk_cell_renderer_text_new(), "text", 0, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pwHelpTree), 1, NULL, gtk_cell_renderer_text_new(), "text", 1, NULL); g_signal_connect(G_OBJECT(treeSelection), "changed", G_CALLBACK(GTKHelpSelect), NULL); gtk_paned_pack2(GTK_PANED(pwPaned), pwHelpLabel = gtk_label_new(NULL), FALSE, FALSE); gtk_label_set_selectable(GTK_LABEL(pwHelpLabel), TRUE); gtk_widget_show_all(pw); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(pts), &ti); tiSearch = ti; pc = acTop; c = 0; while (pc && sz && (pch = NextToken(&sz))) { size_t cch; pcStart = pc; cch = strlen(pch); for (; pc->sz; pc++) if (!StrNCaseCmp(pch, pc->sz, cch)) break; if (!pc->sz) break; if (!pc->szHelp) { /* they gave a synonym; find the canonical version */ pf = pc->pf; for (pc = pcStart; pc->sz; pc++) if (pc->pf == pf && pc->szHelp) break; if (!pc->sz) break; } do gtk_tree_model_get(GTK_TREE_MODEL(pts), &tiSearch, 2, &pcTest, -1); while (pcTest != pc && gtk_tree_model_iter_next(GTK_TREE_MODEL(pts), &tiSearch)); if (pcTest == pc) { /* found! now try the next level down... */ c++; ti = tiSearch; pc = pc->pc; gtk_tree_model_iter_children(GTK_TREE_MODEL(pts), &tiSearch, &ti); } else break; } ptp = gtk_tree_model_get_path(GTK_TREE_MODEL(pts), &ti); pn = gtk_tree_path_get_indices(ptp); ptpExpand = gtk_tree_path_new(); for (i = 0; i < c; i++) { gtk_tree_path_append_index(ptpExpand, pn[i]); gtk_tree_view_expand_row(GTK_TREE_VIEW(pwHelpTree), ptpExpand, FALSE); } gtk_tree_selection_select_iter(treeSelection, &ti); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(pwHelpTree), ptp, NULL, TRUE, 0.5, 0); gtk_tree_view_set_cursor(GTK_TREE_VIEW(pwHelpTree), ptp, NULL, FALSE); gtk_tree_path_free(ptp); gtk_tree_path_free(ptpExpand); } static void GTKBearoffProgressCancel(void) { raise(SIGINT); exit(EXIT_FAILURE); } /* Show a dialog box with a progress bar to be used during initialisation * if a heuristic bearoff database must be created. Most of GNUbg hasn't * been initialised yet, so this function is restricted in many ways. */ extern void GTKBearoffProgress(int i) { static GtkWidget *pwDialog, *pw; gchar *gsz; if (!pwDialog) { #if !GTK_CHECK_VERSION(3,0,0) static GtkWidget *pwAlign; #endif pwDialog = GTKCreateDialog(_("GNU Backgammon"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_NOTIDY, NULL, NULL); gtk_window_set_role(GTK_WINDOW(pwDialog), "progress"); gtk_window_set_type_hint(GTK_WINDOW(pwDialog), GDK_WINDOW_TYPE_HINT_DIALOG); g_signal_connect(G_OBJECT(pwDialog), "destroy", G_CALLBACK(GTKBearoffProgressCancel), NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(DialogArea(pwDialog, DA_MAIN)), pw = gtk_progress_bar_new(), TRUE, TRUE, 8); gtk_widget_set_halign(pw, GTK_ALIGN_FILL); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_box_pack_start(GTK_BOX(DialogArea(pwDialog, DA_MAIN)), pwAlign = gtk_alignment_new(0.5, 0.5, 1, 0), TRUE, TRUE, 8); gtk_container_add(GTK_CONTAINER(pwAlign), pw = gtk_progress_bar_new()); #endif gtk_widget_show_all(pwDialog); } gsz = g_strdup_printf(_("Generating bearoff database (%.0f %%)"), i / 542.64); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pw), gsz); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pw), i / 54264.0); g_free(gsz); if (i >= 54000) { g_signal_handlers_disconnect_by_func(G_OBJECT(pwDialog), (gpointer) G_CALLBACK(GTKBearoffProgressCancel), NULL); gtk_widget_destroy(pwDialog); } ProcessEvents(); } static void enable_sub_menu(GtkWidget * pw, int f); /* for recursion */ static void enable_menu(GtkWidget * pw, int f) { GtkMenuItem *pmi = GTK_MENU_ITEM(pw); if (gtk_menu_item_get_submenu(pmi)) enable_sub_menu(gtk_menu_item_get_submenu(pmi), f); else gtk_widget_set_sensitive(pw, f); } static inline void my_enable_menu(gpointer data, gpointer user_data) { enable_menu((GtkWidget *) data, GPOINTER_TO_INT(user_data)); } static void enable_sub_menu(GtkWidget * pw, int f) { GList *pl; GtkMenuShell *pms = GTK_MENU_SHELL(pw); g_list_foreach(pl = gtk_container_get_children(GTK_CONTAINER(pms)), my_enable_menu, GINT_TO_POINTER(f)); g_list_free(pl); } /* A global setting has changed; update entry in Settings menu if necessary. */ extern void GTKSet(void *p) { BoardData *bd = BOARD(pwBoard)->board_data; if (p == ap) { /* Handle the player names. */ #if !defined(USE_GTKITEMFACTORY) gtk_label_set_text(GTK_LABEL (gtk_bin_get_child (GTK_BIN(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer0") ))), (ap[0].szName)); gtk_label_set_text(GTK_LABEL (gtk_bin_get_child (GTK_BIN(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer1") ))), (ap[1].szName)); #else gtk_label_set_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN(gtk_item_factory_get_widget_by_action(pif, CMD_SET_TURN_0) ))), (ap[0].szName)); gtk_label_set_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN(gtk_item_factory_get_widget_by_action(pif, CMD_SET_TURN_1) ))), (ap[1].szName)); #endif GL_SetNames(); GTKRegenerateGames(); } else if (p == &ms.fJacoby) { bd->jacoby_flag = ms.fJacoby; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->jacoby), bd->jacoby_flag); ShowBoard(); } else if (p == &ms.fTurn) { /* Handle the player on roll. */ fAutoCommand = TRUE; #if !defined(USE_GTKITEMFACTORY) if (ms.fTurn >= 0) { if (ms.fTurn) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer0")), TRUE); else gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer1")), TRUE); enable_menu(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/Roll"), ms.fMove == ms.fTurn && ap[ms.fMove].pt == PLAYER_HUMAN); } #else if (ms.fTurn >= 0) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (gtk_item_factory_get_widget_by_action(pif, CMD_SET_TURN_0 + ms.fTurn)), TRUE); enable_menu(gtk_item_factory_get_widget(pif, "/Game/Roll"), ms.fMove == ms.fTurn && ap[ms.fMove].pt == PLAYER_HUMAN); } #endif fAutoCommand = FALSE; } else if (p == &ms.gs) { /* Handle the game state. */ fAutoCommand = TRUE; board_set_playing(BOARD(pwBoard), plGame != NULL); ToolbarSetPlaying(pwToolbar, plGame != NULL); #if !defined(USE_GTKITEMFACTORY) gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/FileMenu/Save"), plGame != NULL); enable_menu(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu"), ms.gs == GAME_PLAYING); if (ms.fTurn >= 0) enable_menu(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/Roll"), ms.fMove == ms.fTurn && ap[ms.fMove].pt == PLAYER_HUMAN); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/NextRoll"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/PreviousRoll"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/NextMarkedMove"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/PreviousMarkedMove"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/NextGame"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/PreviousGame"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/NextCMarkedMove"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/PreviousCMarkedMove"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/FileMenu/MatchInfo"), !ListEmpty(&lMatch)); enable_menu(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu"), ms.gs == GAME_PLAYING); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/AnalyseFile"), TRUE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/BatchAnalyse"), TRUE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/AnalyseMove"), plLastMove && plLastMove->plNext && plLastMove->plNext->p); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/AnalyseGame"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/AnalyseMatch"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/ClearAnalysisMenu/Move"), plLastMove && plLastMove->plNext && plLastMove->plNext->p); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/ClearAnalysisMenu/Game"), plGame != NULL); gtk_widget_set_sensitive(gtk_ui_manager_get_widget (puim, "/MainMenu/AnalyseMenu/ClearAnalysisMenu/MatchOrSession"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/MatchOrSessionStats"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/MatchEquityTable"), TRUE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/EvaluationSpeed"), TRUE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/SwapPlayers"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkCubeMenu/Clear"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkCubeMenu/Show"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMoveMenu/Clear"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMoveMenu/Show"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkGameMenu/Clear"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkGameMenu/Show"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMatchMenu/Clear"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMatchMenu/Show"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/RolloutMenu/Cube"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/RolloutMenu/Move"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/RolloutMenu/Game"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/RolloutMenu/Match"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/AddMatchOrSessionStatsToDB"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/ShowRecords"), TRUE); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/PlotHistory"), TRUE); /*disabling everything when we analyze a game in the background*/ if(fBackgroundAnalysis){ gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/FileMenu/"), !fAnalysisRunning); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/EditMenu/"), !fAnalysisRunning); // gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/"), !fAnalysisRunning); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GameMenu/"), !fAnalysisRunning); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/AnalyseMenu/"), !fAnalysisRunning); gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/SettingsMenu/"), !fAnalysisRunning); // gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/GoMenu/"), !fAnalysisRunning); // gtk_widget_set_sensitive(gtk_ui_manager_get_widget(puim, "/MainMenu/HelpMenu/"), !fAnalysisRunning); } #else gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/File/Save..."), plGame != NULL); enable_sub_menu(gtk_item_factory_get_widget(pif, "/Game"), ms.gs == GAME_PLAYING); if (ms.fTurn >= 0) enable_menu(gtk_item_factory_get_widget(pif, "/Game/Roll"), ms.fMove == ms.fTurn && ap[ms.fMove].pt == PLAYER_HUMAN); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_NEXT_ROLL), plGame != NULL); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_PREV_ROLL), plGame != NULL); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_NEXT_MARKED), plGame != NULL); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_PREV_MARKED), plGame != NULL); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_NEXT_GAME), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_PREV_GAME), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/File/Match information..."), !ListEmpty(&lMatch)); if (!fAnalysisRunning) enable_sub_menu(gtk_item_factory_get_widget(pif, "/Analyse"), ms.gs == GAME_PLAYING); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/Analyse/Analyse File"), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/Analyse/Batch analyse..."), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_MOVE), plLastMove && plLastMove->plNext && plLastMove->plNext->p); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_GAME), plGame != NULL); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_MATCH), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_CLEAR_MOVE), plLastMove && plLastMove->plNext && plLastMove->plNext->p); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_CLEAR_GAME), plGame != NULL); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_CLEAR_MATCH), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_SHOW_STATISTICS_MATCH), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_SHOW_HISTORY), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_SHOW_MATCHEQUITYTABLE), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_SHOW_CALIBRATION), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_SWAP_PLAYERS), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_CUBE_CLEAR), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_CUBE_SHOW), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_MOVE_CLEAR), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_MOVE_SHOW), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_GAME_CLEAR), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_GAME_SHOW), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_MATCH_CLEAR), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_CMARK_MATCH_SHOW), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_ROLLOUT_CUBE), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_ROLLOUT_MOVE), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_ROLLOUT_GAME), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(pif, CMD_ANALYSE_ROLLOUT_MATCH), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/Analyse/Add match or session to database"), !ListEmpty(&lMatch)); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/Analyse/Show Records"), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/Analyse/Plot History"), TRUE); #endif fAutoCommand = FALSE; } else if (p == &ms.fCrawford) { bd->crawford_game = ms.fCrawford; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->crawford), ms.fCrawford); ShowBoard(); /* this is overkill, but it works */ } else if (p == &ms.nCube) { ShowBoard(); /* this is overkill, but it works */ } else if (IsPanelShowVar(WINDOW_ANNOTATION, p)) { ShowHidePanel(WINDOW_ANNOTATION); } else if (IsPanelShowVar(WINDOW_GAME, p)) { ShowHidePanel(WINDOW_GAME); } else if (IsPanelShowVar(WINDOW_ANALYSIS, p)) { ShowHidePanel(WINDOW_ANALYSIS); } else if (IsPanelShowVar(WINDOW_MESSAGE, p)) { ShowHidePanel(WINDOW_MESSAGE); } else if (IsPanelShowVar(WINDOW_THEORY, p)) { ShowHidePanel(WINDOW_THEORY); } else if (IsPanelShowVar(WINDOW_COMMAND, p)) { ShowHidePanel(WINDOW_COMMAND); } else if (p == &bd->rd->fDiceArea) { if (gtk_widget_get_realized(pwBoard)) { #if defined(USE_BOARD3D) /* If in 3d mode may need to update sizes */ if (display_is_3d(bd->rd)) RecalcViewingVolume(bd); else #endif { if (gtk_widget_get_realized(pwBoard)) { if (gtk_widget_get_visible(bd->dice_area) && !bd->rd->fDiceArea) gtk_widget_hide(bd->dice_area); else if (!gtk_widget_get_visible(bd->dice_area) && bd->rd->fDiceArea) gtk_widget_show_all(bd->dice_area); } } } } else if (p == &fShowIDs) { inCallback = TRUE; #if !defined(USE_GTKITEMFACTORY) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_ui_manager_get_widget(puim, "/MainMenu/ViewMenu/ShowIDStatusBar")), fShowIDs); #else gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (gtk_item_factory_get_widget(pif, "/View/Show ID in status bar")), fShowIDs); #endif inCallback = FALSE; if (!fShowIDs) gtk_widget_hide(pwIDBox); else gtk_widget_show_all(pwIDBox); } else if (p == &gui_show_pips) ShowBoard(); /* this is overkill, but it works */ else if (p == &fOutputWinPC) { MoveListRefreshSize(); } else if (p == &showMoveListDetail) { if (pwMoveAnalysis && pwDetails) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwDetails), showMoveListDetail); } } /* Match stats variables */ #define NUM_STAT_TYPES (FORMATGS_OVERALL - FORMATGS_ALL) static char *aszStatHeading[NUM_STAT_TYPES] = { N_("Chequer play Statistics:"), N_("Cube Statistics:"), N_("Luck Statistics:"), N_("Overall Statistics:") }; static GtkWidget *statViews[NUM_STAT_TYPES], *statView; static int numStatGames; static GtkWidget *pwStatDialog; int fGUIUseStatsPanel = TRUE; static GtkWidget *pswList; static GtkWidget *pwNotebook; static void AddList(char *pStr, GtkWidget * view, const char *pTitle) { gchar *sz; GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); sprintf(strchr(pStr, 0), "%s\n", pTitle); if (gtk_tree_model_get_iter_first(model, &iter)) do { gtk_tree_model_get(model, &iter, 0, &sz, -1); sprintf(strchr(pStr, 0), "%-37s ", sz ? sz : ""); gtk_tree_model_get(model, &iter, 1, &sz, -1); sprintf(strchr(pStr, 0), "%-20s ", sz ? sz : ""); gtk_tree_model_get(model, &iter, 2, &sz, -1); sprintf(strchr(pStr, 0), "%-20s\n", sz ? sz : ""); } while (gtk_tree_model_iter_next(model, &iter)); sprintf(strchr(pStr, 0), "\n"); } static void CopyData(GtkWidget * UNUSED(pwNotebook), int page) { char szOutput[4096]; sprintf(szOutput, "%-37s %-20s %-20s\n", "", ap[0].szName, ap[1].szName); if (page == FORMATGS_CHEQUER || page == FORMATGS_ALL) AddList(szOutput, statViews[FORMATGS_CHEQUER], gettext(aszStatHeading[FORMATGS_CHEQUER])); if (page == FORMATGS_LUCK || page == FORMATGS_ALL) AddList(szOutput, statViews[FORMATGS_LUCK], gettext(aszStatHeading[FORMATGS_LUCK])); if (page == FORMATGS_CUBE || page == FORMATGS_ALL) AddList(szOutput, statViews[FORMATGS_CUBE], gettext(aszStatHeading[FORMATGS_CUBE])); if (page == FORMATGS_OVERALL || page == FORMATGS_ALL) AddList(szOutput, statViews[FORMATGS_OVERALL], gettext(aszStatHeading[FORMATGS_OVERALL])); TextToClipboard(szOutput); } static void CopyPage(GtkWidget * UNUSED(pwWidget), GtkWidget * pwNotebook) { switch (gtk_notebook_get_current_page(GTK_NOTEBOOK(pwNotebook))) { case 0: CopyData(pwNotebook, FORMATGS_OVERALL); break; case 1: CopyData(pwNotebook, FORMATGS_CHEQUER); break; case 2: CopyData(pwNotebook, FORMATGS_CUBE); break; case 3: CopyData(pwNotebook, FORMATGS_LUCK); break; } } static void CopyAll(GtkWidget * UNUSED(pwWidget), GtkWidget * pwNotebook) { CopyData(pwNotebook, FORMATGS_ALL); } static void FillStats(const statcontext * psc, const matchstate * pms, const formatgs gs, GtkWidget * statView) { GList *list = formatGS(psc, pms->nMatchTo, gs); GList *pl; GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(statView))); for (pl = g_list_first(list); pl; pl = g_list_next(pl)) { GtkTreeIter iter; char **aasz = pl->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, aasz[0], 1, aasz[1], 2, aasz[2], -1); } freeGS(list); } static void SetStats(const statcontext * psc) { char *aszLine[] = { NULL, NULL, NULL }; int i; GtkListStore *store; GtkTreeIter iter; for (i = 0; i < NUM_STAT_TYPES; ++i) { store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(statViews[i]), GTK_TREE_MODEL(store)); FillStats(psc, &ms, i, statViews[i]); g_object_unref(store); } store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(statView), GTK_TREE_MODEL(store)); g_object_unref(store); aszLine[0] = gettext(aszStatHeading[FORMATGS_CHEQUER]); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, aszLine[0], -1); FillStats(psc, &ms, FORMATGS_CHEQUER, statView); FillStats(psc, &ms, FORMATGS_LUCK, statView); aszLine[0] = gettext(aszStatHeading[FORMATGS_CUBE]); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, aszLine[0], -1); FillStats(psc, &ms, FORMATGS_CUBE, statView); aszLine[0] = gettext(aszStatHeading[FORMATGS_OVERALL]); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, aszLine[0], -1); FillStats(psc, &ms, FORMATGS_OVERALL, statView); } static const statcontext * GetStatContext(int game) { xmovegameinfo *pmgi; if (!game) return &scMatch; else { listOLD *plg, *pl = lMatch.plNext; for (int i = 1; i < game; i++) pl = pl->plNext; plg = pl->p; pmgi = &((moverecord *) plg->plNext->p)->g; return &pmgi->sc; } } static void StatsSelectGame(GtkWidget * box, int UNUSED(i)) { int curStatGame = gtk_combo_box_get_active(GTK_COMBO_BOX(box)); if (!curStatGame) { gtk_window_set_title(GTK_WINDOW(pwStatDialog), _("Statistics for all games")); } else { char sz[100]; sprintf(sz, _("Statistics for game %d"), curStatGame); gtk_window_set_title(GTK_WINDOW(pwStatDialog), sz); } SetStats(GetStatContext(curStatGame)); } static void StatsPreviousGame(GtkWidget * UNUSED(button), GtkWidget * combo) { int i = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); if (i > 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i - 1); } static void StatsNextGame(GtkWidget * UNUSED(button), GtkWidget * combo) { int i = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); if (i < numStatGames) gtk_combo_box_set_active(GTK_COMBO_BOX(combo), gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) + 1); } static GtkWidget * AddNavigation(GtkWidget * pvbox) { GtkWidget *phbox, *pw, *box; char sz[128]; int anFinalScore[2]; listOLD *pl; box = gtk_combo_box_text_new(); if (getFinalScore(anFinalScore)) sprintf(sz, _("All games: %s %d, %s %d"), ap[0].szName, anFinalScore[0], ap[1].szName, anFinalScore[1]); else sprintf(sz, _("All games: %s, %s"), ap[0].szName, ap[1].szName); #if GTK_CHECK_VERSION(3,0,0) phbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else phbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pvbox), phbox, FALSE, FALSE, 4); pw = button_from_image(gtk_image_new_from_stock(GNUBG_STOCK_GO_PREV_GAME, GTK_ICON_SIZE_LARGE_TOOLBAR)); g_signal_connect(G_OBJECT(pw), "clicked", G_CALLBACK(StatsPreviousGame), box); gtk_box_pack_start(GTK_BOX(phbox), pw, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(pw, _("Move back to the previous game")); pw = button_from_image(gtk_image_new_from_stock(GNUBG_STOCK_GO_NEXT_GAME, GTK_ICON_SIZE_LARGE_TOOLBAR)); g_signal_connect(G_OBJECT(pw), "clicked", G_CALLBACK(StatsNextGame), box); gtk_box_pack_start(GTK_BOX(phbox), pw, FALSE, FALSE, 4); gtk_widget_set_tooltip_text(pw, _("Move ahead to the next game")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(box), sz); numStatGames = 0; for (pl = lMatch.plNext; pl->p; pl = pl->plNext) { listOLD *plg = pl->p; moverecord *pmr = plg->plNext->p; numStatGames++; sprintf(sz, _("Game %d: %s %d, %s %d"), pmr->g.i + 1, ap[0].szName, pmr->g.anScore[0], ap[1].szName, pmr->g.anScore[1]); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(box), sz); } g_signal_connect(G_OBJECT(box), "changed", G_CALLBACK(StatsSelectGame), NULL); gtk_box_pack_start(GTK_BOX(phbox), box, TRUE, TRUE, 4); return box; } static void toggle_fGUIUseStatsPanel(GtkWidget * widget, GtkWidget * UNUSED(pw)) { fGUIUseStatsPanel = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (fGUIUseStatsPanel) { gtk_widget_hide(pswList); gtk_widget_show(pwNotebook); } else { gtk_widget_hide(pwNotebook); gtk_widget_show(pswList); } } static void StatcontextCopy(GtkWidget * UNUSED(pw), GtkTreeView * view) { static char szOutput[4096]; GtkTreeSelection *selection; GtkTreeModel *model; GList *row; GList *rows; selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_count_selected_rows(selection) < 1) return; sprintf(szOutput, "%-37s %-20s %-20s\n", "", ap[0].szName, ap[1].szName); rows = gtk_tree_selection_get_selected_rows(selection, &model); for (row = rows; row; row = row->next) { GtkTreeIter iter; gchar *sz; GtkTreePath *path = row->data; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, 0, &sz, -1); sprintf(strchr(szOutput, 0), "%-37s ", sz ? sz : ""); g_free(sz); gtk_tree_model_get(model, &iter, 1, &sz, -1); sprintf(strchr(szOutput, 0), "%-20s ", sz ? sz : ""); g_free(sz); gtk_tree_model_get(model, &iter, 2, &sz, -1); sprintf(strchr(szOutput, 0), "%-20s\n", sz ? sz : ""); g_free(sz); gtk_tree_path_free(path); } g_list_free(rows); GTKTextToClipboard(szOutput); } static GtkWidget * CreateList(void) { int i; GtkWidget *view; GtkWidget *copyMenu; GtkWidget *menu_item; view = gtk_tree_view_new(); for (i = 0; i < 3; i++) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "xalign", 1.0, NULL); column = gtk_tree_view_column_new_with_attributes("", renderer, "text", i, NULL); gtk_tree_view_column_set_alignment(column, 0.97f); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); } gtk_tree_view_column_set_title(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 1), ap[0].szName); gtk_tree_view_column_set_title(gtk_tree_view_get_column(GTK_TREE_VIEW(view), 2), ap[1].szName); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE); /* list view (selections) */ copyMenu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label(_("Copy selection")); gtk_menu_shell_append(GTK_MENU_SHELL(copyMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(StatcontextCopy), view); menu_item = gtk_menu_item_new_with_label(_("Copy all")); gtk_menu_shell_append(GTK_MENU_SHELL(copyMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(CopyAll), pwNotebook); g_signal_connect(G_OBJECT(view), "button-press-event", G_CALLBACK(ContextMenu), copyMenu); return view; } static void stat_dialog_map(GtkWidget * UNUSED(window), GtkWidget * pwUsePanels) { toggle_fGUIUseStatsPanel(pwUsePanels, 0); } /* Credit: partly based on http://kapo-cpp.blogspot.com */ extern void drawArrow(cairo_t *cr, double start_x, double start_y, double end_x, double end_y) { double angle = atan2(end_y - start_y, end_x - start_x) + M_PI; double dist = sqrt((start_x - end_x) * (start_x - end_x) + (start_y - end_y) * (start_y - end_y)); double side = MIN(6.0, 0.5 * dist); double degrees = 0.6; double x1 = end_x + side * cos(angle - degrees); double y1 = end_y + side * sin(angle - degrees); double x2 = end_x + side * cos(angle + degrees); double y2 = end_y + side * sin(angle + degrees); cairo_move_to(cr, start_x, start_y); cairo_line_to(cr, end_x,end_y); cairo_stroke(cr); cairo_move_to(cr, end_x, end_y); cairo_line_to(cr, x1, y1); cairo_line_to(cr, x2, y2); cairo_line_to(cr, end_x, end_y); cairo_fill(cr); // cairo_stroke (cr); // g_message("arrow: %f %f %f %f",x1,y1,x2,y2); } extern void GTKDumpStatcontext(int game) { GtkWidget *copyMenu, *menu_item, *pvbox, *pwUsePanels; GtkWidget *navi_combo; GtkWidget *addToDbButton; /* the 3D graph seems buggy and makes gnubg crash, removing for now */ #if defined(USE_BOARD3D) int graph3d = 1; int i; GtkWidget *pw; listOLD *pl; GraphData *gd = NULL; if (graph3d) { gd = CreateGraphData(); } #endif /* Here we had many issues. This statistics window calls the MWC window. * - Making both non-modal was causing crashes when closing them. * - Making both modal was causing a "blackhole" whereby we could open * the stats window once but not twice * - Using different modalities causes usability problems * - A solution was found by making both non-modal, but replacing here * the "GTKRunDialog()" at the end by "gtk_widget_show_all()". * - Alas, it turns out it prevents the graph from displaying. * - Finally (for now), another solution consists of making both * windows modal, and using "GTKRunDialog()" in both. Not sure why, * but it finally works. */ pwStatDialog = GTKCreateDialog("", DT_INFO, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(gtk_widget_destroy), NULL); // pwStatDialog = GTKCreateDialog("", DT_INFO, NULL, DIALOG_FLAG_NONE, G_CALLBACK(gtk_widget_destroy), NULL); if (!fAutoDB) { gtk_container_add(GTK_CONTAINER(DialogArea(pwStatDialog, DA_BUTTONS)), addToDbButton = gtk_button_new_with_label(_("Add to DB"))); g_signal_connect(addToDbButton, "clicked", G_CALLBACK(GtkRelationalAddMatch), pwStatDialog); } pwNotebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(pwNotebook), TRUE); gtk_notebook_popup_disable(GTK_NOTEBOOK(pwNotebook)); #if GTK_CHECK_VERSION(3,0,0) pvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pvbox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pvbox), pwNotebook, TRUE, TRUE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), statViews[FORMATGS_OVERALL] = CreateList(), gtk_label_new(_("Overall"))); gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), statViews[FORMATGS_CHEQUER] = CreateList(), gtk_label_new(_("Chequer play"))); gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), statViews[FORMATGS_CUBE] = CreateList(), gtk_label_new(_("Cube decisions"))); gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), statViews[FORMATGS_LUCK] = CreateList(), gtk_label_new(_("Luck"))); statView = CreateList(); pswList = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pswList), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(pswList), statView); gtk_box_pack_start(GTK_BOX(pvbox), pswList, TRUE, TRUE, 0); navi_combo = AddNavigation(pvbox); gtk_container_add(GTK_CONTAINER(DialogArea(pwStatDialog, DA_MAIN)), pvbox); #if defined(USE_BOARD3D) SetNumGames(gd, numStatGames); pl = lMatch.plNext; for (i = 0; i < numStatGames; i++) { listOLD *plg = pl->p; moverecord *mr = plg->plNext->p; xmovegameinfo *pmgi = &mr->g; AddGameData(gd, i, &pmgi->sc); pl = pl->plNext; } /* Total values */ AddGameData(gd, i, &scMatch); pw = StatGraph(gd); if (pw != NULL) { gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), pw, gtk_label_new(_("Graph"))); gtk_widget_set_tooltip_text(pw, _("This graph shows the total error rates per game for each player." " The games are along the bottom and the error rates up the side." " Chequer error in green, cube error in blue.")); } #endif pwUsePanels = gtk_check_button_new_with_label(_("Split statistics into panels")); gtk_widget_set_tooltip_text(pwUsePanels, _("Show data in a single list or split into several panels")); gtk_box_pack_start(GTK_BOX(pvbox), pwUsePanels, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwUsePanels), fGUIUseStatsPanel); g_signal_connect(G_OBJECT(pwUsePanels), "toggled", G_CALLBACK(toggle_fGUIUseStatsPanel), NULL); /* list view (selections) */ copyMenu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label(_("Copy selection")); gtk_menu_shell_append(GTK_MENU_SHELL(copyMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(StatcontextCopy), statView); menu_item = gtk_menu_item_new_with_label(_("Copy all")); gtk_menu_shell_append(GTK_MENU_SHELL(copyMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(CopyAll), pwNotebook); g_signal_connect(G_OBJECT(statView), "button-press-event", G_CALLBACK(ContextMenu), copyMenu); /* dialog size */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwUsePanels))) gtk_window_set_default_size(GTK_WINDOW(pwStatDialog), 0, 300); else { GtkRequisition req; #if GTK_CHECK_VERSION(3,0,0) gtk_widget_get_preferred_size(GTK_WIDGET(pwStatDialog), &req, NULL); #else gtk_widget_size_request(GTK_WIDGET(pwStatDialog), &req); #endif if (req.height < 600) gtk_window_set_default_size(GTK_WINDOW(pwStatDialog), 0, 600); } copyMenu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label(_("Copy page")); gtk_menu_shell_append(GTK_MENU_SHELL(copyMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(CopyPage), pwNotebook); menu_item = gtk_menu_item_new_with_label(_("Copy all pages")); gtk_menu_shell_append(GTK_MENU_SHELL(copyMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(CopyAll), pwNotebook); g_signal_connect(G_OBJECT(pwNotebook), "button-press-event", G_CALLBACK(ContextMenu), copyMenu); gtk_combo_box_set_active(GTK_COMBO_BOX(navi_combo), game); g_signal_connect(pwStatDialog, "map", G_CALLBACK(stat_dialog_map), pwUsePanels); // gtk_widget_show_all (pwStatDialog); GTKRunDialog(pwStatDialog); // <-- causes issues! #if defined(USE_BOARD3D) TidyGraphData(gd); #endif } extern int GTKGetMove(int anMove[8]) { BoardData *bd = BOARD(pwBoard)->board_data; if (!bd->valid_move) return 0; memcpy(anMove, bd->valid_move->anMove, 8 * sizeof(int)); return 1; } static void UpdateMatchinfo(const char *pch, const char *szParam, char **ppch) { char *szCommand; const char *pchOld = *ppch ? *ppch : ""; if (!strcmp(pch, pchOld)) /* no change */ return; szCommand = g_strdup_printf("set matchinfo %s %s", szParam, pch); UserCommand(szCommand); g_free(szCommand); } /* Variables for match info dialog */ static GtkWidget *apwRating[2], *pwDate, *pwEvent, *pwRound, *pwPlace, *pwAnnotator; static GtkTextBuffer *txtComment; static void MatchInfoOK(GtkWidget * pw, int *UNUSED(pf)) { GtkTextIter begin, end; unsigned int nYear, nMonth, nDay; char *pch; outputpostpone(); UpdateMatchinfo(gtk_entry_get_text(GTK_ENTRY(apwRating[0])), "rating 0", &mi.pchRating[0]); UpdateMatchinfo(gtk_entry_get_text(GTK_ENTRY(apwRating[1])), "rating 1", &mi.pchRating[1]); gtk_calendar_get_date(GTK_CALENDAR(pwDate), &nYear, &nMonth, &nDay); nMonth++; if (mi.nYear && !nDay) UserCommand("set matchinfo date"); else if (nDay && (!mi.nYear || mi.nYear != nYear || mi.nMonth != nMonth || mi.nDay != nDay)) { char sz[64]; sprintf(sz, "set matchinfo date %04u-%02u-%02u", nYear, nMonth, nDay); UserCommand(sz); } UpdateMatchinfo(gtk_entry_get_text(GTK_ENTRY(pwEvent)), "event", &mi.pchEvent); UpdateMatchinfo(gtk_entry_get_text(GTK_ENTRY(pwRound)), "round", &mi.pchRound); UpdateMatchinfo(gtk_entry_get_text(GTK_ENTRY(pwPlace)), "place", &mi.pchPlace); UpdateMatchinfo(gtk_entry_get_text(GTK_ENTRY(pwAnnotator)), "annotator", &mi.pchAnnotator); gtk_text_buffer_get_bounds(txtComment, &begin, &end); pch = gtk_text_buffer_get_text(txtComment, &begin, &end, FALSE); UpdateMatchinfo(pch, "comment", &mi.pchComment); g_free(pch); outputresume(); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void AddToTable(GtkWidget * pwTable, char *str, int x, int y) { GtkWidget *pw = gtk_label_new(str); /* Right align */ #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pw, GTK_ALIGN_END); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(pwTable), pw, x, y, 1, 1); gtk_widget_set_hexpand(pw, TRUE); gtk_widget_set_vexpand(pw, TRUE); #else gtk_misc_set_alignment(GTK_MISC(pw), 1.0, 0.5); gtk_table_attach(GTK_TABLE(pwTable), pw, x, x + 1, y, y + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); #endif } extern void GTKMatchInfo(void) { int fOK = FALSE; GtkWidget *pwDialog, *pwScrolled, *pwComment; GtkWidget *pwTable; char sz[128]; pwDialog = GTKCreateDialog(_("GNU Backgammon - Match information"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(MatchInfoOK), &fOK); #if GTK_CHECK_VERSION(3,0,0) pwTable = gtk_grid_new(); #else pwTable = gtk_table_new(3, 7, FALSE); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwTable); sprintf(sz, _("%s's rating:"), ap[0].szName); AddToTable(pwTable, sz, 0, 0); sprintf(sz, _("%s's rating:"), ap[1].szName); AddToTable(pwTable, sz, 0, 1); AddToTable(pwTable, _("Date:"), 0, 2); AddToTable(pwTable, _("Event:"), 0, 3); AddToTable(pwTable, _("Round:"), 0, 4); AddToTable(pwTable, _("Place:"), 0, 5); AddToTable(pwTable, _("Annotator:"), 0, 6); sprintf(sz, "%-78s", _("Comments:")); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), gtk_label_new(sz), 2, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), gtk_label_new(sz), 2, 3, 0, 1); #endif apwRating[0] = gtk_entry_new(); if (mi.pchRating[0]) gtk_entry_set_text(GTK_ENTRY(apwRating[0]), mi.pchRating[0]); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), apwRating[0], 1, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), apwRating[0], 1, 2, 0, 1); #endif apwRating[1] = gtk_entry_new(); if (mi.pchRating[1]) gtk_entry_set_text(GTK_ENTRY(apwRating[1]), mi.pchRating[1]); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), apwRating[1], 1, 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), apwRating[1], 1, 2, 1, 2); #endif pwDate = gtk_calendar_new(); if (mi.nYear) { gtk_calendar_select_month(GTK_CALENDAR(pwDate), mi.nMonth - 1, mi.nYear); gtk_calendar_select_day(GTK_CALENDAR(pwDate), mi.nDay); } else gtk_calendar_select_day(GTK_CALENDAR(pwDate), 0); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), pwDate, 1, 2, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pwDate, 1, 2, 2, 3); #endif pwEvent = gtk_entry_new(); if (mi.pchEvent) gtk_entry_set_text(GTK_ENTRY(pwEvent), mi.pchEvent); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), pwEvent, 1, 3, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pwEvent, 1, 2, 3, 4); #endif pwRound = gtk_entry_new(); if (mi.pchRound) gtk_entry_set_text(GTK_ENTRY(pwRound), mi.pchRound); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), pwRound, 1, 4, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pwRound, 1, 2, 4, 5); #endif pwPlace = gtk_entry_new(); if (mi.pchPlace) gtk_entry_set_text(GTK_ENTRY(pwPlace), mi.pchPlace); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), pwPlace, 1, 5, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pwPlace, 1, 2, 5, 6); #endif pwAnnotator = gtk_entry_new(); if (mi.pchAnnotator) gtk_entry_set_text(GTK_ENTRY(pwAnnotator), mi.pchAnnotator); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), pwAnnotator, 1, 6, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pwAnnotator, 1, 2, 6, 7); #endif pwComment = gtk_text_view_new(); txtComment = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwComment)); if (mi.pchComment) { gtk_text_buffer_set_text(txtComment, mi.pchComment, -1); } gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(pwComment), GTK_WRAP_WORD); pwScrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(pwScrolled), pwComment); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwTable), pwScrolled, 2, 1, 1, 6); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pwScrolled, 2, 3, 1, 7); #endif GTKRunDialog(pwDialog); } static void CalibrationOK(GtkWidget * pw, GtkWidget * ppw) { GtkAdjustment *padj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(ppw)); if (gtk_widget_is_sensitive(ppw)) { if (gtk_adjustment_get_value(padj) != (gdouble) rEvalsPerSec) { char sz[128]; sprintf(sz, "set calibration %.0f", gtk_adjustment_get_value(padj)); UserCommand(sz); } } else if (rEvalsPerSec > 0) UserCommand("set calibration"); UserCommand("save settings"); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void CalibrationEnable(GtkWidget * pw, GtkWidget * pwspin) { gtk_widget_set_sensitive(pwspin, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw))); } static void CalibrationGo(GtkWidget * pw, GtkWidget * apw[2]) { GTKSetCurrentParent(pw); UserCommand("calibrate"); fInterrupt = FALSE; if (rEvalsPerSec > 0) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apw[0]), TRUE); gtk_adjustment_set_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(apw[1])), rEvalsPerSec); } } extern void GTKShowCalibration(void) { GtkAdjustment *padj; GtkWidget *pwDialog, *pwvbox, *pwhbox, *pwenable, *pwspin, *pwbutton, *apw[2]; padj = GTK_ADJUSTMENT(gtk_adjustment_new(rEvalsPerSec > 0 ? rEvalsPerSec : 10000, 2, G_MAXFLOAT, 100, 1000, 0)); pwspin = gtk_spin_button_new(padj, 100, 0); /* FIXME should be modal but presently causes crash and/or killing of the main window */ pwDialog = GTKCreateDialog(_("GNU Backgammon - Speed estimate"), DT_QUESTION, NULL, 0, G_CALLBACK(CalibrationOK), pwspin); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); #else pwvbox = gtk_vbox_new(FALSE, 8); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwvbox); gtk_container_set_border_width(GTK_CONTAINER(pwvbox), 8); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwhbox = gtk_hbox_new(FALSE, 8); #endif gtk_container_add(GTK_CONTAINER(pwvbox), pwhbox); gtk_container_add(GTK_CONTAINER(pwhbox), pwenable = gtk_check_button_new_with_label(_("Speed recorded:"))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwenable), rEvalsPerSec > 0); gtk_container_add(GTK_CONTAINER(pwhbox), pwspin); gtk_widget_set_sensitive(pwspin, rEvalsPerSec > 0); gtk_container_add(GTK_CONTAINER(pwhbox), gtk_label_new(_("static evaluations/second"))); gtk_container_add(GTK_CONTAINER(pwvbox), pwbutton = gtk_button_new_with_label(_("Calibrate"))); gtk_widget_set_tooltip_text(pwbutton, _("Estimate speed, in 0-ply evaluations/second")); apw[0] = pwenable; apw[1] = pwspin; g_signal_connect(G_OBJECT(pwbutton), "clicked", G_CALLBACK(CalibrationGo), apw); g_signal_connect(G_OBJECT(pwenable), "toggled", G_CALLBACK(CalibrationEnable), pwspin); GTKRunDialog(pwDialog); } static gboolean CalibrationCancel(GObject * UNUSED(po), gpointer UNUSED(p)) { fInterrupt = TRUE; return TRUE; } extern void * GTKCalibrationStart(void) { GtkWidget *pwDialog, *pwhbox, *pwResult; pwDialog = GTKCreateDialog(_("GNU Backgammon - Calibration"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_NOTIDY, G_CALLBACK(CalibrationCancel), NULL); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); #else pwhbox = gtk_hbox_new(FALSE, 8); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwhbox); gtk_container_set_border_width(GTK_CONTAINER(pwhbox), 8); gtk_container_add(GTK_CONTAINER(pwhbox), gtk_label_new(_("Calibrating:"))); gtk_container_add(GTK_CONTAINER(pwhbox), pwResult = gtk_label_new(_(" (n/a) "))); gtk_container_add(GTK_CONTAINER(pwhbox), gtk_label_new(_("static evaluations/second"))); pwOldGrab = pwGrab; pwGrab = pwDialog; g_signal_connect(G_OBJECT(pwDialog), "delete_event", G_CALLBACK(CalibrationCancel), NULL); gtk_widget_show_all(pwDialog); ProcessEvents(); g_object_ref(G_OBJECT(pwResult)); return pwResult; } extern void GTKCalibrationUpdate(void *context, float rEvalsPerSec) { gchar sz[32]; sprintf(sz, "%.0f", rEvalsPerSec); gtk_label_set_text(GTK_LABEL(context), sz); ProcessEvents(); } extern void GTKCalibrationEnd(void *context) { g_object_unref(G_OBJECT(context)); gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(context))); pwGrab = pwOldGrab; } static void CallbackResign(GtkWidget * pw, gpointer data) { int i = GPOINTER_TO_INT(data); const char *asz[3] = { "normal", "gammon", "backgammon" }; char sz[20]; ms.anDice[0] = ms.anDice[1] = 0; sprintf(sz, "resign %s", asz[i]); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); UserCommand(sz); return; } extern void GTKResign(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GtkWidget *pwDialog, *pwVbox; int i; const char *asz[3] = { N_("Resign normal"), N_("Resign gammon"), N_("Resign backgammon") }; const char *resign_stocks[3] = { GNUBG_STOCK_RESIGNSN, GNUBG_STOCK_RESIGNSG, GNUBG_STOCK_RESIGNSB }; if (ap[!ms.fTurn].pt != PLAYER_HUMAN && check_resigns(NULL) != -1 && GTKShowWarning(WARN_RESIGN, NULL)) { /* Automatically resign for computer */ UserCommand("resign -1"); while (nNextTurn) NextTurnNotify(NULL); if (!ms.fResignationDeclined) return; } pwDialog = GTKCreateDialog(_("Resign"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_NOOK, NULL, NULL); #if GTK_CHECK_VERSION(3,0,0) pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); /* FIXME: how do we set homogenous to TRUE in gtk3 ? */ #else pwVbox = gtk_vbox_new(TRUE, 5); #endif for (i = 0; i < 3; i++) { GtkWidget *pwButtons, *pwHbox; pwButtons = gtk_button_new(); #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwButtons), pwHbox); gtk_box_pack_start(GTK_BOX(pwHbox), gtk_image_new_from_stock(resign_stocks[i], GTK_ICON_SIZE_LARGE_TOOLBAR), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwHbox), gtk_label_new(_(asz[i])), TRUE, TRUE, 10); gtk_container_add(GTK_CONTAINER(pwVbox), pwButtons); g_signal_connect(G_OBJECT(pwButtons), "clicked", G_CALLBACK(CallbackResign), GINT_TO_POINTER(i)); } gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwVbox); GTKRunDialog(pwDialog); } extern void MoveListDestroy(void) { if (pwMoveAnalysis) { gtk_widget_destroy(pwMoveAnalysis); pwMoveAnalysis = NULL; } } #if defined(USE_BOARD3D) extern gboolean display_is_3d(const renderdata* prd) { g_assert(prd->fDisplayType == DT_2D || (prd->fDisplayType == DT_3D && widget3dValid)); return (prd->fDisplayType == DT_3D); } extern gboolean display_is_2d(const renderdata* prd) { displaytype fdt = prd->fDisplayType; g_assert(fdt == DT_2D || fdt == DT_3D); return (fdt == DT_2D ? TRUE : FALSE); } #endif gnubg-1.08.003/configure.ac000644 001751 000024 00000046771 14613451435 015133 0ustar00pmstaff000000 000000 dnl To rebuild the `configure' script from this, execute the command dnl autoconf dnl in the directory containing this script. dnl Copyright (C) 1999-2002 Gary Wong dnl Copyright (C) 2002-2024 the AUTHORS dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation, either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . AC_INIT([GNU Backgammon],m4_esyscmd(echo 1.08.003$VERSION_EXT | tr -d '\n'),[bug-gnubg@gnu.org],[gnubg]) AC_CANONICAL_BUILD AC_CANONICAL_HOST AC_CONFIG_SRCDIR(gnubg.c) AM_INIT_AUTOMAKE([subdir-objects]) AC_CONFIG_HEADERS([config.h]) dnl dnl parse default options dnl if test -f config.options; then . ./config.options fi dnl dnl host specifics dnl dnl Only relevant for win32 but the macro has to be executed unconditionally dnl -Wl since libtool uses gcc as linker dnl AX_APPEND_LINK_FLAGS([-Wl,--large-address-aware],,,) win32=no AC_MSG_CHECKING([for host]) case "$host" in *-*-mingw*) win32=yes CFLAGS="$CFLAGS -mms-bitfields" LDFLAGS="$LDFLAGS -lws2_32 -lwinmm" if [[[ "$(uname -or)" == *Msys ]]]; then AC_DEFINE(USABLE_UNDER_MSYS, 1, [Using Msys]) fi ;; *-*-darwin*) darwin=yes LDFLAGS="$LDFLAGS -dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" AC_DEFINE(USE_APPLE_OPENGL, 1, [Define if using Apple OpenGL]) ;; *-*-*bsd*) CPPFLAGS="$CPPFLAGS -I${LOCALBASE:-/usr/local}/include" LDFLAGS="$LDFLAGS -L${LOCALBASE:-/usr/local}/lib" ;; esac AM_CONDITIONAL(WIN32, test "x$win32" = "xyes") AC_MSG_RESULT([$host]) if test "x$win32" = "xyes"; then AC_CHECK_TOOL(WINDRES, windres) fi dnl dnl Compiler setup dnl AC_USE_SYSTEM_EXTENSIONS AC_PROG_CC AM_PROG_CC_C_O dnl Deprecated but RHEL6/gcc 4.4 needs it AC_PROG_CC_STDC AM_CONDITIONAL(CROSS_COMPILING, test "x$cross_compiling" = "xyes") dnl dnl Checks for programs. dnl AC_PROG_AWK AC_PROG_LN_S AC_CHECK_PROGS(DOCBOOK2TEXI, docbook2x-texi db2x_docbook2texi, false) AC_CHECK_PROGS(DOCBOOK2MAN, docbook2x-man db2x_docbook2man, false) AC_CHECK_PROGS(DBLATEX, dblatex, false) AC_CHECK_PROGS(XSLTPROC, xsltproc, false) AC_CHECK_PROGS(GMSGFMT, msgfmt, false) AC_ARG_VAR([DOCBOOK2TEXI], [path for docbook2texi from docbook2x package]) AC_ARG_VAR([DOCBOOK2MAN], [path for docbook2man from docbook2x package]) AC_ARG_VAR([DBLATEX], [path for dblatex used to build pdf documentation]) AC_ARG_VAR([XSLTPROC], [path for xsltproc used to build html documentation]) AC_ARG_VAR([GMSGFMT], [path for msgfmt used to compile message catalogs]) LIBCURL_CHECK_CONFIG( , , , ) dnl dnl Setup libtool dnl AC_CONFIG_MACRO_DIR([m4]) AC_DISABLE_SHARED AC_PROG_LIBTOOL dnl dnl yacc and lex setup dnl # Sometimes Flex is installed as Lex, e.g., NetBSD. AC_CHECK_PROG([FLEX], [flex lex], [flex]) # Force the use of `missing' to wrap Flex invocations. AM_MISSING_PROG([LEX], [$FLEX]) AM_PROG_LEX AX_PROG_FLEX_VERSION([2.5.9],,AC_MSG_ERROR([flex 2.5.9 or higher is needed to build GNU Backgammon])) AC_PROG_YACC AM_YFLAGS='-d' AC_SUBST(AM_YFLAGS) dnl dnl check for compiler support dnl glib2minrev=22.0 PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.$glib2minrev], have_glib="yes", AC_MSG_ERROR([You need to have glib2 version 2.$glib2minrev or higher to compile GNU Backgammon])) PKG_CHECK_MODULES(GOBJECT, [gobject-2.0], have_gobject="yes", AC_MSG_WARN([no gobject support in glib])) PKG_CHECK_MODULES(GTHREAD, [gthread-2.0], have_gthread="yes", AC_MSG_WARN([no thread support in glib])) PKG_CHECK_MODULES(FREETYPE2, [freetype2], have_freetype="yes", AC_MSG_WARN([no freetype support])) PKG_CHECK_MODULES(LIBPNG, [libpng >= 1.2], have_libpng="yes", AC_MSG_WARN([no png support])) PKG_CHECK_MODULES(CAIRO, [cairo >= 1.2], have_cairo="yes", [AC_MSG_WARN([no cairo support])]) PKG_CHECK_MODULES(PANGOCAIRO, [pangocairo >= 1.0], have_pangocairo="yes", [AC_MSG_WARN([no pangocairo support])]) PKG_CHECK_MODULES(SQLITE, [sqlite3], have_sqlite="yes", AC_MSG_WARN([no sqlite support])) if test "x$win32" = "xyes"; then have_canberra="no" have_gl="yes" have_glu="yes" else if test "x$darwin" = "xyes"; then have_canberra="no" elif test "x$with_gtk" != "xno"; then if test "x$with_gtk3" = "xyes"; then PKG_CHECK_MODULES(CANBERRA, [libcanberra-gtk3], have_canberra="yes", AC_MSG_WARN([no libcanberra-gtk3 support])) else PKG_CHECK_MODULES(CANBERRA, [libcanberra-gtk], have_canberra="yes", AC_MSG_WARN([no libcanberra-gtk support])) fi fi PKG_CHECK_MODULES(GL, [gl], have_gl="yes", AC_MSG_WARN([no gl support])) PKG_CHECK_MODULES(GLU, [glu], have_glu="yes", AC_MSG_WARN([no glu support])) fi if test "x$with_gtk" != "xno"; then if test "x$with_gtk3" = "xyes"; then PKG_CHECK_MODULES(GTK, [gtk+-3.0 >= 3.22.0], have_gtk="yes", AC_MSG_WARN([no gtk3 support])) else PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.18.0], have_gtk="yes", AC_MSG_WARN([no gtk2 support])) fi if test "x$with_board3d" != "xno"; then if test "x$with_gtk3" = "xyes"; then PKG_CHECK_MODULES(EPOXY, [epoxy], have_epoxy="yes", AC_MSG_WARN([no epoxy support])) else PKG_CHECK_MODULES(GTKGLEXT, [gtkglext-1.0 >= 1.0], have_gtkglext="yes" , AC_MSG_WARN([no gtkglext support])) fi fi fi if test "x$have_freetype" = "xyes"; then AC_DEFINE(HAVE_FREETYPE, 1, [Define if you have freetype2]) fi if test "x$have_libpng" = "xyes"; then AC_DEFINE(HAVE_LIBPNG, 1, [Define if you have libpng]) fi if test "x$have_cairo" = "xyes"; then AC_DEFINE(HAVE_CAIRO,1, [Define if you want to use libcairo]) fi if test "x$have_pangocairo" = "xyes"; then AC_DEFINE(HAVE_PANGOCAIRO,1, [Define if you want to use pangocairo]) fi AC_ARG_WITH(sqlite,[ --with-sqlite use sqlite (Default if found)]) if test "$with_sqlite" != "no" && test "x$have_sqlite" = "xyes"; then AC_DEFINE(USE_SQLITE,1, [Define if you want to use sqlite]) fi AM_CONDITIONAL(USE_SQLITE, test "$with_sqlite" != "no" && test "$have_sqlite" != "no" ) dnl If OSX version < 10.6 (Prior to Snow Leopard) then try to build dnl with Quicktime, otherwise use CoreAudio if it is available if test "x$darwin" = "xyes"; then needquicktime=no AS_VERSION_COMPARE("$(uname -r)", "10.0", needquicktime=yes, [], []) if test "x$needquicktime" = "xyes"; then quicktime=no AC_CHECK_HEADER([QuickTime/QuickTime.h], [quicktime=yes]) if test "x$quicktime" = "xyes"; then AC_DEFINE(HAVE_APPLE_QUICKTIME,1, [Define if you have Apple QuickTime]) LDFLAGS="$LDFLAGS -framework QuickTime" fi else coreaudio=no AC_CHECK_HEADER([AudioToolbox/AudioToolbox.h], [AC_CHECK_HEADER([CoreAudio/CoreAudioTypes.h],[coreaudio=yes])]) if test "x$coreaudio" = "xyes"; then AC_DEFINE(HAVE_APPLE_COREAUDIO,1, [Define if you have Apple CoreAudio]) LDFLAGS="$LDFLAGS -framework AudioUnit -framework CoreServices -framework AudioToolBox -framework CoreAudio" fi fi fi if test "x$have_canberra" = "xyes"; then AC_DEFINE(HAVE_CANBERRA,1, [Define if you want to use gstreamer]) fi dnl have_gthread, have_gtk and have_gtk are handled later, not having glib is fatal AX_C___ATTRIBUTE__() if test "x$ax_cv___attribute__" = "xyes"; then AX_GCC_FUNC_ATTRIBUTE(const) AX_GCC_FUNC_ATTRIBUTE(fallthrough) AX_GCC_FUNC_ATTRIBUTE(format) AX_GCC_FUNC_ATTRIBUTE(pure) AX_GCC_FUNC_ATTRIBUTE(unused) fi dnl dnl check for pkg-config controlled libs dnl dnl dnl Checks for libraries. dnl AC_CHECK_LIB(m,sqrt) AC_SEARCH_LIBS(gethostbyname,nsl) AC_SEARCH_LIBS(inet_aton,resolv) if test "x$win32" = "xyes"; then AC_DEFINE(HAVE_SOCKETS,1,Define if the system supports sockets.) else AC_SEARCH_LIBS(connect,socket,AC_DEFINE(HAVE_SOCKETS,1,Define if the system supports sockets.)) fi dnl dnl Check for readline dnl bcrl=n AC_CHECK_LIB(ncurses,tparm,TERMLIB=-lncurses, AC_CHECK_LIB(termcap,tgetent,TERMLIB=-ltermcap)) AC_CHECK_LIB(readline,readline, [AC_CHECK_HEADER(readline/readline.h, READLINE_LIBS="-lreadline $TERMLIB";bcrl=y)], READLINE_LIBS="") if test "$bcrl" = "y" ; then AC_DEFINE([HAVE_LIB_READLINE],1,Define if you have libreadline) AC_CHECK_HEADERS(stdarg.h) fi AC_SUBST(READLINE_LIBS) dnl dnl Check for gmp dnl bcgmp=n AC_CHECK_LIB(gmp,__gmpz_import, [AC_CHECK_HEADER(gmp.h, GMP_LIB="-lgmp";bcgmp=y)], GMP_LIB="") if test "$bcgmp" = "y" ; then AC_DEFINE([HAVE_LIBGMP],1,Define if you have libgmp) fi AC_SUBST(GMP_LIB) dnl dnl Check for cglm dnl have_cglm="no" CPPFLAGS_bak="$CPPFLAGS" CPPFLAGS="-I. $CPPFLAGS" AC_CHECK_HEADER([cglm/version.h],[have_cglm="yes"]) CPPFLAGS="$CPPFLAGS_bak" dnl dnl Checks for header files. dnl AC_CHECK_HEADERS(sys/resource.h sys/socket.h sys/time.h sys/types.h unistd.h) AC_CHECK_HEADERS(mcheck.h) dnl dnl Checks for typedefs, structures, and compiler characteristics. dnl AC_C_INLINE AC_TYPE_SIZE_T dnl dnl Checks for library functions. dnl AC_CHECK_FUNCS(sigaction sigvec break) AC_CHECK_FUNCS(strptime setpriority) AC_CHECK_FUNCS(mtrace) AC_CHECK_FUNCS(clock_gettime) dnl dnl Check for aligned allocation functions dnl AC_CHECK_FUNCS(posix_memalign _aligned_malloc) dnl dnl Checks for compiler builtins dnl AX_GCC_BUILTIN(__builtin_clz) AX_GCC_BUILTIN(__builtin_expect) dnl ******************* dnl optional components dnl ******************* AC_MSG_CHECKING([wether deprecated glib functions are enabled]) AC_ARG_ENABLE( gdeprecated, [ --enable-gdeprecated enable deprecated glib functions], gdeprecated=$enableval) if test "x$gdeprecated" = "xno"; then AC_DEFINE(G_DISABLE_DEPRECATED, 1, Define if you want to disable deprecated glib functions) fi AC_MSG_RESULT($gdeprecated) AC_MSG_CHECKING([wether deprecated gtk functions are enabled]) AC_ARG_ENABLE( gtkdeprecated, [ --enable-gtkdeprecated enable deprecated gtk functions], gtkdeprecated=$enableval) if test "x$gtkdeprecated" = "xno"; then AC_DEFINE(GTK_DISABLE_DEPRECATED, 1, Define if you want to disable deprecated gtk functions) fi AC_MSG_RESULT($gtkprecated) dnl dnl Check for gtk and gtkglext dnl no_gtk="yes" no_board3d="yes" AC_ARG_WITH(gtk,[ --with-gtk use GTK+ 2.0 (Default if found)]) AC_ARG_WITH(gtk3,[ --with-gtk3 use GTK+ 3.0 (Experimental, disabled by default)]) AC_ARG_WITH(board3d,[ --with-board3d compile with 3D boards (Default if found)]) if test "$with_gtk" != "no" && test "x$have_gtk" = "xyes"; then AC_DEFINE(USE_GTK, 1, [Define if you want to use the gtk gui]) no_gtk="no" fi if test "$with_gtk" = "yes" && test "$no_gtk" = "yes"; then AC_MSG_ERROR([gtk requested but not found]) fi AC_CHECK_HEADERS(GL/glx.h) if test "$with_board3d" != "no" && test "$with_gtk3" = "yes"; then if test "x$have_gtk" = "xyes" && test "x$have_epoxy" = "xyes"; then AC_DEFINE(USE_BOARD3D,1, [Define if you want to use the 3D boards]) no_board3d="no" fi else if test "x$have_gtk" = "xyes" && test "x$have_gtkglext" = "xyes" && test "x$have_gl" = "xyes" && test "x$have_glu" = "xyes"; then AC_DEFINE(USE_BOARD3D,1, [Define if you want to use the 3D boards]) no_board3d="no" fi fi if test "$with_board3d" = "yes" && test "$no_board3d" = "yes"; then AC_MSG_ERROR([board3d requested but gtk or gtkglext not found]) fi if test "$with_board3d" != "no" && test "$have_cglm" = "no"; then AC_MSG_NOTICE([Extract cglm headers later]) AC_CONFIG_COMMANDS([cglm], [echo 'Extract cglm headers'; sh "$ac_top_srcdir/non-src/cglm.shar" > /dev/null]) fi AM_CONDITIONAL(USE_GTK, test "$no_gtk" != "yes" ) AM_CONDITIONAL(USE_BOARD3D, test "$no_board3d" != "yes" ) if test "$no_gtk" = "no"; then AC_PATH_PROG(GDK_PIXBUF_CSOURCE, gdk-pixbuf-csource, no) if test "x$GDK_PIXBUF_CSOURCE" = "xno"; then AC_MSG_WARN([Could not find gdk-pixbuf-csource in your PATH, cannot rebuild pixmaps]) fi AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources, no) if test "x$GLIB_COMPILE_RESOURCES" = "xno"; then AC_MSG_WARN([Could not find glib-compile-resources in your PATH, will use legacy pixmaps instead]) else AC_DEFINE(USE_GRESOURCE, 1, [Define if you want to use GResource to load images]) fi fi AM_CONDITIONAL(FOUND_GDK_PIXBUF_CSOURCE, test "x$GDK_PIXBUF_CSOURCE" != "xno" ) AM_CONDITIONAL(FOUND_GLIB_COMPILE_RESOURCES, test "x$GLIB_COMPILE_RESOURCES" != "xno" ) dnl dnl Check for Python dnl AC_ARG_WITH([python], AS_HELP_STRING([--with-python=program], [specify the python interpreter to use: (default=yes)]), [ if [ test x"$with_python" != x"no" && test x"$with_python" != x"yes" ]; then PYTHON="$with_python" AC_PATH_PROG([PYTHON],[$PYTHON]) if test -z "$PYTHON"; then AC_MSG_ERROR([Cannot find user specified Python interpreter: $with_python]) fi fi ]) if test "x$with_python" != "xno"; then AM_PATH_PYTHON(2.6) AX_PYTHON_DEVEL([], [true]) if test "x$ax_python_devel_found" != "xno"; then AC_DEFINE(USE_PYTHON,1,[Define if you want to use Python inside GNUbg]) fi fi AM_CONDITIONAL(USE_PYTHON, test x"$with_python" != x"no" && test x"$ax_python_devel_found" != x"no" ) dnl dnl SIMD dnl AX_EXT() AC_MSG_CHECKING([for SIMD CPU instructions]) AC_ARG_ENABLE( simd, [ --enable-simd=TYPE enable SIMD usage for newer cpus (TYPE=yes,fma,avx,sse2,neon,no)], simdcpu=$enableval, simdcpu="undef") if test "x$simdcpu" = "xundef" || test "x$simdcpu" = "xyes"; then if test "x$ax_cv_have_fma_ext" = "xyes"; then simdcpu="fma" elif test "x$ax_cv_have_avx_ext" = "xyes"; then simdcpu="avx" elif test "x$ax_cv_have_sse2_ext" = "xyes"; then simdcpu="sse2" elif test "x$ax_cv_have_sse_ext" = "xyes"; then simdcpu="sse" # This seems slightly useful on 64bit Raspberry Pi but not on Apple M1 # elif test "x$ax_cv_have_neon_ext" = "xyes"; then # simdcpu="neon" else simdcpu="no" fi fi if test "x$simdcpu" != "xno"; then AC_DEFINE(USE_SIMD_INSTRUCTIONS,1,Define if you want to compile with SIMD support) if test "x$simdcpu" = "xfma"; then AC_DEFINE(USE_FMA3, 1, Define if you want to compile with FMA3 support) AC_DEFINE(USE_AVX, 1, Define if you want to compile with AVX support) fi if test "x$simdcpu" = "xavx"; then AC_DEFINE(USE_AVX, 1, Define if you want to compile with AVX support) fi if test "x$simdcpu" = "xsse2"; then AC_DEFINE(USE_SSE2, 1, Define if you want to compile with SSE2 support) fi if test "x$simdcpu" = "xneon"; then AC_DEFINE(USE_NEON, 1, Define if you want to compile with NEON support) fi if test x"$GCC" = "xyes"; then if test "x$SIMD_CFLAGS" = x; then if test "x$simdcpu" = "xfma"; then SIMD_CFLAGS="-mfma -mavx" elif test "x$simdcpu" = "xavx"; then SIMD_CFLAGS="-mavx" elif test "x$simdcpu" = "xsse2"; then SIMD_CFLAGS="-msse -msse2" elif test "x$simdcpu" = "xneon"; then case $host_cpu in arm*) SIMD_CFLAGS="-mfpu=neon" ;; aarch64*) SIMD_CFLAGS="-march=armv8-a+simd" ;; esac else SIMD_CFLAGS="-msse" fi fi fi fi AM_CONDITIONAL(USE_AVX, test "x$simdcpu" = "xavx") AC_MSG_RESULT([$host (simd=$simdcpu, SIMD_CFLAGS="$SIMD_CFLAGS")]) AC_ARG_VAR(SIMD_CFLAGS, [CFLAGS needed for compiling in SIMD CPU support]) AC_MSG_CHECKING([for SIMD supported CPU test]) AC_ARG_ENABLE( cputest, [ --disable-cputest disable runtime SIMD CPU test (Default no) ], cputest=$enableval, cputest="yes") if test "x$simdcpu" = "xno"; then cputest="no" elif test x"$GCC" = "xno"; then AC_MSG_WARN([CPU test disabled, GNUC compatible compiler not being used]) cputest="no" fi AS_IF([test "x$cputest" = "xno"], [ AC_DEFINE(DISABLE_SIMD_TEST, 1, Define if you want to disable the SIMD CPU instruction test) ]) AS_IF( [test "x$cputest" != "xno"], [AC_MSG_RESULT($cputest)], [AC_MSG_RESULT(no)] ) dnl dnl Threads dnl AC_MSG_CHECKING([for multithread support]) AC_ARG_ENABLE(threads, [ --enable-threads enable multithread support (Default yes)], threads=$enableval, threads="yes") AM_CONDITIONAL(USE_MULTITHREAD, test "x$enable_threads" != "xno" ) if test "x$enable_threads" != "xno"; then AC_DEFINE(USE_MULTITHREAD, 1, Define if you want to have multithread support) fi AS_IF( [test "x$enable_threads" != "xno"], [AC_MSG_RESULT($threads)], [AC_MSG_RESULT(no)] ) dnl dnl Maximum number of threads dnl AC_ARG_WITH([eval_max_threads], AS_HELP_STRING([--with-eval-max-threads=size], [define the maximum number of evaluation threads allowed: (default=48)]), [ EVAL_THREAD_COUNT=$with_eval_max_threads AC_DEFINE_UNQUOTED(MAX_NUMTHREADS, $EVAL_THREAD_COUNT, [maximum number of evaluation threads]) ]) if test "x$simdcpu" = "xavx" && test "x$win32" = "xyes" ; then AM_CFLAGS="$AM_CFLAGS" fi dnl dnl Check for program to open browser dnl if test x"$win32" = x"no"; then AC_CHECK_PROGS([DEFAULT_WWW_PROG], [sensible-browser xdg-open firefox], [xdg-open]) AC_MSG_CHECKING([for program to open URLs]) AC_ARG_WITH([default_browser], AS_HELP_STRING([--with-default-browser=program], [specify the program to open URLs: (default=xdg-open, or default=sensible-browser on Debian distros)]), [ if [test x"$with_default_browser" = x"no"]; then OPENWWW_PROG="xdg-open" elif [test x"$with_default_browser" = x"yes"]; then OPENWWW_PROG="$DEFAULT_WWW_PROG" else OPENWWW_PROG="$with_default_browser" fi ], [ OPENWWW_PROG="$DEFAULT_WWW_PROG" ]) AC_DEFINE_UNQUOTED(OPEN_URL_PROG, "$OPENWWW_PROG", [program to open URLs]) AC_MSG_RESULT($OPENWWW_PROG) else AC_DEFINE_UNQUOTED(OPEN_URL_PROG, "", [program to open URLs]) fi AC_MSG_CHECKING([whether g_asserts are enabled]) AC_ARG_ENABLE([gasserts], AS_HELP_STRING([--enable-gasserts], [enable g_assert debugging macros (Default disabled)]), [gasserts="yes"], [gasserts="no"]) if test x"$enable_gasserts" != x"yes"; then AM_CFLAGS="$AM_CFLAGS -DG_DISABLE_ASSERT" fi AS_IF( [test x"$enable_gasserts" != x"yes"], [AC_MSG_RESULT($gasserts)], [AC_MSG_RESULT(yes)] ) dnl Compiling with -O3 makes a useful difference with gcc, clang and Sun's dnl compiler ; -ffast-math helps as well when available. dnl For instance, some match analysis on a Core i5 CPU (gcc 4.4.7, -mavx) : dnl -O2 1:23 dnl -O3 1:14 dnl -O3 -ffast-math 1:11 AM_CFLAGS="$AM_CFLAGS -g -O3" if test x"$GCC" = "xyes"; then AM_CFLAGS="$AM_CFLAGS -ffast-math" fi # Don't let automake's default override the above settings # If you really want -O2 -g, use ./configure CFLAGS="-O2 -fno-fast-math" if test x"$CFLAGS" = "x-g -O2"; then CFLAGS="" fi AC_SUBST(AM_CFLAGS) dnl ************* dnl Misc. settings dnl ************* AX_BUILD_DATE_EPOCH(BUILD_DATE, [%Y%m%d]) AC_SUBST([BUILD_DATE]) dnl internationalization macros dnl AC_SUBST(GETTEXT_PACKAGE, gnubg) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The package name, for gettext]) ALL_LINGUAS="cs da de en_GB en_US el es fi fr is it ja ro ru tr" AM_GLIB_GNU_GETTEXT dnl dnl config files dnl AC_CONFIG_FILES([Makefile doc/Makefile lib/Makefile met/Makefile po/Makefile.in po/Makefile m4/Makefile sounds/Makefile board3d/Makefile textures/Makefile scripts/Makefile flags/Makefile fonts/Makefile non-src/Makefile pixmaps/Makefile win32/Makefile]) dnl dnl dnl AC_OUTPUT gnubg-1.08.003/output.h000644 001751 000024 00000006106 14574155047 014350 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2002 Gary Wong * Copyright (C) 2015-2022 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: output.h,v 1.6 2022/01/27 22:14:47 plm Exp $ */ #ifndef OUTPUT_H #define OUTPUT_H #include #include #include "common.h" /* Initialize output module */ extern void output_initialize(void); /* Write a string to stdout/status bar/popup window */ extern void output(const char *sz); /* Write a string to stdout/status bar/popup window, and append \n */ extern void outputl(const char *sz); /* Write a character to stdout/status bar/popup window */ extern void outputc(const char ch); /* Write an error message, perror() style */ extern void outputerr(const char *sz); #if defined(HAVE_FUNC_ATTRIBUTE_FORMAT) /* Write a string to stdout/status bar/popup window, printf style */ extern void outputf(const char *sz, ...) __attribute__ ((format(printf, 1, 2))); /* Write a string to stdout/status bar/popup window, vprintf style */ extern void outputv(const char *sz, va_list val) __attribute__ ((format(printf, 1, 0))); /* Write an error message, fprintf() style */ extern void outputerrf(const char *sz, ...) __attribute__ ((format(printf, 1, 2))); /* Write an error message, vfprintf() style */ extern void outputerrv(const char *sz, va_list val) __attribute__ ((format(printf, 1, 0))); #else /* Write a string to stdout/status bar/popup window, printf style */ extern void outputf(const char *sz, ...); /* Write a string to stdout/status bar/popup window, vprintf style */ extern void outputv(const char *sz, va_list val); /* Write an error message, fprintf() style */ extern void outputerrf(const char *sz, ...); /* Write an error message, vfprintf() style */ extern void outputerrv(const char *sz, va_list val); #endif /* Signifies that all output for the current command is complete */ extern void outputx(void); /* Temporarily disable outputx() calls */ extern void outputpostpone(void); /* Re-enable outputx() calls */ extern void outputresume(void); /* Signifies that subsequent output is for a new command */ extern void outputnew(void); /* Disable output */ extern void outputoff(void); /* Enable output */ extern void outputon(void); extern int cOutputDisabled; extern int cOutputPostponed; extern int foutput_on; #if defined(USE_PYTHON) /* output-family functions allocate with g_strdup_printf(), caller g_free()s */ extern char* szMemOutput; extern int foutput_to_mem; #endif extern void print_utf8_to_locale(const gchar *sz); #endif gnubg-1.08.003/positionid.c000644 001751 000024 00000034145 14574155047 015170 0ustar00pmstaff000000 000000 /* * Copyright (C) 1998-2002 Gary Wong * Copyright (C) 2000-2014 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * An implementation of the legacy position key/ID described at: * https://www.gnu.org/software/gnubg/manual/gnubg.html#gnubg-tech_postionid * * This encoding creates IDs as compact as possible. * * For internal use in moves generation and evaluation we now use another * key, much faster to encode or decode, that is essentially the raw board * squeezed down to 4 bits/point. * * This library also calculates bearoff IDs, which are enumerations of the * * c+6 * C * 6 * * combinations of (up to c) chequers among 6 points. * * * $Id: positionid.c,v 1.56 2021/01/26 22:09:24 plm Exp $ */ #include "config.h" #include #include #include #include "positionid.h" extern void PositionKey(const TanBoard anBoard, positionkey * pkey) { unsigned int i, j; unsigned int *anpBoard = pkey->data; for (i = 0, j = 0; i < 3; i++, j += 8) { anpBoard[i] = anBoard[1][j] + (anBoard[1][j + 1] << 4) + (anBoard[1][j + 2] << 8) + (anBoard[1][j + 3] << 12) + (anBoard[1][j + 4] << 16) + (anBoard[1][j + 5] << 20) + (anBoard[1][j + 6] << 24) + (anBoard[1][j + 7] << 28); anpBoard[i + 3] = anBoard[0][j] + (anBoard[0][j + 1] << 4) + (anBoard[0][j + 2] << 8) + (anBoard[0][j + 3] << 12) + (anBoard[0][j + 4] << 16) + (anBoard[0][j + 5] << 20) + (anBoard[0][j + 6] << 24) + (anBoard[0][j + 7] << 28); } anpBoard[6] = anBoard[0][24] + (anBoard[1][24] << 4); } extern void PositionFromKey(TanBoard anBoard, const positionkey * pkey) { unsigned int i, j; unsigned int const *anpBoard = pkey->data; for (i = 0, j = 0; i < 3; i++, j += 8) { anBoard[1][j] = anpBoard[i] & 0x0f; anBoard[1][j + 1] = (anpBoard[i] >> 4) & 0x0f; anBoard[1][j + 2] = (anpBoard[i] >> 8) & 0x0f; anBoard[1][j + 3] = (anpBoard[i] >> 12) & 0x0f; anBoard[1][j + 4] = (anpBoard[i] >> 16) & 0x0f; anBoard[1][j + 5] = (anpBoard[i] >> 20) & 0x0f; anBoard[1][j + 6] = (anpBoard[i] >> 24) & 0x0f; anBoard[1][j + 7] = (anpBoard[i] >> 28) & 0x0f; anBoard[0][j] = anpBoard[i + 3] & 0x0f; anBoard[0][j + 1] = (anpBoard[i + 3] >> 4) & 0x0f; anBoard[0][j + 2] = (anpBoard[i + 3] >> 8) & 0x0f; anBoard[0][j + 3] = (anpBoard[i + 3] >> 12) & 0x0f; anBoard[0][j + 4] = (anpBoard[i + 3] >> 16) & 0x0f; anBoard[0][j + 5] = (anpBoard[i + 3] >> 20) & 0x0f; anBoard[0][j + 6] = (anpBoard[i + 3] >> 24) & 0x0f; anBoard[0][j + 7] = (anpBoard[i + 3] >> 28) & 0x0f; } anBoard[0][24] = anpBoard[6] & 0x0f; anBoard[1][24] = (anpBoard[6] >> 4) & 0x0f; } /* In evaluations, the function above is often followed by swapping * the board. This is expensive (SwapSides is about as costly as * PositionFromKey itself). * Provide one that fills the board already swapped. */ extern void PositionFromKeySwapped(TanBoard anBoard, const positionkey * pkey) { unsigned int i, j; unsigned int const *anpBoard = pkey->data; for (i = 0, j = 0; i < 3; i++, j += 8) { anBoard[0][j] = anpBoard[i] & 0x0f; anBoard[0][j + 1] = (anpBoard[i] >> 4) & 0x0f; anBoard[0][j + 2] = (anpBoard[i] >> 8) & 0x0f; anBoard[0][j + 3] = (anpBoard[i] >> 12) & 0x0f; anBoard[0][j + 4] = (anpBoard[i] >> 16) & 0x0f; anBoard[0][j + 5] = (anpBoard[i] >> 20) & 0x0f; anBoard[0][j + 6] = (anpBoard[i] >> 24) & 0x0f; anBoard[0][j + 7] = (anpBoard[i] >> 28) & 0x0f; anBoard[1][j] = anpBoard[i + 3] & 0x0f; anBoard[1][j + 1] = (anpBoard[i + 3] >> 4) & 0x0f; anBoard[1][j + 2] = (anpBoard[i + 3] >> 8) & 0x0f; anBoard[1][j + 3] = (anpBoard[i + 3] >> 12) & 0x0f; anBoard[1][j + 4] = (anpBoard[i + 3] >> 16) & 0x0f; anBoard[1][j + 5] = (anpBoard[i + 3] >> 20) & 0x0f; anBoard[1][j + 6] = (anpBoard[i + 3] >> 24) & 0x0f; anBoard[1][j + 7] = (anpBoard[i + 3] >> 28) & 0x0f; } anBoard[1][24] = anpBoard[6] & 0x0f; anBoard[0][24] = (anpBoard[6] >> 4) & 0x0f; } static inline void addBits(unsigned char auchKey[10], unsigned int bitPos, unsigned int nBits) { unsigned int k = bitPos / 8; unsigned int r = (bitPos & 0x7); unsigned int b = (((unsigned int) 0x1 << nBits) - 1) << r; auchKey[k] |= (unsigned char) b; if (k < 8) { auchKey[k + 1] |= (unsigned char) (b >> 8); auchKey[k + 2] |= (unsigned char) (b >> 16); } else if (k == 8) { auchKey[k + 1] |= (unsigned char) (b >> 8); } } extern void oldPositionKey(const TanBoard anBoard, oldpositionkey * pkey) { unsigned int i, iBit = 0; const unsigned int *j; memset(pkey, 0, sizeof(oldpositionkey)); for (i = 0; i < 2; ++i) { const unsigned int *const b = anBoard[i]; for (j = b; j < b + 25; ++j) { const unsigned int nc = *j; if (nc) { addBits(pkey->auch, iBit, nc); iBit += nc + 1; } else { ++iBit; } } } } extern void oldPositionFromKey(TanBoard anBoard, const oldpositionkey * pkey) { int i = 0, j = 0, k; const unsigned char *a; memset(anBoard[0], 0, sizeof(anBoard[0])); memset(anBoard[1], 0, sizeof(anBoard[1])); for (a = pkey->auch; a < pkey->auch + 10; ++a) { unsigned char cur = *a; for (k = 0; k < 8; ++k) { if ((cur & 0x1)) { if (i >= 2 || j >= 25) { /* Error, so return - will probably show error message */ return; } ++anBoard[i][j]; } else { if (++j == 25) { ++i; j = 0; } } cur >>= 1; } } } static char * oldPositionIDFromKey(const oldpositionkey * pkey) { unsigned char const *puch = pkey->auch; static char szID[L_POSITIONID + 1]; char *pch = szID; static const char aszBase64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int i; for (i = 0; i < 3; i++) { *pch++ = aszBase64[puch[0] >> 2]; *pch++ = aszBase64[((puch[0] & 0x03) << 4) | (puch[1] >> 4)]; *pch++ = aszBase64[((puch[1] & 0x0F) << 2) | (puch[2] >> 6)]; *pch++ = aszBase64[puch[2] & 0x3F]; puch += 3; } *pch++ = aszBase64[*puch >> 2]; *pch++ = aszBase64[(*puch & 0x03) << 4]; *pch = 0; return szID; } extern char * PositionIDFromKey(const positionkey * pkey) { TanBoard anBoard; oldpositionkey okey; PositionFromKey(anBoard, pkey); oldPositionKey((ConstTanBoard) anBoard, &okey); return oldPositionIDFromKey(&okey); } extern char * PositionID(const TanBoard anBoard) { oldpositionkey key; oldPositionKey(anBoard, &key); return oldPositionIDFromKey(&key); } extern int PositionFromXG(TanBoard anBoard, const char *pos) { int i; for (i = 0; i < 26; i++) { int p0, p1; if (i == 0) { p0 = 24; p1 = -1; } else if (i == 25) { p0 = -1; p1 = 24; } else { p0 = 24 - i; p1 = i - 1; } if (pos[i] >= 'A' && pos[i] <= 'P') { if (p0 > -1) anBoard[0][p0] = 0; anBoard[1][p1] = (unsigned int) (pos[i] - 'A' + 1); } else if (pos[i] >= 'a' && pos[i] <= 'p') { anBoard[0][p0] = (unsigned int) (pos[i] - 'a' + 1); if (p1 > -1) anBoard[1][p1] = 0; } else if (pos[i] == '-') { if (p0 > -1) anBoard[0][p0] = 0; if (p1 > -1) anBoard[1][p1] = 0; } else { return 1; } } return 0; } extern int CheckPosition(const TanBoard anBoard) { unsigned int ac[2], i; /* Check for a player with over 15 chequers */ for (i = ac[0] = ac[1] = 0; i < 25; i++) if ((ac[0] += anBoard[0][i]) > 15 || (ac[1] += anBoard[1][i]) > 15) { errno = EINVAL; return 0; } /* Check for both players having chequers on the same point */ for (i = 0; i < 24; i++) if (anBoard[0][i] && anBoard[1][23 - i]) { errno = EINVAL; return 0; } /* Check for both players on the bar against closed boards */ for (i = 0; i < 6; i++) if (anBoard[0][i] < 2 || anBoard[1][i] < 2) return 1; if (!anBoard[0][24] || !anBoard[1][24]) return 1; errno = EINVAL; return 0; } extern void ClosestLegalPosition(TanBoard anBoard) { unsigned int i, j, ac[2]; /* Limit each player to 15 chequers */ for (i = 0; i < 2; i++) { ac[i] = 15; for (j = 0; j < 25; j++) { if (anBoard[i][j] <= ac[i]) ac[i] -= anBoard[i][j]; else { anBoard[i][j] = ac[i]; ac[i] = 0; } } } /* Forbid both players having a chequer on the same point */ for (i = 0; i < 24; i++) if (anBoard[0][i]) anBoard[1][23 - i] = 0; /* If both players have closed boards, let at least one of them off * the bar */ for (i = 0; i < 6; i++) if (anBoard[0][i] < 2 || anBoard[1][i] < 2) /* open board */ return; if (anBoard[0][24]) anBoard[1][24] = 0; } extern unsigned char Base64(const unsigned char ch) { if (ch >= 'A' && ch <= 'Z') return (unsigned char)(ch - 'A'); if (ch >= 'a' && ch <= 'z') return (unsigned char)(ch - 'a' + 26); if (ch >= '0' && ch <= '9') return (unsigned char)(ch - '0' + 52); if (ch == '+') return 62; if (ch == '/') return 63; return 255; } extern int PositionFromID(TanBoard anBoard, const char *pchEnc) { oldpositionkey key; unsigned char ach[L_POSITIONID + 1], *pch = ach, *puch = key.auch; int i; memset(ach, 0, L_POSITIONID + 1); for (i = 0; i < L_POSITIONID && pchEnc[i]; i++) pch[i] = Base64((unsigned char) pchEnc[i]); for (i = 0; i < 3; i++) { *puch++ = (unsigned char) (pch[0] << 2) | (pch[1] >> 4); *puch++ = (unsigned char) (pch[1] << 4) | (pch[2] >> 2); *puch++ = (unsigned char) (pch[2] << 6) | pch[3]; pch += 4; } *puch = (unsigned char) (pch[0] << 2) | (pch[1] >> 4); oldPositionFromKey(anBoard, &key); return CheckPosition((ConstTanBoard) anBoard); } extern int EqualBoards(const TanBoard anBoard0, const TanBoard anBoard1) { int i; for (i = 0; i < 25; i++) if (anBoard0[0][i] != anBoard1[0][i] || anBoard0[1][i] != anBoard1[1][i]) return 0; return 1; } #define MAX_N 40 #define MAX_R 25 static unsigned int anCombination[MAX_N][MAX_R], fCalculated = 0; static void InitCombination(void) { unsigned int i, j; for (i = 0; i < MAX_N; i++) anCombination[i][0] = i + 1; for (j = 1; j < MAX_R; j++) anCombination[0][j] = 0; for (i = 1; i < MAX_N; i++) for (j = 1; j < MAX_R; j++) anCombination[i][j] = anCombination[i - 1][j - 1] + anCombination[i - 1][j]; fCalculated = 1; } extern unsigned int Combination(const unsigned int n, const unsigned int r) { g_assert(n <= MAX_N && r <= MAX_R); if (!fCalculated) InitCombination(); return anCombination[n - 1][r - 1]; } static unsigned int PositionF(unsigned int fBits, unsigned int n, unsigned int r) { if (n == r) return 0; return (fBits & (1u << (n - 1))) ? Combination(n - 1, r) + PositionF(fBits, n - 1, r - 1) : PositionF(fBits, n - 1, r); } extern unsigned int PositionBearoff(const unsigned int anBoard[], unsigned int nPoints, unsigned int nChequers) { unsigned int i, fBits, j; if (nPoints == 0) { g_assert_not_reached(); return 0; } for (j = nPoints - 1, i = 0; i < nPoints; i++) j += anBoard[i]; fBits = 1u << j; for (i = 0; i < nPoints - 1; i++) { j -= anBoard[i] + 1; fBits |= (1u << j); } return PositionF(fBits, nChequers + nPoints, nPoints); } static unsigned int PositionInv(unsigned int nID, unsigned int n, unsigned int r) { unsigned int nC; if (!r) return 0; else if (n == r) return (1u << n) - 1; nC = Combination(n - 1, r); return (nID >= nC) ? (1u << (n - 1)) | PositionInv(nID - nC, n - 1, r - 1) : PositionInv(nID, n - 1, r); } extern void PositionFromBearoff(unsigned int anBoard[], unsigned int usID, unsigned int nPoints, unsigned int nChequers) { unsigned int fBits = PositionInv(usID, nChequers + nPoints, nPoints); unsigned int i, j; for (i = 0; i < nPoints; i++) anBoard[i] = 0; j = nPoints - 1; for (i = 0; i < (nChequers + nPoints); i++) { if (fBits & (1u << i)) { if (j == 0) break; j--; } else anBoard[j]++; } } extern unsigned short PositionIndex(unsigned int g, const unsigned int anBoard[6]) { unsigned int i, fBits; unsigned int j; if (g == 0) { g_assert_not_reached(); return 0; } j = g - 1; for (i = 0; i < g; i++) j += anBoard[i]; fBits = 1u << j; for (i = 0; i < g - 1; i++) { j -= anBoard[i] + 1; fBits |= (1u << j); } /* FIXME: 15 should be replaced by nChequers, but the function is * only called from bearoffgammon, so this should be fine. */ return (unsigned short) PositionF(fBits, 15, g); } gnubg-1.08.003/format.c000644 001751 000024 00000102735 14574155047 014300 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2003-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: format.c,v 1.69 2022/01/11 21:48:34 plm Exp $ */ #include "config.h" #include "backgammon.h" #include #include #include "eval.h" #include "format.h" #include "export.h" #include "positionid.h" int fOutputMWC = FALSE; int fOutputWinPC = FALSE; int fOutputMatchPC = TRUE; #define OUTPUT_SZ_LENGTH (5 + MAX_OUTPUT_DIGITS) int fOutputDigits = 3; float rErrorRateFactor = 1000.0f; typedef int (*classdumpfunc) (const TanBoard anBoard, char *szOutput, const bgvariation bgv); extern char * OutputRolloutResult(const char *szIndent, char asz[][FORMATEDMOVESIZE], float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS], const cubeinfo aci[], const int alt, const int cci, const int fCubeful) { static char sz[1024]; int ici; strcpy(sz, ""); for (ici = 0; ici < cci; ici++) { /* header */ if (asz && *asz[ici]) { if (szIndent && *szIndent) strcat(sz, szIndent); sprintf(strchr(sz, 0), "%s:\n", asz[ici]); } /* output */ if (szIndent && *szIndent) strcat(sz, szIndent); strcat(sz, " "); strcat(sz, OutputPercents(aarOutput[ici], TRUE)); strcat(sz, " "); strcat(sz, _("CL")); strcat(sz, " "); strcat(sz, OutputEquityScale(aarOutput[ici][OUTPUT_EQUITY], &aci[alt + ici], &aci[0], TRUE)); if (fCubeful) { strcat(sz, " "); strcat(sz, _("CF")); strcat(sz, " "); strcat(sz, OutputMWC(aarOutput[ici][OUTPUT_CUBEFUL_EQUITY], &aci[0], TRUE)); } strcat(sz, "\n"); /* std dev */ if (szIndent && *szIndent) strcat(sz, szIndent); strcat(sz, " ["); strcat(sz, OutputPercents(aarStdDev[ici], FALSE)); strcat(sz, " "); strcat(sz, _("CL")); strcat(sz, " "); strcat(sz, OutputEquityScale(aarStdDev[ici][OUTPUT_EQUITY], &aci[alt + ici], &aci[0], FALSE)); if (fCubeful) { strcat(sz, " "); strcat(sz, _("CF")); strcat(sz, " "); strcat(sz, OutputMWC(aarStdDev[ici][OUTPUT_CUBEFUL_EQUITY], &aci[0], FALSE)); } strcat(sz, "]\n"); } return sz; } extern char * OutputEvalContext(const evalcontext * pec, const int fChequer) { static char sz[1024]; int i; sprintf(sz, "%u-%s %s", pec->nPlies, _("ply"), (!fChequer || pec->fCubeful) ? _("cubeful") : _("cubeless")); if (pec->fUsePrune) { sprintf(strchr(sz, 0), " %s", _("prune")); } if (fChequer && pec->nPlies) { /* FIXME: movefilters!!! */ } if (pec->rNoise > 0.0f) sprintf(strchr(sz, 0), ", %s %0.3g (%s)", _("noise"), pec->rNoise, pec->fDeterministic ? _("d") : _("nd")); for (i = 0; i < NUM_SETTINGS; i++) if (!cmp_evalcontext(&aecSettings[i], pec)) { sprintf(strchr(sz, 0), " [%s]", Q_(aszSettings[i])); break; } return sz; } /* return -1 if this isn't a predefined setting * n = index of predefined setting if it's a match or * if the eval context matches and it's 0 ply */ static int GetPredefinedChequerplaySetting(const evalcontext * pec, const movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]) { int nEval; int nFilter; int nPlies = pec->nPlies; int i; int fSame; int nPreset; int Accept; if (nPlies > MAX_FILTER_PLIES) { return -1; } for (nEval = 0; nEval < NUM_SETTINGS; ++nEval) { if (cmp_evalcontext(aecSettings + nEval, pec) == 0) { /* eval matches and it's 0 ply, we have a predefined one */ if (nPlies == 0) return nEval; /* see if there's a filter set which matches and uses the * same eval context (world class and supremo use the same * eval context and different filters) */ for (nFilter = 0; nFilter < NUM_SETTINGS; ++nFilter) { /* see what filter set goes with the predefined settings */ if ((nPreset = aiSettingsMoveFilter[nFilter]) < 0) continue; /* nPreset = 0/tiny, 1/normal, 2/large, 3/huge */ fSame = 1; for (i = 0; i < nPlies - 1; ++i) { if ((Accept = aamf[nPlies - 1][i].Accept) != aaamfMoveFilterSettings[nPreset][nPlies - 1][i].Accept) { fSame = 0; break; } /* if they are both ignore this level, don't check * the extra and threshold */ if (Accept < 0) continue; if (aamf[nPlies - 1][i].Extra != aaamfMoveFilterSettings[nPreset][nPlies - 1][i].Extra) { fSame = 0; break; } if (fabs(aamf[nPlies - 1][i].Threshold - aaamfMoveFilterSettings[nPreset][nPlies - 1][i].Threshold) > 0.1e-6) { fSame = 0; break; } } /* the filters match (for this nPlies, so we may have a * preset */ if (fSame && (nFilter == nEval)) return nEval; } } } return -1; } static char * OutputMoveFilterPly(const char *szIndent, const int nPlies, const movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]) { static char sz[1024]; int i; strcpy(sz, ""); if (!nPlies) return sz; for (i = 0; i < nPlies; ++i) { const movefilter *pmf = &aamf[nPlies - 1][i]; if (szIndent && *szIndent) strcat(sz, szIndent); if (pmf->Accept < 0) { sprintf(strchr(sz, 0), _("Skip pruning for %d-ply moves."), i); strcat(sz, "\n"); continue; } if (pmf->Accept == 1) sprintf(strchr(sz, 0), _("keep the best %d-ply move"), i); else sprintf(strchr(sz, 0), _("keep the first %d %d-ply moves"), pmf->Accept, i); if (pmf->Extra) sprintf(strchr(sz, 0), _(" and up to %d more moves within equity %0.3g"), pmf->Extra, pmf->Threshold); strcat(sz, "\n"); } return sz; } static void OutputEvalContextsForRollout(char *sz, const char *szIndent, const evalcontext aecCube[2], const evalcontext aecChequer[2], const movefilter aaamf[2][MAX_FILTER_PLIES][MAX_FILTER_PLIES]) { int fCube = !cmp_evalcontext(&aecCube[0], &aecCube[1]); int fChequer = !cmp_evalcontext(&aecChequer[0], &aecChequer[1]); int fMovefilter = fChequer && (!aecChequer[0].nPlies || equal_movefilter(aecChequer[0].nPlies - 1, aaamf[0][aecChequer[0].nPlies - 1], aaamf[1][aecChequer[0].nPlies - 1])); int fIdentical = fCube && fChequer && fMovefilter; int i; for (i = 0; i < 1 + !fIdentical; i++) { int j; if (!fIdentical) { if (szIndent && *szIndent) strcat(sz, szIndent); sprintf(strchr(sz, 0), "%s %d:\n", _("Player"), i); } /* chequer play */ j = GetPredefinedChequerplaySetting(&aecChequer[i], aaamf[i]); if (szIndent && *szIndent) strcat(sz, szIndent); if (aecChequer[i].nPlies) { sprintf(strchr(sz, 0), "%s: %s ", _("Play"), (j < 0) ? "" : Q_(aszSettings[j])); strcat(sz, OutputEvalContext(&aecChequer[i], TRUE)); strcat(sz, "\n"); strcat(sz, OutputMoveFilterPly(szIndent, aecChequer[i].nPlies, aaamf[i])); } else { sprintf(strchr(sz, 0), "%s: ", _("Play")); strcat(sz, OutputEvalContext(&aecChequer[i], FALSE)); strcat(sz, "\n"); } if (szIndent && *szIndent) strcat(sz, szIndent); sprintf(strchr(sz, 0), "%s: ", _("Cube")); strcat(sz, OutputEvalContext(&aecCube[i], FALSE)); strcat(sz, "\n"); } } extern char * OutputRolloutContext(const char *szIndent, const rolloutcontext * prc) { static char sz[1024]; strcpy(sz, ""); if (szIndent && *szIndent) strcat(sz, szIndent); if (prc->nTruncate && prc->fDoTruncate) sprintf(strchr(sz, 0), prc->fCubeful ? _("Truncated cubeful rollout (depth %d)") : _("Truncated cubeless rollout (depth %d)"), prc->nTruncate); else sprintf(strchr(sz, 0), prc->fCubeful ? _("Full cubeful rollout") : _("Full cubeless rollout")); if (prc->fTruncBearoffOS && !prc->fCubeful) sprintf(strchr(sz, 0), " (%s)", _("truncated at one-sided bearoff")); else if (prc->fTruncBearoff2 && !prc->fCubeful) sprintf(strchr(sz, 0), " (%s)", _("truncated at exact bearoff")); sprintf(strchr(sz, 0), " %s", prc->fVarRedn ? _("with variance reduction") : _("without variance reduction")); strcat(sz, "\n"); if (szIndent && *szIndent) strcat(sz, szIndent); sprintf(strchr(sz, 0), _("%u games"), prc->nGamesDone); if (prc->fInitial) { strcat(sz, ", "); strcat(sz, _("rollout as initial position")); } strcat(sz, ", "); if (prc->fRotate) sprintf(strchr(sz, 0), _("%s dice gen. with seed %lu and quasi-random dice"), gettext(aszRNG[prc->rngRollout]), prc->nSeed); /* seed may be unsigned long int */ else sprintf(strchr(sz, 0), _("%s dice generator with seed %lu"), gettext(aszRNG[prc->rngRollout]), prc->nSeed); /* seed may be unsigned long int */ strcat(sz, "\n"); if ((prc->fStopOnJsd || prc->fStopOnSTD) && szIndent && *szIndent) strcat(sz, szIndent); /* stop on std.err */ if (prc->fStopOnSTD && !prc->fStopOnJsd) { sprintf(strchr(sz, 0), _("Stop when std.errs. are small enough: limit " "%.4f (min. %u games)"), prc->rStdLimit, prc->nMinimumGames); strcat(sz, "\n"); } /* stop on JSD */ if (prc->fStopOnJsd) { sprintf(strchr(sz, 0), _("Stop when best play is enough JSDs ahead: limit " "%.4f (min. %u games)"), prc->rJsdLimit, prc->nMinimumJsdGames); strcat(sz, "\n"); } /* first play */ OutputEvalContextsForRollout(sz, szIndent, prc->aecCube, prc->aecChequer, prc->aaamfChequer); /* later play */ if (prc->fLateEvals) { if (szIndent && *szIndent) strcat(sz, szIndent); sprintf(strchr(sz, 0), _("Different evaluations after %d plies:"), prc->nLate); strcat(sz, "\n"); OutputEvalContextsForRollout(sz, szIndent, prc->aecCubeLate, prc->aecChequerLate, prc->aaamfLate); } return sz; } /* * Return formatted string with equity or MWC. * * Input: * r: equity (either money equity for normalised money eq. for match play * pci: cubeinfo * f: indicates equity (TRUE) or std. error (FALSE) * * * Important: function is not re-entrant. Caller must save output * if needed. */ extern char * OutputEquity(const float r, const cubeinfo * pci, const int f) { static char sz[OUTPUT_SZ_LENGTH]; if (!pci->nMatchTo || !fOutputMWC) { if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, r); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 2, fOutputDigits, r); } else { if (fOutputMatchPC) { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f%%", fOutputDigits + 3, fOutputDigits > 1 ? fOutputDigits - 1 : 0, 100.0f * (f ? eq2mwc(r, pci) : se_eq2mwc(r, pci))); } else { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f", fOutputDigits + 3, fOutputDigits + 1, f ? eq2mwc(r, pci) : se_eq2mwc(r, pci)); } } return sz; } extern char * OutputMoneyEquity(const float ar[], const int f) { static char sz[OUTPUT_SZ_LENGTH]; float eq = 2.0f * ar[OUTPUT_WIN] - 1.0f + ar[OUTPUT_WINGAMMON] + ar[OUTPUT_WINBACKGAMMON] - ar[OUTPUT_LOSEGAMMON] - ar[OUTPUT_LOSEBACKGAMMON]; if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, eq); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 2, fOutputDigits, eq); return sz; } /* * Return formatted string with equity or MWC. * * Input: * r: equity (either money equity for normalised money eq. for match play * pci: cubeinfo * f: indicates equity (TRUE) or std. error (FALSE) * * * Important: function is not re-entrant. Caller must save output * if needed. */ extern char * OutputEquityScale(const float r, const cubeinfo * pci, const cubeinfo * pciBase, const int f) { static char sz[OUTPUT_SZ_LENGTH]; if (!pci->nMatchTo) { if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, (float) (pci->nCube / pciBase->nCube) * r); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 2, fOutputDigits, (float) (pci->nCube / pciBase->nCube) * r); } else { if (fOutputMWC) { if (fOutputMatchPC) { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f%%", fOutputDigits + 3, fOutputDigits > 1 ? fOutputDigits - 1 : 0, 100.0f * (f ? eq2mwc(r, pci) : se_eq2mwc(r, pci))); } else { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f", fOutputDigits + 3, fOutputDigits + 1, f ? eq2mwc(r, pci) : se_eq2mwc(r, pci)); } } else { if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, mwc2eq(eq2mwc(r, pci), pciBase)); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 2, fOutputDigits, se_mwc2eq(se_eq2mwc(r, pci), pciBase)); } } return sz; } /* * Return formatted string with equity or MWC for an equity difference. * * Input: * r1, r2: equities (either money equity for normalised money eq. for match play * pci: cubeinfo * * Important: function is not re-entrant. Caller must save output * if needed. */ extern char * OutputEquityDiff(const float r1, const float r2, const cubeinfo * pci) { static char sz[OUTPUT_SZ_LENGTH]; if (fOutputDigits > MAX_OUTPUT_DIGITS) { g_assert_not_reached(); return NULL; } /* If the difference is 0, print it as -0 in the right format. * Using IEEE754 negative zero is tricky and would not work * if compiled with -ffast-math (which we tend to do for performance * reasons). Make a special case and print the minus sign explicitely. */ if (!pci->nMatchTo || !fOutputMWC) { if (r1 == r2) snprintf(sz, OUTPUT_SZ_LENGTH, "-%*.*f", fOutputDigits + 2, fOutputDigits, 0.0); else snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, r1 - r2); } else { if (fOutputMatchPC) { if (r1 == r2) snprintf(sz, OUTPUT_SZ_LENGTH, " -%*.*f%%", fOutputDigits + 1, fOutputDigits > 1 ? fOutputDigits - 1 : 0, 0.0); else snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f%%", fOutputDigits + 3, fOutputDigits > 1 ? fOutputDigits - 1 : 0, 100.0f * eq2mwc(r1, pci) - 100.0f * eq2mwc(r2, pci)); } else { if (r1 == r2) snprintf(sz, OUTPUT_SZ_LENGTH, "-%*.*f", fOutputDigits + 2, fOutputDigits + 1, 0.0); else snprintf(sz, OUTPUT_SZ_LENGTH, "+%*.*f", fOutputDigits + 3, fOutputDigits + 1, eq2mwc(r1, pci) - eq2mwc(r2, pci)); } } return sz; } /* * Return formatted string with equity or MWC. * * Input is: equity for money game/MWC for match play. * * Important: function is not re-entrant. Caller must save output * if needed. */ extern char * OutputMWC(const float r, const cubeinfo * pci, const int f) { static char sz[OUTPUT_SZ_LENGTH]; if (!pci->nMatchTo) { if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, r); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 2, fOutputDigits, r); } else { if (!fOutputMWC) { if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits, mwc2eq(r, pci)); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 3, fOutputDigits, se_mwc2eq(r, pci)); } else if (fOutputMatchPC) { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f%%", fOutputDigits + 3, fOutputDigits > 1 ? fOutputDigits - 1 : 0, 100.0f * r); } else { if (f) snprintf(sz, OUTPUT_SZ_LENGTH, "%+*.*f", fOutputDigits + 3, fOutputDigits + 1, r); else snprintf(sz, OUTPUT_SZ_LENGTH, "% *.*f", fOutputDigits + 3, fOutputDigits + 1, r); } } return sz; } extern char * OutputPercent(const float r) { static char sz[OUTPUT_SZ_LENGTH]; if (fOutputWinPC) { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f", fOutputDigits + 2, fOutputDigits > 2 ? fOutputDigits - 2 : 0, 100.0f * r); } else { snprintf(sz, OUTPUT_SZ_LENGTH, "%*.*f", fOutputDigits + 2, fOutputDigits, r); } return sz; } extern char * OutputPercents(const float ar[], const int f) { static char sz[80]; strcpy(sz, ""); strcat(sz, OutputPercent(ar[OUTPUT_WIN])); strcat(sz, " "); strcat(sz, OutputPercent(ar[OUTPUT_WINGAMMON])); strcat(sz, " "); strcat(sz, OutputPercent(ar[OUTPUT_WINBACKGAMMON])); strcat(sz, " - "); if (f) strcat(sz, OutputPercent(1.0f - ar[OUTPUT_WIN])); else strcat(sz, OutputPercent(ar[OUTPUT_WIN])); strcat(sz, " "); strcat(sz, OutputPercent(ar[OUTPUT_LOSEGAMMON])); strcat(sz, " "); strcat(sz, OutputPercent(ar[OUTPUT_LOSEBACKGAMMON])); return sz; } /* * Print cube analysis * * Input: * pf: output file * arDouble: equitites for cube decisions * fPlayer: player who doubled * esDouble: eval setup * pci: cubeinfo * fDouble: double/no double * fTake: take/drop * */ extern char * OutputCubeAnalysisFull(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], const evalsetup * pes, const cubeinfo * pci, int fDouble, int fTake, skilltype stDouble, skilltype stTake) { float r; int fMissed; int fAnno = FALSE; float arDouble[4]; static char sz[4096]; strcpy(sz, ""); /* check if cube analysis should be printed */ if (pes->et == EVAL_NONE) return NULL; /* no evaluation */ FindCubeDecision(arDouble, aarOutput, pci); /* print alerts */ fMissed = fDouble > -1 && isMissedDouble(arDouble, aarOutput, fDouble, pci); /* print alerts */ if (fMissed) { fAnno = TRUE; /* missed double */ sprintf(strchr(sz, 0), "%s (%s)!\n", _("Alert: missed double"), OutputEquityDiff(arDouble[OUTPUT_NODOUBLE], (arDouble[OUTPUT_TAKE] > arDouble[OUTPUT_DROP]) ? arDouble[OUTPUT_DROP] : arDouble[OUTPUT_TAKE], pci)); if (badSkill(stDouble)) sprintf(strchr(sz, 0), " [%s]", gettext(aszSkillType[stDouble])); } r = arDouble[OUTPUT_TAKE] - arDouble[OUTPUT_DROP]; if (fTake > 0 && r > 0.0f) { fAnno = TRUE; /* wrong take */ sprintf(strchr(sz, 0), "%s (%s)!\n", _("Alert: wrong take"), OutputEquityDiff(arDouble[OUTPUT_DROP], arDouble[OUTPUT_TAKE], pci)); if (badSkill(stTake)) sprintf(strchr(sz, 0), " [%s]", gettext(aszSkillType[stTake])); } r = arDouble[OUTPUT_DROP] - arDouble[OUTPUT_TAKE]; if (fDouble > 0 && !fTake && r > 0.0f) { fAnno = TRUE; /* wrong pass */ sprintf(strchr(sz, 0), "%s (%s)!\n", _("Alert: wrong pass"), OutputEquityDiff(arDouble[OUTPUT_TAKE], arDouble[OUTPUT_DROP], pci)); if (badSkill(stTake)) sprintf(strchr(sz, 0), " [%s]", gettext(aszSkillType[stTake])); } if (arDouble[OUTPUT_TAKE] > arDouble[OUTPUT_DROP]) r = arDouble[OUTPUT_NODOUBLE] - arDouble[OUTPUT_DROP]; else r = arDouble[OUTPUT_NODOUBLE] - arDouble[OUTPUT_TAKE]; if (fDouble > 0 && fTake < 0 && r > 0.0f) { fAnno = TRUE; /* wrong double */ sprintf(strchr(sz, 0), "%s (%s)!\n", _("Alert: wrong double"), OutputEquityDiff((arDouble[OUTPUT_TAKE] > arDouble[OUTPUT_DROP]) ? arDouble[OUTPUT_DROP] : arDouble[OUTPUT_TAKE], arDouble[OUTPUT_NODOUBLE], pci)); if (badSkill(stDouble)) sprintf(strchr(sz, 0), " [%s]", gettext(aszSkillType[stDouble])); } if ((badSkill(stDouble) || badSkill(stTake)) && !fAnno) { if (badSkill(stDouble)) { sprintf(strchr(sz, 0), _("Alert: double decision marked %s"), gettext(aszSkillType[stDouble])); strcat(sz, "\n"); } if (badSkill(stTake)) { sprintf(strchr(sz, 0), _("Alert: take decision marked %s"), gettext(aszSkillType[stTake])); strcat(sz, "\n"); } } strcat(sz, OutputCubeAnalysis(aarOutput, aarStdDev, pes, pci, fTake)); return sz; } extern char * OutputCubeAnalysis(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], const evalsetup * pes, const cubeinfo * pci, int fTake) { static char sz[4096]; int i; float arDouble[4]; const char *aszCube[] = { NULL, N_("No double"), N_("Double, take"), N_("Double, pass") }; int ai[3]; cubedecision cd; float r; FindCubeDecision(arDouble, aarOutput, pci); /* header */ sprintf(sz, "\n%s\n", _("Cube analysis")); /* ply & cubeless equity */ switch (pes->et) { case EVAL_NONE: strcat(sz, _("n/a")); break; case EVAL_EVAL: sprintf(strchr(sz, 0), "%u-%s", pes->ec.nPlies, _("ply")); break; case EVAL_ROLLOUT: strcat(sz, _("Rollout")); break; } if (fTake >= 0) { /* take or drop */ InvertEvaluationR(aarOutput[0], pci); InvertEvaluationR(aarOutput[1], pci); if (pes->et == EVAL_ROLLOUT) { InvertStdDev(aarStdDev[0]); InvertStdDev(aarStdDev[1]); } } if (pci->nMatchTo) sprintf(strchr(sz, 0), " %s %s (%s: %s)\n", fOutputMWC ? _("cubeless MWC") : _("cubeless equity"), OutputEquity(aarOutput[0][OUTPUT_EQUITY], pci, TRUE), _("Money"), OutputMoneyEquity(aarOutput[0], TRUE)); else sprintf(strchr(sz, 0), " %s %s\n", _("cubeless equity"), OutputMoneyEquity(aarOutput[0], TRUE)); /* Output percentags for evaluations */ if (exsExport.fCubeDetailProb && pes->et == EVAL_EVAL) { strcat(sz, " "); strcat(sz, OutputPercents(aarOutput[0], TRUE)); } strcat(sz, "\n"); /* equities */ strcat(sz, _("Cubeful equities")); strcat(sz, ":\n"); if (pes->et == EVAL_EVAL && exsExport.afCubeParameters[0]) { strcat(sz, " "); strcat(sz, OutputEvalContext(&pes->ec, FALSE)); strcat(sz, "\n"); } getCubeDecisionOrdering(ai, arDouble, aarOutput, pci); for (i = 0; i < 3; i++) { sprintf(strchr(sz, 0), "%d. %-20s", i + 1, gettext(aszCube[ai[i]])); if (fTake == -1) { /* double */ strcat(sz, OutputEquity(arDouble[ai[i]], pci, TRUE)); if (i) sprintf(strchr(sz, 0), " (%s)", OutputEquityDiff(arDouble[ai[i]], arDouble[OUTPUT_OPTIMAL], pci)); } else { /* take or drop */ strcat(sz, OutputEquity(-arDouble[ai[i]], pci, TRUE)); if (i) sprintf(strchr(sz, 0), " (%s)", OutputEquityDiff(-arDouble[ai[i]], -arDouble[OUTPUT_OPTIMAL], pci)); } strcat(sz, "\n"); } /* cube decision */ cd = FindBestCubeDecision(arDouble, aarOutput, pci); sprintf(strchr(sz, 0), "%s: %s", _("Proper cube action"), GetCubeRecommendation(cd)); if ((r = getPercent(cd, arDouble)) >= 0.0f) sprintf(strchr(sz, 0), " (%.1f%%)", 100.0f * r); strcat(sz, "\n"); /* dump rollout */ if (pes->et == EVAL_ROLLOUT && exsExport.fCubeDetailProb) { char asz[2][FORMATEDMOVESIZE]; cubeinfo aci[2]; for (i = 0; i < 2; i++) { memcpy(&aci[i], pci, sizeof(cubeinfo)); if (i) { aci[i].fCubeOwner = !pci->fMove; aci[i].nCube *= 2; } FormatCubePosition(asz[i], &aci[i]); } sprintf(strchr(sz, 0), "\n%s:\n", _("Rollout details")); strcat(strchr(sz, 0), OutputRolloutResult(NULL, asz, aarOutput, aarStdDev, aci, 0, 2, pes->rc.fCubeful)); } if (fTake >= 0) { /* take or drop */ InvertEvaluationR(aarOutput[0], pci); InvertEvaluationR(aarOutput[1], pci); if (pes->et == EVAL_ROLLOUT) { InvertStdDev(aarStdDev[0]); InvertStdDev(aarStdDev[1]); } } if (pes->et == EVAL_ROLLOUT && exsExport.afCubeParameters[1]) strcat(strchr(sz, 0), OutputRolloutContext(NULL, &pes->rc)); return sz; } extern void FormatCubePositions(const cubeinfo * pci, char asz[2][FORMATEDMOVESIZE]) { cubeinfo aci[2]; SetCubeInfo(&aci[0], pci->nCube, pci->fCubeOwner, pci->fMove, pci->nMatchTo, pci->anScore, pci->fCrawford, pci->fJacoby, pci->fBeavers, pci->bgv); FormatCubePosition(asz[0], &aci[0]); SetCubeInfo(&aci[1], 2 * pci->nCube, !pci->fMove, pci->fMove, pci->nMatchTo, pci->anScore, pci->fCrawford, pci->fJacoby, pci->fBeavers, pci->bgv); FormatCubePosition(asz[1], &aci[1]); } extern char * FormatCubePosition(char *sz, cubeinfo * pci) { /* FIXME: functions showing rollout progress can call either * FormatMove() from drawboard.c where we know that sz is * shorter than FORMATEDMOVESIZE, or this one. Moreover they * depend on it to be this short. * Truncate the result if necessary to avoid crashes with long * player names or some translations. Remove the initial * "Player " to save a few characters. */ if (pci->fCubeOwner == -1) snprintf(sz, FORMATEDMOVESIZE, _("Centered %d-cube"), pci->nCube); else snprintf(sz, FORMATEDMOVESIZE, _("%s owns %d-cube"), ap[pci->fCubeOwner].szName, pci->nCube); return sz; } static int DumpOver(const TanBoard anBoard, char *pchOutput, const bgvariation bgv) { float ar[NUM_OUTPUTS] = { 0, 0, 0, 0, 0 }; /* NUM_OUTPUTS is 5 */ if (EvalOver(anBoard, ar, bgv, NULL)) return -1; if (ar[OUTPUT_WIN] > 0.0f) strcpy(pchOutput, _("Win")); else strcpy(pchOutput, _("Loss")); strcat(pchOutput, " "); if (ar[OUTPUT_WINBACKGAMMON] > 0.0f || ar[OUTPUT_LOSEBACKGAMMON] > 0.0f) sprintf(pchOutput, "(%s)\n", _("backgammon")); else if (ar[OUTPUT_WINGAMMON] > 0.0f || ar[OUTPUT_LOSEGAMMON] > 0.0f) sprintf(pchOutput, "(%s)\n", _("gammon")); else sprintf(pchOutput, "(%s)\n", _("single")); return 0; } static int DumpBearoff1(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(pbc1); return BearoffDump(pbc1, anBoard, szOutput); } static int DumpBearoff2(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(pbc2); if (BearoffDump(pbc2, anBoard, szOutput)) return -1; if (pbc1) if (BearoffDump(pbc1, anBoard, szOutput)) return -1; return 0; } static int DumpBearoffOS(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(pbcOS); return BearoffDump(pbcOS, anBoard, szOutput); } static int DumpBearoffTS(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(pbcTS); return BearoffDump(pbcTS, anBoard, szOutput); } static int DumpRace(const TanBoard UNUSED(anBoard), char *UNUSED(szOutput), const bgvariation UNUSED(bgv)) { /* no-op -- nothing much we can say, really (pip count?) */ return 0; } static void DumpAnyContact(const TanBoard UNUSED(anBoard), char *UNUSED(szOutput), const bgvariation UNUSED(bgv), int UNUSED(isCrashed)) { return; } static int DumpContact(const TanBoard anBoard, char *szOutput, const bgvariation bgv) { DumpAnyContact(anBoard, szOutput, bgv, 0); return 0; } static int DumpCrashed(const TanBoard anBoard, char *szOutput, const bgvariation bgv) { DumpAnyContact(anBoard, szOutput, bgv, 1); return 0; } static int DumpHypergammon1(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(apbcHyper[0]); return BearoffDump(apbcHyper[0], anBoard, szOutput); } static int DumpHypergammon2(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(apbcHyper[1]); return BearoffDump(apbcHyper[1], anBoard, szOutput); } static int DumpHypergammon3(const TanBoard anBoard, char *szOutput, const bgvariation UNUSED(bgv)) { g_assert(apbcHyper[2]); return BearoffDump(apbcHyper[2], anBoard, szOutput); } static classdumpfunc acdf[N_CLASSES] = { DumpOver, DumpHypergammon1, DumpHypergammon2, DumpHypergammon3, DumpBearoff2, DumpBearoffTS, DumpBearoff1, DumpBearoffOS, DumpRace, DumpCrashed, DumpContact }; extern int DumpPosition(const TanBoard anBoard, char *szOutput, const evalcontext * pec, cubeinfo * pci, int fOutputMWC, int UNUSED(fOutputWinPC), int fOutputInvert, const char *szMatchID) { float aarOutput[2][NUM_ROLLOUT_OUTPUTS]; positionclass pc = ClassifyPosition(anBoard, pci->bgv); int i, nPlies; int j; evalcontext ec; static const char *aszEvaluator[] = { N_("Over"), N_("Hypergammon-1"), N_("Hypergammon-2"), N_("Hypergammon-3"), N_("Bearoff2"), N_("Bearoff-TS"), N_("Bearoff1"), N_("Bearoff-OS"), N_("Race"), N_("Crashed"), N_("Contact") }; strcpy(szOutput, ""); sprintf(strchr(szOutput, 0), "%s:\t", _("Position ID")); strcat(szOutput, PositionID(anBoard)); strcat(szOutput, "\n"); if (szMatchID) { sprintf(strchr(szOutput, 0), "%s:\t", _("Match ID")); strcat(szOutput, szMatchID); strcat(szOutput, "\n"); } strcat(szOutput, "\n"); sprintf(strchr(szOutput, 0), "%s: \t", _("Evaluator")); strcat(szOutput, gettext(aszEvaluator[pc])); strcat(szOutput, "\n\n"); acdf[pc] (anBoard, strchr(szOutput, 0), pci->bgv); szOutput = strchr(szOutput, 0); sprintf(strchr(szOutput, 0), "\n" " %-7s %-7s %-7s %-7s %-7s %-9s %-9s\n", _("Win"), _("W(g)"), _("W(bg)"), _("L(g)"), _("L(bg)"), (!pci->nMatchTo || !fOutputMWC) ? _("Equity") : _("MWC"), _("Cubeful")); nPlies = pec->nPlies > 9 ? 9 : pec->nPlies; memcpy(&ec, pec, sizeof(evalcontext)); for (i = 0; i <= nPlies; i++) { szOutput = strchr(szOutput, 0); ec.nPlies = i; if (GeneralCubeDecisionE(aarOutput, anBoard, pci, &ec, 0) < 0) return -1; if (!i) strcpy(szOutput, _("static")); else sprintf(szOutput, "%2d %s", i, _("ply")); szOutput = strchr(szOutput, 0); if (fOutputInvert) { InvertEvaluationR(aarOutput[0], pci); InvertEvaluationR(aarOutput[1], pci); pci->fMove = !pci->fMove; } /* Print %'s and equities */ strcat(szOutput, ": "); for (j = 0; j < 5; ++j) { sprintf(strchr(szOutput, 0), "%-7s ", OutputPercent(aarOutput[0][j])); } if (pci->nMatchTo) sprintf(strchr(szOutput, 0), "%-9s ", OutputEquity(Utility(aarOutput[0], pci), pci, TRUE)); else sprintf(strchr(szOutput, 0), "%-9s ", OutputMoneyEquity(aarOutput[0], TRUE)); sprintf(strchr(szOutput, 0), "%-9s ", OutputMWC(aarOutput[0][6], pci, TRUE)); strcat(szOutput, "\n"); if (fOutputInvert) { pci->fMove = !pci->fMove; } } /* if cube is available, output cube action */ if (GetDPEq(NULL, NULL, pci)) { evalsetup es; es.et = EVAL_EVAL; es.ec = *pec; strcat(szOutput, "\n\n"); strcat(szOutput, OutputCubeAnalysis(aarOutput, NULL, &es, pci, -1)); } return 0; } gnubg-1.08.003/render.h000644 001751 000024 00000021632 14574155047 014270 0ustar00pmstaff000000 000000 /* * Copyright (C) 1997-2002 Gary Wong * Copyright (C) 2003-2020 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: render.h,v 1.44 2020/05/26 19:55:54 plm Exp $ */ #ifndef RENDER_H #define RENDER_H #include "gnubg-types.h" #if defined(USE_BOARD3D) #include "board3d/types3d.h" #endif typedef enum { WOOD_ALDER, WOOD_ASH, WOOD_BASSWOOD, WOOD_BEECH, WOOD_CEDAR, WOOD_EBONY, WOOD_FIR, WOOD_MAPLE, WOOD_OAK, WOOD_PINE, WOOD_REDWOOD, WOOD_WALNUT, WOOD_WILLOW, WOOD_PAINT } woodtype; typedef struct { woodtype wt; float aarColour[2][4]; /* RGBA for each player */ float aarDiceColour[2][4]; /* RGB(A) of dice for each player */ int afDieColour[2]; /* TRUE means same colour as chequers */ float aarDiceDotColour[2][4]; /* RGB(A) of dice dot for each player */ float arCubeColour[4]; /* RGB(A) of cube */ unsigned char aanBoardColour[4][4]; /* RGB(A) backgr., border, pts */ int aSpeckle[4]; /* speckle for background, border, pts */ float arRefraction[2], arCoefficient[2], arExponent[2]; /* Phong parameters for chequers */ float arDiceCoefficient[2], arDiceExponent[2]; /* Phong parameters */ float arLight[3]; /* XYZ light vector */ float rRound; /* shape of chequers */ unsigned int nSize; /* basic unit of board size, in pixels -- a chequer's * diameter is 6 of these units (and is 2 units thick). * The board is 108x82(old:72) units, the dice 7x7 and cube 8x8. */ int fHinges; /* TRUE if hinges should be drawn */ int fLabels; /* TRUE if point numbers should be drawn */ int fClockwise; /* orientation for board point numbers */ int fDiceArea; /* Show dice below board */ int fShowGameInfo; int fDynamicLabels; /* TRUE if the point numbers are dynamic, i.e., * they adjust depending on the player on roll */ int showMoveIndicator; #if defined(USE_BOARD3D) displaytype fDisplayType; /* 2d or 3d display */ int fHinges3d; /* TRUE if hinges should be drawn */ int showShadows; /* Show 3d shadows */ int shadowDarkness; /* How dark are shadows */ float dimness; /* Darnkess as percentage of ambient light */ int animateRoll; /* Animate dice rolls */ int animateFlag; /* Animate resignation flag */ unsigned int curveAccuracy; /* Round curve approximation accuracy */ lighttype lightType; /* Positional/Directional light source */ float lightPos[3]; /* x,y,z pos of light source */ int lightLevels[3]; /* amibient/diffuse/specular light levels */ float boardAngle; /* Angle board is tilted at */ float skewFactor; /* FOV adjustment */ int planView; /* Ortho view? */ float diceSize; /* How big are the dice */ int roundedEdges; /* Rounded board edges? */ int bgInTrays; /* Rounded board edges? */ int roundedPoints; /* Rounded points */ PieceType pieceType; /* Different piece models */ PieceTextureType pieceTextureType; /* Different piece texture types */ int afDieColour3d[2]; /* TRUE means same colour as chequers */ int acrossCheq, downCheq; /* Split main board up to improve rendering */ Material ChequerMat[2]; /* Chequer colours */ Material DiceMat[2], DiceDotMat[2]; Material CubeMat, CubeNumberMat; Material BaseMat, PointMat[2]; Material BoxMat, HingeMat; Material PointNumberMat; Material BackGroundMat; #endif } renderdata; typedef struct { unsigned char *ach, *achChequer[2], *achChequerLabels, *achDice[2], *achPip[2], *achCube, *achCubeFaces; unsigned char *achResign; unsigned char *achResignFaces; unsigned short *asRefract[2]; unsigned char *auchArrow[2]; unsigned char *achLabels[2]; } renderimages; extern void GrayScaleColC(unsigned char *pCols); extern int showingGray; extern void RenderInitialise(void); extern void RenderFinalise(void); extern int PreferenceCompare(renderdata * prd1, renderdata * prd2); extern void CopyArea(unsigned char *puchDest, int nDestStride, unsigned char *puchSrc, int nSrcStride, int cx, int cy); extern void CopyAreaRotateClip(unsigned char *puchDest, int nDestStride, int xDest, int yDest, int cxDest, int cyDest, unsigned char *puchSrc, int nSrcStride, int xSrc, int ySrc, int cx, int cy, int nTheta); /* Changed from AlphaBlend as name clashes in windows */ extern void AlphaBlendBase(unsigned char *puchDest, int nDestStride, unsigned char *puchBack, int nBackStride, unsigned char *puchFore, int nForeStride, int cx, int cy); extern void AlphaBlendClip(unsigned char *puchDest, int nDestStride, int xDest, int yDest, int cxDest, int cyDest, unsigned char *puchBack, int nBackStride, int xBack, int yBack, unsigned char *puchFore, int nForeStride, int xFore, int yFore, int cx, int cy); extern void RefractBlend(unsigned char *puchDest, int nDestStride, unsigned char *puchBack, int nBackStride, unsigned char *puchFore, int nForeStride, unsigned short *psRefract, int nRefractStride, int cx, int cy); extern void RefractBlendClip(unsigned char *puchDest, int nDestStride, int xDest, int yDest, int cxDest, int cyDest, unsigned char *puchBack, int nBackStride, int xBack, int yBack, unsigned char *puchFore, int nForeStride, int xFore, int yFore, unsigned short *psRefract, int nRefractStride, int cx, int cy); extern void AlphaBlendClip2(unsigned char *puchDest, int nDestStride, int xDest, int yDest, int cxDest, int cyDest, unsigned char *puchBack, int nBackStride, int xBack, int yBack, unsigned char *puchFore, int nForeStride, int xFore, int yFore, int cx, int cy); extern void RenderBoard(renderdata * prd, unsigned char *puch, int nStride); extern void RenderChequers(renderdata * prd, unsigned char *puch0, unsigned char *puch1, unsigned short *psRefract0, unsigned short *psRefract1, int nStride); extern void RenderChequerLabels(renderdata * prd, unsigned char *puch, int nStride); extern void RenderCube(renderdata * prd, unsigned char *puch, int nStride); extern void RenderCubeFaces(renderdata * prd, unsigned char *puch, int nStride, unsigned char *puchCube, int nStrideCube); extern void RenderDice(renderdata * prd, unsigned char *puch0, unsigned char *puch1, int nStride, int alpha); extern void RenderPips(renderdata * prd, unsigned char *puch0, unsigned char *puch1, int nStride); extern void RenderImages(renderdata * prd, renderimages * pri); extern void RenderArrows(renderdata * prd, unsigned char *puch0, unsigned char *puch1, int nStride, int fClockwise); extern void RenderBoardLabels(renderdata * prd, unsigned char *achLo, unsigned char *achHi, int nStride); extern void FreeImages(renderimages * pri); extern void CalculateArea(renderdata * prd, unsigned char *puch, int nStride, renderimages * pri, TanBoard anBoard, int anOff[2], const unsigned int anDice[2], int anDicePosition[2][2], int fDiceColour, const int anCubePosition[2], int nLogCube, int nCubeOrientation, const int anResignPosition[2], int fResign, int fResignOrientation, int anArrowPosition[2], int fPlaying, int nPlayer, int x, int y, int cx, int cy); #if defined(USE_BOARD3D) extern gboolean widget3dValid; extern gboolean display_is_2d(const renderdata* prd); extern gboolean display_is_3d(const renderdata* prd); extern void SuspendDiceRolling(renderdata* prd); extern void ResumeDiceRolling(renderdata* prd); #endif #endif gnubg-1.08.003/external.h000644 001751 000024 00000014225 14574155047 014633 0ustar00pmstaff000000 000000 /* * Copyright (C) 2001-2002 Gary Wong * Copyright (C) 2003-2020 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: external.h,v 1.26 2021/06/30 21:37:08 plm Exp $ */ #ifndef EXTERNAL_H #define EXTERNAL_H #if HAVE_SYS_SOCKET_H #include #endif #include #include #include "backgammon.h" /* Stuff for the yacc/lex parser */ extern void ExtStartParse(void *scanner, const char *szCommand); extern int ExtInitParse(void **scancontext); extern void ExtDestroyParse(void *scancontext); #define MAX_RFBF_ELEMENTS 53 #define KEY_STR_BEAVERS "beavers" #define KEY_STR_RESIGNATION "resignation" #define KEY_STR_DETERMINISTIC "deterministic" #define KEY_STR_JACOBYRULE "jacobyrule" #define KEY_STR_CRAWFORDRULE "crawfordrule" #define KEY_STR_PRUNE "prune" #define KEY_STR_NOISE "noise" #define KEY_STR_CUBEFUL "cubeful" #define KEY_STR_PLIES "plies" #define KEY_STR_NEWINTERFACE "newinterface" #define KEY_STR_DEBUG "debug" #define KEY_STR_PROMPT "prompt" typedef enum { COMMAND_NONE = 0, COMMAND_FIBSBOARD = 1, COMMAND_EVALUATION = 2, COMMAND_EXIT = 3, COMMAND_VERSION = 4, COMMAND_SET = 5, COMMAND_HELP = 6, COMMAND_LIST = 7 } cmdtype; typedef struct { cmdtype cmdType; void *pvData; } commandinfo; /* * When sending positions to be evaluated by GNUbg as external player, * they are sent using the struct below in the following way: * - anFIBSBoard is from player 1 point of view in all cases * - the unnamed player in the struct fields is the external player and Opp * is the other player from the instance connecting to it, * except in the take case (where what is really evaluated is the full * doubling decision, take/pass and take/drop, from the doubling side) * * For instance, with the external player as player 0 winning the opening roll, * the short game 52 (split) / 55 / fans / double / pass would have the strings * starting with "board:" sent to it: * * player0 : 52 * board:::0:0:0:0:-2:0:0:0:0:5:0:3:0:0:0:-5:5:0:0:0:-3:0:-5:0:0:0:0:2:0:-1:5:2:5:2:1:1:1:0:1:-1:0:25:0:0:0:0:0:0:0:1 * 24/22 13/8 * * player1 : 55 * 13/8*(2) 6/1*(2) * * player0 : double ? * board:::0:0:0:-2:2:0:2:0:0:3:0:1:0:0:0:-4:5:0:0:0:-4:0:-5:0:0:0:0:2:0:-1:0:0:0:0:1:1:1:0:1:-1:0:25:0:0:0:0:0:0:0:1 * no double * * player0 : 66 * board:::0:0:0:-2:2:0:2:0:0:3:0:1:0:0:0:-4:5:0:0:0:-4:0:-5:0:0:0:0:2:0:-1:6:6:6:6:1:1:1:0:1:-1:0:25:0:0:0:0:0:0:0:1 * fans * * player1 : double * * player0 : take ? * board:::0:0:0:-2:2:0:2:0:0:3:0:1:0:0:0:-4:5:0:0:0:-4:0:-5:0:0:0:0:2:0:1:0:0:0:0:1:1:1:1:1:-1:0:25:0:0:0:0:0:0:0:1 */ typedef struct { /* * These must be in the same order than the FIBS board string definition, * starting at Match Length. * See description at http://www.fibs.com/fibs_interface.html#board_state */ int nMatchTo; int nScore; int nScoreOpp; int anFIBSBoard[26]; int nTurn; int anDice[2]; int anOppDice[2]; int nCube; int fCanDouble; int fOppCanDouble; int fDoubled; int nColor; int nDirection; int nHome; /* unused, set to 0 */ int nBar; /* unused, set to 25 */ int nOnHome; /* unused */ int nOnHomeOpp; /* unused */ int nOnBar; /* unused */ int nOnBarOpp; /* unused */ int nCanMove; /* unused */ int fForcedMOve; /* unused */ int fPostCrawford; /* * Redoubles from FIBS board is not usable by GNUbg. * A flag for match play is put at the same place */ int fNonCrawford; int nVersion; int padding[51]; /* These must be last */ GString *gsName; GString *gsOpp; } FIBSBoardInfo; typedef struct { char szPlayer[MAX_NAME_LEN]; char szOpp[MAX_NAME_LEN]; int nMatchTo; int nScore; int nScoreOpp; int anDice[2]; int nCube; int fCubeOwner; int fDoubled; int fCrawford; int fJacoby; int nResignation; TanBoard anBoard; } ProcessedFIBSBoard; typedef struct scancontext { /* scanner ptr must be first element in structure */ void *scanner; void (*ExtErrorHandler) (struct scancontext *, const char *); int fError; int fDebug; int fNewInterface; char *szError; /* command type */ cmdtype ct; void *pCmdData; /* evalcontext */ int nPlies; float rNoise; int fDeterministic; int fCubeful; int fUsePrune; /* session rules */ int fJacobyRule; int fCrawfordRule; int nResignation; int fBeavers; /* fibs board */ union { FIBSBoardInfo bi; int anList[50]; }; } scancontext; #if HAVE_SOCKETS #ifndef WIN32 #define closesocket close #if HAVE_SYS_SOCKET_H #include #include #endif /* #if HAVE_SYS_SOCKET_H */ #else /* #ifndef WIN32 */ #include #include #endif /* #ifndef WIN32 */ #define EXTERNAL_INTERFACE_VERSION "2" #define RFBF_VERSION_SUPPORTED "0" extern int ExternalSocket(struct sockaddr **ppsa, socklen_t *pcb, char *sz); extern int ExternalRead(int h, char *pch, size_t cch); extern int ExternalWrite(int h, char *pch, size_t cch); #ifdef WIN32 extern void OutputWin32SocketError(const char *action); #define SockErr OutputWin32SocketError #else #define SockErr outputerr #endif #endif /* #if HAVE_SOCKETS */ #endif /* #ifndef EXTERNAL_H */ gnubg-1.08.003/sgf.c000644 001751 000024 00000217332 14574155047 013567 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2002 Gary Wong * Copyright (C) 2001-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: sgf.c,v 1.174 2022/02/26 20:22:15 plm Exp $ */ #include "config.h" #include "common.h" #include #include #include #include #include #include #include #include "backgammon.h" #include "dice.h" #include "eval.h" #if USE_GTK #include "gtkgame.h" #endif #include "analysis.h" #include "positionid.h" #include "sgf.h" static const char *szFile; static int fError; static int CheckSGFVersion(char **sz); static void ErrorHandler(const char *sz, int UNUSED(fParseError)) { if (!fError) { fError = TRUE; outputerrf("%s: %s", szFile, sz); } } static void FreeList(listOLD * pl, int nLevel) { /* Levels are: * 0 - GameTreeSeq * 1 - GameTree * 2 - Sequence * 3 - Node * 4 - Property */ if (nLevel == 1) { FreeList(pl->plNext->p, 2); /* initial sequence */ ListDelete(pl->plNext); nLevel = 0; /* remainder of list is more GameTreeSeqs */ } while (pl->plNext != pl) { if (nLevel == 3) { FreeList(((property *) pl->plNext->p)->pl, 4); free(pl->plNext->p); } else if (nLevel == 4) free(pl->plNext->p); else FreeList(pl->plNext->p, nLevel + 1); ListDelete(pl->plNext); } free(pl); } static void FreeGameTreeSeq(listOLD * pl) { FreeList(pl, 0); } static listOLD * LoadCollection(char *sz) { listOLD *plCollection, *pl, *plRoot, *plProp; FILE *pf; fError = FALSE; SGFErrorHandler = ErrorHandler; if (strcmp(sz, "-")) { if (!(pf = g_fopen(sz, "r"))) { outputerr(sz); return NULL; } szFile = sz; } else { /* FIXME does it really make sense to try to load from stdin? */ pf = stdin; szFile = "(stdin)"; } plCollection = SGFParse(pf); if (pf != stdin) fclose(pf); /* Traverse collection, looking for backgammon games. */ if (plCollection) { pl = plCollection->plNext; while (pl != plCollection) { int fBackgammon = FALSE; plRoot = ((listOLD *) ((listOLD *) pl->p)->plNext->p)->plNext->p; for (plProp = plRoot->plNext; plProp != plRoot; plProp = plProp->plNext) { property *pp = plProp->p; if (pp->ach[0] == 'G' && pp->ach[1] == 'M' && pp->pl->plNext->p && atoi((char *) pp->pl->plNext->p) == 6) { fBackgammon = TRUE; break; } } pl = pl->plNext; if (!fBackgammon) { FreeList(pl->plPrev->p, 1); ListDelete(pl->plPrev); } } if (ListEmpty(plCollection)) { ErrorHandler(_("warning: no backgammon games in SGF file"), TRUE); free(plCollection); plCollection = NULL; } } return plCollection; } static void CopyName(int i, char *sz) { char *pc; /* FIXME sanity check the name as in CommandSetPlayerName */ pc = g_strdup(sz); if (strlen(pc) > 31) pc[31] = 0; strcpy(ap[i].szName, pc); g_free(pc); } static void SetScore(xmovegameinfo * pmgi, int fBlack, int n) { if (n >= 0 && (!pmgi->nMatch || n < pmgi->nMatch)) pmgi->anScore[fBlack] = n; } static void RestoreMI(listOLD * pl, moverecord * pmr) { char *pch; xmovegameinfo *pmgi = &pmr->g; for (pl = pl->plNext; (pch = pl->p); pl = pl->plNext) if (!strncmp(pch, "length:", 7)) { pmgi->nMatch = atoi(pch + 7); if (pmgi->nMatch < 0) pmgi->nMatch = 0; } else if (!strncmp(pch, "game:", 5)) { pmgi->i = atoi(pch + 5); if (pmgi->i < 0) pmgi->i = 0; } else if (!strncmp(pch, "ws:", 3) || !strncmp(pch, "bs:", 3)) SetScore(pmgi, *pch == 'b', atoi(pch + 3)); } static void RestoreGS(listOLD * pl, statcontext * psc) { char *pch; lucktype lt; skilltype st; for (pl = pl->plNext; (pch = pl->p); pl = pl->plNext) switch (*pch) { case 'M': /* moves */ psc->fMoves = TRUE; psc->anUnforcedMoves[0] = (int) strtol(pch + 2, &pch, 10); psc->anUnforcedMoves[1] = (int) strtol(pch, &pch, 10); psc->anTotalMoves[0] = (int) strtol(pch, &pch, 10); psc->anTotalMoves[1] = (int) strtol(pch, &pch, 10); for (st = SKILL_VERYBAD; st <= SKILL_NONE; st++) { psc->anMoves[0][st] = (int) strtol(pch, &pch, 10); psc->anMoves[1][st] = (int) strtol(pch, &pch, 10); } psc->arErrorCheckerplay[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorCheckerplay[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorCheckerplay[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorCheckerplay[1][1] = (float) g_ascii_strtod(pch, &pch); break; case 'C': /* cube */ psc->fCube = TRUE; psc->anTotalCube[0] = (int) strtol(pch + 2, &pch, 10); psc->anTotalCube[1] = (int) strtol(pch, &pch, 10); psc->anDouble[0] = (int) strtol(pch, &pch, 10); psc->anDouble[1] = (int) strtol(pch, &pch, 10); psc->anTake[0] = (int) strtol(pch, &pch, 10); psc->anTake[1] = (int) strtol(pch, &pch, 10); psc->anPass[0] = (int) strtol(pch, &pch, 10); psc->anPass[1] = (int) strtol(pch, &pch, 10); psc->anCubeMissedDoubleDP[0] = (int) strtol(pch, &pch, 10); psc->anCubeMissedDoubleDP[1] = (int) strtol(pch, &pch, 10); psc->anCubeMissedDoubleTG[0] = (int) strtol(pch, &pch, 10); psc->anCubeMissedDoubleTG[1] = (int) strtol(pch, &pch, 10); psc->anCubeWrongDoubleDP[0] = (int) strtol(pch, &pch, 10); psc->anCubeWrongDoubleDP[1] = (int) strtol(pch, &pch, 10); psc->anCubeWrongDoubleTG[0] = (int) strtol(pch, &pch, 10); psc->anCubeWrongDoubleTG[1] = (int) strtol(pch, &pch, 10); psc->anCubeWrongTake[0] = (int) strtol(pch, &pch, 10); psc->anCubeWrongTake[1] = (int) strtol(pch, &pch, 10); psc->anCubeWrongPass[0] = (int) strtol(pch, &pch, 10); psc->anCubeWrongPass[1] = (int) strtol(pch, &pch, 10); psc->arErrorMissedDoubleDP[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleDP[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleTG[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleTG[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleDP[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleDP[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleTG[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleTG[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongTake[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongTake[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongPass[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongPass[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleDP[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleDP[1][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleTG[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorMissedDoubleTG[1][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleDP[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleDP[1][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleTG[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongDoubleTG[1][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongTake[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongTake[1][1] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongPass[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arErrorWrongPass[1][1] = (float) g_ascii_strtod(pch, &pch); break; case 'D': /* dice */ psc->fDice = TRUE; pch += 2; for (lt = LUCK_VERYBAD; lt <= LUCK_VERYGOOD; lt++) { psc->anLuck[0][lt] = (int) strtol(pch, &pch, 10); psc->anLuck[1][lt] = (int) strtol(pch, &pch, 10); } psc->arLuck[0][0] = (float) g_ascii_strtod(pch, &pch); psc->arLuck[0][1] = (float) g_ascii_strtod(pch, &pch); psc->arLuck[1][0] = (float) g_ascii_strtod(pch, &pch); psc->arLuck[1][1] = (float) g_ascii_strtod(pch, &pch); break; default: /* ignore */ break; } AddStatcontext(psc, &scMatch); } static char * CopyEscapedString(const char *pchOrig) { char *sz, *pch; for (pch = sz = g_malloc(strlen(pchOrig) + 1); *pchOrig; pchOrig++) { if (*pchOrig == '\\') { if (pchOrig[1] == '\\') { *pch++ = '\\'; pchOrig++; } continue; } if (isspace(*pchOrig) && *pchOrig != '\n') { *pch++ = ' '; continue; } *pch++ = *pchOrig; } *pch = 0; return sz; } static void RestoreText(char *sz, char **ppch) { if (!sz || !*sz) return; g_free(*ppch); *ppch = CopyEscapedString(sz); } static void RestoreRules(xmovegameinfo * pmgi, const char *sz) { char *pch; char *pchx; /* split string at colons */ pch = g_strdup(sz); pchx = strtok(pch, ":"); while (pchx) { if (!strcmp(pchx, "Crawford")) pmgi->fCrawford = TRUE; else if (!strcmp(pchx, "CrawfordGame")) pmgi->fCrawfordGame = TRUE; else if (!strcmp(pchx, "Jacoby")) pmgi->fJacoby = TRUE; else if (!strcmp(pchx, "Nackgammon")) pmgi->bgv = VARIATION_NACKGAMMON; else if (!strcmp(pchx, "Hypergammon1")) pmgi->bgv = VARIATION_HYPERGAMMON_1; else if (!strcmp(pchx, "Hypergammon2")) pmgi->bgv = VARIATION_HYPERGAMMON_2; else if (!strcmp(pchx, "Hypergammon3")) pmgi->bgv = VARIATION_HYPERGAMMON_3; else if (!strcmp(pchx, "NoCube")) pmgi->fCubeUse = FALSE; pchx = strtok(NULL, ":"); } g_free(pch); } static void RestoreRootNode(listOLD * pl) { property *pp; moverecord *pmr; char *pch; int i; pmr = NewMoveRecord(); pmr->mt = MOVE_GAMEINFO; pmr->g.i = 0; pmr->g.nMatch = 0; pmr->g.anScore[0] = 0; pmr->g.anScore[1] = 0; pmr->g.fCrawford = FALSE; pmr->g.fCrawfordGame = FALSE; pmr->g.fJacoby = FALSE; pmr->g.fWinner = -1; pmr->g.nPoints = 0; pmr->g.fResigned = FALSE; pmr->g.nAutoDoubles = 0; pmr->g.bgv = VARIATION_STANDARD; pmr->g.fCubeUse = TRUE; IniStatcontext(&pmr->g.sc); for (pl = pl->plNext; (pp = pl->p); pl = pl->plNext) if (pp->ach[0] == 'M' && pp->ach[1] == 'I') /* MI - Match info property */ RestoreMI(pp->pl, pmr); else if (pp->ach[0] == 'P' && pp->ach[1] == 'B') /* PB - Black player property */ CopyName(1, pp->pl->plNext->p); else if (pp->ach[0] == 'P' && pp->ach[1] == 'W') /* PW - White player property */ CopyName(0, pp->pl->plNext->p); else if (pp->ach[0] == 'R' && pp->ach[1] == 'E') { /* RE - Result property */ pch = pp->pl->plNext->p; pmr->g.fWinner = -1; if (toupper(*pch) == 'B') pmr->g.fWinner = 1; else if (toupper(*pch) == 'W') pmr->g.fWinner = 0; if (pmr->g.fWinner == -1) continue; if (*++pch != '+') continue; pmr->g.nPoints = (int) strtol(pch, &pch, 10); if (pmr->g.nPoints < 1) pmr->g.nPoints = 1; pmr->g.fResigned = toupper(*pch) == 'R'; } else if (pp->ach[0] == 'R' && pp->ach[1] == 'U') { /* RU - Rules property */ RestoreRules(&pmr->g, (const char *) pp->pl->plNext->p); } else if (pp->ach[0] == 'C' && pp->ach[1] == 'V') { /* CV - Cube value (i.e. automatic doubles) */ for (i = 0; (1 << i) <= MAX_CUBE; i++) if (atoi(pp->pl->plNext->p) == 1 << i) { pmr->g.nAutoDoubles = i; break; } } else if (pp->ach[0] == 'G' && pp->ach[1] == 'S') /* GS - Game statistics */ RestoreGS(pp->pl, &pmr->g.sc); else if (pp->ach[0] == 'W' && pp->ach[1] == 'R') /* WR - White rank */ RestoreText(pp->pl->plNext->p, &mi.pchRating[0]); else if (pp->ach[0] == 'B' && pp->ach[1] == 'R') /* BR - Black rank */ RestoreText(pp->pl->plNext->p, &mi.pchRating[1]); else if (pp->ach[0] == 'D' && pp->ach[1] == 'T') { /* DT - Date */ unsigned int nYear, nMonth, nDay; if (pp->pl->plNext->p && sscanf(pp->pl->plNext->p, "%u-%u-%u", &nYear, &nMonth, &nDay) == 3) { mi.nYear = nYear; mi.nMonth = nMonth; mi.nDay = nDay; } } else if (pp->ach[0] == 'E' && pp->ach[1] == 'V') /* EV - Event */ RestoreText(pp->pl->plNext->p, &mi.pchEvent); else if (pp->ach[0] == 'R' && pp->ach[1] == 'O') /* RO - Round */ RestoreText(pp->pl->plNext->p, &mi.pchRound); else if (pp->ach[0] == 'P' && pp->ach[1] == 'C') /* PC - Place */ RestoreText(pp->pl->plNext->p, &mi.pchPlace); else if (pp->ach[0] == 'A' && pp->ach[1] == 'N') /* AN - Annotator */ RestoreText(pp->pl->plNext->p, &mi.pchAnnotator); else if (pp->ach[0] == 'G' && pp->ach[1] == 'C') /* GC - Game comment */ RestoreText(pp->pl->plNext->p, &mi.pchComment); AddMoveRecord(pmr); } static int Point(char ch, int f) { if (ch == 'y') return 24; /* bar */ else if (ch <= 'x' && ch >= 'a') return f ? 'x' - ch : ch - 'a'; else return -1; /* off */ } static void RestoreRolloutScore(move * pm, const char *sz) { char *pc = strstr(sz, "Score"); if (pc) { pc += 6; pm->rScore = (float) g_ascii_strtod(pc, &pc); pm->rScore2 = (float) g_ascii_strtod(pc, &pc); } else { pm->rScore = -99999; pm->rScore2 = -99999; } return; } static void RestoreRolloutTrials(unsigned int *piTrials, const char *sz) { char *pc = strstr(sz, "Trials"); *piTrials = 0; if (!pc) return; sscanf(pc, "Trials %ud", piTrials); } static void RestoreRolloutOutput(float ar[NUM_ROLLOUT_OUTPUTS], const char *sz, const char *szKeyword) { char *pc = strstr(sz, szKeyword); int i; for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) ar[i] = 0.0; if (!pc) return; pc += strlen(szKeyword) + 1; for (i = 0; i < 7; i++) ar[i] = (float) g_ascii_strtod(pc, &pc); } static void InitEvalContext(evalcontext * pec) { pec->nPlies = 0; pec->fCubeful = FALSE; pec->fUsePrune = FALSE; pec->fDeterministic = FALSE; pec->rNoise = 0.0; } static void RestoreEvalContext(evalcontext * pec, char *pc) { int ver = CheckSGFVersion(&pc); InitEvalContext(pec); pec->nPlies = (unsigned int) strtol(pc, &pc, 10); if (*pc == 'C') { pec->fCubeful = TRUE; pc++; } if (ver < 3) { (void) strtol(pc, &pc, 10); /* reduced evaluation -- no longer supported */ pec->fDeterministic = (unsigned int) strtol(pc, &pc, 10); pec->rNoise = (float) g_ascii_strtod(pc, &pc); } else { pec->fDeterministic = (unsigned int) strtol(pc, &pc, 10); pec->rNoise = (float) g_ascii_strtod(pc, &pc); pec->fUsePrune = (unsigned int) strtol(pc, &pc, 10); } } static void RestoreRolloutContextEvalContext(evalcontext * pec, const char *sz, const char *szKeyword) { char *pc = strstr(sz, szKeyword); InitEvalContext(pec); if (!pc) return; pc = strchr(pc, ' '); if (!pc) return; RestoreEvalContext(pec, pc); } static void RestoreRolloutRolloutContext(rolloutcontext * prc, const char *sz) { char *pc = strstr(sz, "RC"); char szTemp[1024]; int fCubeful, fVarRedn, fInitial, fRotate, fTruncBearoff2, fTruncBearoffOS; fCubeful = FALSE; fVarRedn = FALSE; fInitial = FALSE; prc->nTruncate = 0; prc->nTrials = 0; prc->rngRollout = RNG_MERSENNE; prc->nSeed = 0; fRotate = TRUE; fTruncBearoff2 = FALSE; fTruncBearoffOS = FALSE; /* set usable, but ignored values for everything else */ prc->fLateEvals = 0; prc->fStopOnSTD = 0; prc->nLate = 0; prc->nMinimumGames = 324; prc->rStdLimit = 0.01f; if (!pc) return; sscanf(pc, "RC %d %d %d %hu %u \"%1023[^\"]\" %lu %d %d %d", &fCubeful, &fVarRedn, &fInitial, &prc->nTruncate, &prc->nTrials, szTemp, &prc->nSeed, &fRotate, &fTruncBearoff2, &fTruncBearoffOS); prc->fCubeful = fCubeful; prc->fVarRedn = fVarRedn; prc->fRotate = fRotate; prc->fInitial = fInitial; prc->fTruncBearoff2 = fTruncBearoff2; prc->fTruncBearoffOS = fTruncBearoffOS; RestoreRolloutContextEvalContext(&prc->aecCube[0], sz, "cube0"); RestoreRolloutContextEvalContext(&prc->aecCube[1], sz, "cube1"); RestoreRolloutContextEvalContext(&prc->aecChequer[0], sz, "cheq0"); RestoreRolloutContextEvalContext(&prc->aecChequer[1], sz, "cheq1"); } static void RestoreRollout(move * pm, const char *sz) { unsigned int n; pm->esMove.et = EVAL_ROLLOUT; RestoreRolloutScore(pm, sz); RestoreRolloutTrials(&n, sz); RestoreRolloutOutput(pm->arEvalMove, sz, "Output"); RestoreRolloutOutput(pm->arEvalStdDev, sz, "StdDev"); RestoreRolloutRolloutContext(&pm->esMove.rc, sz); } static void RestoreCubeRolloutOutput(float arOutput[], float arStdDev[], const char *sz, const char *szKeyword) { char *pc = strstr(sz, szKeyword); memset(arOutput, 0, NUM_ROLLOUT_OUTPUTS * sizeof(float)); memset(arStdDev, 0, NUM_ROLLOUT_OUTPUTS * sizeof(float)); if (!pc) return; RestoreRolloutOutput(arOutput, pc, "Output"); RestoreRolloutOutput(arStdDev, pc, "StdDev"); } static void RestoreCubeRollout(const char *sz, float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS], evalsetup * pes) { RestoreRolloutTrials(&pes->rc.nGamesDone, sz); RestoreCubeRolloutOutput(aarOutput[0], aarStdDev[0], sz, "NoDouble"); RestoreCubeRolloutOutput(aarOutput[1], aarStdDev[1], sz, "DoubleTake"); RestoreRolloutRolloutContext(&pes->rc, sz); } static void RestoreRolloutInternals(evalsetup * pes, const char *sz) { char *pc; if ((pc = strstr(sz, "SK")) != 0) sscanf(pc, "SK %d", &pes->rc.nSkip); } static int CheckSGFVersion(char **sz) { int n; static int ver = 0; char *pch = strstr(*sz, "ver"); if ((pch == 0) || (sscanf(pch, "ver %d", &n) != 1)) return ver; ver = n; /* skip over version info */ pch += 4; while (*pch != ' ') { ++pch; } *sz = pch; return ver; } static void RestoreRolloutMoveFilter(const char *sz, char *name, movefilter mf[MAX_FILTER_PLIES][MAX_FILTER_PLIES], int nPlies) { char *pc = strstr(sz, name); int i; if (pc == 0) return; pc += strlen(name); for (i = 0; i < nPlies; ++i) { mf[nPlies - 1][i].Accept = (int) strtol(pc, &pc, 10); mf[nPlies - 1][i].Extra = (int) strtol(pc, &pc, 10); mf[nPlies - 1][i].Threshold = (float) g_ascii_strtod(pc, &pc); } } static void RestoreExtendedRolloutContext(rolloutcontext * prc, const char *sz) { char *pc = strstr(sz, "RC"); char szTemp[1024]; int fCubeful, fVarRedn, fInitial, fRotate, fTruncBearoff2, fTruncBearoffOS; int fLateEvals, fDoTruncate; int i; if (!pc) return; if (sscanf(pc, "RC %d %d %d %d %d %d %hu %d %d %hu \"%1023[^\"]\" %lu", &fCubeful, &fVarRedn, &fInitial, &fRotate, &fLateEvals, &fDoTruncate, &prc->nTruncate, &fTruncBearoff2, &fTruncBearoffOS, &prc->nLate, szTemp, &prc->nSeed) != 12) return; prc->fCubeful = fCubeful; prc->fVarRedn = fVarRedn; prc->fInitial = fInitial; prc->fRotate = fRotate; prc->fLateEvals = fLateEvals; prc->fDoTruncate = fDoTruncate; prc->fTruncBearoff2 = fTruncBearoff2; prc->fTruncBearoffOS = fTruncBearoffOS; prc->rngRollout = RNG_MERSENNE; prc->nMinimumGames = 324; prc->rStdLimit = 0.01f; for (i = 0; i < 2; ++i) { sprintf(szTemp, "latecube%d ", i); RestoreRolloutContextEvalContext(&prc->aecCube[i], sz, szTemp + 4); RestoreRolloutContextEvalContext(&prc->aecCubeLate[i], sz, szTemp); sprintf(szTemp, "latecheq%d", i); RestoreRolloutContextEvalContext(&prc->aecChequer[i], sz, szTemp + 4); RestoreRolloutContextEvalContext(&prc->aecChequerLate[i], sz, szTemp); sprintf(szTemp, "latefilt%d ", i); if (prc->aecChequer[i].nPlies) { RestoreRolloutMoveFilter(sz, szTemp + 4, prc->aaamfChequer[i], prc->aecChequer[i].nPlies); } if (prc->aecChequerLate[i].nPlies) { RestoreRolloutMoveFilter(sz, szTemp, prc->aaamfLate[i], prc->aecChequerLate[i].nPlies); } } RestoreRolloutContextEvalContext(&prc->aecCubeTrunc, sz, "cubetrunc"); RestoreRolloutContextEvalContext(&prc->aecChequerTrunc, sz, "cheqtrunc"); } static void RestoreExtendedCubeRollout(char *sz, float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS], evalsetup * pes) { /* we assume new versions will still begin with Eq 4 floats * Trials int */ RestoreRolloutTrials(&pes->rc.nGamesDone, sz); RestoreCubeRolloutOutput(aarOutput[0], aarStdDev[0], sz, "NoDouble"); RestoreCubeRolloutOutput(aarOutput[1], aarStdDev[1], sz, "DoubleTake"); if (CheckSGFVersion(&sz)) { RestoreRolloutInternals(pes, sz); RestoreExtendedRolloutContext(&pes->rc, sz); } } static void RestoreExtendedRollout(move * pm, char *sz) { evalsetup *pes = &pm->esMove; /* we assume new versions will still begin with Score 2 floats * Trials int */ pes->et = EVAL_ROLLOUT; RestoreRolloutScore(pm, sz); RestoreRolloutTrials(&pes->rc.nGamesDone, sz); RestoreRolloutOutput(pm->arEvalMove, sz, "Output"); RestoreRolloutOutput(pm->arEvalStdDev, sz, "StdDev"); if (CheckSGFVersion(&sz)) { RestoreRolloutInternals(pes, sz); RestoreExtendedRolloutContext(&pes->rc, sz); } } static void RestoreDoubleAnalysis(property * pp, float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS], evalsetup * pes) { char *pch = pp->pl->plNext->p; int fUsePrune = 0; int ver; int i, j; switch (*pch) { case 'E': /* EVAL_EVAL */ ++pch; pes->et = EVAL_EVAL; ver = CheckSGFVersion(&pch); memset(aarOutput[0], 0, NUM_ROLLOUT_OUTPUTS * sizeof(float)); memset(aarOutput[1], 0, NUM_ROLLOUT_OUTPUTS * sizeof(float)); aarOutput[0][OUTPUT_CUBEFUL_EQUITY] = -20000.0f; aarOutput[1][OUTPUT_CUBEFUL_EQUITY] = -20000.0f; if (ver < 2) { /* skip 4 fields left over from earlier formats */ (void) g_ascii_strtod(pch, &pch); (void) g_ascii_strtod(pch, &pch); (void) g_ascii_strtod(pch, &pch); (void) g_ascii_strtod(pch, &pch); pes->ec.nPlies = (unsigned int) strtol(pch, &pch, 10); if (*pch == 'C') { pes->ec.fCubeful = TRUE; pch++; } (void) strtol(pch, &pch, 10); /* reduced evaluation -- no longer supported */ pes->ec.fDeterministic = (unsigned int) strtol(pch, &pch, 10); pes->ec.rNoise = (float) g_ascii_strtod(pch, &pch); } else if (ver == 2) { pes->ec.nPlies = (unsigned int) strtol(pch, &pch, 10); if (*pch == 'C') { pes->ec.fCubeful = TRUE; pch++; } (void) strtol(pch, &pch, 10); /* reduced evaluation -- no longer supported */ pes->ec.fDeterministic = (unsigned int) strtol(pch, &pch, 10); pes->ec.rNoise = (float) g_ascii_strtod(pch, &pch); fUsePrune = (int) strtol(pch, &pch, 10); } else { pes->ec.nPlies = (unsigned int) strtol(pch, &pch, 10); if (*pch == 'C') { pes->ec.fCubeful = TRUE; pch++; } pes->ec.fDeterministic = (unsigned int) strtol(pch, &pch, 10); pes->ec.rNoise = (float) g_ascii_strtod(pch, &pch); fUsePrune = (int) strtol(pch, &pch, 10); } pes->ec.fUsePrune = fUsePrune; for (i = 0; i < 2; i++) for (j = 0; j < 7; j++) aarOutput[i][j] = (float) g_ascii_strtod(pch, &pch); break; case 'R': pes->et = EVAL_ROLLOUT; RestoreCubeRollout(pch + 1, aarOutput, aarStdDev, pes); break; case 'X': pes->et = EVAL_ROLLOUT; RestoreExtendedCubeRollout(pch + 1, aarOutput, aarStdDev, pes); break; default: break; } } static void RestoreMarkedMoves(property * pp, movelist * pml) { int val; char *pch = pp->pl->plNext->p; while ((val = (int) strtol(pch, &pch, 10))) { if (val > (int) pml->cMoves || val < 1) continue; pml->amMoves[val - 1].cmark = CMARK_ROLLOUT; } } static void RestoreMoveAnalysis(property * pp, int fPlayer, movelist * pml, unsigned int *piMove, evalsetup * pesChequer, const matchstate * pms) { listOLD *pl = pp->pl->plNext; move *pm; int i; int fUsePrune = 0; TanBoard anBoardMove; int ver; *piMove = atoi(pl->p); for (pml->cMoves = 0, pl = pl->plNext; pl->p; pl = pl->plNext) pml->cMoves++; if (pml->cMoves == 0) { g_assert_not_reached(); return; } /* FIXME we could work these out, but it hardly seems worth it */ pml->cMaxMoves = pml->cMaxPips = pml->iMoveBest = 0; pml->rBestScore = 0; pm = pml->amMoves = g_malloc0(pml->cMoves * sizeof(move)); pesChequer->et = EVAL_NONE; for (pl = pp->pl->plNext->plNext; pl->p; pl = pl->plNext, pm++) { char *pc, *pch, ch; pc = pl->p; /* FIXME we could work these out, but it hardly seems worth it */ pm->cMoves = pm->cPips = 0; pm->rScore2 = 0; for (i = 0; i < 4 && pc[0] && pc[1] && pc[0] != ' '; pc += 2, i++) { pm->anMove[i << 1] = Point(pc[0], fPlayer); pm->anMove[(i << 1) | 1] = Point(pc[1], fPlayer); } if (i < 4) pm->anMove[i << 1] = -1; /* restore auch */ memcpy(anBoardMove, pms->anBoard, sizeof(anBoardMove)); ApplyMove(anBoardMove, pm->anMove, FALSE); PositionKey((ConstTanBoard) anBoardMove, &pm->key); pch = pc; while (isspace(ch = *pch++)) { } pch++; switch (ch) { case 'E': ver = CheckSGFVersion(&pch); /* EVAL_EVAL */ pm->esMove.et = EVAL_EVAL; for (i = 0; i < 5; i++) pm->arEvalMove[i] = (float) g_ascii_strtod(pch, &pch); pm->rScore = (float) g_ascii_strtod(pch, &pch); if (ver < 2) { pm->esMove.ec.nPlies = (unsigned int) strtol(pch, &pch, 10); if (*pch == 'C') { pm->esMove.ec.fCubeful = TRUE; pch++; } (void) strtol(pch, &pch, 10); /* reduced evaluation -- no longer supported */ pm->esMove.ec.fDeterministic = (unsigned int) strtol(pch, &pch, 10); pm->esMove.ec.rNoise = (float) g_ascii_strtod(pch, &pch); /* * Alternatives for ver == 2 and ver > 2 (that is == 3) are identical, * version 3 still writes a reduced evalution flag (set to 0) and * discards it on reads. See comment in WriteMoveAnalysis() */ #if 0 } else if (ver == 2) { pm->esMove.ec.nPlies = (unsigned int) strtol(pch, &pch, 10); if (*pch == 'C') { pm->esMove.ec.fCubeful = TRUE; pch++; } (void) strtol(pch, &pch, 10); /* reduced evaluation -- no longer supported */ pm->esMove.ec.fDeterministic = (unsigned int) strtol(pch, &pch, 10); pm->esMove.ec.rNoise = (float) g_ascii_strtod(pch, &pch); fUsePrune = (int) strtol(pch, &pch, 10); #endif } else { pm->esMove.ec.nPlies = (unsigned int) strtol(pch, &pch, 10); if (*pch == 'C') { pm->esMove.ec.fCubeful = TRUE; pch++; } (void) strtol(pch, &pch, 10); /* reduced evaluation -- no longer supported */ pm->esMove.ec.fDeterministic = (unsigned int) strtol(pch, &pch, 10); pm->esMove.ec.rNoise = (float) g_ascii_strtod(pch, &pch); fUsePrune = (int) strtol(pch, &pch, 10); } pm->esMove.ec.fUsePrune = fUsePrune; break; case 'R': RestoreRollout(pm, pch); break; case 'X': RestoreExtendedRollout(pm, pch); break; default: /* FIXME */ break; } /* save "largest" evalsetup */ if (cmp_evalsetup(pesChequer, &pm->esMove) < 0) memcpy(pesChequer, &pm->esMove, sizeof(evalsetup)); } } static void PointList(listOLD * pl, int an[]) { int i; char ch0, ch1; for (i = 0; i < 25; i++) an[i] = 0; for (; pl->p; pl = pl->plNext) { char *pch = pl->p; if (strchr(pch, ':')) { ch0 = ch1 = 0; sscanf(pch, "%c:%c", &ch0, &ch1); if (ch0 >= 'a' && ch1 <= 'y' && ch0 < ch1) for (i = ch0 - 'a'; i <= ch1 - 'a'; i++) an[i]++; } else if (*pch >= 'a' && *pch <= 'y') an[*pch - 'a']++; } } static void RestoreNode(listOLD * pl) { property *pp, *ppDA = NULL, *ppA = NULL, *ppC = NULL, *ppMR = NULL, *ppCR = NULL; moverecord *pmr = NULL; char *pch; int i, fPlayer = 0, fSetBoard = FALSE, an[25]; skilltype ast[2] = { SKILL_NONE, SKILL_NONE }; lucktype lt = LUCK_NONE; float rLuck = ERR_VAL; for (pl = pl->plNext; (pp = pl->p); pl = pl->plNext) { if (pp->ach[1] == 0 && (pp->ach[0] == 'B' || pp->ach[0] == 'W')) { /* B or W - Move property. */ if (pmr) /* Duplicate move -- ignore. */ continue; pch = pp->pl->plNext->p; fPlayer = pp->ach[0] == 'B'; if (!strcmp(pch, "double")) { pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->fPlayer = fPlayer; LinkToDouble(pmr); } else if (!strcmp(pch, "take")) { pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->fPlayer = fPlayer; LinkToDouble(pmr); } else if (!strcmp(pch, "drop")) { pmr = NewMoveRecord(); pmr->mt = MOVE_DROP; pmr->fPlayer = fPlayer; LinkToDouble(pmr); } else { pmr = NewMoveRecord(); pmr->mt = MOVE_NORMAL; pmr->fPlayer = fPlayer; pmr->anDice[1] = 0; for (i = 0; i < 2 && *pch; pch++, i++) pmr->anDice[i] = *pch - '0'; for (i = 0; i < 4 && pch[0] && pch[1]; pch += 2, i++) { pmr->n.anMove[i << 1] = Point(pch[0], pmr->fPlayer); pmr->n.anMove[(i << 1) | 1] = Point(pch[1], pmr->fPlayer); } if (i < 4) pmr->n.anMove[i << 1] = -1; if (pmr->anDice[0] < 1 || pmr->anDice[0] > 6 || pmr->anDice[1] < 1 || pmr->anDice[1] > 6) { /* illegal roll -- ignore */ g_free(pmr); pmr = NULL; } } } else if (pp->ach[0] == 'A' && pp->ach[1] == 'E') { fSetBoard = TRUE; PointList(pp->pl->plNext, an); for (i = 0; i < 25; i++) if (an[i]) { ms.anBoard[0][i == 24 ? i : 23 - i] = 0; ms.anBoard[1][i] = 0; } } else if (pp->ach[0] == 'A' && pp->ach[1] == 'B') { fSetBoard = TRUE; PointList(pp->pl->plNext, an); for (i = 0; i < 25; i++) ms.anBoard[0][i == 24 ? i : 23 - i] += an[i]; } else if (pp->ach[0] == 'A' && pp->ach[1] == 'W') { fSetBoard = TRUE; PointList(pp->pl->plNext, an); for (i = 0; i < 25; i++) ms.anBoard[1][i] += an[i]; } else if (pp->ach[0] == 'P' && pp->ach[1] == 'L') { int fTurnNew = *((char *) pp->pl->plNext->p) == 'B'; if (ms.fMove != fTurnNew) SwapSides(ms.anBoard); ms.fTurn = ms.fMove = fTurnNew; } else if (pp->ach[0] == 'C' && pp->ach[1] == 'V') { for (i = 1; i <= MAX_CUBE; i <<= 1) if (atoi(pp->pl->plNext->p) == i) { pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEVAL; pmr->scv.nCube = i; AddMoveRecord(pmr); pmr = NULL; break; } } else if (pp->ach[0] == 'C' && pp->ach[1] == 'P') { pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEPOS; switch (*((char *) pp->pl->plNext->p)) { case 'c': pmr->scp.fCubeOwner = -1; break; case 'b': pmr->scp.fCubeOwner = 1; break; case 'w': pmr->scp.fCubeOwner = 0; break; default: g_free(pmr); pmr = NULL; } if (pmr) { AddMoveRecord(pmr); pmr = NULL; } } else if (pp->ach[0] == 'D' && pp->ach[1] == 'I') { char ach[2]; sscanf(pp->pl->plNext->p, "%2c", ach); if (ach[0] >= '1' && ach[0] <= '6' && ach[1] >= '1' && ach[1] <= '6') { pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = ms.fMove; pmr->anDice[0] = ach[0] - '0'; pmr->anDice[1] = ach[1] - '0'; } } else if (pp->ach[0] == 'D' && pp->ach[1] == 'A') /* double analysis */ ppDA = pp; else if (pp->ach[0] == 'A' && !pp->ach[1]) /* move analysis */ ppA = pp; else if (pp->ach[0] == 'M' && pp->ach[1] == 'R') /* marked moves */ ppMR = pp; else if (pp->ach[0] == 'C' && pp->ach[1] == 'R') /* marked moves */ ppCR = pp; else if (pp->ach[0] == 'C' && !pp->ach[1]) /* comment */ ppC = pp; else if (pp->ach[0] == 'B' && pp->ach[1] == 'M') ast[0] = *((char *) pp->pl->plNext->p) == '2' ? SKILL_VERYBAD : SKILL_BAD; else if (pp->ach[0] == 'D' && pp->ach[1] == 'O') ast[0] = SKILL_DOUBTFUL; else if (pp->ach[0] == 'B' && pp->ach[1] == 'C') ast[1] = *((char *) pp->pl->plNext->p) == '2' ? SKILL_VERYBAD : SKILL_BAD; else if (pp->ach[0] == 'D' && pp->ach[1] == 'C') ast[1] = SKILL_DOUBTFUL; else if (pp->ach[0] == 'L' && pp->ach[1] == 'U') rLuck = (float) g_ascii_strtod(pp->pl->plNext->p, NULL); else if (pp->ach[0] == 'G' && pp->ach[1] == 'B') /* good for black */ lt = *((char *) pp->pl->plNext->p) == '2' ? LUCK_VERYGOOD : LUCK_GOOD; else if (pp->ach[0] == 'G' && pp->ach[1] == 'W') /* good for white */ lt = *((char *) pp->pl->plNext->p) == '2' ? LUCK_VERYBAD : LUCK_BAD; } if (fSetBoard && !pmr) { pmr = NewMoveRecord(); pmr->mt = MOVE_SETBOARD; ClosestLegalPosition(ms.anBoard); PositionKey(msBoard(), &pmr->sb.key); } if (pmr && ppC) pmr->sz = CopyEscapedString(ppC->pl->plNext->p); if (pmr) { FixMatchState(&ms, pmr); switch (pmr->mt) { case MOVE_NORMAL: if (ppDA) RestoreDoubleAnalysis(ppDA, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble); if (ppCR) pmr->CubeDecPtr->cmark = CMARK_ROLLOUT; if (ppA) RestoreMoveAnalysis(ppA, pmr->fPlayer, &pmr->ml, &pmr->n.iMove, &pmr->esChequer, &ms); if (ppMR) RestoreMarkedMoves(ppMR, &pmr->ml); /* FIXME: separate st's */ pmr->n.stMove = ast[0]; pmr->stCube = ast[1]; pmr->lt = fPlayer ? lt : LUCK_VERYGOOD - lt; pmr->rLuck = rLuck; break; case MOVE_DOUBLE: case MOVE_TAKE: case MOVE_DROP: if (ppDA) RestoreDoubleAnalysis(ppDA, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble); if (ppCR) pmr->CubeDecPtr->cmark = CMARK_ROLLOUT; pmr->stCube = ast[0]; break; case MOVE_SETDICE: pmr->lt = lt; pmr->rLuck = rLuck; break; default: /* FIXME allow comments for all movetypes */ break; } AddMoveRecord(pmr); } } static void RestoreSequence(listOLD * pl, int fRoot) { pl = pl->plNext; if (fRoot) RestoreRootNode(pl->p); else RestoreNode(pl->p); while (pl = pl->plNext, pl->p) RestoreNode(pl->p); } static void RestoreTree(listOLD * pl, int fRoot) { pl = pl->plNext; RestoreSequence(pl->p, fRoot); pl = pl->plNext; if (pl->p) RestoreTree(pl->p, FALSE); /* FIXME restore other variations, once we can handle them */ } static void RestoreGame(listOLD * pl) { moverecord *pmr; InitBoard(ms.anBoard, ms.bgv); /* FIXME should anything be done with the current game? */ ClearMoveRecord(); ListInsert(&lMatch, plGame); ms.anDice[0] = ms.anDice[1] = 0; ms.fResigned = ms.fDoubled = FALSE; ms.nCube = 1; ms.fTurn = ms.fMove = ms.fCubeOwner = -1; ms.gs = GAME_NONE; RestoreTree(pl, TRUE); pmr = plGame->plNext->p; g_assert(pmr->mt == MOVE_GAMEINFO); AddGame(pmr); if (pmr->g.fResigned) { /* setting fTurn = fMove = -1 results in the board being * inverted when shown. /jth 2003-10-12 * ms.fTurn = ms.fMove = -1; */ moverecord *pmrResign = NewMoveRecord(); pmrResign->mt = MOVE_RESIGN; pmrResign->fPlayer = !pmr->g.fWinner; pmrResign->r.nResigned = pmr->g.nPoints / ms.nCube; if (pmrResign->r.nResigned < 1) pmrResign->r.nResigned = 1; else if (pmrResign->r.nResigned > 3) pmrResign->r.nResigned = 3; AddMoveRecord(pmrResign); } } extern void CommandLoadGame(char *sz) { listOLD *pl; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a file to load from (see `help load " "game').")); return; } if ((pl = LoadCollection(sz))) { if (!get_input_discard()) return; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); /* FIXME if pl contains multiple games, ask which one to load */ RestoreGame(pl->plNext->p); FreeGameTreeSeq(pl); UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); #endif /* FIXME : don't do this if we just loaded a single position */ if (fGotoFirstGame) CommandFirstGame(NULL); } } extern void CommandLoadPosition(char *sz) { listOLD *pl; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a file to load from (see `help load " "position').")); return; } if ((pl = LoadCollection(sz))) { if (!get_input_discard()) return; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); /* FIXME if pl contains multiple games, ask which one to load */ RestoreGame(pl->plNext->p); FreeGameTreeSeq(pl); UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); #endif } } extern void CommandLoadMatch(char *sz) { listOLD *pl; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a file to load from (see `help load " "match').")); return; } if ((pl = LoadCollection(sz))) { int nGames = 0, nMoves = 0; /* FIXME make sure the root nodes have MI properties; if not, * we're loading a session. */ if (!get_input_discard()) return; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); for (pl = pl->plNext; pl->p; pl = pl->plNext) { RestoreGame(pl->p); nGames++; } FreeGameTreeSeq(pl); UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) { moverecord *pmr = pl->p; switch (pmr->mt) { case MOVE_NORMAL: case MOVE_DOUBLE: case MOVE_TAKE: case MOVE_DROP: nMoves++; break; default: /* do not count the other pseudo-moves */ break; } } if (nGames == 1 && nMoves == 1) { moverecord *pmr; CommandFirstMove(NULL); pl = plGame->plNext; pmr = pl->p; while (pmr->mt != MOVE_NORMAL && pmr->mt != MOVE_DOUBLE) { CommandNext(NULL); pl = pl->plNext; pmr = pl->p; } CommandPrevious(NULL); } else if (fGotoFirstGame) CommandFirstGame(NULL); } } static void WriteEscapedString(FILE * pf, char *pch, int fEscapeColons) { char *sz, *pc; sz = (char *) g_malloc(2 * strlen(pch) + 1); for (pc = sz; *pch; pch++) switch (*pch) { case '\\': *pc++ = '\\'; *pc++ = '\\'; break; case ':': if (fEscapeColons) *pc++ = '\\'; *pc++ = ':'; break; case ']': *pc++ = '\\'; *pc++ = ']'; break; default: *pc++ = *pch; break; } *pc = 0; fputs(sz, pf); g_free(sz); } static void WriteEvalContext(FILE * pf, const evalcontext * pec) { gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pec->rNoise); fprintf(pf, "ver %d %u%s %u %s %u", SGF_FORMAT_VER, pec->nPlies, pec->fCubeful ? "C" : "", pec->fDeterministic, buffer, pec->fUsePrune); } static void WriteMoveFilters(FILE * pf, movefilter mf[MAX_FILTER_PLIES][MAX_FILTER_PLIES], int nPlies) { int i; gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; for (i = 0; i < nPlies; ++i) { g_ascii_formatd(buffer, sizeof(buffer), "%.5f", mf[nPlies - 1][i].Threshold); fprintf(pf, "%d %d %s ", mf[nPlies - 1][i].Accept, mf[nPlies - 1][i].Extra, buffer); } } static void WriteRolloutContext(FILE * pf, rolloutcontext * prc) { int i; fprintf(pf, "RC %u %u %u %u %u %u %u %u %u %u \"%s\" %lu ", prc->fCubeful, prc->fVarRedn, prc->fInitial, prc->fRotate, prc->fLateEvals, prc->fDoTruncate, prc->nTruncate, prc->fTruncBearoff2, prc->fTruncBearoffOS, prc->nLate, aszRNG[prc->rngRollout], prc->nSeed); for (i = 0; i < 2; i++) { fprintf(pf, " cube%d ", i); WriteEvalContext(pf, &prc->aecCube[i]); fputc(' ', pf); fprintf(pf, " cheq%d ", i); WriteEvalContext(pf, &prc->aecChequer[i]); if (prc->aecChequer[i].nPlies) { fprintf(pf, " filt%d ", i); WriteMoveFilters(pf, prc->aaamfChequer[i], prc->aecChequer[i].nPlies); } } for (i = 0; i < 2; i++) { fprintf(pf, " latecube%d ", i); WriteEvalContext(pf, &prc->aecCubeLate[i]); fputc(' ', pf); fprintf(pf, " latecheq%d ", i); WriteEvalContext(pf, &prc->aecChequerLate[i]); if (prc->aecChequerLate[i].nPlies) { fprintf(pf, " latefilt%d ", i); WriteMoveFilters(pf, prc->aaamfLate[i], prc->aecChequerLate[i].nPlies); } } fprintf(pf, " cubetrunc "); WriteEvalContext(pf, &prc->aecCubeTrunc); fprintf(pf, " cheqtrunc "); WriteEvalContext(pf, &prc->aecChequerTrunc); } static void WriteRolloutAnalysis(FILE * pf, int fIsMove, float rScore, float rScore2, float aarOutput0[NUM_ROLLOUT_OUTPUTS], float aarOutput1[NUM_ROLLOUT_OUTPUTS], float aarStdDev0[NUM_ROLLOUT_OUTPUTS], float aarStdDev1[NUM_ROLLOUT_OUTPUTS], evalsetup * pes) { int i; gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; /* identify what version we're writing to avoid future problems * the version is defined in eval.h */ if (fIsMove) { fprintf(pf, "X ver %d Score ", SGF_FORMAT_VER); g_ascii_formatd(buffer, sizeof(buffer), "%.10g", rScore); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.10g", rScore2); fprintf(pf, "%s ", buffer); } else { fprintf(pf, "X ver %d Eq ", SGF_FORMAT_VER); } fprintf(pf, "Trials %u ", pes->rc.nGamesDone); if (!fIsMove) fprintf(pf, "NoDouble "); fprintf(pf, "Output "); for (i = 0; i < 7; ++i) { g_ascii_formatd(buffer, sizeof(buffer), "%.10g", aarOutput0[i]); fprintf(pf, "%s ", buffer); } fprintf(pf, "StdDev "); for (i = 0; i < 7; ++i) { g_ascii_formatd(buffer, sizeof(buffer), "%.10g", aarStdDev0[i]); fprintf(pf, "%s ", buffer); } if (!fIsMove) { fprintf(pf, "DoubleTake Output "); for (i = 0; i < 7; ++i) { g_ascii_formatd(buffer, sizeof(buffer), "%.10g", aarOutput1[i]); fprintf(pf, "%s ", buffer); } fprintf(pf, "StdDev "); for (i = 0; i < 7; ++i) { g_ascii_formatd(buffer, sizeof(buffer), "%.10g", aarStdDev1[i]); fprintf(pf, "%s ", buffer); } } fprintf(pf, "SK %d ", pes->rc.nSkip); WriteRolloutContext(pf, &pes->rc); } static void WriteDoubleAnalysis(FILE * pf, float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS], evalsetup * pes, int cmark) { gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; int i, j; /* FIXME: removing write of 0 0 0 0 will break existing SGF files */ fputs("DA[", pf); switch (pes->et) { case EVAL_EVAL: g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pes->ec.rNoise); fprintf(pf, "E ver %d %u%s %u %s %u", SGF_FORMAT_VER, pes->ec.nPlies, pes->ec.fCubeful ? "C" : "", pes->ec.fDeterministic, buffer, pes->ec.fUsePrune); for (i = 0; i < 2; i++) { for (j = 0; j < 7; j++) { g_ascii_formatd(buffer, sizeof(buffer), "%.6f", aarOutput[i][j]); fprintf(pf, " %s", buffer); } } break; case EVAL_ROLLOUT: WriteRolloutAnalysis(pf, 0, 0.0f, 0.0f, aarOutput[0], aarOutput[1], aarStdDev[0], aarStdDev[1], pes); break; default: g_assert_not_reached(); } fputc(']', pf); if (cmark) fputs("CR[]", pf); } static void WriteMove(FILE * pf, int fPlayer, int anMove[]) { int i; for (i = 0; i < 8; i++) switch (anMove[i]) { case 24: /* bar */ putc('y', pf); break; case -1: /* off */ if (!(i & 1)) return; putc('z', pf); break; default: putc(fPlayer ? 'x' - anMove[i] : 'a' + anMove[i], pf); } } static void WriteMoveAnalysis(FILE * pf, int fPlayer, movelist * pml, unsigned int iMove) { unsigned int i; gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; fprintf(pf, "A[%u]", iMove); for (i = 0; i < pml->cMoves; i++) { fputc('[', pf); WriteMove(pf, fPlayer, pml->amMoves[i].anMove); fputc(' ', pf); switch (pml->amMoves[i].esMove.et) { case EVAL_NONE: break; case EVAL_EVAL: g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].arEvalMove[0]); fprintf(pf, "E ver %d %s ", SGF_FORMAT_VER, buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].arEvalMove[1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].arEvalMove[2]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].arEvalMove[3]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].arEvalMove[4]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].rScore); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", pml->amMoves[i].esMove.ec.rNoise); fprintf(pf, "%u%s %d %u %s %u", pml->amMoves[i].esMove.ec.nPlies, pml->amMoves[i].esMove.ec.fCubeful ? "C" : "", /* * Former reduced evaluation flag * Kept for backward compatibility ? * Always 0 in SGF ver. 3 */ 0, pml->amMoves[i].esMove.ec.fDeterministic, buffer, pml->amMoves[i].esMove.ec.fUsePrune); break; case EVAL_ROLLOUT: WriteRolloutAnalysis(pf, 1, pml->amMoves[i].rScore, pml->amMoves[i].rScore2, pml->amMoves[i].arEvalMove, 0, pml->amMoves[i].arEvalStdDev, 0, &pml->amMoves[i].esMove); break; default: g_assert_not_reached(); } fputc(']', pf); } fprintf(pf, "MR["); for (i = 0; i < pml->cMoves; i++) { if (pml->amMoves[i].cmark) fprintf(pf, "%u ", i + 1); } fputc(']', pf); } static void WriteLuck(FILE * pf, int fPlayer, float rLuck, lucktype lt) { gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; if (rLuck != ERR_VAL) { g_ascii_formatd(buffer, sizeof(buffer), "%.5f", rLuck); fprintf(pf, "LU[%s]", buffer); } switch (lt) { case LUCK_VERYBAD: fprintf(pf, "G%c[2]", fPlayer ? 'W' : 'B'); break; case LUCK_BAD: fprintf(pf, "G%c[1]", fPlayer ? 'W' : 'B'); break; case LUCK_NONE: break; case LUCK_GOOD: fprintf(pf, "G%c[1]", fPlayer ? 'B' : 'W'); break; case LUCK_VERYGOOD: fprintf(pf, "G%c[2]", fPlayer ? 'B' : 'W'); break; } } static void WriteSkill(FILE * pf, const skilltype st) { switch (st) { case SKILL_VERYBAD: fputs("BM[2]", pf); break; case SKILL_BAD: fputs("BM[1]", pf); break; case SKILL_DOUBTFUL: fputs("DO[]", pf); break; default: break; } } static void WriteSkillCube(FILE * pf, const skilltype st) { switch (st) { case SKILL_VERYBAD: fputs("BC[2]", pf); break; case SKILL_BAD: fputs("BC[1]", pf); break; case SKILL_DOUBTFUL: fputs("DC[]", pf); break; default: break; } } static void WriteStatContext(FILE * pf, statcontext * psc) { lucktype lt; skilltype st; gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; fputs("GS", pf); if (psc->fMoves) { fprintf(pf, "[M:%d %d %d %d ", psc->anUnforcedMoves[0], psc->anUnforcedMoves[1], psc->anTotalMoves[0], psc->anTotalMoves[1]); for (st = SKILL_VERYBAD; st <= SKILL_NONE; st++) fprintf(pf, "%d %d ", psc->anMoves[0][st], psc->anMoves[1][st]); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorCheckerplay[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorCheckerplay[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorCheckerplay[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorCheckerplay[1][1]); fprintf(pf, "%s]", buffer); } if (psc->fCube) { fprintf(pf, "[C:%d %d %d %d %d %d %d %d ", psc->anTotalCube[0], psc->anTotalCube[1], psc->anDouble[0], psc->anDouble[1], psc->anTake[0], psc->anTake[1], psc->anPass[0], psc->anPass[1]); fprintf(pf, "%d %d %d %d %d %d %d %d %d %d %d %d ", psc->anCubeMissedDoubleDP[0], psc->anCubeMissedDoubleDP[1], psc->anCubeMissedDoubleTG[0], psc->anCubeMissedDoubleTG[1], psc->anCubeWrongDoubleDP[0], psc->anCubeWrongDoubleDP[1], psc->anCubeWrongDoubleTG[0], psc->anCubeWrongDoubleTG[1], psc->anCubeWrongTake[0], psc->anCubeWrongTake[1], psc->anCubeWrongPass[0], psc->anCubeWrongPass[1]); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleDP[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleDP[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleTG[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleTG[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleDP[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleDP[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleTG[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleTG[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongTake[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongTake[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongPass[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongPass[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleDP[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleDP[1][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleTG[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorMissedDoubleTG[1][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleDP[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleDP[1][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleTG[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongDoubleTG[1][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongTake[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongTake[1][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongPass[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arErrorWrongPass[1][1]); fprintf(pf, "%s]", buffer); } if (psc->fDice) { fputs("[D:", pf); for (lt = LUCK_VERYBAD; lt <= LUCK_VERYGOOD; lt++) fprintf(pf, "%d %d ", psc->anLuck[0][lt], psc->anLuck[1][lt]); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arLuck[0][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arLuck[0][1]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arLuck[1][0]); fprintf(pf, "%s ", buffer); g_ascii_formatd(buffer, sizeof(buffer), "%.6f", psc->arLuck[1][1]); fprintf(pf, "%s]", buffer); } } static void WriteProperty(FILE * pf, const char *szName, char *szValue) { if (!szValue || !*szValue) return; fputs(szName, pf); putc('[', pf); WriteEscapedString(pf, szValue, FALSE); putc(']', pf); } static void AddRule(FILE * pf, const char *sz, int *pfFirst) { fprintf(pf, "%s%s", (*pfFirst) ? "" : ":", sz); *pfFirst = FALSE; } extern void SaveGame(FILE * pf, listOLD * plGame) { listOLD *pl; moverecord *pmr; unsigned int i, j; TanBoard anBoard; listOLD *pl_hint = NULL; int fMoveNormalSeen; updateStatisticsGame(plGame); pl = plGame->plNext; pmr = pl->p; g_assert(pmr->mt == MOVE_GAMEINFO); /* Fixed header */ fputs("(;FF[4]GM[6]CA[UTF-8]AP[GNU Backgammon:" VERSION "]", pf); /* Match length, if appropriate */ /* FIXME: isn't it always appropriate to write this? */ /* If not, money games will be loaded without score and game number */ /* if( pmr->g.nMatch ) */ fprintf(pf, "MI[length:%d][game:%d][ws:%d][bs:%d]", pmr->g.nMatch, pmr->g.i, pmr->g.anScore[0], pmr->g.anScore[1]); /* Names */ fputs("PW[", pf); WriteEscapedString(pf, ap[0].szName, FALSE); fputs("]PB[", pf); WriteEscapedString(pf, ap[1].szName, FALSE); putc(']', pf); if (!pmr->g.i) { WriteProperty(pf, "WR", mi.pchRating[0]); WriteProperty(pf, "BR", mi.pchRating[1]); if (mi.nYear) { char *szDate = g_strdup_printf("%04u-%02u-%02u", mi.nYear, mi.nMonth, mi.nDay); WriteProperty(pf, "DT", szDate); g_free(szDate); } WriteProperty(pf, "EV", mi.pchEvent); WriteProperty(pf, "RO", mi.pchRound); WriteProperty(pf, "PC", mi.pchPlace); WriteProperty(pf, "AN", mi.pchAnnotator); WriteProperty(pf, "GC", mi.pchComment); } if (pmr->g.fCrawford || pmr->g.fJacoby || pmr->g.bgv != VARIATION_STANDARD || !pmr->g.fCubeUse) { int fFirst = TRUE; fputs("RU[", pf); if (!pmr->g.fCubeUse) AddRule(pf, "NoCube", &fFirst); if (pmr->g.fCrawford) AddRule(pf, "Crawford", &fFirst); if (pmr->g.fCrawfordGame) AddRule(pf, "CrawfordGame", &fFirst); if (pmr->g.fJacoby) AddRule(pf, "Jacoby", &fFirst); if (pmr->g.bgv != VARIATION_STANDARD) { static const char *aszSGFVariation[NUM_VARIATIONS] = { NULL, "Nackgammon", "Hypergammon1", "Hypergammon2", "Hypergammon3" }; AddRule(pf, aszSGFVariation[pmr->g.bgv], &fFirst); } fputs("]", pf); } if (pmr->g.nAutoDoubles) fprintf(pf, "CV[%d]", 1 << pmr->g.nAutoDoubles); if (pmr->g.fWinner >= 0) fprintf(pf, "RE[%c+%d%s]", pmr->g.fWinner ? 'B' : 'W', pmr->g.nPoints, pmr->g.fResigned ? "R" : ""); if (pmr->g.sc.fMoves || pmr->g.sc.fCube || pmr->g.sc.fDice) WriteStatContext(pf, &pmr->g.sc); if (game_is_last(plGame)) pl_hint = game_add_pmr_hint(plGame); fMoveNormalSeen = FALSE; for (pl = pl->plNext; pl != plGame; pl = pl->plNext) { pmr = pl->p; switch (pmr->mt) { case MOVE_NORMAL: fMoveNormalSeen = TRUE; /* sanitise the move if from a hint record */ if (pmr->ml.cMoves && pmr->n.iMove > pmr->ml.cMoves) { memcpy(pmr->n.anMove, pmr->ml.amMoves[0].anMove, sizeof(pmr->n.anMove)); pmr->n.iMove = 0; } fprintf(pf, "\n;%c[%u%u", pmr->fPlayer ? 'B' : 'W', pmr->anDice[0], pmr->anDice[1]); WriteMove(pf, pmr->fPlayer, pmr->n.anMove); putc(']', pf); if (pmr->CubeDecPtr->esDouble.et != EVAL_NONE) WriteDoubleAnalysis(pf, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, pmr->CubeDecPtr->cmark); if (pmr->ml.cMoves) WriteMoveAnalysis(pf, pmr->fPlayer, &pmr->ml, pmr->n.iMove); WriteLuck(pf, pmr->fPlayer, pmr->rLuck, pmr->lt); /* FIXME: separate skill for cube and move */ WriteSkill(pf, pmr->n.stMove); WriteSkillCube(pf, pmr->stCube); break; case MOVE_DOUBLE: /* Last record cannot usually be a legitimate double, it * is a placeholder for hint data for a possible double by * the player on roll. Skip it. See discussion of bug #36716. */ if (pl->plNext == plGame && /* Exception. In a scenario like: copy id from position * with dice not rolled yet / paste it into gnubg / hint * / save, it is reasonable to assume that the user is * interested in the doubling decision analysis. There * was no explicit double action but save the * MOVE_DOUBLE record anyway. */ !(fMoveNormalSeen == FALSE && pmr->CubeDecPtr->esDouble.et != EVAL_NONE)) break; fprintf(pf, "\n;%c[double]", pmr->fPlayer ? 'B' : 'W'); if (pmr->CubeDecPtr->esDouble.et != EVAL_NONE) WriteDoubleAnalysis(pf, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, pmr->CubeDecPtr->cmark); WriteSkill(pf, pmr->stCube); break; case MOVE_TAKE: fprintf(pf, "\n;%c[take]", pmr->fPlayer ? 'B' : 'W'); if (pmr->CubeDecPtr->esDouble.et != EVAL_NONE) WriteDoubleAnalysis(pf, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, pmr->CubeDecPtr->cmark); WriteSkill(pf, pmr->stCube); break; case MOVE_DROP: fprintf(pf, "\n;%c[drop]", pmr->fPlayer ? 'B' : 'W'); if (pmr->CubeDecPtr->esDouble.et != EVAL_NONE) WriteDoubleAnalysis(pf, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, pmr->CubeDecPtr->cmark); WriteSkill(pf, pmr->stCube); break; case MOVE_RESIGN: break; case MOVE_SETBOARD: PositionFromKey(anBoard, &pmr->sb.key); /* Insert a PL record. This will set the right player on * roll when loading a before-diceroll position (instead * of always player 0, which is usually wrong) and is * transparent in the other cases. */ fprintf(pf, "\n;PL[%c]", pmr->fPlayer ? 'B' : 'W'); fputs("AE[a:y]", pf); for (i = 0, j = 0; i < 25; ++i) j += anBoard[1][i]; if (j) { fputs("AW", pf); for (i = 0; i < 25; i++) for (j = 0; j < anBoard[1][i]; j++) fprintf(pf, "[%c]", (char) ('a' + i)); } for (i = 0, j = 0; i < 25; ++i) j += anBoard[0][i]; if (j) { fputs("AB", pf); for (i = 0; i < 25; i++) for (j = 0; j < anBoard[0][i]; j++) fprintf(pf, "[%c]", i == 24 ? 'y' : (char) ('x' - i)); } break; case MOVE_SETDICE: fprintf(pf, "\n;PL[%c]DI[%u%u]", pmr->fPlayer ? 'B' : 'W', pmr->anDice[0], pmr->anDice[1]); WriteLuck(pf, pmr->fPlayer, pmr->rLuck, pmr->lt); break; case MOVE_SETCUBEVAL: fprintf(pf, "\n;CV[%d]", pmr->scv.nCube); break; case MOVE_SETCUBEPOS: fprintf(pf, "\n;CP[%c]", "cwb"[pmr->scp.fCubeOwner + 1]); break; default: g_assert_not_reached(); } if (pmr->sz) { fputs("C[", pf); WriteEscapedString(pf, pmr->sz, FALSE); putc(']', pf); } } if (pl_hint) game_remove_pmr_hint(pl_hint); /* FIXME if the game is not over and the player on roll is the last * player to move, add a PL property */ fputs(")\n", pf); } extern void CommandSaveGame(char *sz) { FILE *pf; sz = NextToken(&sz); if (!plGame) { outputl(_("No game in progress (type `new game' to start one).")); return; } if (!sz || !*sz) { outputl(_("You must specify a file to save to (see `help save " "game').")); return; } if (!confirmOverwrite(sz, fConfirmSave)) return; if (!strcmp(sz, "-")) pf = stdout; else if (!(pf = g_fopen(sz, "w"))) { outputerr(sz); return; } SaveGame(pf, plGame); if (pf != stdout) fclose(pf); setDefaultFileName(sz); } extern void CommandSaveMatch(char *sz) { FILE *pf; listOLD *pl; int fDontClose = FALSE; sz = NextToken(&sz); if (!plGame) { outputl(_("No game in progress (type `new game' to start one).")); return; } /* FIXME what should be done if nMatchTo == 0? */ if (!sz || !*sz) { outputl(_("You must specify a file to save to (see `help save " "match').")); return; } if (!confirmOverwrite(sz, fConfirmSave)) return; if (!strcmp(sz, "-")) { pf = stdout; fDontClose = TRUE; } else if (!(pf = g_fopen(sz, "w"))) { outputerr(sz); return; } for (pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext) SaveGame(pf, pl->p); if (!fDontClose) fclose(pf); setDefaultFileName(sz); delete_autosave(); } extern void CommandSavePosition(char *sz) { FILE *pf; listOLD l; moverecord *pmgi; moverecord *pmsb; moverecord *pmsd = NULL; moverecord *pmr_cur = NULL; moverecord *pmscv; moverecord *pmscp; int fDontClose = FALSE; sz = NextToken(&sz); if (!plGame) { outputl(_("No game in progress (type `new game' to start one).")); return; } if (!sz || !*sz) { outputl(_("You must specify a file to save to (see `help save " "position').")); return; } if (!confirmOverwrite(sz, fConfirmSave)) return; if (!strcmp(sz, "-")) { pf = stdout; fDontClose = TRUE; } else if (!(pf = g_fopen(sz, "w"))) { outputerr(sz); return; } ListCreate(&l); /* gameinfo record */ pmgi = NewMoveRecord(); pmgi->mt = MOVE_GAMEINFO; pmgi->sz = NULL; pmgi->g.i = 0; pmgi->g.nMatch = ms.nMatchTo; pmgi->g.anScore[0] = ms.anScore[0]; pmgi->g.anScore[1] = ms.anScore[1]; pmgi->g.fCrawford = fAutoCrawford && ms.nMatchTo > 1; pmgi->g.fCrawfordGame = ms.fCrawford; pmgi->g.fJacoby = ms.fJacoby && !ms.nMatchTo; pmgi->g.fWinner = -1; pmgi->g.nPoints = 0; pmgi->g.fResigned = FALSE; pmgi->g.nAutoDoubles = 0; pmgi->g.bgv = ms.bgv; pmgi->g.fCubeUse = ms.fCubeUse; IniStatcontext(&pmgi->g.sc); ListInsert(&l, pmgi); /* setboard record */ pmsb = NewMoveRecord(); pmsb->mt = MOVE_SETBOARD; pmsb->fPlayer = ms.fMove; if (ms.fMove) SwapSides(ms.anBoard); PositionKey(msBoard(), &pmsb->sb.key); if (ms.fMove) SwapSides(ms.anBoard); ListInsert(&l, pmsb); /* set cube value */ pmscv = NewMoveRecord(); pmscv->mt = MOVE_SETCUBEVAL; pmscv->scv.nCube = ms.nCube; ListInsert(&l, pmscv); /* cube position */ pmscp = NewMoveRecord(); pmscp->mt = MOVE_SETCUBEPOS; pmscp->scp.fCubeOwner = ms.fCubeOwner; ListInsert(&l, pmscp); /* set dice */ /* FIXME if the dice are not rolled, this should be done with a PL * property (which is SaveGame()'s job) */ pmr_cur = get_current_moverecord(NULL); if (pmr_cur && (pmr_cur->ml.cMoves > 0 || pmr_cur->CubeDecPtr->esDouble.et != EVAL_NONE)) ListInsert(&l, pmr_cur); else if (ms.anDice[0] > 0) { pmsd = NewMoveRecord(); pmsd->mt = MOVE_SETDICE; pmsd->fPlayer = ms.fMove; pmsd->anDice[0] = ms.anDice[0]; pmsd->anDice[1] = ms.anDice[1]; pmsd->lt = LUCK_NONE; pmsd->rLuck = ERR_VAL; ListInsert(&l, pmsd); } /* FIXME add MOVE_DOUBLE record(s) as appropriate */ SaveGame(pf, &l); if (!fDontClose) fclose(pf); while (l.plNext->p) ListDelete(l.plNext); g_free(pmgi); g_free(pmsb); g_free(pmsd); g_free(pmscv); g_free(pmscp); setDefaultFileName(sz); } gnubg-1.08.003/ylwrap000755 001751 000024 00000015314 14600637122 014071 0ustar00pmstaff000000 000000 #! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gnubg-1.08.003/gtktempmap.c000644 001751 000024 00000061675 14574155047 015170 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2003-2022 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtktempmap.c,v 1.65 2022/09/02 13:43:30 plm Exp $ */ /* * Based on Sho Sengoku's Equity Temperature Map * https://bkgm.com/articles/Sengoku/TemperatureMap/index.html */ #include "config.h" #include #include #include #include #include #include "backgammon.h" #include "eval.h" #include "gtktempmap.h" #include "gtkgame.h" #include "drawboard.h" #include "format.h" #include "render.h" #include "renderprefs.h" #include "gtkboard.h" #include "gtkwindows.h" #include "gtkcube.h" #define SIZE_QUADRANT 52 typedef struct { matchstate *pms; float aarEquity[6][6]; float rAverage; GtkWidget *aapwDA[6][6]; GtkWidget *aapwe[6][6]; GtkWidget *pwAverage; GtkWidget *pweAverage; int aaanMove[6][6][8]; gchar *szTitle; } tempmap; typedef struct { unsigned char *achDice[2]; unsigned char *achPips[2]; int fShowEquity; int fShowBestMove; int fInvert; GtkWidget *apwGauge[2]; float rMin, rMax; tempmap *atm; int n; int nSizeDie; } tempmapwidget; /* Retain these from one GTKShowTempMap() to the next */ static int fShowEquity = FALSE; static int fShowBestMove = FALSE; static int TempMapEquities(evalcontext * pec, const matchstate * pms, float aarEquity[6][6], int aaanMove[6][6][8], const gchar * szTitle, const float rFac) { int i, j; float arOutput[NUM_ROLLOUT_OUTPUTS]; TanBoard anBoard; int aaan[6][6][8]; float aar[6][6]; cubeinfo ci; cubeinfo cix; /* calculate equities */ GetMatchStateCubeInfo(&cix, pms); if (szTitle && *szTitle) { gchar *sz = g_strdup_printf(_("Calculating equities for %s"), szTitle); ProgressStartValue(sz, 21); g_free(sz); } else ProgressStartValue(_("Calculating equities"), 21); for (i = 0; i < 6; ++i) for (j = 0; j <= i; ++j) { memcpy(&ci, &cix, sizeof ci); /* find best move */ memcpy(anBoard, pms->anBoard, sizeof(anBoard)); if (FindBestMove(aaan[i][j], i + 1, j + 1, anBoard, &ci, pec, defaultFilters) < 0) { ProgressEnd(); return -1; } /* evaluate resulting position */ SwapSides(anBoard); ci.fMove = !ci.fMove; if (GeneralEvaluationE(arOutput, (ConstTanBoard) anBoard, &ci, pec) < 0) { ProgressEnd(); return -1; } InvertEvaluationR(arOutput, &cix); if (!cix.nMatchTo && rFac != 1.0f) arOutput[OUTPUT_CUBEFUL_EQUITY] *= rFac; aar[i][j] = arOutput[OUTPUT_CUBEFUL_EQUITY]; aar[j][i] = arOutput[OUTPUT_CUBEFUL_EQUITY]; if (i != j) memcpy(aaan[j][i], aaan[i][j], sizeof aaan[0][0]); ProgressValueAdd(1); } ProgressEnd(); memcpy(aarEquity, aar, sizeof aar); memcpy(aaanMove, aaan, sizeof aaan); return 0; } static int CalcTempMapEquities(evalcontext * pec, tempmapwidget * ptmw) { int i; for (i = 0; i < ptmw->n; ++i) if (TempMapEquities(pec, ptmw->atm[i].pms, ptmw->atm[i].aarEquity, ptmw->atm[i].aaanMove, ptmw->atm[i].szTitle, (float) (ptmw->atm[i].pms->nCube / ptmw->atm[0].pms->nCube)) < 0) return -1; return 0; } static void UpdateStyle(GtkWidget * pw, const float r) { GtkStyle *ps = gtk_style_copy(gtk_widget_get_style(pw)); double *gbval; gbval = g_malloc(sizeof(*gbval)); *gbval = 1.0 - (double)r; g_object_set_data_full(G_OBJECT(pw), "gbval", gbval, g_free); ps->bg[GTK_STATE_NORMAL].red = 0xFFFF; ps->bg[GTK_STATE_NORMAL].blue = ps->bg[GTK_STATE_NORMAL].green = (guint16) ((1.0f - r) * 0xFFFF); gtk_widget_set_style(pw, ps); } static void SetStyle(GtkWidget * pw, const float rEquity, const float rMin, const float rMax, const int fInvert) { float r = (rEquity - rMin) / (rMax - rMin); UpdateStyle(pw, fInvert ? (1.0f - r) : r); } static char * GetEquityString(const float rEquity, const cubeinfo * pci, const int fInvert) { float r; if (fInvert) { /* invert equity */ if (pci->nMatchTo) r = 1.0f - rEquity; else r = -rEquity; } else r = rEquity; if (fInvert) { cubeinfo ci; memcpy(&ci, pci, sizeof ci); ci.fMove = !ci.fMove; return OutputMWC(r, &ci, TRUE); } else return OutputMWC(r, pci, TRUE); } static void UpdateTempMapEquities(tempmapwidget * ptmw) { int i, j; float rMax, rMin, r; cubeinfo ci; int m; char szMove[FORMATEDMOVESIZE]; /* calc. min, max and average */ rMax = -10000; rMin = +10000; for (m = 0; m < ptmw->n; ++m) { ptmw->atm[m].rAverage = 0.0f; for (i = 0; i < 6; ++i) for (j = 0; j < 6; ++j) { r = ptmw->atm[m].aarEquity[i][j]; ptmw->atm[m].rAverage += r; if (r > rMax) rMax = r; if (r < rMin) rMin = r; } ptmw->atm[m].rAverage /= 36.0f; } ptmw->rMax = rMax; ptmw->rMin = rMin; /* update styles */ GetMatchStateCubeInfo(&ci, ptmw->atm[0].pms); for (m = 0; m < ptmw->n; ++m) { for (i = 0; i < 6; ++i) for (j = 0; j < 6; ++j) { gchar *sz = g_strdup_printf("%s [%s]", GetEquityString(ptmw->atm[m].aarEquity[i][j], &ci, ptmw->fInvert), FormatMove(szMove, (ConstTanBoard) ptmw->atm[m].pms->anBoard, ptmw->atm[m].aaanMove[i][j])); SetStyle(ptmw->atm[m].aapwDA[i][j], ptmw->atm[m].aarEquity[i][j], rMin, rMax, ptmw->fInvert); gtk_widget_set_tooltip_text(ptmw->atm[m].aapwe[i][j], sz); g_free(sz); gtk_widget_queue_draw(ptmw->atm[m].aapwDA[i][j]); } SetStyle(ptmw->atm[m].pwAverage, ptmw->atm[m].rAverage, rMin, rMax, ptmw->fInvert); gtk_widget_set_tooltip_text(ptmw->atm[m].pweAverage, GetEquityString(ptmw->atm[m].rAverage, &ci, ptmw->fInvert)); gtk_widget_queue_draw(ptmw->atm[m].pwAverage); } /* update labels on gauge */ gtk_label_set_text(GTK_LABEL(ptmw->apwGauge[ptmw->fInvert]), GetEquityString(rMin, &ci, ptmw->fInvert)); gtk_label_set_text(GTK_LABEL(ptmw->apwGauge[!ptmw->fInvert]), GetEquityString(rMax, &ci, ptmw->fInvert)); } static gboolean DrawQuadrant(GtkWidget * pw, cairo_t * cr, tempmapwidget * ptmw) { const int *pi = (int *) g_object_get_data(G_OBJECT(pw), "user_data"); int i = 0; int j = 0; int m = 0; cubeinfo ci; PangoLayout *layout; PangoFontDescription *description; float y; GString *str; char *pch, *tmp; GtkAllocation allocation; gtk_widget_get_allocation(pw, &allocation); #if GTK_CHECK_VERSION(3,0,0) double *gbval = g_object_get_data(G_OBJECT(pw), "gbval"); guint width, height; width = gtk_widget_get_allocated_width(pw); height = gtk_widget_get_allocated_height(pw); cairo_rectangle(cr, 0, 0, width, height); cairo_set_source_rgb(cr, 1.0, *gbval, *gbval); cairo_fill(cr); gtk_render_frame(gtk_widget_get_style_context(pw), cr, 0, 0, width, height); #else (void) cr; /* silence compiler warning */ gtk_paint_box(gtk_widget_get_style(pw), gtk_widget_get_window(pw), GTK_STATE_NORMAL, GTK_SHADOW_IN, NULL, NULL, NULL, 0, 0, allocation.width, allocation.height); #endif if (pi == NULL) return TRUE; if (*pi >= 0) { i = (*pi % 100) / 6; j = (*pi % 100) % 6; m = *pi / 100; } else { m = -(*pi + 1); j = -1; } str = g_string_new(""); if (ptmw->fShowEquity) { float r = 0.0f; if (j >= 0) r = ptmw->atm[m].aarEquity[i][j]; else if (j == -1) r = ptmw->atm[m].rAverage; GetMatchStateCubeInfo(&ci, ptmw->atm[0].pms); tmp = GetEquityString(r, &ci, ptmw->fInvert); while (*tmp == ' ') tmp++; g_string_append(str, tmp); } /* move */ if (j >= 0 && ptmw->fShowBestMove) { char szMove[FORMATEDMOVESIZE]; FormatMovePlain(szMove, (ConstTanBoard)ptmw->atm[m].pms->anBoard, ptmw->atm[m].aaanMove[i][j]); if (ptmw->fShowEquity) g_string_append_printf(str, " %s", szMove); else g_string_append(str, szMove); } if (str->len == 0) { g_string_free(str, TRUE); return TRUE; } pch = str->str; if (ptmw->fShowEquity && j >= 0 && ptmw->fShowBestMove) y = 2; else if (ptmw->fShowEquity) y = (float)(allocation.height - 4) / 2.0f; else y = 2 + (float)(allocation.height - 4) / 10.0f; description = pango_font_description_from_string("sans"); pango_font_description_set_size(description, allocation.height * PANGO_SCALE / 8); layout = gtk_widget_create_pango_layout(pw, NULL); pango_layout_set_font_description(layout, description); do { tmp = strchr(pch, ' '); if (tmp) *tmp = 0; pango_layout_set_text(layout, pch, -1); #if GTK_CHECK_VERSION(3,0,0) gtk_render_layout(gtk_widget_get_style_context(pw), cr, 2.0, (double)y, layout); #else gtk_paint_layout(gtk_widget_get_style(pw), gtk_widget_get_window(pw), GTK_STATE_NORMAL, TRUE, NULL, pw, NULL, 2, (int) y, layout); #endif if (tmp) { pch = tmp + 1; y += (float)(allocation.height - 4) / 5.0f; } } while (tmp); g_object_unref(layout); g_string_free(str, TRUE); return TRUE; } #if ! GTK_CHECK_VERSION(3,0,0) static void ExposeQuadrant(GtkWidget * pw, GdkEventExpose * UNUSED(pev), tempmapwidget * ptmw) { cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(pw)); DrawQuadrant(pw, cr, ptmw); cairo_destroy(cr); } #endif static void ExposeDieArea(GtkWidget * pw, cairo_t * cr, gint area_x, gint area_y, gint area_width, gint area_height, tempmapwidget * ptmw) { const int *pi = (int *) g_object_get_data(G_OBJECT(pw), "user_data"); int x, y; int nSizeDie; GtkAllocation allocation; gtk_widget_get_allocation(pw, &allocation); nSizeDie = (allocation.width - 4) / 7; if (nSizeDie > ((allocation.height - 4) / 7)) nSizeDie = (allocation.height - 4) / 7; if (ptmw->nSizeDie != nSizeDie) { int i; renderdata rd; /* render die */ CopyAppearance(&rd); rd.nSize = ptmw->nSizeDie = nSizeDie; #if defined(USE_BOARD3D) Copy3dDiceColour(&rd); #endif for (i = 0; i < 2; ++i) { g_free(ptmw->achDice[i]); g_free(ptmw->achPips[i]); ptmw->achDice[i] = (unsigned char *) g_malloc(nSizeDie * nSizeDie * 7 * 7 * 4); ptmw->achPips[i] = (unsigned char *) g_malloc(nSizeDie * nSizeDie * 3); } RenderDice(&rd, ptmw->achDice[0], ptmw->achDice[1], nSizeDie * 7 * 4, FALSE); RenderPips(&rd, ptmw->achPips[0], ptmw->achPips[1], nSizeDie * 3); } x = (allocation.width - ptmw->nSizeDie * 7) / 2; y = (allocation.height - ptmw->nSizeDie * 7) / 2; cairo_save(cr); cairo_rectangle(cr, area_x, area_y, area_width, area_height); cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); cairo_fill(cr); cairo_restore(cr); DrawDie(cr, ptmw->achDice, ptmw->achPips, ptmw->nSizeDie, x, y, ptmw->atm[0].pms->fMove, *pi + 1, FALSE); } #if GTK_CHECK_VERSION(3,0,0) static gboolean ExposeDie(GtkWidget * pw, cairo_t * cr, tempmapwidget * ptmw) { ExposeDieArea(pw, cr, 3, 3, gtk_widget_get_allocated_width(pw) - 6, gtk_widget_get_allocated_height(pw) - 6, ptmw); return TRUE; } #else static void ExposeDie(GtkWidget * pw, GdkEventExpose * pev, tempmapwidget * ptmw) { cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(pw)); ExposeDieArea(pw, cr, pev->area.x, pev->area.y, pev->area.width, pev->area.height, ptmw); cairo_destroy(cr); } #endif static void TempMapPlyToggled(GtkWidget * pw, tempmapwidget * ptmw) { const int *pi = (int *) g_object_get_data(G_OBJECT(pw), "user_data"); evalcontext ec = { TRUE, 0, FALSE, TRUE, 0.0 }; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw))) { /* recalculate equities */ ec.nPlies = *pi; if (CalcTempMapEquities(&ec, ptmw)) return; UpdateTempMapEquities(ptmw); } } static void ShowEquityToggled(GtkWidget * pw, tempmapwidget * ptmw) { int f = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw)); if (f != ptmw->fShowEquity) { fShowEquity = ptmw->fShowEquity = f; UpdateTempMapEquities(ptmw); } } static void ShowBestMoveToggled(GtkWidget * pw, tempmapwidget * ptmw) { int f = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw)); if (f != ptmw->fShowBestMove) { fShowBestMove = ptmw->fShowBestMove = f; UpdateTempMapEquities(ptmw); } } static void DestroyDialog(gpointer p, GObject * UNUSED(obj)) { tempmapwidget *ptmw = (tempmapwidget *) p; int i; /* garbage collect */ g_free(ptmw->achDice[0]); g_free(ptmw->achDice[1]); g_free(ptmw->achPips[0]); g_free(ptmw->achPips[1]); for (i = 0; i < ptmw->n; ++i) { g_free(ptmw->atm[i].pms); g_free(ptmw->atm[i].szTitle); } g_free(ptmw->atm); g_free(ptmw); } extern void GTKShowTempMap(const matchstate ams[], const int n, gchar * aszTitle[], const int fInvert) { evalcontext ec = { TRUE, 0, FALSE, TRUE, 0.0 }; tempmapwidget *ptmw; int *pi; int i, j; GtkWidget *pwDialog; GtkWidget *pwv; GtkWidget *pw; GtkWidget *pwh; GtkWidget *pwx = NULL; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwOuterGrid; GtkWidget *pwGrid = NULL; #else GtkWidget *pwOuterTable; GtkWidget *pwTable = NULL; #endif int k, l, km, lm, m; /* dialog */ if (!cubeTempMapAtMoney) { pwDialog = GTKCreateDialog(_("Sho Sengoku Temperature Map - Distribution of Rolls"), DT_INFO, NULL, DIALOG_FLAG_MODAL, NULL, NULL); } else { pwDialog = GTKCreateDialog(_("Temperature Map in Hypothetical Money Play"), DT_INFO, NULL, DIALOG_FLAG_MODAL, NULL, NULL); } ptmw = (tempmapwidget *) g_malloc(sizeof(tempmapwidget)); ptmw->fShowBestMove = fShowBestMove; ptmw->fShowEquity = fShowEquity; ptmw->fInvert = fInvert; ptmw->n = n; ptmw->nSizeDie = -1; ptmw->achDice[0] = ptmw->achDice[1] = NULL; ptmw->achPips[0] = ptmw->achPips[1] = NULL; ptmw->atm = (tempmap *) g_malloc(n * sizeof(tempmap)); for (i = 0; i < n; ++i) { ptmw->atm[i].pms = (matchstate *) g_malloc(sizeof(matchstate)); memcpy(ptmw->atm[i].pms, &ams[i], sizeof(matchstate)); } /* vbox to hold tree widget and buttons */ #if GTK_CHECK_VERSION(3,0,0) pwv = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); #else pwv = gtk_vbox_new(FALSE, 6); #endif gtk_container_set_border_width(GTK_CONTAINER(pwv), 6); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwv); /* calculate number of rows and columns */ for (lm = 1; /**/; ++lm) if (lm * lm >= n) break; for (km = 1; km * lm < n; ++km); #if GTK_CHECK_VERSION(3,0,0) pwOuterGrid = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pwOuterGrid), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pwOuterGrid), TRUE); gtk_box_pack_start(GTK_BOX(pwv), pwOuterGrid, TRUE, TRUE, 0); #else pwOuterTable = gtk_table_new(km, lm, TRUE); gtk_box_pack_start(GTK_BOX(pwv), pwOuterTable, TRUE, TRUE, 0); #endif for (k = m = 0; k < km; ++k) for (l = 0; l < lm && m < n; ++l, ++m) { tempmap *ptm = &ptmw->atm[m]; ptm->szTitle = (aszTitle && aszTitle[m] && *aszTitle[m]) ? g_strdup(aszTitle[m]) : NULL; pw = gtk_frame_new(ptm->szTitle); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwOuterGrid), pw, l, k, 1, 1); pwGrid = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pwGrid), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pwGrid), TRUE); gtk_container_add(GTK_CONTAINER(pw), pwGrid); #else gtk_table_attach_defaults(GTK_TABLE(pwOuterTable), pw, l, l + 1, k, k + 1); pwTable = gtk_table_new(7, 7, TRUE); gtk_container_add(GTK_CONTAINER(pw), pwTable); #endif /* drawing areas */ for (i = 0; i < 6; ++i) { for (j = 0; j < 6; ++j) { ptm->aapwDA[i][j] = gtk_drawing_area_new(); ptm->aapwe[i][j] = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(ptm->aapwe[i][j]), FALSE); gtk_container_add(GTK_CONTAINER(ptm->aapwe[i][j]), ptm->aapwDA[i][j]); gtk_widget_set_size_request(ptm->aapwDA[i][j], SIZE_QUADRANT, SIZE_QUADRANT); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), ptm->aapwe[i][j], i + 1, j + 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), ptm->aapwe[i][j], i + 1, i + 2, j + 1, j + 2); #endif pi = (int *) g_malloc(sizeof(int)); *pi = i * 6 + j + m * 100; g_object_set_data_full(G_OBJECT(ptm->aapwDA[i][j]), "user_data", pi, g_free); #if GTK_CHECK_VERSION(3,0,0) gtk_style_context_add_class(gtk_widget_get_style_context(ptm->aapwDA[i][j]), "gnubg-temp-map-quadrant"); g_signal_connect(G_OBJECT(ptm->aapwDA[i][j]), "draw", G_CALLBACK(DrawQuadrant), ptmw); #else g_signal_connect(G_OBJECT(ptm->aapwDA[i][j]), "expose_event", G_CALLBACK(ExposeQuadrant), ptmw); #endif } /* die */ pw = gtk_drawing_area_new(); gtk_widget_set_size_request(pw, SIZE_QUADRANT, SIZE_QUADRANT); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw, 0, i + 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pw, 0, 1, i + 1, i + 2); #endif pi = (int *) g_malloc(sizeof(int)); *pi = i; g_object_set_data_full(G_OBJECT(pw), "user_data", pi, g_free); #if GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(pw), "draw", G_CALLBACK(ExposeDie), ptmw); #else g_signal_connect(G_OBJECT(pw), "expose_event", G_CALLBACK(ExposeDie), ptmw); #endif /* die */ pw = gtk_drawing_area_new(); gtk_widget_set_size_request(pw, SIZE_QUADRANT, SIZE_QUADRANT); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw, i + 1, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pw, i + 1, i + 2, 0, 1); #endif pi = (int *) g_malloc(sizeof(int)); *pi = i; g_object_set_data_full(G_OBJECT(pw), "user_data", pi, g_free); #if GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(pw), "draw", G_CALLBACK(ExposeDie), ptmw); #else g_signal_connect(G_OBJECT(pw), "expose_event", G_CALLBACK(ExposeDie), ptmw); #endif } /* drawing area for average */ ptm->pwAverage = gtk_drawing_area_new(); ptm->pweAverage = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(ptm->pweAverage), FALSE); gtk_container_add(GTK_CONTAINER(ptm->pweAverage), ptm->pwAverage); gtk_widget_set_size_request(ptm->pwAverage, SIZE_QUADRANT, SIZE_QUADRANT); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), ptm->pweAverage, 0, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), ptm->pweAverage, 0, 1, 0, 1); #endif pi = (int *) g_malloc(sizeof(int)); *pi = -m - 1; g_object_set_data_full(G_OBJECT(ptm->pwAverage), "user_data", pi, g_free); #if GTK_CHECK_VERSION(3,0,0) gtk_style_context_add_class(gtk_widget_get_style_context(ptm->pwAverage), "gnubg-temp-map-quadrant"); g_signal_connect(G_OBJECT(ptm->pwAverage), "draw", G_CALLBACK(DrawQuadrant), ptmw); #else g_signal_connect(G_OBJECT(ptm->pwAverage), "expose_event", G_CALLBACK(ExposeQuadrant), ptmw); #endif } /* separator */ #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwv), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 0); #else gtk_box_pack_start(GTK_BOX(pwv), gtk_hseparator_new(), FALSE, FALSE, 0); #endif /* gauge */ #if GTK_CHECK_VERSION(3,0,0) pwGrid = gtk_grid_new(); gtk_box_pack_start(GTK_BOX(pwv), pwGrid, FALSE, FALSE, 0); #else pwTable = gtk_table_new(2, 16, FALSE); gtk_box_pack_start(GTK_BOX(pwv), pwTable, FALSE, FALSE, 0); #endif for (i = 0; i < 16; ++i) { pw = gtk_drawing_area_new(); gtk_widget_set_size_request(pw, 15, 20); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw, i, 1, 1, 1); gtk_widget_set_hexpand(pw, TRUE); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), pw, i, i + 1, 1, 2); #endif g_object_set_data(G_OBJECT(pw), "user_data", NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_style_context_add_class(gtk_widget_get_style_context(pw), "gnubg-temp-map-quadrant"); g_signal_connect(G_OBJECT(pw), "draw", G_CALLBACK(DrawQuadrant), NULL); #else g_signal_connect(G_OBJECT(pw), "expose_event", G_CALLBACK(ExposeQuadrant), NULL); #endif UpdateStyle(pw, (float)i / 15.0f); } for (i = 0; i < 2; ++i) { ptmw->apwGauge[i] = gtk_label_new(""); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), ptmw->apwGauge[i], 15 * i, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(pwTable), ptmw->apwGauge[i], 15 * i, 15 * i + 1, 0, 1); #endif } /* separator */ #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwv), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 0); #else gtk_box_pack_start(GTK_BOX(pwv), gtk_hseparator_new(), FALSE, FALSE, 0); #endif /* buttons */ #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #else pwh = gtk_hbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwv), pwh, FALSE, FALSE, 0); for (i = 0; i < 4; ++i) { gchar *sz = g_strdup_printf(_("%d ply"), i); if (i == 0) pw = pwx = gtk_radio_button_new_with_label(NULL, sz); else pw = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwx), sz); g_free(sz); gtk_box_pack_start(GTK_BOX(pwh), pw, FALSE, FALSE, 0); pi = (int *) g_malloc(sizeof(int)); *pi = i; g_object_set_data_full(G_OBJECT(pw), "user_data", pi, g_free); g_signal_connect(G_OBJECT(pw), "toggled", G_CALLBACK(TempMapPlyToggled), ptmw); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwx), TRUE); /* show-buttons */ if (n < 2) { #if GTK_CHECK_VERSION(3,0,0) pwh = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #else pwh = gtk_hbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwv), pwh, FALSE, FALSE, 0); } pw = gtk_check_button_new_with_label(_("Show equities")); gtk_toggle_button_set_active((GtkToggleButton *) pw, ptmw->fShowEquity); gtk_box_pack_end(GTK_BOX(pwh), pw, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pw), "toggled", G_CALLBACK(ShowEquityToggled), ptmw); pw = gtk_check_button_new_with_label(_("Show best move")); gtk_toggle_button_set_active((GtkToggleButton *) pw, ptmw->fShowBestMove); gtk_box_pack_end(GTK_BOX(pwh), pw, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pw), "toggled", G_CALLBACK(ShowBestMoveToggled), ptmw); /* update */ CalcTempMapEquities(&ec, ptmw); UpdateTempMapEquities(ptmw); /* modality */ gtk_window_set_default_size(GTK_WINDOW(pwDialog), 400, 500); g_object_weak_ref(G_OBJECT(pwDialog), DestroyDialog, ptmw); GTKRunDialog(pwDialog); } gnubg-1.08.003/gtkmovelist.c000644 001751 000024 00000034334 14574155047 015357 0ustar00pmstaff000000 000000 /* * Copyright (C) 2005-2009 Jon Kinsey * Copyright (C) 2006-2018 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkmovelist.c,v 1.44 2022/12/15 22:23:00 plm Exp $ */ #include "config.h" #include "gtklocdefs.h" #include "gtkgame.h" #include #include "format.h" #include "gtkmovelistctrl.h" #include "drawboard.h" #define DETAIL_COLUMN_COUNT 11 #define MIN_COLUMN_COUNT 5 enum { ML_COL_RANK = 0, ML_COL_TYPE, ML_COL_WIN, ML_COL_GWIN, ML_COL_BGWIN, ML_COL_LOSS, ML_COL_GLOSS, ML_COL_BGLOSS, ML_COL_EQUITY, ML_COL_DIFF, ML_COL_MOVE, ML_COL_FGCOL, ML_COL_DATA }; extern void MoveListCreate(hintdata * phd) { static const char *aszTitleDetails[] = { N_("Rank"), N_("analysisType|Type"), N_("Win"), N_("W g"), N_("W bg"), N_("Lose"), N_("L g"), N_("L bg"), NULL, N_("Diff."), N_("Move") }; unsigned int i; int showWLTree = showMoveListDetail && !phd->fDetails; /* Create list widget */ GtkListStore *store; GtkTreeIter iter; GtkTreeSelection *sel; GtkWidget *view = gtk_tree_view_new(); int offset = (phd->fDetails) ? 0 : MIN_COLUMN_COUNT - DETAIL_COLUMN_COUNT; if (showWLTree) { GtkStyle *psDefault = gtk_widget_get_style(view); GtkCellRenderer *renderer = custom_cell_renderer_movelist_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_RANK]), renderer, "movelist", 0, "rank", 1, NULL); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); g_object_set(renderer, "cell-background-gdk", &psDefault->bg[GTK_STATE_NORMAL], "cell-background-set", TRUE, NULL); g_object_set_data(G_OBJECT(view), "hintdata", phd); } else { GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "ypad", 0, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_RANK]), renderer, "text", ML_COL_RANK, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, Q_(aszTitleDetails[ML_COL_TYPE]), renderer, "text", ML_COL_TYPE, "foreground", ML_COL_FGCOL + offset, NULL); if (phd->fDetails) { gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_WIN]), renderer, "text", ML_COL_WIN, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_GWIN]), renderer, "text", ML_COL_GWIN, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_BGWIN]), renderer, "text", ML_COL_BGWIN, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_LOSS]), renderer, "text", ML_COL_LOSS, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_GLOSS]), renderer, "text", ML_COL_GLOSS, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_BGLOSS]), renderer, "text", ML_COL_BGLOSS, "foreground", ML_COL_FGCOL + offset, NULL); } gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_EQUITY], renderer, "text", ML_COL_EQUITY + offset, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _(aszTitleDetails[ML_COL_DIFF]), renderer, "text", ML_COL_DIFF + offset, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, Q_(aszTitleDetails[ML_COL_MOVE]), renderer, "text", ML_COL_MOVE + offset, "foreground", ML_COL_FGCOL + offset, NULL); } phd->pwMoves = view; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE); g_signal_connect(view, "row-activated", G_CALLBACK(HintDoubleClick), phd); g_signal_connect(sel, "changed", G_CALLBACK(HintSelect), phd); /* Add empty rows */ if (phd->fDetails) store = gtk_list_store_new(DETAIL_COLUMN_COUNT + 2, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); else { if (showWLTree) store = gtk_list_store_new(2, G_TYPE_POINTER, G_TYPE_INT); else store = gtk_list_store_new(MIN_COLUMN_COUNT + 2, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); } for (i = 0; i < phd->pml->cMoves; i++) gtk_list_store_append(store, &iter); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); MoveListUpdate(phd); } float rBest; GtkStyle *psHighlight = NULL; extern void MoveListRefreshSize(void) { custom_cell_renderer_invalidate_size(); if (pwMoveAnalysis) { hintdata *phd = (hintdata *) g_object_get_data(G_OBJECT(pwMoveAnalysis), "user_data"); MoveListUpdate(phd); } } /* * Call UpdateMostList to update the movelist in the GTK hint window. * For example, after new evaluations, rollouts or toggle of MWC/Equity. * */ extern void MoveListUpdate(const hintdata * phd) { unsigned int i, j, colNum; char sz[32]; cubeinfo ci; movelist *pml = phd->pml; int col = phd->fDetails ? 8 : 2; int showWLTree = showMoveListDetail && !phd->fDetails; int offset = (phd->fDetails) ? 0 : MIN_COLUMN_COUNT - DETAIL_COLUMN_COUNT; GtkTreeIter iter; GtkListStore *store; store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(phd->pwMoves))); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); if (!psHighlight) { /* Get highlight style first time in */ GtkStyle *psTemp; GtkStyle *psMoves = gtk_widget_get_style(phd->pwMoves); GetStyleFromRCFile(&psHighlight, "move-done", psMoves); /* Use correct background colour when selected */ memcpy(&psHighlight->bg[GTK_STATE_SELECTED], &psMoves->bg[GTK_STATE_SELECTED], sizeof(GdkColor)); /* Also get colour to use for w/l stats in detail view */ GetStyleFromRCFile(&psTemp, "move-winlossfg", psMoves); memcpy(&wlCol, &psTemp->fg[GTK_STATE_NORMAL], sizeof(GdkColor)); g_object_unref(psTemp); } /* This function should only be called when the game state matches * the move list. */ g_assert(ms.fMove == 0 || ms.fMove == 1); GetMatchStateCubeInfo(&ci, &ms); rBest = pml->amMoves[0].rScore; if (!showWLTree) gtk_tree_view_column_set_title(gtk_tree_view_get_column(GTK_TREE_VIEW(phd->pwMoves), col), (fOutputMWC && ms.nMatchTo) ? _("MWC") : _("Equity")); for (i = 0; i < pml->cMoves; i++) { float *ar = pml->amMoves[i].arEvalMove; int rankKnown; const char *highlight_sz; if (showWLTree) gtk_list_store_set(store, &iter, 0, pml->amMoves + i, -1); else gtk_list_store_set(store, &iter, ML_COL_DATA + offset, pml->amMoves + i, -1); rankKnown = 1; if (i && i == pml->cMoves - 1 && phd->piHighlight && i == *phd->piHighlight) /* The move made is the last on the list. Some moves might * have been deleted to fit this one in */ { /* Lets count how many moves are possible to see if this is the last move */ movelist ml; int dice[2]; memcpy(dice, ms.anDice, sizeof(dice)); if (!dice[0]) { /* If the dice have got lost, try to find them */ moverecord *pmr = (moverecord *) plLastMove->plNext->p; if (pmr) { dice[0] = pmr->anDice[0]; dice[1] = pmr->anDice[1]; } } GenerateMoves(&ml, msBoard(), dice[0], dice[1], FALSE); if (i < ml.cMoves - 1) rankKnown = 0; } highlight_sz = (phd->piHighlight && *phd->piHighlight == i) ? "*" : ""; if (rankKnown) sprintf(sz, "%s%s%u", pml->amMoves[i].cmark ? "+" : "", highlight_sz, i + 1); else sprintf(sz, "%s%s??", pml->amMoves[i].cmark ? "+" : "", highlight_sz); if (showWLTree) { gtk_list_store_set(store, &iter, 1, rankKnown ? (int) i + 1 : -1, -1); goto skipoldcode; } else gtk_list_store_set(store, &iter, ML_COL_RANK, sz, -1); FormatEval(sz, &pml->amMoves[i].esMove); gtk_list_store_set(store, &iter, ML_COL_TYPE, sz, -1); /* gwc */ if (phd->fDetails) { colNum = ML_COL_WIN; for (j = 0; j < 5; j++) { if (j == 3) { gtk_list_store_set(store, &iter, colNum, OutputPercent(1.0f - ar[OUTPUT_WIN]), -1); colNum++; } gtk_list_store_set(store, &iter, colNum, OutputPercent(ar[j]), -1); colNum++; } } /* cubeless equity */ gtk_list_store_set(store, &iter, ML_COL_EQUITY + offset, OutputEquity(pml->amMoves[i].rScore, &ci, TRUE), -1); if (i != 0) { gtk_list_store_set(store, &iter, ML_COL_DIFF + offset, OutputEquityDiff(pml->amMoves[i].rScore, rBest, &ci), -1); } gtk_list_store_set(store, &iter, ML_COL_MOVE + offset, FormatMove(sz, msBoard(), pml->amMoves[i].anMove), -1); /* highlight row */ if (phd->piHighlight && *phd->piHighlight == i) { char buf[20]; sprintf(buf, "#%02x%02x%02x", psHighlight->fg[GTK_STATE_SELECTED].red / 256, psHighlight->fg[GTK_STATE_SELECTED].green / 256, psHighlight->fg[GTK_STATE_SELECTED].blue / 256); gtk_list_store_set(store, &iter, ML_COL_FGCOL + offset, buf, -1); } else gtk_list_store_set(store, &iter, ML_COL_FGCOL + offset, NULL, -1); skipoldcode: /* Messy as 3 copies of code at moment... */ gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter); } } extern GList * MoveListGetSelectionList(const hintdata * phd) { GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(phd->pwMoves)); GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(phd->pwMoves)); return gtk_tree_selection_get_selected_rows(sel, &model); } /* gtk_tree_path_free() is not the right function type * to be called directly from g_list_foreach() below */ static inline void my_gtk_tree_path_free(gpointer data, gpointer UNUSED(user_data)) { gtk_tree_path_free((GtkTreePath *) data); } extern void MoveListFreeSelectionList(GList * pl) { g_list_foreach(pl, my_gtk_tree_path_free, NULL); g_list_free(pl); } extern move * MoveListGetMove(const hintdata * phd, GList * pl) { move *m; int showWLTree = showMoveListDetail && !phd->fDetails; int col, offset = (phd->fDetails) ? 0 : MIN_COLUMN_COUNT - DETAIL_COLUMN_COUNT; GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(phd->pwMoves)); gboolean check = gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) (pl->data)); g_assert(check == TRUE); #if defined(G_DISABLE_ASSERT) (void)check; /* silence warning about unused variable */ #endif if (showWLTree) col = 0; else col = ML_COL_DATA + offset; gtk_tree_model_get(model, &iter, col, &m, -1); return m; } extern void MoveListShowToggledClicked(GtkWidget * UNUSED(pw), hintdata * phd) { int f = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(phd->pwShow)); if (f) gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(phd->pwMoves)), GTK_SELECTION_SINGLE); else gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(phd->pwMoves)), GTK_SELECTION_MULTIPLE); ShowMove(phd, f); } extern gint MoveListClearSelection(GtkWidget * UNUSED(pw), GdkEventSelection * UNUSED(pes), hintdata * phd) { gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(phd->pwMoves))); return TRUE; } gnubg-1.08.003/gtktoolbar.h000644 001751 000024 00000003245 14574155047 015161 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2003-2011 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtktoolbar.h,v 1.16 2021/06/30 21:11:44 plm Exp $ */ #ifndef GTKTOOLBAR_H #define GTKTOOLBAR_H #include "gtkboard.h" #if defined(USE_GTKITEMFACTORY) extern GtkItemFactory *pif; #endif typedef enum { C_NONE, C_ROLLDOUBLE, C_TAKEDROP, C_AGREEDECLINE, C_PLAY } toolbarcontrol; extern GtkWidget *ToolbarNew(void); extern toolbarcontrol ToolbarUpdate(GtkWidget * pwToolbar, const matchstate * pms, const DiceShown diceShown, const int fComputerTurn, const int fPlaying); extern int ToolbarIsEditing(GtkWidget * pwToolbar); extern void ToolbarActivateEdit(GtkWidget * pwToolbar); extern void ToolbarSetPlaying(GtkWidget * pwToolbar, const int f); extern void ToolbarSetClockwise(GtkWidget * pwToolbar, const int f); extern GtkWidget *image_from_xpm_d(char **xpm, GtkWidget * pw); extern void click_edit(void); extern void click_swapdirection(void); #endif /* GTKTOOLBAR_H */ gnubg-1.08.003/multithread.c000644 001751 000024 00000040426 14612213440 015311 0ustar00pmstaff000000 000000 /* * Copyright (C) 2007-2009 Jon Kinsey * Copyright (C) 2007-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #if defined(WIN32) #include #endif #include #include #include #include #if defined(USE_GTK) #include "gtkgame.h" #endif #include "multithread.h" #include "rollout.h" #include "util.h" #include "drawboard.h" /*for FormatMove()*/ #include "lib/simd.h" #if defined(USE_MULTITHREAD) static GThread* thread[MAX_NUMTHREADS]; extern unsigned int MT_GetNumThreads(void) { return td.numThreads; } extern void MT_CloseThreads(void) { unsigned int i; MT_SafeSet(&td.closingThreads, TRUE); mt_add_tasks(td.numThreads, CloseThread, NULL, NULL); if (MT_WaitForTasks(NULL, 0, FALSE) != (int) td.numThreads) g_print(_("Error closing threads!\n")); for (i = 0; i < td.numThreads; i++) g_thread_join(thread[i]); } static void MT_TaskDone(Task * pt) { MT_SafeInc(&td.doneTasks); if (pt) { free(pt->pLinkedTask); g_free(pt); } } static Task * MT_GetTask(void) { Task *task = NULL; multi_debug("get task asks lock (queueLock)"); Mutex_Lock(&td.queueLock); multi_debug("get task gets lock (queueLock)"); if (g_list_length(td.tasks) > 0) { task = (Task *) g_list_first(td.tasks)->data; td.tasks = g_list_delete_link(td.tasks, g_list_first(td.tasks)); if (g_list_length(td.tasks) == 0) { ResetManualEvent(td.activity); } } Mutex_Release(&td.queueLock); multi_debug("get task unlocks (queueLock)"); return task; } extern void MT_AbortTasks(void) { Task *task; /* Remove tasks from list */ while ((task = MT_GetTask()) != NULL) MT_TaskDone(task); MT_SafeSet(&td.result, -1); } static SIMD_STACKALIGN gpointer MT_WorkerThreadFunction(void *tld) { #if 0 /* why do we need this align ? - because of a gcc bug */ #if __GNUC__ && defined(WIN32) /* Align stack pointer on 16/32 byte boundary so SSE/AVX variables work correctly */ int align_offset; #if defined(USE_AVX) __asm__ __volatile__("andl $-32, %%esp":::"%esp"); align_offset = ((int) (&align_offset)) % 32; #else __asm__ __volatile__("andl $-16, %%esp":::"%esp"); align_offset = ((int) (&align_offset)) % 16; #endif #endif #endif { ThreadLocalData *pTLD = (ThreadLocalData *) tld; TLSSetValue(td.tlsItem, (size_t) pTLD); MT_SafeInc(&td.result); MT_TaskDone(NULL); /* Thread created */ do { Task *task; WaitForManualEvent(td.activity); task = MT_GetTask(); if (task) { task->fun(task->data); MT_TaskDone(task); } } while (MT_SafeCompare(&td.closingThreads, FALSE)); #if 0 #if __GNUC__ && defined(WIN32) /* De-align stack pointer to avoid crash on exit */ __asm__ __volatile__("addl %0, %%esp"::"r"(align_offset):"%esp"); #endif #endif return NULL; } } static gboolean WaitingForThreads(gpointer UNUSED(unused)) { /* Unlikely to be called */ multi_debug("waiting for threads to be created!"); return FALSE; } static void MT_CreateThreads(void) { unsigned int i; #if defined(DEBUG_MULTITHREADED) gchar *buf; buf = g_strdup_printf("creating %u thread%s", td.numThreads, (td.numThreads > 1 ? "s" : "")); multi_debug(buf); g_free(buf); #endif MT_SafeSet(&td.result, 0); MT_SafeSet(&td.closingThreads, FALSE); for (i = 0; i < td.numThreads; i++) { ThreadLocalData *pTLD = MT_CreateThreadLocalData(i); #if GLIB_CHECK_VERSION (2,32,0) if (!(thread[i] = g_thread_try_new(NULL, MT_WorkerThreadFunction, pTLD, NULL))) #else if (!(thread[i] = g_thread_create(MT_WorkerThreadFunction, pTLD, TRUE, NULL))) #endif printf(_("Failed to create thread\n")); #if defined(DEBUG_MULTITHREADED) else { buf = g_strdup_printf("thread %u created", i); multi_debug(buf); g_free(buf); } #endif } td.addedTasks = td.numThreads; /* Wait for all the threads to be created (timeout after 1 second) */ if (MT_WaitForTasks(WaitingForThreads, 1000, FALSE) != (int) td.numThreads) g_print(_("Error creating threads!\n")); } void MT_SetNumThreads(unsigned int num) { if (num != td.numThreads) { if (td.numThreads != 0) MT_CloseThreads(); td.numThreads = num; MT_CreateThreads(); if (num == 1) { /* No locking in evals */ EvaluatePosition = EvaluatePositionNoLocking; GeneralCubeDecisionE = GeneralCubeDecisionENoLocking; GeneralEvaluationE = GeneralEvaluationENoLocking; ScoreMove = ScoreMoveNoLocking; FindBestMove = FindBestMoveNoLocking; FindnSaveBestMoves = FindnSaveBestMovesNoLocking; BasicCubefulRollout = BasicCubefulRolloutNoLocking; } else { /* Locking version of evals */ EvaluatePosition = EvaluatePositionWithLocking; GeneralCubeDecisionE = GeneralCubeDecisionEWithLocking; GeneralEvaluationE = GeneralEvaluationEWithLocking; ScoreMove = ScoreMoveWithLocking; FindBestMove = FindBestMoveWithLocking; FindnSaveBestMoves = FindnSaveBestMovesWithLocking; BasicCubefulRollout = BasicCubefulRolloutWithLocking; } } } extern void MT_StartThreads(void) { if (td.numThreads == 0) { /* We could set it to something else (the number of cores or some * fraction of that ?) but it is probably not a good idea to hog * a lot of resources by default. */ td.numThreads = 1; MT_CreateThreads(); } } void MT_AddTask(Task * pt, gboolean lock) { if (lock) { multi_debug("add task asks lock (queueLock)"); Mutex_Lock(&td.queueLock); multi_debug("add task gets lock (queueLock)"); } if (td.addedTasks == 0) MT_SafeSet(&td.result, 0); /* Reset result for new tasks */ td.addedTasks++; td.tasks = g_list_append(td.tasks, pt); if (g_list_length(td.tasks) == 1) { /* New tasks */ SetManualEvent(td.activity); } if (lock) { Mutex_Release(&td.queueLock); multi_debug("add task unlocks"); } } extern void mt_add_tasks(unsigned int num_tasks, AsyncFun pFun, void *taskData, gpointer linked) { unsigned int i; { #if defined(DEBUG_MULTITHREADED) multi_debug("add %u task%s asks lock (queueLock)", num_tasks, (num_tasks > 1 ? "s" : "")); Mutex_Lock(&td.queueLock); multi_debug("add tasks gets lock (queueLock)"); #else Mutex_Lock(&td.queueLock); #endif } for (i = 0; i < num_tasks; i++) { Task *pt = (Task *) g_malloc(sizeof(Task)); pt->fun = pFun; pt->data = taskData; pt->pLinkedTask = linked; MT_AddTask(pt, FALSE); } Mutex_Release(&td.queueLock); multi_debug("add tasks unlocks (queueLock)"); } static gboolean WaitForAllTasks(int time) { int j = 0; while (!MT_SafeCompare(&td.doneTasks, td.totalTasks)) { // if (pmrCurAnn != NULL) { // g_message("in the loop: pmrCurAnn exists"); // } // SetAnnotation(pmrCurAnn); // ChangeGame(NULL); if (j == 10) return FALSE; /* Not done yet */ j++; g_usleep(100 * time); } return TRUE; } int MT_WaitForTasks(gboolean(*pCallback) (gpointer), int callbackTime, int autosave) { int callbackLoops = callbackTime / UI_UPDATETIME; int waits = 0; int polltime = callbackLoops ? UI_UPDATETIME : callbackTime; guint as_source = 0; char tmp1[200]; char tmp2[200]; // TanBoard anBoard; moverecord * pmr1; moverecord * pmr2; int start1 = 1; int start2 = 1; //int myPage; int i=0; /* Set total tasks to wait for */ td.totalTasks = td.addedTasks; #if defined(USE_GTK) // g_message("MT_WaitForTasks\n"); GTKSuspendInput(); // GTKResumeInput(); #endif if (autosave) as_source = g_timeout_add(nAutoSaveTime * 60000, save_autosave, NULL); multi_debug("waiting for all tasks"); while (!WaitForAllTasks(polltime)) { waits++; if (pCallback && waits >= callbackLoops) { waits = 0; pCallback(NULL); } ProcessEvents(); /* VERSION 1: When analysis runs in the background: Every so often, we make sure it displays the result of the analysis, else the analysis result of the first move is not shown automatically. Likewise it automatically shows the colors of the marked (wrong) moves, which looks really nice. - This could probably be improved, no need to check so often, it may slow down gnubg - It is less frequent than in the loop of the above function: WaitForAllTasks(); so maybe it's not too bad VERSION 2: periodically (every 3 times we go through the loop): (1) at the start, we record pmr1 of our move. (We call start1 this single step.) (2) As long as the user doesn't move, i.e. we stay at pmr2==pmr1, then we keep running ChangeGame(). (We call this start2.) (3) If the user moves, i.e. gets to some pmr2 !=pmr1, and the move analysis is available there, then we stop. It may be a move with cube+move decisions, and if the user looks at some cube decision, ChangeGame() will change the page to the move decision instead, bothering the user. In this last step, we don't update colors anymore. We could modulate in the future based on what the user is doing. */ // if (pwMoveAnalysis!=NULL) // g_message("sensitive:%d", gtk_widget_is_sensitive(pwAnalysis)); if(fAnalysisRunning) { i++; if (i==3) { i=0; if (start2) { if(start1) { pmr1 = get_current_moverecord(NULL); if (pmr1 != NULL) FormatMove(tmp1, msBoard(), pmr1->n.anMove); start1 = 0; // g_message("pmr1: move index i=%u; move=%s\n",pmr1->n.iMove, tmp1); ChangeGame(NULL); } else { pmr2 = get_current_moverecord(NULL); if (pmr2 != NULL) FormatMove(tmp2, msBoard(), pmr2->n.anMove); // g_message("pmr2: move index i=%u; move=%s\n",pmr2->n.iMove, tmp2); // if (pwMoveAnalysis!=NULL) // g_message("new results"); #if defined(USE_GTK) if (strcmp(tmp1, tmp2) != 0 && pwMoveAnalysis!=NULL) { #else if (strcmp(tmp1, tmp2) != 0) { #endif // g_message("STOP"); start2 = 0; } else { // g_message("change"); ChangeGame(NULL); } } } } } // myPage=gtk_notebook_get_current_page(GTK_NOTEBOOK(gtk_widget_get_parent(pwAnalysis))); // g_message("notebook page=%d",myPage); // if (pwMoveAnalysis!=NULL) // g_message("yeah!"); // if (pwCubeAnalysis!=NULL) // g_message("oop cube!"); /* at the start pmr_cur->n.iMove is not valid and returns an arbitrary large number (even though pmr_cur is not NULL), then the first time it's valid it looks like it returns smaller numbers... also it seems that it's valid for analysed games */ // if(pmr_cur->n.iMove<100){ // ChangeGame(NULL); // waitToDisplay=0; // } // // if (pmrCurAnn != NULL) { // // g_message("in the loop: pmrCurAnn exists"); // // FormatMove(sz + strlen(_("Moved ")), msBoard(), pmr->n.anMove); // // // FormatMove(tmp, msBoard(), pmrCurAnn->n.anMove); // // g_message("move=%s\n", tmp); // // } // SetAnnotation(pmrCurAnn); } if (autosave) { g_source_remove(as_source); save_autosave(NULL); } multi_debug("done waiting for all tasks"); MT_SafeSet(&td.doneTasks, 0); td.addedTasks = 0; td.totalTasks = -1; #if defined(USE_GTK) GTKResumeInput(); #endif return MT_SafeGet(&td.result); } extern void MT_SetResultFailed(void) { MT_SafeSet(&td.result, -1); } extern int MT_GetDoneTasks(void) { return MT_SafeGet(&td.doneTasks); } /* Code below used in calibrate to try and get a resonable figure for multiple threads */ static double start; /* used for timekeeping */ extern void MT_SyncInit(void) { ResetManualEvent(td.syncStart); ResetManualEvent(td.syncEnd); } extern void MT_SyncStart(void) { static int count = 0; /* Wait for all threads to get here */ if (MT_SafeIncValue(&count) == (int) td.numThreads) { count--; start = get_time(); SetManualEvent(td.syncStart); } else { WaitForManualEvent(td.syncStart); if (MT_SafeDecCheck(&count)) ResetManualEvent(td.syncStart); } } extern double MT_SyncEnd(void) { static int count = 0; /* Wait for all threads to get here */ if (MT_SafeIncValue(&count) == (int) td.numThreads) { const double now = get_time(); count--; SetManualEvent(td.syncEnd); return now - start; } else { WaitForManualEvent(td.syncEnd); if (MT_SafeDecCheck(&count)) ResetManualEvent(td.syncEnd); return 0; } } #else /* !defined(USE_MULTITHREAD) */ #include "multithread.h" #include #if defined(USE_GTK) #include #endif int asyncRet; void MT_AddTask(Task * pt, gboolean lock) { (void) lock; /* silence compiler warning */ td.result = 0; /* Reset result for new tasks */ td.tasks = g_list_append(td.tasks, pt); } void mt_add_tasks(unsigned int num_tasks, AsyncFun pFun, void *taskData, gpointer linked) { unsigned int i; for (i = 0; i < num_tasks; i++) { Task *pt = (Task *) malloc(sizeof(Task)); pt->fun = pFun; pt->data = taskData; pt->pLinkedTask = linked; MT_AddTask(pt, FALSE); } } extern int MT_GetDoneTasks(void) { return MT_SafeGet(&td.doneTasks); } int MT_WaitForTasks(gboolean(*pCallback) (gpointer), int callbackTime, int autosave) { GList *member; guint as_source = 0, cb_source = 0; (void) callbackTime; /* silence compiler warning */ MT_SafeSet(&td.doneTasks, 0); #if defined(USE_GTK) GTKSuspendInput(); #endif multi_debug("waiting for all tasks"); if (pCallback) pCallback(NULL); cb_source = g_timeout_add(1000, pCallback, NULL); if (autosave) as_source = g_timeout_add(nAutoSaveTime * 60000, save_autosave, NULL); for (member = g_list_first(td.tasks); member; member = member->next, MT_SafeInc(&td.doneTasks)) { Task *task = member->data; task->fun(task->data); free(task->pLinkedTask); free(task); ProcessEvents(); } g_list_free(td.tasks); if (autosave) { g_source_remove(as_source); save_autosave(NULL); } g_source_remove(cb_source); td.tasks = NULL; #if defined(USE_GTK) GTKResumeInput(); #endif return td.result; } extern void MT_AbortTasks(void) { td.result = -1; } #endif gnubg-1.08.003/gtkchequer.h000644 001751 000024 00000004034 14574155047 015150 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2004-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkchequer.h,v 1.23 2021/10/05 20:58:46 plm Exp $ */ #ifndef GTKCHEQUER_H #define GTKCHEQUER_H #include "backgammon.h" typedef struct { GtkWidget *pwMoves; /* the movelist */ GtkWidget *pwRollout, *pwRolloutSettings; /* rollout buttons */ GtkWidget *pwEval, *pwEvalSettings; /* evaluation buttons */ GtkWidget *pwMove; /* move button */ GtkWidget *pwCopy; /* copy button */ GtkWidget *pwEvalPly; /* predefined eval buttons */ GtkWidget *pwRolloutPresets; /* predefined Rollout buttons */ GtkWidget *pwShow; /* button for showing moves */ GtkWidget *pwTempMap; /* button for showing temperature map */ GtkWidget *pwCmark; /* button for marking */ GtkWidget *pwScoreMap; /* button for showing move score map */ moverecord *pmr; movelist *pml; int fButtonsValid; int fDestroyOnMove; unsigned int *piHighlight; int fDetails; int hist; } hintdata; extern GtkWidget *CreateMoveList(moverecord * pmr, const int fButtonsValid, const int fDestroyOnMove, const int fDetails, int hist); extern int CheckHintButtons(hintdata * phd); extern void MoveListRefreshSize(void); extern GtkWidget *pwDetails; extern int showMoveListDetail; #endif gnubg-1.08.003/openurl.h000644 001751 000024 00000002004 14574155047 014465 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2007 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: openurl.h,v 1.7 2018/04/23 21:48:48 plm Exp $ */ #ifndef OPENURL_H #define OPENURL_H extern void OpenURL(const char *szURL); extern char *set_web_browser(const char *sz); extern const gchar *get_web_browser(void); #endif /* OPENURL_H */ gnubg-1.08.003/file.c000644 001751 000024 00000026775 14610037046 013725 0ustar00pmstaff000000 000000 /* * Copyright (C) 2007-2008 Christian Anthon * Copyright (C) 2007-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "backgammon.h" #include #include "file.h" #include ExportFormat export_format[] = { {EXPORT_SGF, ".sgf", N_("GNU Backgammon File"), "sgf", {TRUE, TRUE, TRUE} } , /*must be the first element */ {EXPORT_HTML, ".html", "HTML", "html", {TRUE, TRUE, TRUE} } , {EXPORT_GAM, ".gam", N_("Jellyfish Game"), "gam", {FALSE, TRUE, FALSE} } , {EXPORT_MAT, ".mat", N_("Jellyfish Match"), "mat", {TRUE, FALSE, FALSE} } , {EXPORT_POS, ".pos", N_("Jellyfish Position"), "pos", {FALSE, FALSE, TRUE} } , {EXPORT_LATEX, ".tex", "LaTeX", "latex", {TRUE, TRUE, FALSE} } , #if HAVE_PANGOCAIRO {EXPORT_PDF, ".pdf", "PDF", "pdf", {TRUE, TRUE, TRUE} } , #endif {EXPORT_TEXT, ".txt", N_("Plain Text"), "text", {TRUE, TRUE, TRUE} } , #if HAVE_LIBPNG {EXPORT_PNG, ".png", "PNG", "png", {FALSE, FALSE, TRUE} } , #endif #if HAVE_PANGOCAIRO {EXPORT_PS, ".ps", "PostScript", "ps", {TRUE, TRUE, TRUE} } , #endif {EXPORT_SNOWIETXT, ".txt", N_("Snowie Text"), "snowietxt", {TRUE, TRUE, TRUE} } , #if HAVE_PANGOCAIRO {EXPORT_SVG, ".svg", "SVG", "svg", {FALSE, FALSE, TRUE} } , #endif }; ImportFormat import_format[] = { {IMPORT_SGF, ".sgf", N_("GNU Backgammon File"), "sgf"} , /*must be the first element */ {IMPORT_SGG, ".sgg", N_("GridGammon Save Game"), "sgg"} , {IMPORT_MAT, ".mat", N_("Jellyfish Match"), "mat"} , {IMPORT_OLDMOVES, ".fibs", N_("FIBS oldmoves format"), "oldmoves"} , {IMPORT_POS, ".pos", N_("Jellyfish Position"), "pos"} , {IMPORT_SNOWIETXT, ".txt", N_("Snowie Text"), "snowietxt"} , {IMPORT_TMG, ".tmg", N_("TrueMoneyGames"), "tmg"} , {IMPORT_EMPIRE, ".gam", N_("GammonEmpire Game"), "empire"} , {IMPORT_PARTY, ".gam", N_("PartyGammon Game"), "party"} , {IMPORT_BGROOM, ".bgf", N_("BGRoom Game"), "bgroom"} , {N_IMPORT_TYPES, NULL, N_("Unknown file format"), NULL} }; typedef struct { FILE *fp; size_t dataRead; unsigned int dataPos; char *data; } FileHelper; /* Data structures and functions for getting file type data */ static FileHelper * OpenFileHelper(const char *filename) { FileHelper *fh; if (!filename || !g_file_test(filename, G_FILE_TEST_EXISTS) || g_file_test(filename, G_FILE_TEST_IS_DIR)) return NULL; /* File not found */ fh = g_new(FileHelper, 1); fh->fp = g_fopen(filename, "r"); if (!fh->fp) { /* Failed to open file */ g_free(fh); return NULL; } fh->dataRead = 0; fh->dataPos = 0; fh->data = NULL; return fh; } static void CloseFileHelper( /*lint -e{818} */ FileHelper * fh) { fclose(fh->fp); g_free(fh->data); g_free(fh); } static void fhReset(FileHelper * fh) { /* Reset data pointer to start of file */ fh->dataPos = 0; } static void fhDataGetChar(FileHelper * fh) { size_t numRead; if (fh->dataPos < fh->dataRead) return; #define BLOCK_SIZE 1024 #define MAX_READ_SIZE 5000 fh->data = g_realloc(fh->data, fh->dataRead + BLOCK_SIZE); if (fh->dataRead > MAX_READ_SIZE) numRead = 0; /* Too big - should have worked things out by now! */ else numRead = fread(fh->data + fh->dataRead, 1, BLOCK_SIZE, fh->fp); if (numRead < BLOCK_SIZE) { (fh->data + fh->dataRead)[numRead] = '\0'; numRead++; } fh->dataRead += numRead; } static char fhPeekNextChar(FileHelper * fh) { fhDataGetChar(fh); return fh->data[fh->dataPos]; } static char fhReadNextChar(FileHelper * fh) { fhDataGetChar(fh); return fh->data[fh->dataPos++]; } static int fhPeekNextIsWS(FileHelper * fh) { char c = fhPeekNextChar(fh); return (c == ' ' || c == '\t' || c == '\r' || c == '\n'); } static void fhSkipWS(FileHelper * fh) { while (fhPeekNextIsWS(fh)) (void) fhReadNextChar(fh); } static int fhSkipToEOL(FileHelper * fh) { char c; do { c = fhReadNextChar(fh); if (c == '\n') return TRUE; } while (c != '\0'); return FALSE; } static int fhReadString(FileHelper * fh, const char *str) { /* Check file has str next */ while (*str) { if (fhReadNextChar(fh) != *str) return FALSE; str++; } return TRUE; } static int fhReadStringNC(FileHelper * fh, const char *str) { /* Check file has str next (ignoring case) */ while (*str) { char c = fhReadNextChar(fh); if (g_ascii_tolower(c) != *str) return FALSE; str++; } return TRUE; } static int fhPeekStringNC(FileHelper * fh, const char *str) { /* Check file has str next (ignoring case) but don't move */ unsigned int pos = fh->dataPos; int ret = TRUE; while (*str) { char c = fhReadNextChar(fh); if (g_ascii_tolower(c) != *str) { ret = FALSE; break; } str++; } fh->dataPos = pos; return ret; } static int fhReadNumber(FileHelper * fh) { /* Check file has str next */ int anyNumbers = FALSE; do { char c = fhPeekNextChar(fh); if (!g_ascii_isdigit(c)) return anyNumbers; anyNumbers = TRUE; } while (fhReadNextChar(fh) != '\0'); return TRUE; } static int fhReadAnyAlphNumString(FileHelper * fh) { char c = fhPeekNextChar(fh); if (!g_ascii_isalnum(c)) return FALSE; do { c = fhPeekNextChar(fh); if (!g_ascii_isalnum(c) && c != '_') return fhPeekNextIsWS(fh); } while (fhReadNextChar(fh) != '\0'); return TRUE; } static int IsSGFFile(FileHelper * fh) { const char *elements[] = { "(", ";", "FF", "[", "4", "]", "GM", "[", "6", "]", "" }; const char **test = elements; fhReset(fh); while (**test) { fhSkipWS(fh); if (!fhReadString(fh, *test)) return FALSE; test++; } return TRUE; } static int IsSGGFile(FileHelper * fh) { fhReset(fh); fhSkipWS(fh); if (fhReadAnyAlphNumString(fh)) { fhSkipWS(fh); if (!fhReadString(fh, "vs.")) return FALSE; fhSkipWS(fh); if (fhReadAnyAlphNumString(fh)) return TRUE; } return FALSE; } static int IsMATFile(FileHelper * fh) { fhReset(fh); do { char c; fhSkipWS(fh); c = fhPeekNextChar(fh); /* XG-style comment at the top of a mat file. * Backgammon NJ can add so many of them that the real MAT pattern * further below is pushed beyond the horizon of our probing. */ /* FIXME ? Check for all comments (';' and anything after that) */ if (c == ';') { fhReadNextChar(fh); if (fhReadNextChar(fh) == ' ' && fhReadNextChar(fh) == '[') return TRUE; } else if (g_ascii_isdigit(c)) { if (fhReadNumber(fh)) { fhSkipWS(fh); if (fhReadStringNC(fh, "point")) { fhSkipWS(fh); if (fhReadStringNC(fh, "match")) return TRUE; } } return FALSE; } } while (fhSkipToEOL(fh)); return FALSE; } static int IsTMGFile(FileHelper * fh) { fhReset(fh); do { fhSkipWS(fh); if (fhPeekStringNC(fh, "game")) { (void) fhReadStringNC(fh, "game"); fhSkipWS(fh); return fhReadNumber(fh) && (fhPeekNextChar(fh) == ':'); } (void) fhReadAnyAlphNumString(fh); if (fhPeekNextChar(fh) != ':') return FALSE; } while (fhSkipToEOL(fh)); return FALSE; } static int IsTXTFile(FileHelper * fh) { fhReset(fh); fhSkipWS(fh); if (fhReadNumber(fh) && fhReadNextChar(fh) == ';') { fhSkipWS(fh); if (fhReadNumber(fh) && fhReadNextChar(fh) == ';') return TRUE; } return FALSE; } static int IsJFPFile(FileHelper * fh) { char firstbyte; fhReset(fh); firstbyte = fhReadNextChar(fh); if (firstbyte < 124 || firstbyte > 126) return FALSE; if ((fhReadNextChar(fh) == '\0')) return TRUE; else return FALSE; } static int IsGAMFile(FileHelper * fh) { fhReset(fh); fhSkipWS(fh); if (fhReadAnyAlphNumString(fh)) { fhSkipWS(fh); if (fhReadAnyAlphNumString(fh)) { fhSkipWS(fh); return fhReadString(fh, "1)"); } } return FALSE; } static int IsPARFile(FileHelper * fh) { fhReset(fh); fhSkipWS(fh); if (fhReadStringNC(fh, "boardid=")) { (void) fhSkipToEOL(fh); if (fhReadStringNC(fh, "creator=")) return TRUE; } return FALSE; } static int IsBGRFile(FileHelper * fh) { fhReset(fh); fhSkipWS(fh); if (fhReadStringNC(fh, "bgf version")) { fhSkipWS(fh); if (!fhReadString(fh, "1.2")) g_print(_("Unexpected version of BGRoom file!\n")); return TRUE; } return FALSE; } extern FilePreviewData * ReadFilePreview(const char *filename) { FilePreviewData *fpd; FileHelper *fh = OpenFileHelper(filename); if (!fh) return NULL; fpd = g_new0(FilePreviewData, 1); fpd->type = N_IMPORT_TYPES; if (IsSGFFile(fh)) fpd->type = IMPORT_SGF; else if (IsSGGFile(fh)) fpd->type = IMPORT_SGG; else if (IsTXTFile(fh)) fpd->type = IMPORT_SNOWIETXT; else if (IsTMGFile(fh)) fpd->type = IMPORT_TMG; else if (IsMATFile(fh)) fpd->type = IMPORT_MAT; else if (IsJFPFile(fh)) fpd->type = IMPORT_POS; else if (IsGAMFile(fh)) fpd->type = IMPORT_EMPIRE; else if (IsPARFile(fh)) fpd->type = IMPORT_PARTY; else if (IsBGRFile(fh)) fpd->type = IMPORT_BGROOM; CloseFileHelper(fh); return fpd; } /* IK: modified the function to enable an output filename value without extension */ extern char * GetFilename(int CheckForCurrent, ExportType type, int extens) { char *sz; if (CheckForCurrent && szCurrentFileName && *szCurrentFileName) { if (extens) sz = g_strdup_printf("%s%s", szCurrentFileName, export_format[type].extension); else sz = g_strdup(szCurrentFileName); } else { time_t t = time(NULL); char tstr[16]; if (strftime(tstr, 16, "%Y-%m-%d-%H%M", localtime(&t)) == 0) *tstr = '\0'; if (extens) sz = g_strdup_printf("%s-%s_%dp_%s.sgf", ap[0].szName, ap[1].szName, ms.nMatchTo, tstr); else sz = g_strdup_printf("%s-%s_%dp_%s", ap[0].szName, ap[1].szName,ms.nMatchTo, tstr); } return sz; } gnubg-1.08.003/gtkscoremap.h000644 001751 000024 00000010216 14610037046 015311 0ustar00pmstaff000000 000000 /* * Copyright (C) 2020 Aaron Tikuisis * Copyright (C) 2020-2023 Isaac Keslassy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkscoremap.h,v 1.4 2023/01/18 21:49:36 plm Exp $ */ #ifndef GTKSCOREMAP_H #define GTKSCOREMAP_H #include "gnubg-types.h" /* for matchstate */ typedef enum { ZERO_PLY, ONE_PLY, TWO_PLY, THREE_PLY, FOUR_PLY, NUM_PLY } scoreMapPly; extern scoreMapPly scoreMapPlyDefault; extern const char* aszScoreMapPly[NUM_PLY]; extern const char* aszScoreMapPlyCommands[NUM_PLY]; typedef enum { LENGTH_THREE, LENGTH_FIVE, LENGTH_SEVEN, LENGTH_NINE, LENGTH_ELEVEN, LENGTH_FIFTEEN, LENGTH_TWENTY_ONE, VAR_LENGTH, NUM_MATCH_LENGTH } scoreMapMatchLength; extern scoreMapMatchLength scoreMapMatchLengthDefIdx; extern const int MATCH_LENGTH_OPTIONS[NUM_MATCH_LENGTH]; extern const char* aszScoreMapMatchLength[NUM_MATCH_LENGTH]; extern const char* aszScoreMapMatchLengthCommands[NUM_MATCH_LENGTH]; /* Used in the "Label by" radio buttons - we assume the same order as the labels */ typedef enum { LABEL_AWAY, LABEL_SCORE, NUM_LABEL} scoreMapLabel; extern scoreMapLabel scoreMapLabelDef; extern const char* aszScoreMapLabel[NUM_LABEL]; extern const char* aszScoreMapLabelCommands[NUM_LABEL]; /* Used in the "Top-left" radio buttons - we assume the same order as the labels */ /* Additional options elsewhere: - apwScoreMapJacoby (gtkgame.c); - "set scoremapjacoby" (gtkgame.c); - CommandSetScoreMapJacoby (backgammon.h)*/ typedef enum {MONEY_NO_JACOBY, MONEY_JACOBY, NUM_JACOBY} scoreMapJacoby; extern scoreMapJacoby scoreMapJacobyDef; extern const char* aszScoreMapJacoby[NUM_JACOBY]; extern const char* aszScoreMapJacobyCommands[NUM_JACOBY]; /* Used in the "Display Eval" radio buttons - we assume the same order as the labels */ typedef enum {CUBE_NO_EVAL, CUBE_ABSOLUTE_EVAL, CUBE_RELATIVE_EVAL_ND_D, CUBE_RELATIVE_EVAL_DT_DP, NUM_CUBEDISP} scoreMapCubeEquityDisplay; extern scoreMapCubeEquityDisplay scoreMapCubeEquityDisplayDef; extern const char* aszScoreMapCubeEquityDisplay[NUM_CUBEDISP]; extern const char* aszScoreMapCubeEquityDisplayCommands[NUM_CUBEDISP]; // Same for move evaluation typedef enum {MOVE_NO_EVAL, MOVE_ABSOLUTE_EVAL, MOVE_RELATIVE_EVAL, NUM_MOVEDISP} scoreMapMoveEquityDisplay; extern scoreMapMoveEquityDisplay scoreMapMoveEquityDisplayDef; extern const char* aszScoreMapMoveEquityDisplay[NUM_MOVEDISP]; extern const char* aszScoreMapMoveEquityDisplayCommands[NUM_MOVEDISP]; /* Used in the "Colour by" radio buttons - we assume the same order as the labels */ /* Additional options elsewhere: - apwScoreMapColour (gtkgame.c); - CommandSetScoreMapColour (backgammon.h) - "set scoremapcolour" (gtkgame.c); */ typedef enum {ALL, DND, PT, NUM_COLOUR} scoreMapColour; extern scoreMapColour scoreMapColourDef; extern const char* aszScoreMapColour[NUM_COLOUR]; extern const char* aszScoreMapColourCommands[NUM_COLOUR]; /* Layout options: either horizontal or vertical. */ /* Additional options elsewhere: - apwScoreMapLayout (gtkgame.c); - CommandSetScoreMapLayout (backgammon.h) - "set scoremaplayout" (gtkgame.c); */ typedef enum {VERTICAL, HORIZONTAL, NUM_LAYOUT} scoreMapLayout; extern scoreMapLayout scoreMapLayoutDef; extern const char* aszScoreMapLayout[NUM_LAYOUT]; extern const char* aszScoreMapLayoutCommands[NUM_LAYOUT]; extern void GTKShowScoreMap(const matchstate ams[], int cube); extern void GTKShowMoveScoreMapInfo(GtkWidget* pw, GtkWidget* pwParent); extern void GTKShowCubeScoreMapInfo(GtkWidget* pw, GtkWidget* pwParent); #endif /* GTKSCOREMAP_H */ gnubg-1.08.003/osr.c000644 001751 000024 00000052130 14574155047 013604 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2004 Joern Thyssen * Copyright (C) 2004-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * Inspired from osr.cc from fibs2html * * $Id: osr.c,v 1.45 2022/10/22 18:27:59 plm Exp $ */ /*lint -e514 */ #include "config.h" #include #include #include "eval.h" #include "positionid.h" #include "SFMT.h" #include "osr.h" #define MAX_PROBS 32 #define MAX_GAMMON_PROBS 15 static sfmt_t sfmt; static void OSRQuasiRandomDice(const unsigned int iTurn, const unsigned int iGame, const unsigned int cGames, unsigned int anDice[2]) { if (!iTurn && !(cGames % 36)) { anDice[0] = (iGame % 6) + 1; anDice[1] = ((iGame / 6) % 6) + 1; } else if (iTurn == 1 && !(cGames % 1296)) { anDice[0] = ((iGame / 36) % 6) + 1; anDice[1] = ((iGame / 216) % 6) + 1; } else { anDice[0] = (unsigned int) (sfmt_genrand_uint32(&sfmt) % 6) + 1; anDice[1] = (unsigned int) (sfmt_genrand_uint32(&sfmt) % 6) + 1; } } /* Fill aaProb with one sided bearoff probabilities for position with */ /* bearoff id n. */ static void getBearoffProbs(const unsigned int n, unsigned short int aaProb[32]) { if (BearoffDist(pbc1, n, NULL, NULL, NULL, aaProb, NULL)) g_assert_not_reached(); } static int isCrossOver(const unsigned int from, const unsigned int to) { return (from / 6) != (to / 6); } /* * Find (and move) best move in one side rollout. * * Input * anBoard: the board (reversed compared to normal convention) * anDice: the roll (dice 1 <> dice 2) * pnOut: current number of chequers outside home quadrant * * Output: * anBoard: the updated board after the move * pnOut: the number of chequers outside home quadrant after move * */ #if !defined(G_DISABLE_ASSERT) static unsigned int chequersout(const unsigned int anBoard[25]) { unsigned int i, n = 0; for (i = 6; i < 25; i++) n += anBoard[i]; return n; } #endif /*! \brief checks that we haven't moved too many checkers of any point on the board * but board need not contain all 15 checkers */ #if !defined(G_DISABLE_ASSERT) static int checkboard(const unsigned int anBoard[25]) { unsigned int i; for (i = 0; i < 25; i++) if (anBoard[i] > 15) return 0; return 1; } #endif static void FindBestMoveOSR2(unsigned int anBoard[25], const unsigned int anDice[2], unsigned int *pnOut) { unsigned int ifar, inear, iboth; unsigned int iused = 0; unsigned int i, j, lc; unsigned int found; ifar = 5 + anDice[0]; inear = 5 + anDice[1]; if (anBoard[ifar] && anBoard[inear]) { /* two chequers move exactly into the home quadrant */ /* move chequers */ --anBoard[ifar]; --anBoard[inear]; g_assert(checkboard(anBoard)); anBoard[5] += 2; g_assert(*pnOut >= 2); *pnOut -= 2; g_assert(*pnOut == chequersout(anBoard)); return; } iboth = 5 + (anDice[0] + anDice[1]); if (anBoard[iboth]) { /* one chequer move exactly into the home quadrant */ /* move chequer */ --anBoard[iboth]; ++anBoard[5]; g_assert(checkboard(anBoard)); g_assert(*pnOut > 0); --*pnOut; g_assert(*pnOut == chequersout(anBoard)); return; } /* loop through dice */ for (i = 0; i < 2 && *pnOut; ++i) { /* check for exact cross over */ if (anBoard[5 + anDice[i]]) { /* move chequer */ --anBoard[5 + anDice[i]]; ++anBoard[5]; g_assert(checkboard(anBoard)); g_assert(*pnOut > 0); --*pnOut; g_assert(*pnOut == chequersout(anBoard)); ++iused; /* next die */ continue; } /* find chequer furthest away */ lc = 24; while (lc > 5 && !anBoard[lc]) --lc; /* try to make cross over from the back */ found = FALSE; for (j = lc; j - anDice[i] > 5; --j) { if (anBoard[j] && isCrossOver(j, j - anDice[i])) { /* move chequer */ --anBoard[j]; ++anBoard[j - anDice[i]]; g_assert(checkboard(anBoard)); ++iused; found = TRUE; /* FIXME: increment lc if needed */ break; } } if (!found) { /* no move with cross-over was found */ /* move chequer from the rear */ for (j = lc; j > 5; --j) { if (anBoard[j]) { --anBoard[j]; ++anBoard[j - anDice[i]]; g_assert(checkboard(anBoard)); ++iused; if (j - anDice[i] < 6) { /* we've moved inside home quadrant */ g_assert(*pnOut > 0); --*pnOut; } g_assert(*pnOut == chequersout(anBoard)); break; } } } } if (!*pnOut && iused < 2) { /* die 2 still left, and all chequers inside home quadrant */ if (anBoard[anDice[1] - 1]) { /* bear-off */ --anBoard[anDice[1] - 1]; g_assert(checkboard(anBoard)); return; } /* try filling rearest empty space */ for (i = 0; i < 6 - anDice[1]; i++) { j = 5 - i; if (anBoard[j] && !anBoard[j - anDice[1]]) { /* empty space found */ --anBoard[j]; ++anBoard[j - anDice[1]]; g_assert(checkboard(anBoard)); return; } } /* move chequer from the rear */ for (i = 0; i < 6; i++) { j = 5 - i; if (anBoard[j]) { /* move chequer from the rear */ --anBoard[j]; if (j >= anDice[1]) /* add chequer to point */ ++anBoard[j - anDice[1]]; /* else */ /* bearoff */ g_assert(checkboard(anBoard)); return; } } } g_assert(iused == 2); return; } /* * Find (and move) best move in one side rollout. * * Input * anBoard: the board * anDice: the roll (dice 1 = dice 2) * pnOut: current number of chequers outside home quadrant * * Output: * anBoard: the updated board after the move * pnOut: the number of chequers outside home quadrant after move * */ static void FindBestMoveOSR4(unsigned int anBoard[25], const unsigned int nDice, unsigned int *pnOut) { unsigned int nd = 4; unsigned int i, n = 0; /* check for exact bear-ins */ while (nd > 0 && *pnOut > 0 && anBoard[5 + nDice]) { --anBoard[5 + nDice]; ++anBoard[5]; g_assert(checkboard(anBoard)); --nd; g_assert(*pnOut > 0); --*pnOut; g_assert(*pnOut == chequersout(anBoard)); } #if 0 /* this is broken or very very slow when the player has chequers in the * 3rd or 4th quadrant */ if (*pnOut > 0) { /* check for 4, 3, or 2 chequers move exactly into home quadrant */ for (n = nd; n > 1; --n) { i = 5 + n * nDice; if (i < 25 && anBoard[i]) { --anBoard[i]; ++anBoard[5]; g_assert(checkboard(anBoard)); nd -= n; g_assert(*pnOut > 0); --*pnOut; g_assert(*pnOut == chequersout(anBoard)); n = nd; /* restart loop */ } } } #endif if (*pnOut > 0 && nd > 0) { unsigned int first; unsigned int lc; first = TRUE; /* find rearest chequer */ lc = 24; while (lc > 5 && !anBoard[lc]) --lc; /* try to make cross over from the back */ for (i = lc; i > 5; --i) { if (anBoard[i]) { if (isCrossOver(i, i - nDice) && (first || (i - nDice) > 5)) { /* move chequers */ while (anBoard[i] && nd && *pnOut) { --anBoard[i]; ++anBoard[i - nDice]; g_assert(checkboard(anBoard)); if (i - nDice < 6) { /* we move into homeland */ g_assert(*pnOut > 0); --*pnOut; } g_assert(*pnOut == chequersout(anBoard)); --nd; } if (!*pnOut || !nd) break; /* did we move all chequers from that point */ first = !anBoard[i]; } } } /* move chequers from the rear */ while (*pnOut && nd) { for (i = lc; i > 5; --i) { if (anBoard[i]) { while (anBoard[i] && nd && *pnOut) { --anBoard[i]; ++anBoard[i - nDice]; g_assert(checkboard(anBoard)); if (i - nDice < 6) { g_assert(*pnOut > 0); --*pnOut; } g_assert(*pnOut == chequersout(anBoard)); --nd; } if (!n || !*pnOut) break; } } } } if (!*pnOut) { /* all chequers inside home quadrant */ while (nd) { unsigned int any; if (anBoard[nDice - 1]) { /* perfect bear-off */ --anBoard[nDice - 1]; --nd; g_assert(checkboard(anBoard)); continue; } if (nd >= 2 && nDice <= 3 && anBoard[2 * nDice - 1] > 0) { /* bear double 1s, 2s, and 3s off, e.g., 4/2/0 */ --anBoard[2 * nDice - 1]; nd -= 2; g_assert(checkboard(anBoard)); continue; } if (nd >= 3 && nDice <= 2 && anBoard[3 * nDice - 1] > 0) { /* bear double 1s off from 3 point (3/2/1/0) or * double 2s off from 6 point (6/4/2/0) */ --anBoard[3 * nDice - 1]; nd -= 3; g_assert(checkboard(anBoard)); continue; } if (nd >= 4 && nDice <= 1 && anBoard[4 * nDice - 1] > 0) { /* hmmm, this should not be possible... */ /* bear off double 1s: 4/3/2/1/0 */ --anBoard[4 * nDice - 1]; g_assert(checkboard(anBoard)); nd -= 4; } any = FALSE; /* move chequers from rear */ /* FIXME: fill gaps? */ for (i = 0; nd && i < 6; i++) { unsigned int j = 5 - i; while (anBoard[j] && nd) { any = TRUE; --anBoard[j]; --nd; if (j >= nDice) ++anBoard[j - nDice]; g_assert(checkboard(anBoard)); } } if (!any) /* no more chequers left */ nd = 0; } } } /* * Find (and move) best move in one sided rollout. * * Input * anBoard: the board * anDice: the roll (dice 1 is assumed to be lower than dice 2) * pnOut: current number of chequers outside home quadrant * * Output: * anBoard: the updated board after the move * pnOut: the number of chequers outside home quadrant after move * */ static void FindBestMoveOSR(unsigned int anBoard[25], const unsigned int anDice[2], unsigned int *pnOut) { if (anDice[0] != anDice[1]) FindBestMoveOSR2(anBoard, anDice, pnOut); else FindBestMoveOSR4(anBoard, anDice[0], pnOut); } /* * osr: one sided rollout. * * Input: * anBoard: the board (reversed compared to normal convention) * iGame: game# * nGames: # of games. * nOut: current number of chequers outside home quadrant. * * Returns: number of rolls used to get all chequers inside home * quadrant. */ static unsigned int osr(unsigned int anBoard[25], const unsigned int iGame, const unsigned int nGames, unsigned int nOut) { unsigned int iTurn = 0; unsigned int anDice[2]; /* loop until all chequers are in home quadrant */ while (nOut) { /* roll dice */ OSRQuasiRandomDice(iTurn, iGame, nGames, anDice); if (anDice[0] < anDice[1]) swap_us(anDice, anDice + 1); /* find and move best move */ FindBestMoveOSR(anBoard, anDice, &nOut); iTurn++; } return iTurn; } /* * RollOSR: perform onesided rollout * * Input: * nGames: number of simulations * anBoard: the board * nOut: number of chequers outside home quadrant * * Output: * arProbs[ nMaxProbs ]: probabilities * arGammonProbs[ nMaxGammonProbs ]: gammon probabilities * */ static void rollOSR(const unsigned int nGames, const unsigned int anBoard[25], const unsigned int nOut, float arProbs[], const unsigned int nMaxProbs, float arGammonProbs[], const unsigned int nMaxGammonProbs) { unsigned int an[25]; unsigned short int anProb[32]; unsigned int i; unsigned int iGame; int *anCounts = (int *) g_alloca(nMaxGammonProbs * sizeof(int)); memset(anCounts, 0, sizeof(int) * nMaxGammonProbs); for (i = 0; i < nMaxProbs; ++i) arProbs[i] = 0.0f; /* perform rollouts */ for (iGame = 0; iGame < nGames; ++iGame) { unsigned int n, m; memcpy(an, anBoard, sizeof(an)); /* do actual rollout */ n = osr(an, iGame, nGames, nOut); /* number of chequers in home quadrant */ m = 0; for (i = 0; i < 6; ++i) m += an[i]; /* update counts */ ++anCounts[MIN(m == 15 ? n + 1 : n, nMaxGammonProbs - 1)]; /* get prob. from bearoff1 */ getBearoffProbs(PositionBearoff(an, pbc1->nPoints, pbc1->nChequers), anProb); for (i = 0; i < 32; ++i) arProbs[MIN(n + i, nMaxProbs - 1)] += anProb[i] / 65535.0f; } /* scale resulting probabilities */ for (i = 0; i < (unsigned int) nMaxProbs; ++i) { arProbs[i] /= (float)nGames; /* printf ( "arProbs[%d]=%f\n", i, arProbs[ i ] ); */ } /* calculate gammon probs. * (prob. of getting inside home quadrant in i rolls */ for (i = 0; i < nMaxGammonProbs; ++i) { arGammonProbs[i] = (float)anCounts[i] / (float)nGames; /* printf ( "arGammonProbs[%d]=%f\n", i, arGammonProbs[ i ] ); */ } } /* * OSP: one sided probabilities * * Input: * anBoard: one side of the board * nGames: number of simulations * * Output: * an: ??? * arProb: array of probabilities (ar[ i ] is the prob. that player * bears off in i moves) * arGammonProb: gammon probabilities * */ static unsigned int osp(const unsigned int anBoard[25], const unsigned int nGames, unsigned int an[25], float arProbs[MAX_PROBS], float arGammonProbs[MAX_GAMMON_PROBS]) { int i; unsigned int nTotal, nOut; /* copy board into an, and find total number of chequers left, * and number of chequers outside home */ nTotal = nOut = 0; memcpy(an, anBoard, 25 * sizeof(int)); for (i = 0; i < 25; ++i) { /* total number of chequers left */ nTotal += anBoard[i]; if (i > 5) nOut += anBoard[i]; } if (nOut > 0) /* chequers outside home: do one sided rollout */ rollOSR(nGames, an, nOut, arProbs, MAX_PROBS, arGammonProbs, MAX_GAMMON_PROBS); else { /* chequers inside home: use BEAROFF2 */ unsigned short int anProb[32]; /* no gammon possible */ for (i = 0; i < MAX_GAMMON_PROBS; ++i) arGammonProbs[i] = 0.0f; if (nTotal == 15) arGammonProbs[1] = 1.0f; else arGammonProbs[0] = 1.0f; /* get probs from BEAROFF2 */ for (i = 0; i < MAX_PROBS; ++i) arProbs[i] = 0.0f; getBearoffProbs(PositionBearoff(anBoard, pbc1->nPoints, pbc1->nChequers), anProb); for (i = 0; i < 32; ++i) { int n = MIN(i, MAX_PROBS - 1); arProbs[n] += anProb[i] / 65535.0f; /* printf ( "arProbs[%d]=%f\n", n, arProbs[n] ); */ } } return nTotal; } static float bgProb(const unsigned int anBoard[25], const int fOnRoll, const unsigned int nTotal, const float arProbs[], const unsigned int nMaxProbs) { unsigned int nTotPipsHome = 0; unsigned int i; float r; /* total pips before out of opponent's home quadrant */ for (i = 18; i < 25; ++i) nTotPipsHome += anBoard[i] * (i - 17); r = 0.0f; if (nTotPipsHome) { /* ( nTotal + 3 ) / 4 - 1: number of rolls before opponent is off. */ /* (nTotPipsHome + 2) / 3: numbers of rolls before I'm out of * opponent's home quadrant (with consecutive 2-1's) */ if ((nTotal + 3) / 4 - 1 <= (nTotPipsHome + 2) / 3) { /* backgammon is possible */ unsigned short int anProb[32]; /* get "bear-off" prob (for getting out of opp.'s home quadr.) */ /* FIXME: this ignores chequers on the bar */ getBearoffProbs(PositionBearoff(anBoard + 18, pbc1->nPoints, pbc1->nChequers), anProb); for (i = 0; i < nMaxProbs; ++i) { if (arProbs[i] > 0.0f) { float s = 0.0f; unsigned int j; for (j = i + !fOnRoll; j < 32; ++j) s += anProb[j] / 65535.0f; r += s * arProbs[i]; } } } } return r; } /* * Calculate race probabilities using one sided rollouts. * * Input: * anBoard: the current board * (assumed to be a race position without contact) * nGames: the number of simulations to perform * * Output: * arOutput: probabilities. * */ extern void raceProbs(const TanBoard anBoard, const unsigned int nGames, float arOutput[NUM_OUTPUTS], float arMu[2]) { TanBoard an; float aarProbs[2][MAX_PROBS]; float aarGammonProbs[2][MAX_PROBS]; float arG[2] = { 0.0f, 0.0f }, arBG[2] = { 0.0f, 0.0f }; unsigned int anTotal[2]; int i, j, k; float w, s; /* Seed set to ensure that OSR are reproducible */ sfmt_init_gen_rand(&sfmt, 0); for (i = 0; i < NUM_OUTPUTS; ++i) arOutput[i] = 0.0f; for (i = 0; i < 2; ++i) anTotal[i] = osp(anBoard[i], nGames, an[i], aarProbs[i], aarGammonProbs[i]); /* calculate OUTPUT_WIN */ w = 0; for (i = 0; i < MAX_PROBS; ++i) { /* calculate the prob. of the opponent using more than i rolls * to bear off */ s = 0.0f; for (j = i; j < MAX_PROBS; ++j) s += aarProbs[0][j]; /* winning chance is: prob. of me bearing off in i rolls times * prob. the opponent doesn't bear off in i rolls */ w += aarProbs[1][i] * s; } arOutput[OUTPUT_WIN] = MIN(w, 1.0f); /* calculate gammon and backgammon probs */ for (i = 0; i < 2; ++i) { if (anTotal[!i] == 15) { /* gammon and backgammon possible */ for (j = 0; j < MAX_GAMMON_PROBS; ++j) { /* chance of opponent having borne all chequers of * within j rolls */ s = 0.0f; for (k = 0; k < j + i; ++k) s += aarProbs[i][k]; /* gammon chance */ arG[i] += aarGammonProbs[!i][j] * s; } if (arG[i] > 0.0f) /* calculate backgammon probs */ arBG[i] = bgProb(an[!i], i, anTotal[i], aarProbs[i], MAX_PROBS); } } arOutput[OUTPUT_WINGAMMON] = MIN(arG[1], 1.0f); arOutput[OUTPUT_LOSEGAMMON] = MIN(arG[0], 1.0f); arOutput[OUTPUT_WINBACKGAMMON] = MIN(arBG[1], 1.0f); arOutput[OUTPUT_LOSEBACKGAMMON] = MIN(arBG[0], 1.0f); /* calculate average number of rolls to bear off */ if (arMu) { for (i = 0; i < 2; ++i) { arMu[i] = 0.0f; for (j = 0; j < MAX_PROBS; ++j) arMu[i] += (float)j * aarProbs[i][j]; } } } gnubg-1.08.003/copying.c000644 001751 000024 00000105741 14613445366 014460 0ustar00pmstaff000000 000000 /* Do not modify this file! It is created automatically by copying.awk. Modify copying.awk instead. */ #include "backgammon.h" #include "common.h" char *aszCopying[] = { " GNU GENERAL PUBLIC LICENSE", " Version 3, 29 June 2007", "", " Copyright (C) 2007 Free Software Foundation, Inc. ", " Everyone is permitted to copy and distribute verbatim copies", " of this license document, but changing it is not allowed.", "", " Preamble", "", " The GNU General Public License is a free, copyleft license for", "software and other kinds of works.", "", " The licenses for most software and other practical works are designed", "to take away your freedom to share and change the works. By contrast,", "the GNU General Public License is intended to guarantee your freedom to", "share and change all versions of a program--to make sure it remains free", "software for all its users. We, the Free Software Foundation, use the", "GNU General Public License for most of our software; it applies also to", "any other work released this way by its authors. You can apply it to", "your programs, too.", "", " When we speak of free software, we are referring to freedom, not", "price. Our General Public Licenses are designed to make sure that you", "have the freedom to distribute copies of free software (and charge for", "them if you wish), that you receive source code or can get it if you", "want it, that you can change the software or use pieces of it in new", "free programs, and that you know you can do these things.", "", " To protect your rights, we need to prevent others from denying you", "these rights or asking you to surrender the rights. Therefore, you have", "certain responsibilities if you distribute copies of the software, or if", "you modify it: responsibilities to respect the freedom of others.", "", " For example, if you distribute copies of such a program, whether", "gratis or for a fee, you must pass on to the recipients the same", "freedoms that you received. You must make sure that they, too, receive", "or can get the source code. And you must show them these terms so they", "know their rights.", "", " Developers that use the GNU GPL protect your rights with two steps:", "(1) assert copyright on the software, and (2) offer you this License", "giving you legal permission to copy, distribute and/or modify it.", "", " For the developers' and authors' protection, the GPL clearly explains", "that there is no warranty for this free software. For both users' and", "authors' sake, the GPL requires that modified versions be marked as", "changed, so that their problems will not be attributed erroneously to", "authors of previous versions.", "", " Some devices are designed to deny users access to install or run", "modified versions of the software inside them, although the manufacturer", "can do so. This is fundamentally incompatible with the aim of", "protecting users' freedom to change the software. The systematic", "pattern of such abuse occurs in the area of products for individuals to", "use, which is precisely where it is most unacceptable. Therefore, we", "have designed this version of the GPL to prohibit the practice for those", "products. If such problems arise substantially in other domains, we", "stand ready to extend this provision to those domains in future versions", "of the GPL, as needed to protect the freedom of users.", "", " Finally, every program is threatened constantly by software patents.", "States should not allow patents to restrict development and use of", "software on general-purpose computers, but in those that do, we wish to", "avoid the special danger that patents applied to a free program could", "make it effectively proprietary. To prevent this, the GPL assures that", "patents cannot be used to render the program non-free.", "", " The precise terms and conditions for copying, distribution and", "modification follow.", "", " TERMS AND CONDITIONS", "", " 0. Definitions.", "", " \"This License\" refers to version 3 of the GNU General Public License.", "", " \"Copyright\" also means copyright-like laws that apply to other kinds of", "works, such as semiconductor masks.", "", " \"The Program\" refers to any copyrightable work licensed under this", "License. Each licensee is addressed as \"you\". \"Licensees\" and", "\"recipients\" may be individuals or organizations.", "", " To \"modify\" a work means to copy from or adapt all or part of the work", "in a fashion requiring copyright permission, other than the making of an", "exact copy. The resulting work is called a \"modified version\" of the", "earlier work or a work \"based on\" the earlier work.", "", " A \"covered work\" means either the unmodified Program or a work based", "on the Program.", "", " To \"propagate\" a work means to do anything with it that, without", "permission, would make you directly or secondarily liable for", "infringement under applicable copyright law, except executing it on a", "computer or modifying a private copy. Propagation includes copying,", "distribution (with or without modification), making available to the", "public, and in some countries other activities as well.", "", " To \"convey\" a work means any kind of propagation that enables other", "parties to make or receive copies. Mere interaction with a user through", "a computer network, with no transfer of a copy, is not conveying.", "", " An interactive user interface displays \"Appropriate Legal Notices\"", "to the extent that it includes a convenient and prominently visible", "feature that (1) displays an appropriate copyright notice, and (2)", "tells the user that there is no warranty for the work (except to the", "extent that warranties are provided), that licensees may convey the", "work under this License, and how to view a copy of this License. If", "the interface presents a list of user commands or options, such as a", "menu, a prominent item in the list meets this criterion.", "", " 1. Source Code.", "", " The \"source code\" for a work means the preferred form of the work", "for making modifications to it. \"Object code\" means any non-source", "form of a work.", "", " A \"Standard Interface\" means an interface that either is an official", "standard defined by a recognized standards body, or, in the case of", "interfaces specified for a particular programming language, one that", "is widely used among developers working in that language.", "", " The \"System Libraries\" of an executable work include anything, other", "than the work as a whole, that (a) is included in the normal form of", "packaging a Major Component, but which is not part of that Major", "Component, and (b) serves only to enable use of the work with that", "Major Component, or to implement a Standard Interface for which an", "implementation is available to the public in source code form. A", "\"Major Component\", in this context, means a major essential component", "(kernel, window system, and so on) of the specific operating system", "(if any) on which the executable work runs, or a compiler used to", "produce the work, or an object code interpreter used to run it.", "", " The \"Corresponding Source\" for a work in object code form means all", "the source code needed to generate, install, and (for an executable", "work) run the object code and to modify the work, including scripts to", "control those activities. However, it does not include the work's", "System Libraries, or general-purpose tools or generally available free", "programs which are used unmodified in performing those activities but", "which are not part of the work. For example, Corresponding Source", "includes interface definition files associated with source files for", "the work, and the source code for shared libraries and dynamically", "linked subprograms that the work is specifically designed to require,", "such as by intimate data communication or control flow between those", "subprograms and other parts of the work.", "", " The Corresponding Source need not include anything that users", "can regenerate automatically from other parts of the Corresponding", "Source.", "", " The Corresponding Source for a work in source code form is that", "same work.", "", " 2. Basic Permissions.", "", " All rights granted under this License are granted for the term of", "copyright on the Program, and are irrevocable provided the stated", "conditions are met. This License explicitly affirms your unlimited", "permission to run the unmodified Program. The output from running a", "covered work is covered by this License only if the output, given its", "content, constitutes a covered work. This License acknowledges your", "rights of fair use or other equivalent, as provided by copyright law.", "", " You may make, run and propagate covered works that you do not", "convey, without conditions so long as your license otherwise remains", "in force. You may convey covered works to others for the sole purpose", "of having them make modifications exclusively for you, or provide you", "with facilities for running those works, provided that you comply with", "the terms of this License in conveying all material for which you do", "not control copyright. Those thus making or running the covered works", "for you must do so exclusively on your behalf, under your direction", "and control, on terms that prohibit them from making any copies of", "your copyrighted material outside their relationship with you.", "", " Conveying under any other circumstances is permitted solely under", "the conditions stated below. Sublicensing is not allowed; section 10", "makes it unnecessary.", "", " 3. Protecting Users' Legal Rights From Anti-Circumvention Law.", "", " No covered work shall be deemed part of an effective technological", "measure under any applicable law fulfilling obligations under article", "11 of the WIPO copyright treaty adopted on 20 December 1996, or", "similar laws prohibiting or restricting circumvention of such", "measures.", "", " When you convey a covered work, you waive any legal power to forbid", "circumvention of technological measures to the extent such circumvention", "is effected by exercising rights under this License with respect to", "the covered work, and you disclaim any intention to limit operation or", "modification of the work as a means of enforcing, against the work's", "users, your or third parties' legal rights to forbid circumvention of", "technological measures.", "", " 4. Conveying Verbatim Copies.", "", " You may convey verbatim copies of the Program's source code as you", "receive it, in any medium, provided that you conspicuously and", "appropriately publish on each copy an appropriate copyright notice;", "keep intact all notices stating that this License and any", "non-permissive terms added in accord with section 7 apply to the code;", "keep intact all notices of the absence of any warranty; and give all", "recipients a copy of this License along with the Program.", "", " You may charge any price or no price for each copy that you convey,", "and you may offer support or warranty protection for a fee.", "", " 5. Conveying Modified Source Versions.", "", " You may convey a work based on the Program, or the modifications to", "produce it from the Program, in the form of source code under the", "terms of section 4, provided that you also meet all of these conditions:", "", " a) The work must carry prominent notices stating that you modified", " it, and giving a relevant date.", "", " b) The work must carry prominent notices stating that it is", " released under this License and any conditions added under section", " 7. This requirement modifies the requirement in section 4 to", " \"keep intact all notices\".", "", " c) You must license the entire work, as a whole, under this", " License to anyone who comes into possession of a copy. This", " License will therefore apply, along with any applicable section 7", " additional terms, to the whole of the work, and all its parts,", " regardless of how they are packaged. This License gives no", " permission to license the work in any other way, but it does not", " invalidate such permission if you have separately received it.", "", " d) If the work has interactive user interfaces, each must display", " Appropriate Legal Notices; however, if the Program has interactive", " interfaces that do not display Appropriate Legal Notices, your", " work need not make them do so.", "", " A compilation of a covered work with other separate and independent", "works, which are not by their nature extensions of the covered work,", "and which are not combined with it such as to form a larger program,", "in or on a volume of a storage or distribution medium, is called an", "\"aggregate\" if the compilation and its resulting copyright are not", "used to limit the access or legal rights of the compilation's users", "beyond what the individual works permit. Inclusion of a covered work", "in an aggregate does not cause this License to apply to the other", "parts of the aggregate.", "", " 6. Conveying Non-Source Forms.", "", " You may convey a covered work in object code form under the terms", "of sections 4 and 5, provided that you also convey the", "machine-readable Corresponding Source under the terms of this License,", "in one of these ways:", "", " a) Convey the object code in, or embodied in, a physical product", " (including a physical distribution medium), accompanied by the", " Corresponding Source fixed on a durable physical medium", " customarily used for software interchange.", "", " b) Convey the object code in, or embodied in, a physical product", " (including a physical distribution medium), accompanied by a", " written offer, valid for at least three years and valid for as", " long as you offer spare parts or customer support for that product", " model, to give anyone who possesses the object code either (1) a", " copy of the Corresponding Source for all the software in the", " product that is covered by this License, on a durable physical", " medium customarily used for software interchange, for a price no", " more than your reasonable cost of physically performing this", " conveying of source, or (2) access to copy the", " Corresponding Source from a network server at no charge.", "", " c) Convey individual copies of the object code with a copy of the", " written offer to provide the Corresponding Source. This", " alternative is allowed only occasionally and noncommercially, and", " only if you received the object code with such an offer, in accord", " with subsection 6b.", "", " d) Convey the object code by offering access from a designated", " place (gratis or for a charge), and offer equivalent access to the", " Corresponding Source in the same way through the same place at no", " further charge. You need not require recipients to copy the", " Corresponding Source along with the object code. If the place to", " copy the object code is a network server, the Corresponding Source", " may be on a different server (operated by you or a third party)", " that supports equivalent copying facilities, provided you maintain", " clear directions next to the object code saying where to find the", " Corresponding Source. Regardless of what server hosts the", " Corresponding Source, you remain obligated to ensure that it is", " available for as long as needed to satisfy these requirements.", "", " e) Convey the object code using peer-to-peer transmission, provided", " you inform other peers where the object code and Corresponding", " Source of the work are being offered to the general public at no", " charge under subsection 6d.", "", " A separable portion of the object code, whose source code is excluded", "from the Corresponding Source as a System Library, need not be", "included in conveying the object code work.", "", " A \"User Product\" is either (1) a \"consumer product\", which means any", "tangible personal property which is normally used for personal, family,", "or household purposes, or (2) anything designed or sold for incorporation", "into a dwelling. In determining whether a product is a consumer product,", "doubtful cases shall be resolved in favor of coverage. For a particular", "product received by a particular user, \"normally used\" refers to a", "typical or common use of that class of product, regardless of the status", "of the particular user or of the way in which the particular user", "actually uses, or expects or is expected to use, the product. A product", "is a consumer product regardless of whether the product has substantial", "commercial, industrial or non-consumer uses, unless such uses represent", "the only significant mode of use of the product.", "", " \"Installation Information\" for a User Product means any methods,", "procedures, authorization keys, or other information required to install", "and execute modified versions of a covered work in that User Product from", "a modified version of its Corresponding Source. The information must", "suffice to ensure that the continued functioning of the modified object", "code is in no case prevented or interfered with solely because", "modification has been made.", "", " If you convey an object code work under this section in, or with, or", "specifically for use in, a User Product, and the conveying occurs as", "part of a transaction in which the right of possession and use of the", "User Product is transferred to the recipient in perpetuity or for a", "fixed term (regardless of how the transaction is characterized), the", "Corresponding Source conveyed under this section must be accompanied", "by the Installation Information. But this requirement does not apply", "if neither you nor any third party retains the ability to install", "modified object code on the User Product (for example, the work has", "been installed in ROM).", "", " The requirement to provide Installation Information does not include a", "requirement to continue to provide support service, warranty, or updates", "for a work that has been modified or installed by the recipient, or for", "the User Product in which it has been modified or installed. Access to a", "network may be denied when the modification itself materially and", "adversely affects the operation of the network or violates the rules and", "protocols for communication across the network.", "", " Corresponding Source conveyed, and Installation Information provided,", "in accord with this section must be in a format that is publicly", "documented (and with an implementation available to the public in", "source code form), and must require no special password or key for", "unpacking, reading or copying.", "", " 7. Additional Terms.", "", " \"Additional permissions\" are terms that supplement the terms of this", "License by making exceptions from one or more of its conditions.", "Additional permissions that are applicable to the entire Program shall", "be treated as though they were included in this License, to the extent", "that they are valid under applicable law. If additional permissions", "apply only to part of the Program, that part may be used separately", "under those permissions, but the entire Program remains governed by", "this License without regard to the additional permissions.", "", " When you convey a copy of a covered work, you may at your option", "remove any additional permissions from that copy, or from any part of", "it. (Additional permissions may be written to require their own", "removal in certain cases when you modify the work.) You may place", "additional permissions on material, added by you to a covered work,", "for which you have or can give appropriate copyright permission.", "", " Notwithstanding any other provision of this License, for material you", "add to a covered work, you may (if authorized by the copyright holders of", "that material) supplement the terms of this License with terms:", "", " a) Disclaiming warranty or limiting liability differently from the", " terms of sections 15 and 16 of this License; or", "", " b) Requiring preservation of specified reasonable legal notices or", " author attributions in that material or in the Appropriate Legal", " Notices displayed by works containing it; or", "", " c) Prohibiting misrepresentation of the origin of that material, or", " requiring that modified versions of such material be marked in", " reasonable ways as different from the original version; or", "", " d) Limiting the use for publicity purposes of names of licensors or", " authors of the material; or", "", " e) Declining to grant rights under trademark law for use of some", " trade names, trademarks, or service marks; or", "", " f) Requiring indemnification of licensors and authors of that", " material by anyone who conveys the material (or modified versions of", " it) with contractual assumptions of liability to the recipient, for", " any liability that these contractual assumptions directly impose on", " those licensors and authors.", "", " All other non-permissive additional terms are considered \"further", "restrictions\" within the meaning of section 10. If the Program as you", "received it, or any part of it, contains a notice stating that it is", "governed by this License along with a term that is a further", "restriction, you may remove that term. If a license document contains", "a further restriction but permits relicensing or conveying under this", "License, you may add to a covered work material governed by the terms", "of that license document, provided that the further restriction does", "not survive such relicensing or conveying.", "", " If you add terms to a covered work in accord with this section, you", "must place, in the relevant source files, a statement of the", "additional terms that apply to those files, or a notice indicating", "where to find the applicable terms.", "", " Additional terms, permissive or non-permissive, may be stated in the", "form of a separately written license, or stated as exceptions;", "the above requirements apply either way.", "", " 8. Termination.", "", " You may not propagate or modify a covered work except as expressly", "provided under this License. Any attempt otherwise to propagate or", "modify it is void, and will automatically terminate your rights under", "this License (including any patent licenses granted under the third", "paragraph of section 11).", "", " However, if you cease all violation of this License, then your", "license from a particular copyright holder is reinstated (a)", "provisionally, unless and until the copyright holder explicitly and", "finally terminates your license, and (b) permanently, if the copyright", "holder fails to notify you of the violation by some reasonable means", "prior to 60 days after the cessation.", "", " Moreover, your license from a particular copyright holder is", "reinstated permanently if the copyright holder notifies you of the", "violation by some reasonable means, this is the first time you have", "received notice of violation of this License (for any work) from that", "copyright holder, and you cure the violation prior to 30 days after", "your receipt of the notice.", "", " Termination of your rights under this section does not terminate the", "licenses of parties who have received copies or rights from you under", "this License. If your rights have been terminated and not permanently", "reinstated, you do not qualify to receive new licenses for the same", "material under section 10.", "", " 9. Acceptance Not Required for Having Copies.", "", " You are not required to accept this License in order to receive or", "run a copy of the Program. Ancillary propagation of a covered work", "occurring solely as a consequence of using peer-to-peer transmission", "to receive a copy likewise does not require acceptance. However,", "nothing other than this License grants you permission to propagate or", "modify any covered work. These actions infringe copyright if you do", "not accept this License. Therefore, by modifying or propagating a", "covered work, you indicate your acceptance of this License to do so.", "", " 10. Automatic Licensing of Downstream Recipients.", "", " Each time you convey a covered work, the recipient automatically", "receives a license from the original licensors, to run, modify and", "propagate that work, subject to this License. You are not responsible", "for enforcing compliance by third parties with this License.", "", " An \"entity transaction\" is a transaction transferring control of an", "organization, or substantially all assets of one, or subdividing an", "organization, or merging organizations. If propagation of a covered", "work results from an entity transaction, each party to that", "transaction who receives a copy of the work also receives whatever", "licenses to the work the party's predecessor in interest had or could", "give under the previous paragraph, plus a right to possession of the", "Corresponding Source of the work from the predecessor in interest, if", "the predecessor has it or can get it with reasonable efforts.", "", " You may not impose any further restrictions on the exercise of the", "rights granted or affirmed under this License. For example, you may", "not impose a license fee, royalty, or other charge for exercise of", "rights granted under this License, and you may not initiate litigation", "(including a cross-claim or counterclaim in a lawsuit) alleging that", "any patent claim is infringed by making, using, selling, offering for", "sale, or importing the Program or any portion of it.", "", " 11. Patents.", "", " A \"contributor\" is a copyright holder who authorizes use under this", "License of the Program or a work on which the Program is based. The", "work thus licensed is called the contributor's \"contributor version\".", "", " A contributor's \"essential patent claims\" are all patent claims", "owned or controlled by the contributor, whether already acquired or", "hereafter acquired, that would be infringed by some manner, permitted", "by this License, of making, using, or selling its contributor version,", "but do not include claims that would be infringed only as a", "consequence of further modification of the contributor version. For", "purposes of this definition, \"control\" includes the right to grant", "patent sublicenses in a manner consistent with the requirements of", "this License.", "", " Each contributor grants you a non-exclusive, worldwide, royalty-free", "patent license under the contributor's essential patent claims, to", "make, use, sell, offer for sale, import and otherwise run, modify and", "propagate the contents of its contributor version.", "", " In the following three paragraphs, a \"patent license\" is any express", "agreement or commitment, however denominated, not to enforce a patent", "(such as an express permission to practice a patent or covenant not to", "sue for patent infringement). To \"grant\" such a patent license to a", "party means to make such an agreement or commitment not to enforce a", "patent against the party.", "", " If you convey a covered work, knowingly relying on a patent license,", "and the Corresponding Source of the work is not available for anyone", "to copy, free of charge and under the terms of this License, through a", "publicly available network server or other readily accessible means,", "then you must either (1) cause the Corresponding Source to be so", "available, or (2) arrange to deprive yourself of the benefit of the", "patent license for this particular work, or (3) arrange, in a manner", "consistent with the requirements of this License, to extend the patent", "license to downstream recipients. \"Knowingly relying\" means you have", "actual knowledge that, but for the patent license, your conveying the", "covered work in a country, or your recipient's use of the covered work", "in a country, would infringe one or more identifiable patents in that", "country that you have reason to believe are valid.", "", " If, pursuant to or in connection with a single transaction or", "arrangement, you convey, or propagate by procuring conveyance of, a", "covered work, and grant a patent license to some of the parties", "receiving the covered work authorizing them to use, propagate, modify", "or convey a specific copy of the covered work, then the patent license", "you grant is automatically extended to all recipients of the covered", "work and works based on it.", "", " A patent license is \"discriminatory\" if it does not include within", "the scope of its coverage, prohibits the exercise of, or is", "conditioned on the non-exercise of one or more of the rights that are", "specifically granted under this License. You may not convey a covered", "work if you are a party to an arrangement with a third party that is", "in the business of distributing software, under which you make payment", "to the third party based on the extent of your activity of conveying", "the work, and under which the third party grants, to any of the", "parties who would receive the covered work from you, a discriminatory", "patent license (a) in connection with copies of the covered work", "conveyed by you (or copies made from those copies), or (b) primarily", "for and in connection with specific products or compilations that", "contain the covered work, unless you entered into that arrangement,", "or that patent license was granted, prior to 28 March 2007.", "", " Nothing in this License shall be construed as excluding or limiting", "any implied license or other defenses to infringement that may", "otherwise be available to you under applicable patent law.", "", " 12. No Surrender of Others' Freedom.", "", " If conditions are imposed on you (whether by court order, agreement or", "otherwise) that contradict the conditions of this License, they do not", "excuse you from the conditions of this License. If you cannot convey a", "covered work so as to satisfy simultaneously your obligations under this", "License and any other pertinent obligations, then as a consequence you may", "not convey it at all. For example, if you agree to terms that obligate you", "to collect a royalty for further conveying from those to whom you convey", "the Program, the only way you could satisfy both those terms and this", "License would be to refrain entirely from conveying the Program.", "", " 13. Use with the GNU Affero General Public License.", "", " Notwithstanding any other provision of this License, you have", "permission to link or combine any covered work with a work licensed", "under version 3 of the GNU Affero General Public License into a single", "combined work, and to convey the resulting work. The terms of this", "License will continue to apply to the part which is the covered work,", "but the special requirements of the GNU Affero General Public License,", "section 13, concerning interaction through a network will apply to the", "combination as such.", "", " 14. Revised Versions of this License.", "", " The Free Software Foundation may publish revised and/or new versions of", "the GNU General Public License from time to time. Such new versions will", "be similar in spirit to the present version, but may differ in detail to", "address new problems or concerns.", "", " Each version is given a distinguishing version number. If the", "Program specifies that a certain numbered version of the GNU General", "Public License \"or any later version\" applies to it, you have the", "option of following the terms and conditions either of that numbered", "version or of any later version published by the Free Software", "Foundation. If the Program does not specify a version number of the", "GNU General Public License, you may choose any version ever published", "by the Free Software Foundation.", "", " If the Program specifies that a proxy can decide which future", "versions of the GNU General Public License can be used, that proxy's", "public statement of acceptance of a version permanently authorizes you", "to choose that version for the Program.", "", " Later license versions may give you additional or different", "permissions. However, no additional obligations are imposed on any", "author or copyright holder as a result of your choosing to follow a", "later version.", "", 0 }, *aszWarranty[] = { " 15. Disclaimer of Warranty.", "", " THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY", "APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT", "HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY", "OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,", "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM", "IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF", "ALL NECESSARY SERVICING, REPAIR OR CORRECTION.", "", " 16. Limitation of Liability.", "", " IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING", "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS", "THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY", "GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE", "USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF", "DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD", "PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),", "EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF", "SUCH DAMAGES.", "", " 17. Interpretation of Sections 15 and 16.", "", " If the disclaimer of warranty and limitation of liability provided", "above cannot be given local legal effect according to their terms,", "reviewing courts shall apply local law that most closely approximates", "an absolute waiver of all civil liability in connection with the", "Program, unless a warranty or assumption of liability accompanies a", "copy of the Program in return for a fee.", "", 0 }; gnubg-1.08.003/gtkrelational.c000644 001751 000024 00000202600 14610037046 015625 0ustar00pmstaff000000 000000 /* * Copyright (C) 2006-2008 Christian Anthon * Copyright (C) 2006-2024 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * 02/2023: Isaac Keslassy: introduced the "history plot" feature, together * with two ways of launching it graphically: * a sub-menu command ("Analyze > Plot History"), and * a button in "Show Records". */ #include "config.h" #include "backgammon.h" #include #include #include #include #include "gtkrelational.h" #include "gtkgame.h" #include "gtkwindows.h" #include "gtklocdefs.h" enum { COLUMN_NICK, COLUMN_GNUE, COLUMN_GCHE, COLUMN_GCUE, COLUMN_SNWE, COLUMN_SCHE, COLUMN_SCUE, COLUMN_WRPA, COLUMN_WRTA, COLUMN_WDTG, COLUMN_WDBD, COLUMN_MDAC, COLUMN_MDBC, COLUMN_LUCK, NUM_COLUMNS }; static const gchar *titles[] = { N_("Nick"), N_("GNU\nErr"), N_("GNU\nMove"), N_("GNU\nCube"), N_("Snw\nErr"), N_("Snw\nMove"), N_("Snw\nCube"), N_("Pass"), N_("Take"), N_("WDb\nPass"), N_("WDb\nTake"), N_("MDb\nPass"), N_("MDb\nTake"), N_("Luck") }; static GtkWidget *pwPlayerName; static GtkWidget *pwPlayerNotes; static GtkWidget *pwQueryText; static GtkWidget *pwQueryResult = NULL; static GtkWidget *pwQueryBox; static GtkWidget *pwDBStatDialog; static GtkListStore *playerStore; static GtkListStore *dbStore; static GtkTreeIter selected_iter; static int optionsValid; static GtkWidget *playerTreeview = NULL; static GtkWidget *adddb, *deldb, *gameStats, *dbList, *dbtype, *user, *password, *hostname, *login, *helptext; static void CheckDatabase(const char *database); static void DBListSelected(GtkTreeView * treeview, gpointer userdata); #define PACK_OFFSET 4 #define OUTSIDE_FRAME_GAP PACK_OFFSET #define INSIDE_FRAME_GAP PACK_OFFSET #define NAME_NOTES_VGAP PACK_OFFSET #define BUTTON_GAP PACK_OFFSET #define QUERY_BORDER 1 static char * GetSelectedPlayer(void) { char *name; GtkTreeModel *model; if(!playerTreeview) return NULL; GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(playerTreeview)); if (gtk_tree_selection_count_selected_rows(sel) != 1) return NULL; model = gtk_tree_view_get_model(GTK_TREE_VIEW(playerTreeview)); gtk_tree_selection_get_selected(sel, &model, &selected_iter); gtk_tree_model_get(model, &selected_iter, COLUMN_NICK, &name, -1); return name; } /***************************************************************************** code for drawing the plot of GNU matchErrorRate using the records *****************************************************************************/ #define WIDTH 640 #define HEIGHT 480 /* Number of matches to fetch and plot */ #define NUM_PLOT 100 #define PLOT_WINDOW 5 // #define NUM_RECORDS 250 /* make sure it's no less than NUM_PLOT*/ static GdkRectangle plotarea; /* GtkDrawingArea size */ static double margin1x = 0.08; static double margin2x = 0.08; static double margin1y = 0.08; static double margin2y = 0.05; // static int alreadyComputed=0; /* when drawing it computes all arrays twice :( )*/ static char playerName[MAX_NAME_LEN]; /* name of the player for whom we plot the history*/ /* static because needed for both the computing + drawing functions... */ static int matchMoves [NUM_PLOT]={-1}; /* vector of numbers of moves in matches */ static double matchErrors [NUM_PLOT]={-1.0}; /* vector of total errors in matches */ static double matchErrorRate [NUM_PLOT]={-1.0}; /* vector of match error rate per match */ static double matchAvgErrorRate [NUM_PLOT]={-1.0}; /* vector of match error rate over last PLOT_WINDOW matches */ static int matchCumMoves [NUM_PLOT+1]={0}; /* vector of cumulative numbers of moves in matches */ static double matchCumErrors [NUM_PLOT+1]={0.0}; /* vector of cumulative total errors in matches */ static char opponentNames[NUM_PLOT][MAX_NAME_LEN]; /* names of opponentNames */ static double maxError = 0.001; // to avoid dividing by 0 in case of mistake static double minError = 1000.0; // to avoid dividing by 0 in case of mistake static double minYScale, maxYScale; static int numRecords = NUM_PLOT; // #define EPSILON 0.001 /* shows translation x->X when x=0=>X=a and x=1=>X=b * defined with plot MWC, could also make it extern there; * but the functions below depends on the margin definitions, * so extern is more tricky, and we'd need to start having * the margins in the function parameters */ static double scaleValue(double x,double a,double b) { return a+x*(b-a); } /* convert x in [0,1] to its X plotting value */ static double xToX (double x) { /* * x = 0 -> X = margin1*d * x = 1 -> X = (1-margin2)*d */ return scaleValue(x, margin1x * plotarea.width, ( 1- margin2x) * plotarea.width); } /* convert index i to its X plotting value by using the number of moves at match i */ static double iToX (int i) { /* for i: how many moves have been played between i and * "the end of the vector == the beginning of the match records", * scaled by total played movesxi */ double x = ((double)matchCumMoves[i]) / ((double)matchCumMoves[0]); return xToX(x); } /* convert y in [0,1] to its Y plotting value */ static double trueHistY (double y) { /* * y = 0 -> -h(1-margin1) on screen->Y=+h(1-margin1) * y = 1 -> -h*margin2 on screen->Y=+h*margin2 */ return scaleValue(y, (1 - margin1y) * plotarea.height, margin2y * plotarea.height); } /* convert error to its Y plotting value using the rigth scaling */ static double errorToY(double error) { double y = (error-minYScale)/(maxYScale-minYScale); return trueHistY(y); } static gboolean DrawHistoryPlot (GtkWidget *widget, GdkEventExpose *event, gpointer UNUSED(user_data)) { // GdkRectangle da; /* GtkDrawingArea size */ double dx = 2.0, dy = 2.0; /* Pixels between each point */ double fontSize =11.0; double clip_x1 = 0.0, clip_y1 = 0.0, clip_x2 = 0.0, clip_y2 = 0.0; // gdouble i, clip_x1 = 0.0, clip_y1 = 0.0, clip_x2 = 0.0, clip_y2 = 0.0; char strTemp[40]; // "convert" the G*t*kWidget to G*d*kWindow (no, it's not a GtkWindow!) GdkWindow* window = gtk_widget_get_window(widget); #if GTK_CHECK_VERSION(3,0,0) /*this is an "on_draw" in GTK3*/ /* Define a clipping zone to improve performance */ cairo_rectangle_int_t crt = { event->area.x, event->area.y, event->area.width, event->area.height }; cairo_region_t * cairoRegion = cairo_region_create_rectangle(&crt); GdkDrawingContext * drawingContext; drawingContext = gdk_window_begin_draw_frame(window, cairoRegion); // say: "I want to start drawing" cairo_t *cr = gdk_drawing_context_get_cairo_context(drawingContext); #else (void) event; cairo_t *cr = gdk_cairo_create(window); #endif #if GTK_CHECK_VERSION(3,0,0) /* Determine GtkDrawingArea dimensions */ gdk_window_get_geometry(window, &plotarea.x, &plotarea.y, &plotarea.width, &plotarea.height); #else /* Determine GtkDrawingArea dimensions */ int unused = 0; gdk_window_get_geometry(window, &plotarea.x, &plotarea.y, &plotarea.width, &plotarea.height, &unused); #endif /* we check already before calling the function, this is just to make sure and could be deleted*/ if(numRecords>1){ /* Determine the data points to calculate (i.e. those in the clipping zone */ cairo_device_to_user_distance (cr, &dx, &dy); cairo_clip_extents (cr, &clip_x1, &clip_y1, &clip_x2, &clip_y2); cairo_set_font_size(cr, fontSize); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); /* set scale on y-axis plot + sanity check + making sure min=0; --i) { cairo_line_to (cr, iToX(i), errorToY(matchAvgErrorRate[i])); } cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER); cairo_stroke (cr); /*discs*/ for (int i = numRecords-PLOT_WINDOW; i >=0; --i) { cairo_arc(cr, iToX(i), errorToY(matchAvgErrorRate[i]), dx/2, 0, 2 * M_PI); cairo_stroke_preserve(cr); cairo_fill(cr); } /* +legend */ cairo_set_source_rgb (cr, 1.0, 0.5, 0.0); cairo_set_dash(cr, dashed2, 0, 1); /*disable*/ cairo_move_to (cr, xToX(0.4), trueHistY(1.0+margin2y/2)); cairo_line_to (cr, xToX(0.45), trueHistY(1.0+margin2y/2)); cairo_stroke (cr); cairo_set_source_rgb (cr, 1.0, 0.5, 0.0); cairo_move_to(cr, xToX(0.47), trueHistY(1.0+margin2y/2)+0.3*fontSize); cairo_show_text(cr, _("5-match average")); cairo_stroke (cr); /* +text to the right of line */ cairo_move_to(cr, xToX(1.0)+10*dx/2, errorToY(matchAvgErrorRate[0]) + 0.3 * fontSize); cairo_set_source_rgb (cr, 1.0, 0.5, 0.0); sprintf(strTemp, "%.1f", matchAvgErrorRate[0]); // g_message("avg error rate %.1f\n", matchAvgErrorRate[0]); cairo_show_text(cr, strTemp); cairo_stroke(cr); /* PLOT 2: match error (in black)*/ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); for (int i = numRecords-1; i >=0; --i) { // for (int i = 0; i < numRecords; i ++) { cairo_line_to (cr, iToX(i), errorToY(matchErrorRate[i])); // g_message("i=%d,val=%f",i,matchErrorRate[i]); } // cairo_set_source_rgba (cr, 1, 0.6, 0.0, 0.6); //red, green, blue, translucency; //cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0) = black cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER); cairo_stroke (cr); /*discs*/ for (int i = numRecords-1; i >=0; --i) { // for (int i = 0; i < numRecords; i ++) { cairo_arc(cr, iToX(i), errorToY(matchErrorRate[i]), dx/2, 0, 2 * M_PI); cairo_stroke_preserve(cr); cairo_fill(cr); } /* +legend */ cairo_set_line_width (cr, dy/3); cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_move_to (cr, xToX(0.05), trueHistY(1.0+margin2y/2)); cairo_line_to (cr, xToX(0.1), trueHistY(1.0+margin2y/2)); cairo_stroke (cr); cairo_move_to(cr, xToX(0.12), trueHistY(1.0+margin2y/2)+0.3*fontSize); cairo_show_text(cr, _("Match error rate")); cairo_stroke (cr); /* +text to the right of line */ cairo_move_to(cr, xToX(1.0)+3*dx/2, errorToY(matchErrorRate[0]) + 0.3 * fontSize); cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); sprintf(strTemp, "%.1f", matchErrorRate[0]); // g_message("error rate %.1f\n", matchErrorRate[0]); cairo_show_text(cr, strTemp); cairo_stroke(cr); /* PLOT 3: Avg error (in blue)*/ cairo_set_source_rgb (cr, 0.0, 0.35, 0.65); /* 1. the newest record is the first, so we conceptually start by plotting the oldest; 2. it's an average, so it's not defined on all i's*/ cairo_set_dash(cr, dashed, len, 1); double matchAvg=Ratio(matchCumErrors[0], matchCumMoves[0]); cairo_move_to (cr, xToX(0.0), errorToY(matchAvg)); cairo_line_to (cr, xToX(1.0), errorToY(matchAvg)); cairo_stroke (cr); /* +legend */ cairo_move_to (cr, xToX(0.75), trueHistY(1.0+margin2y/2)); cairo_line_to (cr, xToX(0.8), trueHistY(1.0+margin2y/2)); cairo_stroke (cr); cairo_set_source_rgb (cr, 0.0, 0.35, 0.65); cairo_move_to(cr, xToX(0.82), trueHistY(1.0+margin2y/2)+0.3*fontSize); cairo_show_text(cr, _("Average")); cairo_stroke (cr); /* +text to the right of line */ cairo_move_to(cr, xToX(1.0)+17*dx/2, errorToY(matchAvg) + 0.3 * fontSize); cairo_set_source_rgb (cr, 0.0, 0.35, 0.65); sprintf(strTemp, "%.1f", matchAvg); cairo_show_text(cr, strTemp); cairo_stroke(cr); /* x axis*/ // for (int i = 10; i < numRecords; i=i+10) { // for (int j = 1; j <=10; j++) { double xLabel=ceil(0.11*((double)matchCumMoves[0])); for (double i = xLabel; i <(double)matchCumMoves[0]; i+=xLabel) { /* grid lines*/ cairo_set_line_width (cr, dy/3); cairo_set_dash(cr, dashed2, len2, 1); cairo_set_source_rgb (cr, 0.6, 0.6, 0.6); // for (int i = numRecords-1; i >=0; i=MIN(i-1,i-numRecords/5)) { // g_message("matchCumMoves[0]=%d,i=%f, xLabel=%f",matchCumMoves[0],i,xLabel); // double x=((double)matchCumMoves[i]) / ((double)matchCumMoves[0]); // /* [commented: axis markers] */ // cairo_move_to (cr, xToX(((double)i)/(n-1)), trueHistY(-0.03)); // cairo_line_to (cr, xToX(((double)i)/(n-1)), trueHistY(0.03)); cairo_move_to (cr, xToX(i/ ((double)matchCumMoves[0])), trueHistY(0.0)); cairo_line_to (cr, xToX(i/ ((double)matchCumMoves[0])), trueHistY(1.0)); cairo_stroke (cr); /* text: x-axis labels */ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); // cairo_move_to (cr, xToX(((double)i)/(numRecords-1)), trueHistY(0.0)); // cairo_line_to (cr, xToX(((double)i)/(numRecords-1)), trueHistY(1.0)); cairo_move_to(cr, xToX(i/ ((double)matchCumMoves[0]))-4*dx, trueHistY(0.0)+1.25*fontSize); sprintf(strTemp, "%d", (int)i); cairo_show_text(cr, strTemp); } cairo_move_to(cr, xToX(0.5)-10*dx, trueHistY(0.0)+2.5*fontSize); cairo_show_text(cr, _("decisions (cube or move)")); /* y axis*/ for (double j = 0.0; j <1.0; j+=0.1) { /*grid lines*/ if (j>0.0) { cairo_set_source_rgb (cr, 0.6, 0.6, 0.6); cairo_set_dash(cr, dashed2, len2, 1); cairo_move_to (cr, xToX(0.0), trueHistY(j)); cairo_line_to (cr, xToX(1.0), trueHistY(j)); cairo_stroke (cr); } /* text: y-axis labels */ cairo_move_to(cr, xToX(-0.08), trueHistY(j)+0.3*fontSize); sprintf(strTemp, "%.1f", scaleValue(j,minYScale,maxYScale)); cairo_show_text(cr, strTemp); cairo_stroke (cr); } /* drawing: new matches (vertical lines) */ cairo_set_line_width (cr, dy/3); cairo_set_source_rgb (cr, 0.3, 0.3, 0.3); cairo_set_dash(cr, dashed2, 0, 1); /*disable*/ int jTemp=0; /* this time we start from i=0 to make sure to include the latest match */ for (int i = 0; i =0; i=i-MAX(1,numRecords/5)) { // g_message("i=%d",i); // cairo_move_to (cr, iToX(i), errorToY(matchErrorRate[i])); // cairo_line_to (cr, iToX(i), trueHistY(0.93)); cairo_set_source_rgb (cr, 0.0, 0.0, 0.55); drawArrow(cr, iToX(i), trueHistY(0.86), iToX(i), errorToY(matchErrorRate[i])-3*dy); cairo_stroke (cr); /* text: match 1, match 2... */ // int jTemp=0; jTemp++; double Y1= (jTemp % 2 == 0)? fontSize:-fontSize; double Y2= (jTemp % 2 == 0)? 2*fontSize:0; cairo_move_to(cr, iToX(i)-10*dx,(trueHistY(0.95)+Y1)); sprintf(strTemp, _("match %d"), numRecords-i); cairo_show_text(cr, strTemp); cairo_move_to(cr, iToX(i)-10*dx,(trueHistY(0.95)+Y2)); sprintf(strTemp, _("vs. %s"), opponentNames[i]); cairo_show_text(cr, strTemp); cairo_stroke (cr); } } else GTKMessage(_("Error, not enough datapoints for a plot."), DT_INFO); #if GTK_CHECK_VERSION(3,0,0) // say: "I'm finished drawing gdk_window_end_draw_frame(window, drawingContext); // cleanup cairo_region_destroy(cairoRegion); #else cairo_destroy (cr); #endif return FALSE; } static void HistoryPlotInfo(GtkWidget* UNUSED(pw), GtkWidget* pwParent) { GtkWidget* pwInfoDialog, * pwBox; // const char* pch; pwInfoDialog = GTKCreateDialog(_("History Plot Explanations"), DT_INFO, pwParent, DIALOG_FLAG_MODAL, NULL, NULL); #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_set_border_width(GTK_CONTAINER(pwBox), 8); gtk_container_add(GTK_CONTAINER(DialogArea(pwInfoDialog, DA_MAIN)), pwBox); // Add explanation text for mwc plot AddText(pwBox, _(" This plot shows how the player's GNU error rate has evolved \ throughout the player's history, as provided by the database records (for the up-to-100 \ last matches).\ \n\n- To draw the plot, you need to first add the analyses to the database. Also make sure \ that the player you want to analyze is at the bottom of the screen.\ \n\n- The x-axis represents all of the analyzed player's (non-trivial) cube and move \ decisions in the matches. \ \n\n- The y-axis represents the GNU error rate, i.e., the ratio of the total errors by the \ total number of non-trivial played decisions. Lower is better.\ \n\n- The black plot shows the GNU error rate for each match.\ \n\n- The orange plot illustrates the weighted-average error rate over the past 5 matches. \ It divides the total errors by the number of played decisions within these 5 matches.\ \n\n- Some match examples are provided throughout the plot (blue arrows).")); GTKRunDialog(pwInfoDialog); } static void CreateHistoryWindow (void) //GtkWidget* pwParent) { { GtkWidget *window; GtkWidget *helpButton; GtkWidget *da; gchar *plotTitle; window = GTKCreateDialog("", DT_INFO, NULL, DIALOG_FLAG_MINMAXBUTTONS, NULL, NULL); gtk_window_set_default_size(GTK_WINDOW(window), WIDTH, HEIGHT); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); plotTitle = g_strdup_printf( _("History plot for %s"), playerName); gtk_window_set_title(GTK_WINDOW(window), plotTitle); g_free(plotTitle); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_widget_destroy), NULL); gtk_container_add(GTK_CONTAINER(DialogArea(window, DA_BUTTONS)), helpButton = gtk_button_new_with_label(_("Explanations"))); gtk_widget_set_tooltip_text(helpButton, _("Click to obtain more explanations on this History plot")); g_signal_connect(helpButton, "clicked", G_CALLBACK(HistoryPlotInfo), window); da = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(DialogArea(window, DA_MAIN)), da); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_hexpand(da, TRUE); g_signal_connect(G_OBJECT(da), "draw", G_CALLBACK(DrawHistoryPlot), NULL); #else g_signal_connect(G_OBJECT(da), "expose-event", G_CALLBACK (DrawHistoryPlot), NULL); #endif gtk_widget_show_all(window); } static void initHistoryArrays(void) { for (int i = 0; i < numRecords; i++) { matchErrorRate[i] = -1.0; matchAvgErrorRate[i] = -1.0; matchMoves[i] = -1; matchErrors[i] = -1.0; matchCumMoves[i] = 0; matchCumErrors[i] = 0.0; } maxError = 0.001; minError = 1000.0; numRecords = NUM_PLOT; } extern void ComputeHistory(int usePlayerName) { /* let's re-initialize all the static values and recompute the History */ // if (numRecordsrows < 2){ GTKMessage(_("Problem accessing database"), DT_INFO); return; } int userID = (int) strtol(rs->data[1][0], NULL, 0); // g_message("userID=%d",userID); FreeRowset(rs); // player_id, name FROM player WHERE player.player_id =2 // char szRequest[600]; sprintf(szRequest, // "matchstat_id," "unforced_moves," /*moves[0]*/ "close_cube_decisions," /*moves[1]*/ "cube_error_total_normalised," /* stats[0]*/ "chequer_error_total_normalised," /* stats[1]*/ "player_id0, player_id1 " "FROM matchstat NATURAL JOIN player NATURAL JOIN session " "WHERE name='%s' " "ORDER BY matchstat_id DESC " "LIMIT %d", playerName, NUM_PLOT); // sprintf(szRequest, // "matchstat_id," // "total_moves," // "unforced_moves," /*moves[1]*/ // "close_cube_decisions," /*moves[2]*/ // "snowie_moves," // "error_missed_doubles_below_cp_normalised," // "error_missed_doubles_above_cp_normalised," // "error_wrong_doubles_below_dp_normalised," // "error_wrong_doubles_above_tg_normalised," // "error_wrong_takes_normalised," // "error_wrong_passes_normalised," // "cube_error_total_normalised," /* stats[6]*/ // "chequer_error_total_normalised," /* stats[7]*/ // "luck_total_normalised," // "player_id0, player_id1,matchstat_id " // "FROM matchstat NATURAL JOIN player NATURAL JOIN session " // "WHERE name='isaac' " // "ORDER BY matchstat_id DESC " // "LIMIT %d", // NUM_PLOT); // g_message("request=%s",szRequest); rs2 = RunQuery(szRequest); if (!rs2){ GTKMessage(_("Problem accessing database"), DT_INFO); return; } if (rs2->rows < 2) { GTKMessage(_("No data in database"), DT_INFO); FreeRowset(rs2); return ; } // <= ? for (j = 1; j < rs2->rows; ++j) { RowSet *rs3; for (int i = 0; i < 2; ++i) moves[i] = (int) strtol(rs2->data[j][i], NULL, 0); for (int i = 2; i < 4; ++i) stats[i - 2] = (float) g_strtod(rs2->data[j][i], NULL); matchErrors[j-1]=(stats[0] + stats[1]) * 1000.0f; matchMoves[j-1]=moves[0] + moves[1]; matchErrorRate[j-1]=Ratiof(stats[0] + stats[1], moves[0] + moves[1]) * 1000.0f; /* get name of player at top of screen*/ int opponentID = (userID == (int) strtol(rs2->data[j][4],NULL, 0)) ? (int) strtol(rs2->data[j][5],NULL, 0) : (int) strtol(rs2->data[j][4],NULL, 0); sprintf(szRequest, "name FROM player WHERE player_id='%d'",opponentID); rs3 = RunQuery(szRequest); if (!rs3){ GTKMessage(_("Problem accessing database"), DT_INFO); return; } sprintf(opponentNames[j-1], "%s",rs3->data[1][0]); FreeRowset(rs3); // int userID=(int) strtol(rs2->data[1][0], NULL, 0); // g_message("opponent name=%s",opponentNames[j-1]); } numRecords=MIN(j-1,NUM_PLOT); // g_message("numRecords=%d",numRecords); /* counting backwards because the oldest record is at the end*/ // matchCumMoves[numRecords-1]=matchMoves[numRecords]; // matchCumErrors[numRecords-1]=matchErrors[numRecords]; for (int i = numRecords-1; i >=0; --i) { matchCumErrors[i]=matchCumErrors[i+1]+matchErrors[i]; matchCumMoves[i]=matchCumMoves[i+1]+matchMoves[i]; maxError=MAX(maxError,matchErrorRate[i]); minError=MIN(minError,matchErrorRate[i]); // g_message("maxerror:%f",maxError); } FreeRowset(rs2); if(numRecords>=PLOT_WINDOW+1) { /* if we have enough data to get at least 2 points*/ for (int i = numRecords-PLOT_WINDOW; i >=0; --i) { matchAvgErrorRate[i]=Ratio((matchCumErrors[i]-matchCumErrors[i+PLOT_WINDOW]), (matchCumMoves[i]-matchCumMoves[i+PLOT_WINDOW])); // g_message("matchAvgErrorRate[%d]=%f",i,matchAvgErrorRate[i]); } } if(numRecords>1) CreateHistoryWindow(); else GTKMessage(_("Error, not enough datapoints for a plot."), DT_INFO); // if (needToFreeListName){ // g_free(listName); // needToFreeListName=FALSE; // } return; } /* creating this placeholder function with all the inputs needed when * pressing a button; the real function above doesn't have all these inputs */ static void PlotHistoryTrigger(GtkWidget * UNUSED(pw), gpointer UNUSED(p)) { char *listName = NULL; // /* if launched by record list, need to check if player was picked there */ // fTriggeredByRecordList = TRUE; /* launched by record list, so need to check if player was picked there*/ listName = GetSelectedPlayer(); if (listName) { sprintf(playerName, "%s", listName); // g_message("using listName:%s",listName); g_free(listName); } else { // g_message("not from list"); // if(fTriggeredByRecordList && !listName){ // g_message("we free listName"); g_free(listName); // fTriggeredByRecordList = FALSE; /*re-initialize*/ if (!ap[1].szName[0]) { GTKMessage(_("No player name. Please open a match or select one in the database records."), DT_INFO); return; } // g_message("player on board?"); sprintf(playerName, "%s", ap[1].szName); // if (!playerName){ // GTKMessage(_("No player name. Please open a match or select one in the database records."), DT_INFO); // return; // } } //gtk_widget_destroy(pwr); ComputeHistory(TRUE); } static GtkTreeModel * create_model(void) { GtkTreeIter iter; RowSet *rs; int moves[4]; unsigned int i, j; gfloat stats[9]; /* create list store */ playerStore = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT); /* prepare the SQL query */ rs = RunQuery("name," "SUM(total_moves)," "SUM(unforced_moves)," "SUM(close_cube_decisions)," "SUM(snowie_moves)," "SUM(error_missed_doubles_below_cp_normalised)," "SUM(error_missed_doubles_above_cp_normalised)," "SUM(error_wrong_doubles_below_dp_normalised)," "SUM(error_wrong_doubles_above_tg_normalised)," "SUM(error_wrong_takes_normalised)," "SUM(error_wrong_passes_normalised)," "SUM(cube_error_total_normalised)," "SUM(chequer_error_total_normalised)," "SUM(luck_total_normalised) " "FROM matchstat NATURAL JOIN player group by name"); if (!rs) return 0; if (rs->rows < 2) { GTKMessage(_("No data in database"), DT_INFO); FreeRowset(rs); return 0; } for (j = 1; j < rs->rows; ++j) { for (i = 1; i < 5; ++i) moves[i - 1] = (int) strtol(rs->data[j][i], NULL, 0); for (i = 5; i < 14; ++i) stats[i - 5] = (float) g_strtod(rs->data[j][i], NULL); gtk_list_store_append(playerStore, &iter); gtk_list_store_set(playerStore, &iter, COLUMN_NICK, rs->data[j][0], COLUMN_GNUE, Ratiof(stats[6] + stats[7], moves[1] + moves[2]) * 1000.0f, COLUMN_GCHE, Ratiof(stats[7], moves[1]) * 1000.0f, COLUMN_GCUE, Ratiof(stats[6], moves[2]) * 1000.0f, COLUMN_SNWE, Ratiof(stats[6] + stats[7], moves[3]) * 1000.0f, COLUMN_SCHE, Ratiof(stats[7], moves[3]) * 1000.0f, COLUMN_SCUE, Ratiof(stats[6], moves[3]) * 1000.0f, COLUMN_WRPA, Ratiof(stats[5], moves[3]) * 1000.0f, COLUMN_WRTA, Ratiof(stats[4], moves[3]) * 1000.0f, COLUMN_WDTG, Ratiof(stats[3], moves[3]) * 1000.0f, COLUMN_WDBD, Ratiof(stats[2], moves[3]) * 1000.0f, COLUMN_MDAC, Ratiof(stats[1], moves[3]) * 1000.0f, COLUMN_MDBC, Ratiof(stats[0], moves[3]) * 1000.0f, COLUMN_LUCK, Ratiof(stats[8], moves[0]) * 1000.0f, -1); } FreeRowset(rs); return GTK_TREE_MODEL(playerStore); } static void cell_data_func(GtkTreeViewColumn * UNUSED(col), GtkCellRenderer * renderer, GtkTreeModel * model, GtkTreeIter * iter, gpointer column) { gfloat data; gchar buf[20]; /* get data pointed to by column */ gtk_tree_model_get(model, iter, GPOINTER_TO_INT(column), &data, -1); /* format the data to two digits */ g_snprintf(buf, sizeof(buf), "%.2f", data); /* render the string right aligned */ g_object_set(renderer, "text", buf, NULL); g_object_set(renderer, "xalign", 1.0, NULL); } static void add_columns(GtkTreeView * treeview) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gint i; renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Nick"), renderer, "text", COLUMN_NICK, NULL); gtk_tree_view_column_set_sort_column_id(column, 0); gtk_tree_view_append_column(treeview, column); for (i = 1; i < NUM_COLUMNS; i++) { column = gtk_tree_view_column_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_end(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, GINT_TO_POINTER(i), NULL); gtk_tree_view_column_set_sort_column_id(column, i); gtk_tree_view_column_set_title(column, gettext(titles[i])); gtk_tree_view_append_column(treeview, column); } } static GtkWidget * do_list_store(void) { GtkTreeModel *model; GtkWidget *treeview; model = create_model(); if (!model) return NULL; treeview = gtk_tree_view_new_with_model(model); g_object_unref(model); #if GTK_CHECK_VERSION(3,14,0) /* * This should not be hard coded but set from the theme. * Explicit deprecation starts at 3.14 but it may * not work in earlier gtk3 as well. */ #else gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); #endif gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), COLUMN_NICK); add_columns(GTK_TREE_VIEW(treeview)); return treeview; } static void ShowRelationalSelect(GtkWidget * UNUSED(pw), int UNUSED(y), int UNUSED(x), GdkEventButton * UNUSED(peb), GtkWidget * UNUSED(pwCopy)) { char *pName = GetSelectedPlayer(); RowSet *rs; char *query; gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwPlayerNotes)), "", -1); if (!pName) return; query = g_strdup_printf("player_id, name, notes FROM player WHERE player.name = '%s'", pName); g_free(pName); rs = RunQuery(query); g_free(query); if (!rs) { gtk_entry_set_text(GTK_ENTRY(pwPlayerName), ""); return; } g_assert(rs->rows == 2); /* Should be exactly one entry */ gtk_entry_set_text(GTK_ENTRY(pwPlayerName), rs->data[1][1]); gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwPlayerNotes)), rs->data[1][2], -1); FreeRowset(rs); } static void ShowRelationalClicked(GtkTreeView * UNUSED(treeview), GtkTreePath * UNUSED(path), GtkTreeViewColumn * UNUSED(col), gpointer UNUSED(userdata)) { gchar *name = GetSelectedPlayer(); if (!name) return; CommandRelationalShowDetails(name); g_free(name); } static GtkWidget * GtkRelationalShowStats(void) { GtkWidget *scrolledWindow; scrolledWindow = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN); playerTreeview = do_list_store(); g_signal_connect(playerTreeview, "row-activated", (GCallback) ShowRelationalClicked, NULL); gtk_container_add(GTK_CONTAINER(scrolledWindow), playerTreeview); g_signal_connect(playerTreeview, "cursor-changed", G_CALLBACK(ShowRelationalSelect), NULL); return scrolledWindow; } extern void GtkRelationalAddMatch(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { CommandRelationalAddMatch(NULL); outputx(); } static GtkWidget * GetRelList(RowSet * pRow) { unsigned int i, j; GtkListStore *store; GType *types; GtkTreeIter iter; GtkCellRenderer *renderer; GtkWidget *treeview; unsigned int cols = pRow ? (unsigned int) pRow->cols : 0; unsigned int rows = pRow ? (unsigned int) pRow->rows : 0; if (!pRow || !rows || !cols) return gtk_label_new(_("Search failed or empty.")); types = g_new(GType, cols); for (j = 0; j < cols; j++) types[j] = G_TYPE_STRING; store = gtk_list_store_newv(cols, types); g_free(types); for (i = 1; i < rows; i++) { gtk_list_store_append(store, &iter); for (j = 0; j < cols; j++) gtk_list_store_set(store, &iter, j, pRow->data[i][j], -1); } treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); renderer = gtk_cell_renderer_text_new(); for (j = 0; j < cols; j++) gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), -1, pRow->data[0][j], renderer, "text", j, NULL); return treeview; } static void ShowRelationalErase(GtkWidget * UNUSED(pw), GtkWidget * UNUSED(notused)) { char *buf; gchar *player = GetSelectedPlayer(); if (!player) return; buf = g_strdup_printf(_("Remove all data for %s?"), player); if (!GetInputYN(buf)) return; sprintf(buf, "\"%s\"", player); CommandRelationalErase(buf); g_free(buf); gtk_list_store_remove(GTK_LIST_STORE(playerStore), &selected_iter); } static char * GetText(GtkTextView * pwText) { GtkTextIter start, end; GtkTextBuffer *buffer = gtk_text_view_get_buffer(pwText); char *pch; gtk_text_buffer_get_start_iter(buffer, &start); gtk_text_buffer_get_end_iter(buffer, &end); pch = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); return pch; } static void UpdatePlayerDetails(GtkWidget * UNUSED(pw), GtkWidget * UNUSED(notused)) { char *notes; const char *newname; gchar *oldname = GetSelectedPlayer(); if (!oldname) return; notes = GetText(GTK_TEXT_VIEW(pwPlayerNotes)); newname = gtk_entry_get_text(GTK_ENTRY(pwPlayerName)); if (RelationalUpdatePlayerDetails(oldname, newname, notes) != 0) gtk_list_store_set(GTK_LIST_STORE(playerStore), &selected_iter, 0, newname, -1); g_free(notes); g_free(oldname); } static void RelationalQuery(GtkWidget * UNUSED(pw), GtkWidget * UNUSED(pwVbox)) { RowSet *rs; char *pch, *query; pch = GetText(GTK_TEXT_VIEW(pwQueryText)); if (!StrNCaseCmp("select ", pch, strlen("select "))) query = pch + strlen("select "); else query = pch; rs = RunQuery(query); if (pwQueryResult) gtk_widget_destroy(pwQueryResult); pwQueryResult = GetRelList(rs); gtk_box_pack_start(GTK_BOX(pwQueryBox), pwQueryResult, TRUE, TRUE, 0); gtk_widget_show(pwQueryResult); if (rs) FreeRowset(rs); g_free(pch); } static DBProvider * GetSelectedDBType(void) { DBProviderType dbType = (DBProviderType) gtk_combo_box_get_active(GTK_COMBO_BOX(dbtype)); return GetDBProvider(dbType); } static void TryConnection(DBProvider * pdb, GtkWidget * dbList) { const char *msg; DBProviderType dbType = (DBProviderType) gtk_combo_box_get_active(GTK_COMBO_BOX(dbtype)); gtk_list_store_clear(GTK_LIST_STORE(dbStore)); msg = TestDB(dbType); gtk_widget_set_sensitive(login, FALSE); if (msg) { gtk_label_set_text(GTK_LABEL(helptext), msg); optionsValid = FALSE; gtk_widget_set_sensitive(adddb, FALSE); gtk_widget_set_sensitive(deldb, FALSE); } else { /* Test ok */ GList *pl = pdb->GetDatabaseList(pdb->username, pdb->password, pdb->hostname); if (g_list_find_custom(pl, pdb->database, (GCompareFunc) g_ascii_strcasecmp) == NULL) { /* Somehow selected database not in list, so add it */ pl = g_list_append(pl, g_strdup(pdb->database)); } while (pl) { int ok, seldb; GtkTreeIter iter; char *database = (char *) pl->data; seldb = !StrCaseCmp(database, pdb->database); if (seldb) ok = TRUE; else { char *tmpDatabase = pdb->database; pdb->database = database; ok = (TestDB(dbType) == NULL); pdb->database = tmpDatabase; } if (ok) { gtk_list_store_append(GTK_LIST_STORE(dbStore), &iter); gtk_list_store_set(GTK_LIST_STORE(dbStore), &iter, 0, database, -1); if (seldb) { gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(dbList)), &iter); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(dbList), gtk_tree_model_get_path(gtk_tree_view_get_model(GTK_TREE_VIEW(dbList)), &iter), NULL, TRUE, 1, 0); } } g_free(database); pl = pl->next; } g_list_free(pl); CheckDatabase(pdb->database); } } static void CredentialsChanged(void) { gtk_widget_set_sensitive(login, TRUE); } static void LoginClicked(GtkButton * UNUSED(button), gpointer dbList) { char *tmpUser, *tmpPass, *tmpHost; DBProvider *pdb = GetSelectedDBType(); if (pdb == NULL) return; tmpUser = pdb->username; tmpPass = pdb->password; tmpHost = pdb->hostname; pdb->username = g_strdup(gtk_entry_get_text(GTK_ENTRY(user))); pdb->password = g_strdup(gtk_entry_get_text(GTK_ENTRY(password))); pdb->hostname = g_strdup(gtk_entry_get_text(GTK_ENTRY(hostname))); TryConnection(pdb, dbList); g_free(pdb->hostname); g_free(pdb->password); g_free(pdb->username); pdb->username = tmpUser; pdb->password = tmpPass; pdb->hostname = tmpHost; } static void TypeChanged(GtkComboBox * UNUSED(widget), gpointer dbList) { DBProvider *pdb = GetSelectedDBType(); if (pdb == NULL) return; if (pdb->HasUserDetails) { gtk_widget_set_sensitive(user, TRUE); gtk_widget_set_sensitive(password, TRUE); gtk_widget_set_sensitive(hostname, TRUE); gtk_entry_set_text(GTK_ENTRY(user), pdb->username); gtk_entry_set_text(GTK_ENTRY(password), pdb->password); if (pdb->hostname) gtk_entry_set_text(GTK_ENTRY(hostname), pdb->hostname); else gtk_entry_set_text(GTK_ENTRY(hostname), ""); } else { gtk_widget_set_sensitive(user, FALSE); gtk_widget_set_sensitive(password, FALSE); gtk_widget_set_sensitive(hostname, FALSE); } TryConnection(pdb, dbList); } void CheckDatabase(const char *database) { int valid = FALSE; int dbok = 0; DBProvider *pdb = GetSelectedDBType(); if (pdb) dbok = (pdb->Connect(database, gtk_entry_get_text(GTK_ENTRY(user)), gtk_entry_get_text(GTK_ENTRY(password)), gtk_entry_get_text(GTK_ENTRY(hostname))) >= 0); if (!dbok) gtk_label_set_text(GTK_LABEL(helptext), _("Failed to connect to database!")); else { int version = RunQueryValue(pdb, "next_id FROM control WHERE tablename = 'version'"); int matchcount = RunQueryValue(pdb, "count(*) FROM session"); char *dbString, *buf, *buf2 = NULL; if (version < DB_VERSION) dbString = _("This database is from an old version of GNU Backgammon and cannot be used"); else if (version > DB_VERSION) dbString = _("This database is from a new version of GNU Backgammon and cannot be used"); else { if (matchcount < 0) dbString = _("This database structure is invalid"); else { valid = TRUE; if (matchcount == 0) dbString = _("This database contains no matches"); else if (matchcount == 1) dbString = _("This database contains 1 match"); else { buf2 = g_strdup_printf(_("This database contains %d matches\n"), matchcount); dbString = buf2; } } } buf = g_strdup_printf(_("Database connection successful\n%s\n"), dbString); gtk_label_set_text(GTK_LABEL(helptext), buf); g_free(buf); g_free(buf2); pdb->Disconnect(); } gtk_widget_set_sensitive(adddb, dbok); gtk_widget_set_sensitive(deldb, dbok); optionsValid = valid; } static char * GetSelectedDB(GtkTreeView * treeview) { GtkTreeModel *model; char *db = NULL; GtkTreeSelection *sel = gtk_tree_view_get_selection(treeview); if (gtk_tree_selection_count_selected_rows(sel) != 1) return NULL; gtk_tree_selection_get_selected(sel, &model, &selected_iter); gtk_tree_model_get(model, &selected_iter, 0, &db, -1); return db; } static void DBListSelected(GtkTreeView * treeview, gpointer UNUSED(userdata)) { char *db = GetSelectedDB(treeview); if (db) { CheckDatabase(db); g_free(db); } } static void AddDBClicked(GtkButton * UNUSED(button), gpointer dbList) { char *dbName = GTKGetInput(_("Add Database"), _("Database Name:"), NULL); if (dbName) { DBProvider *pdb = GetSelectedDBType(); int con = 0; gchar *sz; GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(dbList)); /* If the database name is already in the list, don't try to add a new one */ if (gtk_tree_model_get_iter_first(model, &iter)) do { gtk_tree_model_get(model, &iter, 0, &sz, -1); if (g_ascii_strcasecmp(dbName, sz) == 0) { gtk_label_set_text(GTK_LABEL(helptext), _("Failed to create, database exists!")); g_free(dbName); return; } } while (gtk_tree_model_iter_next(model, &iter)); if (pdb) con = pdb->Connect(dbName, gtk_entry_get_text(GTK_ENTRY(user)), gtk_entry_get_text(GTK_ENTRY(password)), gtk_entry_get_text(GTK_ENTRY(hostname))); if (con > 0 || ((pdb) && CreateDatabase(pdb))) { gtk_list_store_append(GTK_LIST_STORE(dbStore), &iter); gtk_list_store_set(GTK_LIST_STORE(dbStore), &iter, 0, dbName, -1); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(dbList)), &iter); pdb->Disconnect(); CheckDatabase(dbName); } else gtk_label_set_text(GTK_LABEL(helptext), _("Failed to create database!")); g_free(dbName); } } static void DelDBClicked(GtkButton * UNUSED(button), gpointer dbList) { char *db = GetSelectedDB(GTK_TREE_VIEW(dbList)); if (db && GetInputYN(_("Are you sure you want to delete all the matches in this database?"))) { DBProvider *pdb = GetSelectedDBType(); if (pdb && pdb->DeleteDatabase(db, gtk_entry_get_text(GTK_ENTRY(user)), gtk_entry_get_text(GTK_ENTRY(password)), gtk_entry_get_text(GTK_ENTRY(hostname)))) { gtk_list_store_remove(GTK_LIST_STORE(dbStore), &selected_iter); optionsValid = FALSE; gtk_widget_set_sensitive(deldb, FALSE); gtk_label_set_text(GTK_LABEL(helptext), _("Database successfully removed")); pdb->database = "gnubg"; } else gtk_label_set_text(GTK_LABEL(helptext), _("Failed to delete database!")); } } extern void RelationalOptionsShown(void) { /* Setup the options when tab selected */ gtk_combo_box_set_active(GTK_COMBO_BOX(dbtype), dbProviderType); } extern void RelationalSaveOptions(void) { if (optionsValid) { DBProviderType dbType = (DBProviderType) gtk_combo_box_get_active(GTK_COMBO_BOX(dbtype)); SetDBSettings(dbType, GetSelectedDB(GTK_TREE_VIEW(dbList)), gtk_entry_get_text(GTK_ENTRY(user)), gtk_entry_get_text(GTK_ENTRY(password)), gtk_entry_get_text(GTK_ENTRY(hostname))); storeGameStats = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gameStats)); } } extern GtkWidget * RelationalOptions(void) { int i; GtkWidget *hb1, *hb2, *vb1, *vb2, *lbl, *help, *pwScrolled; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *grid; #else GtkWidget *table; GtkWidget *align; #endif dbStore = gtk_list_store_new(1, G_TYPE_STRING); dbList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dbStore)); g_object_unref(dbStore); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(dbList)), GTK_SELECTION_BROWSE); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(dbList), -1, _("Databases"), gtk_cell_renderer_text_new(), "text", 0, NULL); gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(dbList), FALSE); g_signal_connect(dbList, "cursor-changed", G_CALLBACK(DBListSelected), NULL); dbtype = gtk_combo_box_text_new(); for (i = 0; i < NUM_PROVIDERS; i++) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(dbtype), GetProviderName(i)); g_signal_connect(dbtype, "changed", G_CALLBACK(TypeChanged), dbList); #if GTK_CHECK_VERSION(3,0,0) vb2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); hb2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else vb2 = gtk_vbox_new(FALSE, 0); hb2 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(vb2), hb2, FALSE, FALSE, 10); #if GTK_CHECK_VERSION(3,0,0) vb1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); hb1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else vb1 = gtk_vbox_new(FALSE, 0); hb1 = gtk_hbox_new(FALSE, 0); #endif gtk_widget_set_tooltip_text(hb1, _("Database type can be SQLite (bundled with GNU Backgammon), MySQL/MariaDB or PostgreSQL. " "The first one needs only a database name. For the other two you need an external database server and to configure how to access it")); gtk_box_pack_start(GTK_BOX(hb1), gtk_label_new(_("DB Type")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hb1), dbtype, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vb1), hb1, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) grid = gtk_grid_new(); #else table = gtk_table_new(4, 2, FALSE); #endif lbl = gtk_label_new(_("Username")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(lbl, GTK_ALIGN_START); gtk_widget_set_valign(lbl, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(grid), lbl, 0, 0, 1, 1); #else gtk_misc_set_alignment(GTK_MISC(lbl), 0, 0.5); gtk_table_attach(GTK_TABLE(table), lbl, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); #endif user = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(user), 20); g_signal_connect(user, "changed", G_CALLBACK(CredentialsChanged), dbList); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(grid), user, 1, 0, 1, 1); #else gtk_table_attach(GTK_TABLE(table), user, 1, 2, 0, 1, 0, 0, 0, 0); #endif lbl = gtk_label_new(_("Password")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(lbl, GTK_ALIGN_START); gtk_widget_set_valign(lbl, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(grid), lbl, 0, 1, 1, 1); #else gtk_misc_set_alignment(GTK_MISC(lbl), 0, 0.5); gtk_table_attach(GTK_TABLE(table), lbl, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); #endif password = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(password), 20); gtk_entry_set_visibility(GTK_ENTRY(password), FALSE); g_signal_connect(password, "changed", G_CALLBACK(CredentialsChanged), dbList); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(grid), password, 1, 1, 1, 1); #else gtk_table_attach(GTK_TABLE(table), password, 1, 2, 1, 2, 0, 0, 0, 0); #endif lbl = gtk_label_new(_("DB server")); gtk_widget_set_tooltip_text(lbl, _("Entered as: hostname:port")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(lbl, GTK_ALIGN_START); gtk_widget_set_valign(lbl, GTK_ALIGN_CENTER); gtk_grid_attach(GTK_GRID(grid), lbl, 0, 2, 1, 1); #else gtk_misc_set_alignment(GTK_MISC(lbl), 0, 0.5); gtk_table_attach(GTK_TABLE(table), lbl, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); #endif hostname = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(hostname), 64); gtk_entry_set_width_chars(GTK_ENTRY(hostname), 20); gtk_entry_set_visibility(GTK_ENTRY(hostname), TRUE); g_signal_connect(hostname, "changed", G_CALLBACK(CredentialsChanged), dbList); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(grid), hostname, 1, 2, 1, 1); #else gtk_table_attach(GTK_TABLE(table), hostname, 1, 2, 2, 3, 0, 0, 0, 0); #endif login = gtk_button_new_with_label(_("Login")); g_signal_connect(login, "clicked", G_CALLBACK(LoginClicked), dbList); gtk_widget_set_tooltip_text(login, _("Check connection to database server")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(login, GTK_ALIGN_END); gtk_widget_set_valign(login, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(grid), login, 1, 3, 1, 1); #else align = gtk_alignment_new(1, 0, 0, 0); gtk_container_add(GTK_CONTAINER(align), login); gtk_table_attach(GTK_TABLE(table), align, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 0); #endif #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(vb1), grid, FALSE, FALSE, 4); #else gtk_box_pack_start(GTK_BOX(vb1), table, FALSE, FALSE, 4); #endif gameStats = gtk_check_button_new_with_label(_("Store game stats")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gameStats), storeGameStats); gtk_box_pack_start(GTK_BOX(vb1), gameStats, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(gameStats, _("Store individual games statistics in addition to global match ones")); gtk_box_pack_start(GTK_BOX(hb2), vb1, FALSE, FALSE, 10); help = gtk_frame_new(_("Info")); helptext = gtk_label_new(NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(helptext, GTK_ALIGN_START); gtk_widget_set_valign(helptext, GTK_ALIGN_START); g_object_set(helptext, "margin", 4, NULL); #else gtk_misc_set_alignment(GTK_MISC(helptext), 0, 0); gtk_misc_set_padding(GTK_MISC(helptext), 4, 4); #endif gtk_widget_set_size_request(helptext, 400, 70); gtk_container_add(GTK_CONTAINER(help), helptext); gtk_box_pack_start(GTK_BOX(vb2), help, FALSE, FALSE, 4); pwScrolled = gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_size_request(pwScrolled, 100, 100); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(pwScrolled), dbList); #if GTK_CHECK_VERSION(3,0,0) vb1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vb1 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hb2), vb1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vb1), pwScrolled, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) hb1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hb1 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(vb1), hb1, FALSE, FALSE, 0); adddb = gtk_button_new_with_label(_("Add database")); g_signal_connect(adddb, "clicked", G_CALLBACK(AddDBClicked), dbList); gtk_box_pack_start(GTK_BOX(hb1), adddb, FALSE, FALSE, 0); deldb = gtk_button_new_with_label(_("Delete database")); g_signal_connect(deldb, "clicked", G_CALLBACK(DelDBClicked), dbList); gtk_box_pack_start(GTK_BOX(hb1), deldb, FALSE, FALSE, 4); return vb2; } extern void GtkShowRelational(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GtkWidget *pwRun, *pwHbox2, *pwVbox2, *pwPlayerFrame, *pwUpdate, *pwPaned, *pwVbox, *pwErase, *pwOpen, *pwn, *pwLabel, *pwScrolled, *pwHbox, *histButton; DBProvider *pdb; static GtkTextBuffer *query = NULL; /*remember query */ if (((pdb = ConnectToDB(dbProviderType)) == NULL) || RunQueryValue(pdb, "count(*) FROM player") < 2) { if (pdb) pdb->Disconnect(); GTKMessage(_("No data in database"), DT_INFO); return; } pdb->Disconnect(); /* We had the following bug: in an unexplained way, this window became a black hole: we could not relaunch it after closing it. V1: we make it modal. But then, if we click on a plot window and close the two windows successively, gnubg crashes. V2: it turns out that we need to first check that gnubg does not think there is an open top-level window before starting this window. It then works fine. */ // if (pwDBStatDialog && gtk_widget_get_toplevel(pwDBStatDialog)) // gtk_widget_destroy(gtk_widget_get_toplevel(pwDBStatDialog)); pwDBStatDialog = GTKCreateDialog(_("GNU Backgammon - Database"), DT_INFO, NULL, DIALOG_FLAG_NONE, G_CALLBACK(gtk_widget_destroy), NULL); // DT_INFO, NULL, DIALOG_FLAG_MINMAXBUTTONS, NULL, NULL); // DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_MINMAXBUTTONS, NULL, NULL); # #define REL_DIALOG_HEIGHT 600 gtk_window_set_default_size(GTK_WINDOW(pwDBStatDialog), -1, REL_DIALOG_HEIGHT); gtk_container_add(GTK_CONTAINER(DialogArea(pwDBStatDialog, DA_BUTTONS)), histButton = gtk_button_new_with_label(_("Plot History"))); gtk_widget_set_tooltip_text(histButton, _("Click on the button to plot the historical " "error of (1) a player selected in the above list, or if no player is selected, " "(2) the player sitting at the bottom of the board in the current match.")); g_signal_connect(histButton, "clicked", G_CALLBACK(PlotHistoryTrigger), pwDBStatDialog); pwn = gtk_notebook_new(); gtk_container_set_border_width(GTK_CONTAINER(pwn), 0); /******************************************************* ** Start of (left hand side) of player screen... *******************************************************/ #if GTK_CHECK_VERSION(3,0,0) pwPaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL); pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwPaned = gtk_vpaned_new(); pwVbox = gtk_vbox_new(FALSE, 0); #endif gtk_paned_set_position(GTK_PANED(pwPaned), (int) (REL_DIALOG_HEIGHT * 0.6)); gtk_notebook_append_page(GTK_NOTEBOOK(pwn), pwPaned, gtk_label_new(_("Players"))); gtk_container_set_border_width(GTK_CONTAINER(pwVbox), INSIDE_FRAME_GAP); gtk_paned_add1(GTK_PANED(pwPaned), pwVbox); gtk_box_pack_start(GTK_BOX(pwVbox), GtkRelationalShowStats(), TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) pwHbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox2 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHbox2, FALSE, FALSE, 0); pwOpen = gtk_button_new_with_label(_("Open")); g_signal_connect(G_OBJECT(pwOpen), "clicked", G_CALLBACK(ShowRelationalClicked), NULL); gtk_box_pack_start(GTK_BOX(pwHbox2), pwOpen, FALSE, FALSE, 0); pwErase = gtk_button_new_with_label(_("Erase")); g_signal_connect(G_OBJECT(pwErase), "clicked", G_CALLBACK(ShowRelationalErase), NULL); gtk_box_pack_start(GTK_BOX(pwHbox2), pwErase, FALSE, FALSE, BUTTON_GAP); /******************************************************* ** Start of right hand side of player screen... *******************************************************/ pwPlayerFrame = gtk_frame_new(_("Player")); gtk_container_set_border_width(GTK_CONTAINER(pwPlayerFrame), OUTSIDE_FRAME_GAP); gtk_paned_add2(GTK_PANED(pwPaned), pwPlayerFrame); #if GTK_CHECK_VERSION(3,0,0) pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, NAME_NOTES_VGAP); #else pwVbox = gtk_vbox_new(FALSE, NAME_NOTES_VGAP); #endif gtk_container_set_border_width(GTK_CONTAINER(pwVbox), INSIDE_FRAME_GAP); gtk_container_add(GTK_CONTAINER(pwPlayerFrame), pwVbox); #if GTK_CHECK_VERSION(3,0,0) pwHbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox2 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHbox2, FALSE, FALSE, 0); pwLabel = gtk_label_new(_("Name")); gtk_box_pack_start(GTK_BOX(pwHbox2), pwLabel, FALSE, FALSE, 0); pwPlayerName = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(pwHbox2), pwPlayerName, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) pwVbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwVbox2, TRUE, TRUE, 0); pwLabel = gtk_label_new(_("Notes")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); #endif gtk_box_pack_start(GTK_BOX(pwVbox2), pwLabel, FALSE, FALSE, 0); pwPlayerNotes = gtk_text_view_new(); gtk_text_view_set_editable(GTK_TEXT_VIEW(pwPlayerNotes), TRUE); pwScrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(pwScrolled), pwPlayerNotes); gtk_box_pack_start(GTK_BOX(pwVbox2), pwScrolled, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) pwHbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox2 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHbox2, FALSE, FALSE, 0); pwUpdate = gtk_button_new_with_label(_("Update Details")); gtk_box_pack_start(GTK_BOX(pwHbox2), pwUpdate, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pwUpdate), "clicked", G_CALLBACK(UpdatePlayerDetails), NULL); /******************************************************* ** End of right hand side of player screen... *******************************************************/ /* Query sheet */ #if GTK_CHECK_VERSION(3,0,0) pwVbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwVbox = gtk_vbox_new(FALSE, 0); #endif gtk_notebook_append_page(GTK_NOTEBOOK(pwn), pwVbox, gtk_label_new(_("Query"))); gtk_container_set_border_width(GTK_CONTAINER(pwVbox), INSIDE_FRAME_GAP); pwLabel = gtk_label_new(_("Query text")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwLabel, FALSE, FALSE, 0); if (!query) { query = gtk_text_buffer_new(NULL); pwQueryText = gtk_text_view_new_with_buffer(query); gtk_text_buffer_set_text(query, "s.session_id, s.length, p1.name, p2.name from (player p1, player p2) join session s on s.player_id0 = p1.player_id and s.player_id1 = p2.player_id", -1); } else pwQueryText = gtk_text_view_new_with_buffer(query); gtk_text_view_set_border_window_size(GTK_TEXT_VIEW(pwQueryText), GTK_TEXT_WINDOW_TOP, QUERY_BORDER); gtk_text_view_set_border_window_size(GTK_TEXT_VIEW(pwQueryText), GTK_TEXT_WINDOW_RIGHT, QUERY_BORDER); gtk_text_view_set_border_window_size(GTK_TEXT_VIEW(pwQueryText), GTK_TEXT_WINDOW_BOTTOM, QUERY_BORDER); gtk_text_view_set_border_window_size(GTK_TEXT_VIEW(pwQueryText), GTK_TEXT_WINDOW_LEFT, QUERY_BORDER); gtk_text_view_set_editable(GTK_TEXT_VIEW(pwQueryText), TRUE); gtk_box_pack_start(GTK_BOX(pwVbox), pwQueryText, FALSE, FALSE, 0); gtk_widget_set_size_request(pwQueryText, 250, 80); #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwHbox, FALSE, FALSE, 0); pwLabel = gtk_label_new(_("Result")); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pwLabel, GTK_ALIGN_START); gtk_widget_set_valign(pwLabel, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(pwLabel), 0, 0.5); #endif gtk_box_pack_start(GTK_BOX(pwHbox), pwLabel, TRUE, TRUE, 0); pwRun = gtk_button_new_with_label(_("Run Query")); g_signal_connect(G_OBJECT(pwRun), "clicked", G_CALLBACK(RelationalQuery), pwVbox); gtk_box_pack_start(GTK_BOX(pwHbox), pwRun, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) pwQueryBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwQueryBox = gtk_vbox_new(FALSE, 0); #endif pwScrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); #if GTK_CHECK_VERSION(3, 8, 0) gtk_container_add(GTK_CONTAINER(pwScrolled), pwQueryBox); #else gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pwScrolled), pwQueryBox); #endif gtk_box_pack_start(GTK_BOX(pwVbox), pwScrolled, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(DialogArea(pwDBStatDialog, DA_MAIN)), pwn); gtk_widget_show_all(pwDBStatDialog); } extern void GtkShowQuery(RowSet * pRow) { GtkWidget *pwDialog; pwDialog = GTKCreateDialog(_("GNU Backgammon - Database Result"), DT_INFO, NULL, DIALOG_FLAG_MODAL, NULL, NULL); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), GetRelList(pRow)); GTKRunDialog(pwDialog); } gnubg-1.08.003/gtkfile.c000644 001751 000024 00000077422 14610037046 014426 0ustar00pmstaff000000 000000 /* * Copyright (C) 2005 Ingo Macherius * Copyright (C) 2005-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "backgammon.h" #include "gtklocdefs.h" #include #include #if HAVE_UNISTD_H #include #endif #include #include #include #include "gtkfile.h" #include "gtkgame.h" #include "gtktoolbar.h" #include "gtkwindows.h" #include "file.h" #include "util.h" /*for picking the first file in folder...*/ #include #include #include #include #include #include #define MAX_LEN 1024 static void FilterAdd(const char *fn, const char *pt, GtkFileChooser * fc) { GtkFileFilter *aff = gtk_file_filter_new(); gchar *sz; gtk_file_filter_set_name(aff, fn); gtk_file_filter_add_pattern(aff, pt); gtk_file_filter_add_pattern(aff, sz = g_ascii_strup(pt, -1)); g_free(sz); gtk_file_chooser_add_filter(fc, aff); } static GtkWidget * GnuBGFileDialog(const gchar * prompt, const gchar * folder, const gchar * name, GtkFileChooserAction action) { #if defined( WIN32) char *programdir, *pc; #endif GtkWidget *fc; switch (action) { case GTK_FILE_CHOOSER_ACTION_OPEN: fc = gtk_file_chooser_dialog_new(prompt, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, #if GTK_CHECK_VERSION(3,0,0) "_Open", #else GTK_STOCK_OPEN, #endif GTK_RESPONSE_ACCEPT, #if GTK_CHECK_VERSION(3,0,0) "_Cancel", #else GTK_STOCK_CANCEL, #endif GTK_RESPONSE_CANCEL, NULL); break; case GTK_FILE_CHOOSER_ACTION_SAVE: fc = gtk_file_chooser_dialog_new(prompt, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, #if GTK_CHECK_VERSION(3,0,0) "_Save", #else GTK_STOCK_SAVE, #endif GTK_RESPONSE_ACCEPT, #if GTK_CHECK_VERSION(3,0,0) "_Cancel", #else GTK_STOCK_CANCEL, #endif GTK_RESPONSE_CANCEL, NULL); break; default: return NULL; } gtk_window_set_modal(GTK_WINDOW(fc), TRUE); gtk_window_set_transient_for(GTK_WINDOW(fc), GTK_WINDOW(pwMain)); if (folder && *folder && g_file_test(folder, G_FILE_TEST_IS_DIR)) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fc), folder); if (name && *name) { if (action == GTK_FILE_CHOOSER_ACTION_OPEN) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fc), name); else gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(fc), name); } #if defined(WIN32) programdir = g_strdup(getDataDir()); if ((pc = strrchr(programdir, G_DIR_SEPARATOR)) != NULL) { char *tmp; *pc = '\0'; tmp = g_build_filename(programdir, "GridGammon", "SaveGame", NULL); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(fc), tmp, NULL); g_free(tmp); tmp = g_build_filename(programdir, "GammonEmpire", "savedgames", NULL); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(fc), tmp, NULL); g_free(tmp); tmp = g_build_filename(programdir, "PartyGaming", "PartyGammon", "SavedGames", NULL); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(fc), tmp, NULL); g_free(tmp); tmp = g_build_filename(programdir, "Play65", "savedgames", NULL); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(fc), tmp, NULL); g_free(tmp); tmp = g_build_filename(programdir, "TrueMoneyGames", "SavedGames", NULL); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(fc), tmp, NULL); g_free(tmp); } g_free(programdir); #endif return fc; } extern char * GTKFileSelect(const gchar * prompt, const gchar * extension, const gchar * folder, const gchar * name, GtkFileChooserAction action) { gchar *filename = NULL; GtkWidget *fc = GnuBGFileDialog(prompt, folder, name, action); if (extension && *extension) { gchar *sz = g_strdup_printf(_("Supported files (%s)"), extension); FilterAdd(sz, extension, GTK_FILE_CHOOSER(fc)); FilterAdd(_("All Files"), "*", GTK_FILE_CHOOSER(fc)); g_free(sz); } if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)); gtk_widget_destroy(fc); return filename; } typedef struct { GtkWidget *fc, *description, *mgp, *upext; } SaveOptions; static void SaveOptionsCallBack(GtkWidget * UNUSED(pw), SaveOptions * pso) { gint type, mgp; type = gtk_combo_box_get_active(GTK_COMBO_BOX(pso->description)); mgp = gtk_combo_box_get_active(GTK_COMBO_BOX(pso->mgp)); gtk_dialog_set_response_sensitive(GTK_DIALOG(pso->fc), GTK_RESPONSE_ACCEPT, export_format[type].exports[mgp]); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pso->upext))) { gchar *fn; if ((fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pso->fc))) != NULL) { gchar *fnname, *fndir; DisectPath(fn, export_format[type].extension, &fnname, &fndir); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(pso->fc), fndir); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(pso->fc), fnname); g_free(fnname); g_free(fndir); g_free(fn); } } } static void SaveCommon(guint f, gchar * prompt) { GtkWidget *hbox; guint i; gint j, type; SaveOptions so; static ExportType last_export_type = EXPORT_SGF; static gint last_export_mgp = 0; static gchar *last_save_folder = NULL; static gchar *last_export_folder = NULL; gchar *fn = GetFilename(TRUE, (f == 1) ? EXPORT_SGF : last_export_type, TRUE); gchar *folder = NULL; const gchar *mgp_text[3] = { "match", "game", "position" }; if (f == 1) folder = last_save_folder ? last_save_folder : default_sgf_folder; else folder = last_export_folder ? last_export_folder : default_export_folder; so.fc = GnuBGFileDialog(prompt, folder, fn, GTK_FILE_CHOOSER_ACTION_SAVE); g_free(fn); so.description = gtk_combo_box_text_new(); for (j = i = 0; i < f; ++i) { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(so.description), export_format[i].description); if (i == last_export_type) gtk_combo_box_set_active(GTK_COMBO_BOX(so.description), j); j++; } if (f == 1) gtk_combo_box_set_active(GTK_COMBO_BOX(so.description), 0); so.mgp = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(so.mgp), _("match")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(so.mgp), _("game")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(so.mgp), _("position")); gtk_combo_box_set_active(GTK_COMBO_BOX(so.mgp), last_export_mgp); so.upext = gtk_check_button_new_with_label(_("Update extension")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(so.upext), TRUE); #if GTK_CHECK_VERSION(3,0,0) hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); #else hbox = gtk_hbox_new(FALSE, 10); #endif gtk_box_pack_start(GTK_BOX(hbox), so.mgp, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), so.description, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), so.upext, TRUE, TRUE, 0); gtk_widget_show_all(hbox); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(so.fc), hbox); g_signal_connect(G_OBJECT(so.description), "changed", G_CALLBACK(SaveOptionsCallBack), &so); g_signal_connect(G_OBJECT(so.mgp), "changed", G_CALLBACK(SaveOptionsCallBack), &so); SaveOptionsCallBack(so.fc, &so); if (gtk_dialog_run(GTK_DIALOG(so.fc)) == GTK_RESPONSE_ACCEPT) { SaveOptionsCallBack(so.fc, &so); fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(so.fc)); if (fn) { const gchar *et = mgp_text[gtk_combo_box_get_active(GTK_COMBO_BOX(so.mgp))]; gchar *cmd = NULL; type = gtk_combo_box_get_active(GTK_COMBO_BOX(so.description)); if (type == EXPORT_SGF) cmd = g_strdup_printf("save %s \"%s\"", et, fn); else cmd = g_strdup_printf("export %s %s \"%s\"", et, export_format[type].clname, fn); last_export_type = (ExportType) type; last_export_mgp = gtk_combo_box_get_active(GTK_COMBO_BOX(so.mgp)); g_free(last_export_folder); last_export_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(so.fc)); UserCommand(cmd); UserCommand("save settings"); g_free(cmd); } g_free(fn); } gtk_widget_destroy(so.fc); } static ImportType lastOpenType; static GtkWidget *openButton, *selFileType; static int autoOpen; static void selection_changed_cb(GtkFileChooser * file_chooser, void *UNUSED(notused)) { const char *label; gchar *buf; gchar *filename; FilePreviewData *fpd; int openable = FALSE; filename = gtk_file_chooser_get_filename(file_chooser); fpd = ReadFilePreview(filename); g_free(filename); if (!fpd) { lastOpenType = N_IMPORT_TYPES; label = ""; } else { lastOpenType = fpd->type; label = gettext((import_format[lastOpenType]).description); g_free(fpd); if (lastOpenType != N_IMPORT_TYPES || !autoOpen) openable = TRUE; } buf = g_strdup_printf("%s", label); gtk_label_set_markup(GTK_LABEL(selFileType), buf); g_free(buf); gtk_widget_set_sensitive(openButton, openable); } static void add_import_filters(GtkFileChooser * fc) { GtkFileFilter *aff = gtk_file_filter_new(); gint i; gchar *sg, *sz; gtk_file_filter_set_name(aff, _("Supported files")); for (i = 0; i < N_IMPORT_TYPES; ++i) { sg = g_strdup_printf("*%s", import_format[i].extension); gtk_file_filter_add_pattern(aff, sg); gtk_file_filter_add_pattern(aff, sz = g_ascii_strup(sg, -1)); g_free(sz); g_free(sg); } gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc), aff); FilterAdd(_("All Files"), "*", GTK_FILE_CHOOSER(fc)); for (i = 0; i < N_IMPORT_TYPES; ++i) { sg = g_strdup_printf("*%s", import_format[i].extension); FilterAdd(import_format[i].description, sg, GTK_FILE_CHOOSER(fc)); g_free(sg); } } static void OpenTypeChanged(GtkComboBox * widget, gpointer fc) { autoOpen = (gtk_combo_box_get_active(widget) == 0); selection_changed_cb(fc, NULL); } static GtkWidget * import_types_combo(void) { gint i; GtkWidget *type_combo = gtk_combo_box_text_new(); /* Default option 'automatic' */ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(type_combo), _("Automatic")); gtk_combo_box_set_active(GTK_COMBO_BOX(type_combo), 0); for (i = 0; i < N_IMPORT_TYPES; ++i) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(type_combo), import_format[i].description); /* Extra option 'command file' */ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(type_combo), _("GNUbg Command file")); return type_combo; } static void do_import_file(gint import_type, gchar * fn) { gchar *cmd = NULL; if (!fn) return; if (import_type == N_IMPORT_TYPES) outputerrf(_("Unable to import. Unrecognized file type")); else if (import_type == IMPORT_SGF) { cmd = g_strdup_printf("load match \"%s\"", fn); } else { cmd = g_strdup_printf("import %s \"%s\"", import_format[import_type].clname, fn); } if (cmd) { if (ToolbarIsEditing(NULL)) click_edit(); UserCommand(cmd); } g_free(cmd); } extern void GTKOpen(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { GtkWidget *fc; GtkWidget *type_combo, *box, *box2; gchar *folder = NULL; gint import_type; static gchar *last_import_folder = NULL; static gchar *last_import_file = NULL; folder = last_import_folder ? last_import_folder : default_import_folder; fc = GnuBGFileDialog(_("Open backgammon file"), folder, last_import_file, GTK_FILE_CHOOSER_ACTION_OPEN); type_combo = import_types_combo(); g_signal_connect(type_combo, "changed", G_CALLBACK(OpenTypeChanged), fc); #if GTK_CHECK_VERSION(3,0,0) box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); box2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else box = gtk_hbox_new(FALSE, 0); box2 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(box), box2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(box2), gtk_label_new(_("Open as:")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(box2), type_combo, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) box2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else box2 = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(box), box2, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(box2), gtk_label_new(_("Selected file type: ")), FALSE, FALSE, 0); selFileType = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(box2), selFileType, FALSE, FALSE, 0); gtk_widget_show_all(box); g_signal_connect(GTK_FILE_CHOOSER(fc), "selection-changed", G_CALLBACK(selection_changed_cb), NULL); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(fc), box); add_import_filters(GTK_FILE_CHOOSER(fc)); openButton = DialogArea(fc, DA_OK); autoOpen = TRUE; if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) { gchar *fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)); import_type = gtk_combo_box_get_active(GTK_COMBO_BOX(type_combo)); if (import_type == 0) { /* Type automatically based on file */ do_import_file((gint)lastOpenType, fn); g_free(last_import_file); last_import_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)); } else { import_type--; /* Ignore auto option */ if (import_type == N_IMPORT_TYPES) { /* Load command file */ gchar *cmd = NULL; cmd = g_strdup_printf("load commands \"%s\"", fn); if (cmd) { UserCommand(cmd); UserCommand("save settings"); } g_free(cmd); } else { /* Import as specific type */ do_import_file(import_type, fn); g_free(last_import_file); last_import_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)); } } g_free(last_import_folder); last_import_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(fc)); g_free(fn); } gtk_widget_destroy(fc); } extern void GTKCommandsOpen(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { gchar *filename = NULL, *cmd = NULL; GtkWidget *fc = GnuBGFileDialog(_("Open Commands file"), NULL, NULL, GTK_FILE_CHOOSER_ACTION_OPEN); if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)); cmd = g_strdup_printf("load commands \"%s\"", filename); if (cmd) { UserCommand(cmd); UserCommand("save settings"); } g_free(cmd); g_free(filename); } gtk_widget_destroy(fc); } extern void GTKSave(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { SaveCommon(N_EXPORT_TYPES, _("Save or export to file")); } enum { COL_RESULT = 0, COL_DESC, COL_FILE, COL_PATH, NUM_COLS }; static gboolean batch_create_save(gchar * filename, gchar ** save, char **result) { gchar *file; gchar *folder; gchar *dir; DisectPath(filename, NULL, &file, &folder); if (file == NULL || folder == NULL) { g_free(file); g_free(folder); if (result) *result = _("Incorrect path"); return FALSE; } dir = g_build_filename(folder, "analysed", NULL); g_free(folder); if (!g_file_test(dir, G_FILE_TEST_EXISTS)) g_mkdir(dir, 0700); if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) { g_free(file); g_free(dir); if (result) *result = _("Failed to create directory"); return FALSE; } *save = g_strconcat(dir, G_DIR_SEPARATOR_S, file, ".sgf", NULL); g_free(file); g_free(dir); return TRUE; } static gboolean batch_analyse(gchar * filename, char **result, gboolean add_to_db, gboolean add_incdata_to_db) { gchar *cmd; gchar *save = NULL; gboolean fMatchAnalysed; if (!batch_create_save(filename, &save, result)) return FALSE; printf("save %s\n", save); if (g_file_test((save), G_FILE_TEST_EXISTS)) { *result = _("Pre-existing"); g_free(save); return TRUE; } g_free(szCurrentFileName); szCurrentFileName = NULL; cmd = g_strdup_printf("import auto \"%s\"", filename); UserCommand(cmd); g_free(cmd); if (!szCurrentFileName) { *result = _("Failed import"); g_free(save); return FALSE; } UserCommand("analysis clear match"); UserCommand("analyse match"); if (fMatchCancelled) { *result = _("Cancelled"); g_free(save); fInterrupt = FALSE; fMatchCancelled = FALSE; return FALSE; } cmd = g_strdup_printf("save match \"%s\"", save); UserCommand(cmd); g_free(cmd); g_free(save); fMatchAnalysed = MatchAnalysed(); if (add_to_db && ((!fMatchAnalysed && add_incdata_to_db) || fMatchAnalysed)) { cmd = g_strdup("relational add match quiet"); UserCommand(cmd); g_free(cmd); } *result = _("Done"); return TRUE; } static void batch_do_all(gpointer batch_model, gboolean add_to_db, gboolean add_incdata_to_db) { gchar *result; GtkTreeIter iter; gboolean valid; fMatchCancelled = FALSE; g_return_if_fail(batch_model != NULL); valid = gtk_tree_model_get_iter_first(batch_model, &iter); while (valid) { gchar *filename; gint cancelled; gtk_tree_model_get(batch_model, &iter, COL_PATH, &filename, -1); //outputerrf("filename=%s\n", filename); batch_analyse(filename, &result, add_to_db, add_incdata_to_db); gtk_list_store_set(batch_model, &iter, COL_RESULT, result, -1); cancelled = GPOINTER_TO_INT(g_object_get_data(batch_model, "cancelled")); if (cancelled) break; valid = gtk_tree_model_iter_next(batch_model, &iter); } } static void batch_cancel(GtkWidget * UNUSED(pw), gpointer UNUSED(model)) { pwGrab = pwOldGrab; fInterrupt = TRUE; fMatchCancelled = TRUE; } static void batch_stop(GtkWidget * UNUSED(pw), gpointer p) { fMatchCancelled = TRUE; fInterrupt = TRUE; g_object_set_data(G_OBJECT(p), "cancelled", GINT_TO_POINTER(1)); } static void batch_skip_file(GtkWidget * UNUSED(pw), gpointer UNUSED(p)) { fMatchCancelled = TRUE; fInterrupt = TRUE; } static GtkTreeModel * batch_create_model(GSList * filenames) { GtkListStore *store; GtkTreeIter tree_iter; GSList *iter; store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); for (iter = filenames; iter != NULL; iter = iter->next) { char *desc; char *folder; char *file; char *filename = (char *) iter->data; FilePreviewData *fpd; gtk_list_store_append(store, &tree_iter); fpd = ReadFilePreview(filename); if (fpd) desc = g_strdup(import_format[fpd->type].description); else desc = g_strdup(import_format[N_IMPORT_TYPES].description); g_free(fpd); gtk_list_store_set(store, &tree_iter, COL_DESC, desc, -1); g_free(desc); DisectPath(filename, NULL, &file, &folder); gtk_list_store_set(store, &tree_iter, COL_FILE, file, -1); g_free(file); g_free(folder); gtk_list_store_set(store, &tree_iter, COL_PATH, filename, -1); } return GTK_TREE_MODEL(store); } static GtkWidget * batch_create_view(GSList * filenames) { GtkCellRenderer *renderer; GtkTreeModel *model; GtkWidget *view; view = gtk_tree_view_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _("Result"), renderer, "text", COL_RESULT, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, Q_("fileType|Type"), renderer, "text", COL_DESC, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, _("File"), renderer, "text", COL_FILE, NULL); model = batch_create_model(filenames); gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); g_object_unref(model); return view; } static void batch_open_selected_file(GtkTreeView * view) { gchar *save; gchar *file; gchar *cmd; GtkTreeModel *model; GtkTreeIter selected_iter; GtkTreeSelection *sel = gtk_tree_view_get_selection(view); if (gtk_tree_selection_count_selected_rows(sel) != 1) return; model = gtk_tree_view_get_model(view); gtk_tree_selection_get_selected(sel, &model, &selected_iter); gtk_tree_model_get(model, &selected_iter, COL_PATH, &file, -1); if (!batch_create_save(file, &save, NULL)) return; cmd = g_strdup_printf("load match \"%s\"", save); UserCommand(cmd); g_free(save); g_free(cmd); } static void batch_row_activate(GtkTreeView * view, GtkTreePath * UNUSED(path), GtkTreeViewColumn * UNUSED(col), gpointer UNUSED(userdata)) { batch_open_selected_file(view); } static void batch_row_open(GtkWidget * UNUSED(widget), GtkTreeView * view) { batch_open_selected_file(view); } static void batch_create_dialog_and_run(GSList * filenames, gboolean add_to_db) { GtkWidget *dialog; GtkWidget *buttons; GtkWidget *view; GtkWidget *ok_button; GtkWidget *skip_button; GtkWidget *stop_button; GtkWidget *open_button; GtkTreeModel *model; GtkWidget *sw; gboolean add_incdata_to_db = FALSE; if (add_to_db && (!fAnalyseMove || !fAnalyseCube || !fAnalyseDice || !afAnalysePlayers[0] || !afAnalysePlayers[1])) { add_incdata_to_db = GetInputYN(_("Your current analysis settings will produce incomplete statistics.\n" "Do you still want to add these matches to the database?")); } view = batch_create_view(filenames); model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); g_object_set_data(G_OBJECT(model), "cancelled", GINT_TO_POINTER(0)); dialog = GTKCreateDialog(_("Batch analyse files"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_MINMAXBUTTONS | DIALOG_FLAG_NOTIDY, NULL, NULL); gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 400); pwOldGrab = pwGrab; pwGrab = dialog; g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(batch_cancel), model); sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw), view); gtk_container_add(GTK_CONTAINER(DialogArea(dialog, DA_MAIN)), sw); buttons = DialogArea(dialog, DA_BUTTONS); ok_button = DialogArea(dialog, DA_OK); gtk_widget_set_sensitive(ok_button, FALSE); skip_button = gtk_button_new_with_label(_("Skip")); stop_button = gtk_button_new_with_label(_("Stop")); open_button = gtk_button_new_with_label(_("Open")); gtk_container_add(GTK_CONTAINER(buttons), skip_button); gtk_container_add(GTK_CONTAINER(buttons), stop_button); gtk_container_add(GTK_CONTAINER(buttons), open_button); g_signal_connect(G_OBJECT(skip_button), "clicked", G_CALLBACK(batch_skip_file), model); g_signal_connect(G_OBJECT(stop_button), "clicked", G_CALLBACK(batch_stop), model); gtk_widget_show_all(dialog); batch_do_all(model, add_to_db, add_incdata_to_db); g_signal_connect(open_button, "clicked", G_CALLBACK(batch_row_open), view); g_signal_connect(view, "row-activated", G_CALLBACK(batch_row_activate), view); gtk_widget_set_sensitive(ok_button, TRUE); gtk_widget_set_sensitive(open_button, TRUE); gtk_widget_set_sensitive(skip_button, FALSE); gtk_widget_set_sensitive(stop_button, FALSE); gtk_window_set_modal(GTK_WINDOW(dialog), FALSE); } extern void GTKAnalyzeCurrent(void) { /*analyze match*/ UserCommand("analyse match"); if (fAutoDB) { /*add match to db*/ CommandRelationalAddMatch(NULL); } /*show stats panel*/ UserCommand("show statistics match"); return; } /* functions to find latest file in folder */ static void recentByModification(const char* path, char* recent){ char buffer[MAX_LEN]; FilePreviewData *fdp; struct dirent* entry; time_t recenttime = 0; struct stat statbuf; DIR* dir = opendir(path); if (dir) { while (NULL != (entry = readdir(dir))) { // outputerrf(_("`%s' ... looking at file....: %s, time: %lld"), entry->d_name, recent, (long long)recenttime); /* we first check that it's a file*/ if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0 || strncmp(entry->d_name, "/", 1) == 0 || strncmp(entry->d_name, "\\", 1) == 0) continue; /* check file type when DIRENT is defined; could use stat if not*/ #ifdef _DIRENT_HAVE_D_TYPE if (entry->d_type == DT_REG) // #else // DIR* dir2 = opendir(entry); // if(dir2==NULL) { #endif { /* we then check that it's more recent than what we've seen so far*/ sprintf(buffer, "%s/%s", path, entry->d_name); stat(buffer, &statbuf); if (statbuf.st_mtime > recenttime) { /* next we check that it's a correct file format*/ fdp = ReadFilePreview(buffer); if (!fdp) { //outputerrf(_("`%s' is not a backgammon file (especially %s)... looking at file....: %s, time: %lld"), buffer,entry->d_name, recent, (long long) recenttime); g_free(fdp); continue; } else if (fdp->type == N_IMPORT_TYPES) { //outputerrf(_("The format of '%s' is not recognized (especially %s)"), buffer,entry->d_name); g_free(fdp); continue; } else { /* finally it passed all the checks, we keep it for now in the char * recent */ strncpy(recent, buffer, MAX_LEN); // strncpy(recent, entry->d_name, MAX_LEN); recenttime = statbuf.st_mtime; // g_message("looking at file....: %s, time: %lld\n", recent, (long long) recenttime); g_free(fdp); } } } } closedir(dir); } else { outputerrf("Unable to read the directory"); } } static void AnalyzeSingleFile(void) { gchar *folder = NULL; gchar *filename = NULL; GtkWidget *fc; static gchar *last_folder = NULL; folder = last_folder ? last_folder : default_import_folder; /* now select a file; could also use GTKFileSelect() */ fc = GnuBGFileDialog(_("Select file to analyse"), folder, NULL, GTK_FILE_CHOOSER_ACTION_OPEN); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(fc), FALSE); add_import_filters(GTK_FILE_CHOOSER(fc)); if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc)); } if (filename) { gchar* cmd; g_free(last_folder); last_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(fc)); gtk_widget_destroy(fc); // char buffer[MAX_LEN]; // sprintf(buffer, "%s/%s", last_folder, filename); // // if (!get_input_discard()) // // return; /*open this file*/ cmd = g_strdup_printf("import auto \"%s\"", filename); UserCommand(cmd); g_free(cmd); ////outputerrf("filename=%s\n", filename); //CommandImportAuto(filename); g_free(filename); /*analyze match*/ UserCommand("analyse match"); if(fAutoDB) { /*add match to db*/ CommandRelationalAddMatch(NULL); } /*show stats panel*/ UserCommand("show statistics match"); return; } else gtk_widget_destroy(fc); } static void SmartAnalyze(void) { gchar *folder = NULL; gchar *cmd; char recent[MAX_LEN] = ""; folder = default_import_folder ? default_import_folder : "."; // g_message("folder=%s\n", folder); /* find most recent file in the folder and write its name (in char recent[])*/ recentByModification(folder, recent); /*open this file*/ cmd = g_strdup_printf("import auto \"%s\"", recent); UserCommand(cmd); g_free(cmd); //outputerrf("recent=%s\n", recent); //CommandImportAuto(recent); /*analyze match*/ UserCommand("analyse match"); if(fAutoDB) { /*add match to db*/ CommandRelationalAddMatch(NULL); } /*show stats panel*/ UserCommand("show statistics match"); return; } extern void GTKAnalyzeFile(void) { // g_message("GTKAnalyzeFile(): %d\n", AnalyzeFileSettingDef); if (AnalyzeFileSettingDef == AnalyzeFileBatch) { GTKBatchAnalyse(NULL, 0, NULL); } else if (AnalyzeFileSettingDef == AnalyzeFileRegular) { AnalyzeSingleFile(); } else { // AnalyzeFileSmart, SmartAnalyze(); } return; } extern void GTKBatchAnalyse(gpointer UNUSED(p), guint UNUSED(n), GtkWidget * UNUSED(pw)) { gchar *folder = NULL; GSList *filenames = NULL; GtkWidget *fc; static gchar *last_folder = NULL; GtkWidget *add_to_db; fInterrupt = FALSE; folder = last_folder ? last_folder : default_import_folder; fc = GnuBGFileDialog(_("Select files to analyse"), folder, NULL, GTK_FILE_CHOOSER_ACTION_OPEN); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(fc), TRUE); add_import_filters(GTK_FILE_CHOOSER(fc)); add_to_db = gtk_check_button_new_with_label(_("Add to database")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(add_to_db), fAutoDB); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(fc), add_to_db); if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) { filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(fc)); } if (filenames) { gboolean add_to_db_set; int fConfirmNew_s; g_free(last_folder); last_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(fc)); add_to_db_set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(add_to_db)); gtk_widget_destroy(fc); if (!get_input_discard()) return; fConfirmNew_s = fConfirmNew; fConfirmNew = 0; batch_create_dialog_and_run(filenames, add_to_db_set); fConfirmNew = fConfirmNew_s; } else gtk_widget_destroy(fc); } gnubg-1.08.003/eval.h000644 001751 000024 00000044130 14574155047 013736 0ustar00pmstaff000000 000000 /* * Copyright (C) 1998-2002 Gary Wong * Copyright (C) 2000-2017 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: eval.h,v 1.200 2023/12/20 23:09:54 plm Exp $ */ #ifndef EVAL_H #define EVAL_H #include "dice.h" #include "bearoff.h" #include "neuralnet.h" #include "cache.h" #define EXP_LOCK_FUN(ret, name, ...) \ typedef ret (*f_##name)( __VA_ARGS__); \ extern f_##name name; \ extern ret name##NoLocking( __VA_ARGS__); \ extern ret name##WithLocking( __VA_ARGS__) #define WEIGHTS_VERSION "1.01" #define WEIGHTS_VERSION_BINARY 1.01f #define WEIGHTS_MAGIC_BINARY 472.3782f #define NUM_OUTPUTS 5 #define NUM_CUBEFUL_OUTPUTS 4 #define NUM_ROLLOUT_OUTPUTS 7 #define BETA_HIDDEN 0.1f #define BETA_OUTPUT 1.0f #define OUTPUT_WIN 0 #define OUTPUT_WINGAMMON 1 #define OUTPUT_WINBACKGAMMON 2 #define OUTPUT_LOSEGAMMON 3 #define OUTPUT_LOSEBACKGAMMON 4 #define OUTPUT_EQUITY 5 /* NB: neural nets do not output equity, only * rollouts do. */ #define OUTPUT_CUBEFUL_EQUITY 6 /* Cubeful evalutions */ typedef enum { OUTPUT_OPTIMAL = 0, OUTPUT_NODOUBLE, OUTPUT_TAKE, OUTPUT_DROP } CubefulOutputs; /* A trivial upper bound on the number of (complete or incomplete) * legal moves of a single roll: if all 15 chequers are spread out, * then there are 18 C 4 + 17 C 3 + 16 C 2 + 15 C 1 = 3875 * combinations in which a roll of 11 could be played (up to 4 choices from * 15 chequers, and a chequer may be chosen more than once). The true * bound will be lower than this (because there are only 26 points, * some plays of 15 chequers must "overlap" and map to the same * resulting position), but that would be more difficult to * compute. */ #define MAX_INCOMPLETE_MOVES 3875 #define MAX_MOVES 3060 typedef struct movefilter_s { int Accept; /* always allow this many moves. 0 means don't use this */ /* level, since at least 1 is needed when used. */ int Extra; /* and add up to this many more... */ float Threshold; /* ...if they are within this equity difference */ } movefilter; /* we'll have filters for 1..4 ply evaluation */ #define MAX_FILTER_PLIES 4 extern movefilter defaultFilters[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; typedef struct { /* FIXME expand this... e.g. different settings for different position * classes */ unsigned int fCubeful:1; /* cubeful evaluation */ unsigned int nPlies:4; unsigned int fUsePrune:1; unsigned int fDeterministic:1; unsigned int :25; /* padding */ float rNoise; /* standard deviation */ } evalcontext; /* identifies the format of evaluation info in .sgf files * early (pre extending rollouts) had no version numbers * extendable rollouts have a version number of 1 * with pruning nets, we have two possibilities - reduction could still * be enabled (version = 2) or, given the speedup and performance * improvements, I assume we will drop reduction entirely. (ver = 3 or more) * When presented with an .sgf file, gnubg will attempt to work out what * data is present in the file based on the version number */ #define SGF_FORMAT_VER 3 typedef struct { evalcontext aecCube[2], aecChequer[2]; /* evaluation parameters */ evalcontext aecCubeLate[2], aecChequerLate[2]; /* ... for later moves */ evalcontext aecCubeTrunc, aecChequerTrunc; /* ... at truncation point */ movefilter aaamfChequer[2][MAX_FILTER_PLIES][MAX_FILTER_PLIES]; movefilter aaamfLate[2][MAX_FILTER_PLIES][MAX_FILTER_PLIES]; unsigned int fCubeful:1; /* Cubeful rollout */ unsigned int fVarRedn:1; /* variance reduction */ unsigned int fInitial:1; /* roll out as opening position */ unsigned int fRotate:1; /* quasi-random dice */ unsigned int fTruncBearoff2:1; /* cubeless rollout: trunc at BEAROFF2 */ unsigned int fTruncBearoffOS:1; /* cubeless rollout: trunc at BEAROFF_OS */ unsigned int fLateEvals:1; /* enable different evals for later moves */ unsigned int fDoTruncate:1; /* enable truncated rollouts */ unsigned int fStopOnSTD:1; /* stop when std's are small enough */ unsigned int fStopOnJsd:1; unsigned int fStopMoveOnJsd:1; /* stop multi-line rollout when jsd * is small enough */ unsigned short nTruncate; /* truncation */ unsigned int nTrials; /* number of rollouts */ unsigned short nLate; /* switch evaluations on move nLate of game */ rng rngRollout; unsigned long nSeed; unsigned int nMinimumGames; /* always do at least this many */ float rStdLimit; /* stop when std < this */ unsigned int nMinimumJsdGames; float rJsdLimit; unsigned int nGamesDone; float rStoppedOnJSD; int nSkip; } rolloutcontext; typedef struct { float rEquity; float rJSD; int nOrder; int nRank; } jsdinfo; typedef enum { EVAL_NONE, EVAL_EVAL, EVAL_ROLLOUT } evaltype; /* enumeration of variations of backgammon * (starting position and/or special rules) */ extern bgvariation bgvDefault; extern int anChequers[NUM_VARIATIONS]; extern const char *aszVariations[NUM_VARIATIONS]; extern const char *aszVariationCommands[NUM_VARIATIONS]; /* * Cubeinfo contains the information necessary for evaluation * of a position. * These structs are placed here so that the move struct can be defined */ typedef struct { /* * nCube: the current value of the cube, * fCubeOwner: the owner of the cube, * fMove: the player for which we are * calculating equity for, * fCrawford, fJacoby, fBeavers: optional rules in effect, * arGammonPrice: the gammon prices; * [ 0 ] = gammon price for player 0, * [ 1 ] = gammon price for player 1, * [ 2 ] = backgammon price for player 0, * [ 3 ] = backgammon price for player 1. * */ int nCube, fCubeOwner, fMove, nMatchTo, anScore[2], fCrawford, fJacoby, fBeavers; float arGammonPrice[4]; bgvariation bgv; } cubeinfo; typedef struct { evaltype et; evalcontext ec; rolloutcontext rc; } evalsetup; typedef enum { DOUBLE_TAKE, DOUBLE_PASS, NODOUBLE_TAKE, TOOGOOD_TAKE, TOOGOOD_PASS, DOUBLE_BEAVER, NODOUBLE_BEAVER, REDOUBLE_TAKE, REDOUBLE_PASS, NO_REDOUBLE_TAKE, TOOGOODRE_TAKE, TOOGOODRE_PASS, NO_REDOUBLE_BEAVER, NODOUBLE_DEADCUBE, /* cube is dead (match play only) */ NO_REDOUBLE_DEADCUBE, /* cube is dead (match play only) */ NOT_AVAILABLE, /* Cube not available */ OPTIONAL_DOUBLE_TAKE, OPTIONAL_REDOUBLE_TAKE, OPTIONAL_DOUBLE_BEAVER, OPTIONAL_DOUBLE_PASS, OPTIONAL_REDOUBLE_PASS } cubedecision; typedef enum { DT_NORMAL, DT_BEAVER, DT_RACCOON, NUM_DOUBLE_TYPES } doubletype; /* * TT_NA can happen if a single position was loaded from a sgf file. * To check for beavers, use "> TT_NORMAL", not "!= TT_NORMAL". */ typedef enum { TT_NA, TT_NORMAL, TT_BEAVER } taketype; extern const char *aszDoubleTypes[NUM_DOUBLE_TYPES]; /* * prefined settings */ #define NUM_SETTINGS 9 #define SETTINGS_4PLY 8 #define SETTINGS_GRANDMASTER 7 #define SETTINGS_SUPREMO 6 #define SETTINGS_WORLDCLASS 5 #define SETTINGS_EXPERT 4 #define SETTINGS_ADVANCED 3 #define SETTINGS_INTERMEDIATE 2 #define SETTINGS_NOVICE 1 #define SETTINGS_BEGINNER 0 extern evalcontext aecSettings[NUM_SETTINGS]; extern evalcontext ecBasic; extern int aiSettingsMoveFilter[NUM_SETTINGS]; extern const char *aszSettings[NUM_SETTINGS]; #define NUM_MOVEFILTER_SETTINGS 5 extern const char *aszMoveFilterSettings[NUM_MOVEFILTER_SETTINGS]; extern movefilter aaamfMoveFilterSettings[NUM_MOVEFILTER_SETTINGS][MAX_FILTER_PLIES][MAX_FILTER_PLIES]; typedef enum { CMARK_NONE, CMARK_ROLLOUT } CMark; typedef struct { int anMove[8]; positionkey key; unsigned int cMoves, cPips; /* scores for this move */ float rScore, rScore2; /* evaluation for this move */ float arEvalMove[NUM_ROLLOUT_OUTPUTS]; float arEvalStdDev[NUM_ROLLOUT_OUTPUTS]; evalsetup esMove; CMark cmark; } move; extern int fInterrupt; extern cubeinfo ciCubeless; extern const char *aszEvalType[(int) EVAL_ROLLOUT + 1]; extern bearoffcontext *pbc1; extern bearoffcontext *pbc2; extern bearoffcontext *pbcOS; extern bearoffcontext *pbcTS; extern bearoffcontext *apbcHyper[3]; typedef struct { unsigned int cMoves; /* and current move when building list */ unsigned int cMaxMoves, cMaxPips; int iMoveBest; float rBestScore; move *amMoves; } movelist; /* cube efficiencies */ extern float rOSCubeX; extern float rRaceFactorX[2]; extern float rRaceCoefficientX[2]; extern float rRaceMax[2]; extern float rRaceMin[2]; extern float rCrashedX[2]; extern float rContactX[2]; /* position classes */ typedef enum { CLASS_OVER = 0, /* Game already finished */ CLASS_HYPERGAMMON1, /* hypergammon with 1 chequers */ CLASS_HYPERGAMMON2, /* hypergammon with 2 chequers */ CLASS_HYPERGAMMON3, /* hypergammon with 3 chequers */ CLASS_BEAROFF2, /* Two-sided bearoff database (in memory) */ CLASS_BEAROFF_TS, /* Two-sided bearoff database (on disk) */ CLASS_BEAROFF1, /* One-sided bearoff database (in memory) */ CLASS_BEAROFF_OS, /* One-sided bearoff database /on disk) */ CLASS_RACE, /* Race neural network */ CLASS_CRASHED, /* Contact, one side has less than 7 active checkers */ CLASS_CONTACT /* Contact neural network */ } positionclass; #define N_CLASSES (CLASS_CONTACT + 1) #define CLASS_PERFECT CLASS_BEAROFF_TS #define CLASS_GOOD CLASS_BEAROFF_OS /* Good enough to not need SanityCheck */ typedef int (*classevalfunc) (const TanBoard anBoard, float arOutput[], const bgvariation bgv, NNState * nnStates); extern classevalfunc acef[N_CLASSES]; /* Evaluation cache size is 2^SIZE entries */ #define CACHE_SIZE_DEFAULT 19 #define CACHE_SIZE_GUIMAX 23 #define CFMONEY(arEquity,pci) \ ( ( (pci)->fCubeOwner == -1 ) ? arEquity[ 2 ] : \ ( ( (pci)->fCubeOwner == (pci)->fMove ) ? arEquity[ 1 ] : arEquity[ 3 ] ) ) #define CFHYPER(arEquity,pci) \ ( ( (pci)->fCubeOwner == -1 ) ? \ ( ( (pci)->fJacoby ) ? arEquity[ 2 ] : arEquity[ 1 ] ) : \ ( ( (pci)->fCubeOwner == (pci)->fMove ) ? arEquity[ 0 ] : arEquity[ 3 ] ) ) extern void EvalInitialise(char *szWeights, char *szWeightsBinary, int fNoBearoff, void (*pfProgress) (unsigned int)); extern int EvalShutdown(void); extern void EvalStatus(char *szOutput); extern int EvalNewWeights(int nSize); extern int EvalSave(const char *szWeights); EXP_LOCK_FUN(int, EvaluatePosition, NNState * nnStates, const TanBoard anBoard, float arOutput[], cubeinfo * const pci, const evalcontext * pec); extern void InvertEvaluationR(float ar[NUM_ROLLOUT_OUTPUTS], const cubeinfo * pci); extern void InvertEvaluation(float ar[NUM_OUTPUTS]); EXP_LOCK_FUN(int, FindBestMove, int anMove[8], int nDice0, int nDice1, TanBoard anBoard, const cubeinfo * pci, evalcontext * pec, movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]); EXP_LOCK_FUN(int, FindnSaveBestMoves, movelist * pml, int nDice0, int nDice1, const TanBoard anBoard, positionkey * keyMove, const float rThr, const cubeinfo * pci, const evalcontext * pec, movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]); extern void PipCount(const TanBoard anBoard, unsigned int anPips[2]); extern int ThorpCount(const TanBoard anBoard, int *pnLeader, float *adjusted, int *pnTrailer); extern int KeithCount(const TanBoard anBoard, int pn[2]); extern int IsightCount(const TanBoard anBoard, int pn[2]); extern int DumpPosition(const TanBoard anBoard, char *szOutput, const evalcontext * pec, cubeinfo * pci, int fOutputMWC, int fOutputWinPC, int fOutputInvert, const char *szMatchID); extern void SwapSides(TanBoard anBoard); extern int GameStatus(const TanBoard anBoard, const bgvariation bgv); extern void EvalCacheFlush(void); extern int EvalCacheResize(unsigned int cNew); extern int EvalCacheStats(unsigned int *pcUsed, unsigned int *pcLookup, unsigned int *pcHit); extern double GetEvalCacheSize(void); void SetEvalCacheSize(unsigned int size); extern unsigned int GetEvalCacheEntries(void); extern int GetCacheMB(int size); extern evalCache cEval; extern evalCache cpEval; extern unsigned int cCache; extern int GenerateMoves(movelist * pml, const TanBoard anBoard, int n0, int n1, int fPartial); extern int ApplySubMove(TanBoard anBoard, const int iSrc, const int nRoll, const int fCheckLegal); extern int ApplyMove(TanBoard anBoard, const int anMove[8], const int fCheckLegal); extern positionclass ClassifyPosition(const TanBoard anBoard, const bgvariation bgv); /* internal use only */ extern void EvalRaceBG(const TanBoard anBoard, float arOutput[], const bgvariation bgv); extern float Utility(float ar[NUM_OUTPUTS], const cubeinfo * pci); extern float UtilityME(float ar[NUM_OUTPUTS], const cubeinfo * pci); extern int SetCubeInfoMoney(cubeinfo * pci, const int nCube, const int fCubeOwner, const int fMove, const int fJacoby, const int fBeavers, const bgvariation bgv); extern int SetCubeInfo(cubeinfo * pci, const int nCube, const int fCubeOwner, const int fMove, const int nMatchTo, const int anScore[2], const int fCrawford, const int fJacoby, const int fBeavers, const bgvariation bgv); extern void swap_us(unsigned int *p0, unsigned int *p1); extern void swap(int *p0, int *p1); extern void SanityCheck(const TanBoard anBoard, float arOutput[]); extern int EvalOver(const TanBoard anBoard, float arOutput[], const bgvariation bgv, NNState * nnStates); extern float KleinmanCount(int nPipOnRoll, int nPipNotOnRoll); extern int GetDPEq(int *pfCube, float *prDPEq, const cubeinfo * pci); extern float mwc2eq(const float rMwc, const cubeinfo * pci); extern float eq2mwc(const float rEq, const cubeinfo * pci); extern float se_mwc2eq(const float rMwc, const cubeinfo * pci); extern float se_eq2mwc(const float rEq, const cubeinfo * pci); extern char *FormatEval(char *sz, evalsetup * pes); extern cubedecision FindCubeDecision(float arDouble[], float aarOutput[][NUM_ROLLOUT_OUTPUTS], const cubeinfo * pci); EXP_LOCK_FUN(int, GeneralCubeDecisionE, float aarOutput[2][NUM_ROLLOUT_OUTPUTS], const TanBoard anBoard, cubeinfo * const pci, const evalcontext * pec, const evalsetup * pes); EXP_LOCK_FUN(int, GeneralEvaluationE, float arOutput[NUM_ROLLOUT_OUTPUTS], const TanBoard anBoard, cubeinfo * const pci, const evalcontext * pec); extern int cmp_evalsetup(const evalsetup * pes1, const evalsetup * pes2); extern int cmp_evalcontext(const evalcontext * pec1, const evalcontext * pec2); extern char *GetCubeRecommendation(const cubedecision cd); extern cubedecision FindBestCubeDecision(float arDouble[], float aarOutput[2][NUM_ROLLOUT_OUTPUTS], const cubeinfo * pci); extern int getCurrentGammonRates(float aarRates[2][2], float arOutput[], const TanBoard anBoard, cubeinfo * pci, const evalcontext * pec); extern void getMoneyPoints(float aaarPoints[2][7][2], const int fJacoby, const int fBeavers, float aarRates[2][2]); extern void getMatchPoints(float aaarPoints[2][4][2], int afAutoRedouble[2], int afDead[2], const cubeinfo * pci, float aarRates[2][2]); extern void getCubeDecisionOrdering(int aiOrder[3], float arDouble[4], float aarOutput[2][NUM_ROLLOUT_OUTPUTS], const cubeinfo * pci); extern float getPercent(const cubedecision cd, const float arDouble[]); extern void RefreshMoveList(movelist * pml, int *ai); EXP_LOCK_FUN(int, ScoreMove, NNState * nnStates, move * pm, const cubeinfo * pci, const evalcontext * pec, int nPlies); extern void CopyMoveList(movelist * pmlDest, const movelist * pmlSrc); extern int isCloseCubedecision(const float arDouble[]); extern int isMissedDouble(float arDouble[], float aarOutput[2][NUM_ROLLOUT_OUTPUTS], const int fDouble, const cubeinfo * pci); extern unsigned int locateMove(const TanBoard anBoard, const int anMove[8], const movelist * pml); extern int equal_movefilter(const int i, const movefilter amf1[MAX_FILTER_PLIES], const movefilter amf2[MAX_FILTER_PLIES]); extern int equal_movefilters(movefilter aamf1[MAX_FILTER_PLIES][MAX_FILTER_PLIES], movefilter aamf2[MAX_FILTER_PLIES][MAX_FILTER_PLIES]); extern doubletype DoubleType(const int fDoubled, const int fMove, const int fTurn); extern int PerfectCubeful(bearoffcontext * pbc, const TanBoard anBoard, float arEquity[]); extern void baseInputs(const TanBoard anBoard, float arInput[]); extern int CompareMoves(const move * pm0, const move * pm1); extern float EvalEfficiency(const TanBoard anBoard, positionclass pc, int ply); extern float Cl2CfMoney(float arOutput[NUM_OUTPUTS], cubeinfo * pci, float rCubeX); extern float Cl2CfMatch(float arOutput[NUM_OUTPUTS], cubeinfo * pci, float rCubeX); extern float Noise(const evalcontext * pec, const TanBoard anBoard, int iOutput); extern int EvalKey(const evalcontext * pec, const int nPlies, const cubeinfo * pci, int fCubefulEquity); extern void MakeCubePos(const cubeinfo aciCubePos[], const int cci, const int fTop, cubeinfo aci[], const int fInvert); extern void GetECF3(float arCubeful[], int cci, float arCf[], cubeinfo aci[]); extern int EvaluatePerfectCubeful(const TanBoard anBoard, float arEquity[], const bgvariation bgv); extern neuralnet nnContact, nnRace, nnCrashed; extern neuralnet nnpContact, nnpRace, nnpCrashed; #endif gnubg-1.08.003/gtktheory.h000644 001751 000024 00000001557 14574155047 015035 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtktheory.h,v 1.4 2013/06/16 02:16:17 mdpetch Exp $ */ #ifndef GTKTHEORY_H #define GTKTHEORY_H extern void GTKShowTheory(const int fActivePage); #endif gnubg-1.08.003/util.h000644 001751 000024 00000002611 14574155047 013762 0ustar00pmstaff000000 000000 /* * Copyright (C) 2007-2009 Christian Anthon * Copyright (C) 2007-2013 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: util.h,v 1.15 2013/07/11 19:16:07 mdpetch Exp $ */ #ifndef UTIL_H #define UTIL_H #include #include extern char *prefsdir; extern char *datadir; extern char *pkg_datadir; extern char *docdir; extern char *getDataDir(void); extern char *getPkgDataDir(void); extern char *getDocDir(void); #define BuildFilename(file) g_build_filename(getPkgDataDir(), file, NULL) #define BuildFilename2(file1, file2) g_build_filename(getPkgDataDir(), file1, file2, NULL) extern void PrintSystemError(const char *message); extern void PrintError(const char *message); extern FILE *GetTemporaryFile(const char *nameTemplate, char **retName); #endif gnubg-1.08.003/export.h000644 001751 000024 00000006004 14574155047 014326 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * Copyright (C) 2002-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: export.h,v 1.44 2022/01/02 22:56:36 plm Exp $ */ #include #include "backgammon.h" #ifndef EXPORT_H #define EXPORT_H #define EXPORT_CUBE_ACTUAL 4 #define EXPORT_CUBE_MISSED 5 #define EXPORT_CUBE_CLOSE 6 typedef enum { HTML_EXPORT_TYPE_GNU, HTML_EXPORT_TYPE_BBS, HTML_EXPORT_TYPE_FIBS2HTML, NUM_HTML_EXPORT_TYPES } htmlexporttype; typedef enum { HTML_EXPORT_CSS_HEAD, HTML_EXPORT_CSS_INLINE, HTML_EXPORT_CSS_EXTERNAL, NUM_HTML_EXPORT_CSS } htmlexportcss; extern const char *aszHTMLExportType[]; extern const char *aszHTMLExportCSS[]; extern const char *aszHTMLExportCSSCommand[]; typedef struct { int fIncludeAnnotation; int fIncludeAnalysis; int fIncludeStatistics; int fIncludeMatchInfo; /* display board: 0 (never), 1 (every move), 2 (every second move) etc */ int fDisplayBoard; int fSide; /* 0, 1, or -1 for both players */ /* moves */ unsigned int nMoves; /* show at most nMoves */ int fMovesDetailProb; /* show detailed probabilities */ int afMovesParameters[2]; /* detailed parameters */ int afMovesDisplay[4]; /* display moves */ /* cube */ int fCubeDetailProb; /* show detailed probabilities */ int afCubeParameters[2]; /* detailed parameters */ int afCubeDisplay[7]; /* display cube actions */ /* FIXME: add format specific options */ /* For example, frames/non frames for HTML. */ char *szHTMLPictureURL; htmlexporttype het; char *szHTMLExtension; htmlexportcss hecss; /* sizes */ int nPNGSize; int nHtmlSize; } exportsetup; extern exportsetup exsExport; extern char *filename_from_iGame(const char *szBase, const int iGame); extern int WritePNG(const char *sz, unsigned char *puch, unsigned int nStride, unsigned int nSizeX, unsigned int nSizeY); #if defined(USE_BOARD3D) void GenerateImage3d(const char *szName, unsigned int nSize, unsigned int nSizeX, unsigned int nSizeY); #endif extern void TextAnalysis(GString * gsz, const matchstate * pms, moverecord * pmr); extern void TextPrologue(GString * gsz, const matchstate * pms, const int iGame); extern void TextBoardHeader(GString * gsz, const matchstate * pms, const int iGame, const int iMove); #endif gnubg-1.08.003/boards.xml000644 001751 000024 00000132705 14574155047 014640 0ustar00pmstaff000000 000000 Default setting The GNU Backgammon Team board=#2F5F2F;0.20 border=#003F00 wood=alder hinges=y light=150;50 shape=0.5 chequers0=#F12525;0.90;1.50;0.20;3.00 chequers1=#00000B;0.50;1.50;1.00;30.00 dice0=#F12525;0.20;3.00;y dice1=#00000B;1.00;30.00;y dot0=#A4A4A4 dot1=#A4A4A4 cube=#D7D7D7 points0=#FF5F5F;0.20 points1=#BFBFBF;0.20 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=0.200000 lightposy=1.900000 lightposz=3.300000 lightambient=45 lightdiffuse=75 lightspecular=95 chequers3d0=#D83F3F;#CC3333;#FF0000;60;80 chequers3d1=#333333;#4C4C4C;#3F3F3F;70;80 dice3d0=#F22626;#CC3333;#FF0000;100;100;n dice3d1=#333333;#4C4C4C;#3F3F3F;70;100;n dot3d0=#A5A5A5;#BFBFBF;#4C4F4C;128;100 dot3d1=#C6C6C6;#D1D898;#1B1B1B;128;100 cube3d=#B2B2BF;#A5A5B2;#CBCCCB;80;0 cubetext3d=#000066;#00007F;#00008C;98;100 base3d=#007F00;#007200;#000000;128;0;felt.png points3d0=#FF3233;#DB4C5A;#49181D;128;100;felt.png points3d1=#F3FBFB;#FDEDF9;#47514A;128;100;felt.png border3d=#D87226;#D85630;#37465C;128;100;alder.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#AB78CC;#E7E675;#010101;116;100 background3d=#D45588;#933E98;#CA41C7;116;0;felt.png Green/Black Albert Silver board=#F2E5D8;0.09 border=#003F00 wood=ebony hinges=y light=150;50 shape=0.5 chequers0=#FDFDFD;1.00;3.00;0.90;20.00 chequers1=#0B0B0B;1.00;3.00;0.90;15.00 dice0=#EE2222;0.20;3.00;y dice1=#000008;1.00;30.00;y dot0=#EDEFF2 dot1=#EDEFF2 cube=#D6D6C6 points0=#4CA57F;0.09 points1=#4C4C4C;0.20 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=p lightposx=0.400000 lightposy=1.600000 lightposz=3.400000 lightambient=60 lightdiffuse=60 lightspecular=90 chequers3d0=#F2F2F2;#E5E4E5;#7F7F7F;90;100 chequers3d1=#191919;#323232;#7F7F7F;90;100 dice3d0=#F2F2F2;#E5E4E5;#7F7F7F;90;100;y dice3d1=#191919;#323232;#7F7F7F;90;100;y dot3d0=#573989;#923687;#CD6FD0;128;100 dot3d1=#C6C6C6;#D1D898;#1B1B1B;128;100 cube3d=#D6D6C6;#B5AFA0;#97B787;59;0 cubetext3d=#000082;#23266B;#4A3166;128;100 base3d=#F2E5D8;#EABA5B;#302030;128;0;stain.png points3d0=#4CA57F;#59B28C;#0A0C1C;128;100;stain.png points3d1=#4C4C4C;#595959;#602026;128;100;stain.png border3d=#5A4821;#604F25;#495D79;128;100;berch.png hinge3d=#CC915A;#BF7F63;#DAA260;122;0;hinge.png numbers3d=#E3E3E3;#D0CBCE;#010101;128;100 background3d=#C62149;#993559;#1A4312;128;0;alder.png Wood 1 Albert Silver board=#FFD872;0.09 border=#003F00 wood=walnut hinges=y light=150;50 shape=0.5 chequers0=#FFFFFF;1.00;3.00;0.90;19.90 chequers1=#000000;1.00;3.00;0.90;14.80 dice0=#FBFBFB;0.90;19.90;y dice1=#090909;0.90;14.80;y dot0=#000000 dot1=#EBEDF0 cube=#D4D4C4 points0=#FF5F5F;0.20 points1=#BFBFBF;0.20 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=y lighttype=d lightposx=3.000000 lightposy=0.000000 lightposz=3.500000 lightambient=40 lightdiffuse=75 lightspecular=80 chequers3d0=#F7F7F7;#E0E0E0;#E5E5E5;81;100 chequers3d1=#0C0C0C;#262626;#E5E5E5;100;100 dice3d0=#F7F7F7;#E0E0E0;#E5E5E5;81;100;y dice3d1=#0C0C0C;#262626;#E5E5E5;100;100;y dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#FFFFFF;#E0E0E0;#E5E5E5;81;0 cubetext3d=#000000;#000000;#000000;100;100 base3d=#FFD872;#F9C46C;#FFDB5E;61;0;pine2.png points3d0=#BF7200;#B26600;#995E3F;100;100;pine.png points3d1=#753B00;#7D4400;#9E510C;100;100;pine.png border3d=#3F2400;#4C2603;#703D26;71;100;pine2.png hinge3d=#895B49;#7D613D;#EACE8E;100;0;hinge.png numbers3d=#FFFFFF;#FFFFFF;#E5E5E5;100;100 background3d=#FBFFB5;#FEFFAA;#FEFF7E;100;0;pine.png Red/Blue Albert Silver board=#BFBFBF;0.09 border=#003F00 wood=walnut hinges=y light=150;50 shape=0.5 chequers0=#FEFEFE;1.00;3.00;0.90;19.90 chequers1=#000000;1.00;3.00;0.90;14.80 dice0=#FEFEFE;0.90;19.90;y dice1=#000000;0.90;14.80;y dot0=#EAECEF dot1=#EAECEF cube=#D3D3C3 points0=#980000;0.09 points1=#000072;0.20 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=n bgintrays=y roundedpoints=n lighttype=p lightposx=-1.100000 lightposy=-1.200000 lightposz=5.000000 lightambient=50 lightdiffuse=70 lightspecular=100 chequers3d0=#FF1D28;#962125;#F1B1B4;100;100 chequers3d1=#6373E0;#4237B9;#FFFFFF;100;100 dice3d0=#FF1D28;#962125;#F1B1B4;100;100 dice3d1=#6373E0;#4237B9;#FFFFFF;100;100 dot3d0=#FDFDFD;#FDFDFD;#FDFDFD;100;100 dot3d1=#FFFFFF;#FFFFFF;#FFFFFF;100;100 cube3d=#E9E9E9;#C1C1C1;#FFFFFF;100;0 cubetext3d=#07095E;#423BA4;#141170;100;100 base3d=#BFBFBF;#969696;#505050;100;0 points3d0=#D02A30;#BB3437;#F1A6AD;100;100 points3d1=#3A38B9;#6363C8;#3B3F98;100;100 border3d=#85581D;#734C16;#3F3113;100;100;felt.png hinge3d=#DBDC46;#FFFA44;#DADC9F;100;0;hinge.png numbers3d=#FFFFFF;#FFFFFF;#FFFFFF;100;100 background3d=#DD47FF;#A83097;#EDEDED;100;0;alder.png Crisloid Gary Wong board=#AE7621;0.09 border=#005F00 wood=paint hinges=n light=150;50 shape=0.2 chequers0=#005F00;1.00;1.50;1.00;100.00 chequers1=#BFBFAF;1.00;1.50;1.00;100.00 dice0=#005F00;1.00;100.00;y dice1=#DFDFCF;1.00;100.00;n dot0=#FFFFFF dot1=#007F00 cube=#E5E5E5 points0=#007F00;0.09 points1=#FFFFFF;0.09 hinges3d=n piecetype=1 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=0.500000 lightposy=2.100000 lightposz=2.500000 lightambient=55 lightdiffuse=65 lightspecular=100 chequers3d0=#005300;#005600;#3FB651;100;95 chequers3d1=#B2B2A3;#A5A2A4;#7F7F7F;100;100 dice3d0=#005300;#005600;#3FB651;100;95;y dice3d1=#B2B2A3;#A5A2A4;#7F7F7F;100;100;y dot3d0=#DF7AE7;#AD40A0;#CD6FD0;128;100 dot3d1=#C6C6C6;#D1D898;#1B1B1B;128;100 cube3d=#E3E5DA;#E4E9C9;#97B787;93;0 cubetext3d=#000093;#3A4589;#4A3166;128;100 base3d=#AD7521;#B7661B;#000000;128;0;suede.png points3d0=#005E00;#007200;#004900;128;100;suede.png points3d1=#FFFFFF;#CECECE;#7F7F7F;118;100;suede.png border3d=#005E00;#003F00;#002D00;128;100;marble.png hinge3d=#CC915A;#BF7F63;#DAA260;122;100;hinge.png numbers3d=#9E9E9E;#939092;#010101;128;100 background3d=#5B993F;#4B7748;#1A4312;128;0;suede.png Crystal Gary Wong board=#8FAFB7;0.00 border=#005F00 wood=redwood hinges=y light=150;50 shape=1.0 chequers0=#FFFFFF;0.51;1.50;1.00;100.00 chequers1=#000000;0.44;1.50;1.00;100.00 dice0=#005F00;1.00;100.00;y dice1=#7C7C7C;1.00;100.00;n dot0=#4E4E4E dot1=#DDDDDD cube=#E5E5E5 points0=#D7DFDF;0.00 points1=#878E8F;0.00 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=p lightposx=0.100000 lightposy=1.500000 lightposz=3.000000 lightambient=50 lightdiffuse=65 lightspecular=90 chequers3d0=#FFFFFF;#CCCCCC;#CCCCCC;60;50 chequers3d1=#000000;#4C4C4C;#3F3F3F;70;50 dice3d0=#005E00;#001C00;#007200;100;80;n dice3d1=#7F7F7F;#4C4C4C;#3F3F3F;70;80;n dot3d0=#4F4F4F;#BFBFBF;#4C4F4C;128;100 dot3d1=#C6C6C6;#D1D898;#1B1B1B;128;100 cube3d=#CCCCDB;#A5A5B2;#CBCCCB;80;0 cubetext3d=#000066;#00007F;#00008C;98;100 base3d=#8EAFB7;#A0C6CE;#8AD6AB;128;0;felt.png points3d0=#D6DDDD;#DBE5E5;#49181D;128;100 points3d1=#878E8E;#96A8A8;#47514A;128;100 border3d=#FC7226;#ED5630;#37465C;128;100;alder.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#AB78CC;#E7E675;#010101;116;100 background3d=#A2B2D4;#609895;#68ACCA;116;0 Daily Gammon Nardy Pillards board=#FFFCC4;0,00 border=#318567 wood=paint hinges=n light=60;66 shape=1.0 chequers0=#383BAD;1.00;2.00;0.00;17.00 chequers1=#D0BF24;1.00;1.00;0.00;3.00 dice0=#C3C3C3;0.00;3.00;y dice1=#DCD027;0.00;3.00;y dot0=#FFFFFF dot1=#000000 cube=#AFE5A8 points0=#49D441;0.00 points1=#0A6810;0.00 hinges3d=n piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=1.000000 lightposy=1.000000 lightposz=1.500000 lightambient=60 lightdiffuse=50 lightspecular=100 chequers3d0=#383AAD;#495ECC;#CCCCCC;60;100;swirl.png chequers3d1=#D1BF23;#B4B94E;#BDBDBD;70;100;swirl.png dice3d0=#383AAD;#28288D;#4B48DE;100;100;n dice3d1=#D1BF23;#C19E44;#494949;70;100;n dot3d0=#DEDEDE;#BFBFBF;#4C4F4C;128;100 dot3d1=#282828;#40422E;#3F3F3F;128;100 cube3d=#AFE5A8;#A7D671;#CBCCCB;80;0 cubetext3d=#66204F;#69297F;#00008C;98;100 base3d=#FFFCC3;#C7CE4F;#000000;128;0;suede.png points3d0=#49D33F;#43A02B;#345A0F;128;100 points3d1=#0A680F;#1B5C1E;#47514A;128;100 border3d=#308466;#37A274;#42794E;110;100 hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#CCB76A;#C2E72E;#010101;116;100 background3d=#C8D022;#CAD02C;#385D6E;116;0 GamesGrid Classic Ned Cross board=#EFB43B;0.09 border=#004000 wood=walnut hinges=n light=150;50 shape=0.5 chequers0=#94211A;1.00;1.50;0.20;3.00 chequers1=#E7EDEF;1.00;1.50;0.80;30.00 dice0=#D140B9;0.10;6.70;n dice1=#1C5FED;0.30;4.20;n dot0=#C7C7C7 dot1=#EFEFEF cube=#F7C80A points0=#9A6750;0.09 points1=#5F7287;0.09 hinges3d=n piecetype=0 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=p lightposx=0.500000 lightposy=1.400000 lightposz=1.500000 lightambient=30 lightdiffuse=80 lightspecular=80 chequers3d0=#932119;#963F34;#CCCCCC;100;100 chequers3d1=#E8EDEF;#E8E8E8;#3F3F3F;100;100 dice3d0=#D13FBA;#762F8D;#943EBB;100;100;n dice3d1=#1C5EED;#230879;#3F3F3F;70;100;n dot3d0=#C6C6C6;#BFBFBF;#4C4F4C;128;100 dot3d1=#EFEFEF;#A4ABA1;#1B1B1B;128;100 cube3d=#F7C60A;#AA802D;#CBCCCB;80;0 cubetext3d=#2B196C;#403681;#00008C;98;100 base3d=#EFB53A;#BF9241;#203020;128;0;alder.png points3d0=#99664F;#966C37;#49181D;128;100;pine.png points3d1=#5E7287;#6C7979;#47514A;128;100;pine.png border3d=#895436;#734334;#37465C;128;100;berch.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#CCAD91;#E7E675;#010101;116;100 background3d=#9A3F2B;#715A16;#68ACCA;116;0;felt.png GoL Blue and White Ian Shaw board=#F6F6FF;0.09 border=#E6E9FF wood=paint hinges=n light=150;50 shape=0.5 chequers0=#F3EFF7;1.00;1.50;1.00;30.00 chequers1=#3F4FAF;1.00;1.50;0.20;3.00 dice0=#FFFEFE;0.90;1.00;n dice1=#6464E5;1.00;30.00;n dot0=#000000 dot1=#FFFFFF cube=#FBF7FF points0=#8B8C8E;0.09 points1=#D4D4D4;0.09 hinges3d=n piecetype=0 piecetexturetype=0 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=1.100000 lightposy=2.200000 lightposz=3.300000 lightambient=55 lightdiffuse=60 lightspecular=70 chequers3d0=#EFF7FF;#E5E5E5;#CCCCCC;100;100;wood.png chequers3d1=#3F4FAF;#556CDE;#3F3F3F;100;100;wood.png dice3d0=#FFFFFF;#BABABA;#B4B8BB;100;100;n dice3d1=#6363E5;#330BB1;#3F3F3F;70;100;n dot3d0=#000000;#282828;#4C4F4C;128;100 dot3d1=#EFEFEF;#D1DACD;#1B1B1B;128;100 cube3d=#F9F7FF;#AAA5AA;#CBCCCB;80;0 cubetext3d=#475E6C;#446281;#00008C;98;100 base3d=#F4F4FF;#F3FCFF;#000000;128;0;felt.png points3d0=#8C8C8E;#96938E;#000000;128;100;felt.png points3d1=#B5B5B5;#9BADAD;#000000;128;100;felt.png border3d=#CED1FF;#DBD6FF;#37465C;128;100 hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#894C32;#8D4023;#010101;116;100 background3d=#C5C8AB;#9DAD9C;#68ACCA;116;0 Jellyfish Øystein Johansen board=#A5ADAF;0.00 border=#2F3030 wood=paint hinges=n light=-1;90 shape=0.0 chequers0=#FB3232;1.00;1.50;0.00;20.10 chequers1=#7BE0E3;1.00;1.50;0.00;30.00 dice0=#FF3838;0.00;30.00;n dice1=#00FFFF;0.00;30.00;n dot0=#010101 dot1=#010101 cube=#E5E5E5 points0=#FFFEFE;0.00 points1=#010101;0.09 hinges3d=n piecetype=1 piecetexturetype=1 roundededges=n bgintrays=y roundedpoints=n lighttype=p lightposx=1.600000 lightposy=1.600000 lightposz=3.400000 lightambient=45 lightdiffuse=70 lightspecular=100 chequers3d0=#F93232;#BB5343;#010101;128;100 chequers3d1=#7AE0E2;#8FBADB;#010101;128;100 dice3d0=#FF3838;#E0201A;#7B1913;100;100;n dice3d1=#00FFFF;#4F6A79;#3F3F3F;70;100;n dot3d0=#DDDDDD;#BFBFBF;#4C4F4C;128;100 dot3d1=#000000;#222321;#1B1B1B;128;100 cube3d=#CEC6CC;#AABCBC;#CBCCCB;80;0 cubetext3d=#5B3B6C;#6D3C81;#00008C;98;100 base3d=#A5ADAF;#798585;#010101;128;0 points3d0=#FFE2E2;#A3B7C9;#010000;128;100 points3d1=#151A1E;#373D3D;#010101;128;100 border3d=#2D3030;#42261D;#37465C;128;100 hinge3d=#D8F233;#99BF0C;#E9C944;63;0; numbers3d=#AB78CC;#E7E675;#010101;116;100 background3d=#999A94;#707165;#2C3B6C;116;0 Red/Blue - Gold/Silver Ian Shaw board=#020532;0.20 border=#004000 wood=fir hinges=y light=150;50 shape=0.5 chequers0=#B4B5CA;1.00;2.10;0.90;17.20 chequers1=#DCA52B;1.00;1.50;0.50;3.00 dice0=#C3C3C3;0.20;3.00;n dice1=#0C0C19;1.00;30.00;y dot0=#FEFFFE dot1=#E5E5E5 cube=#E5E5E5 points0=#FF6060;0.20 points1=#7EA9CA;0.20 hinges3d=y piecetype=0 piecetexturetype=0 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=2.900000 lightposy=1.400000 lightposz=4.500000 lightambient=60 lightdiffuse=60 lightspecular=75 chequers3d0=#B5B5C9;#B5918C;#858084;81;100 chequers3d1=#DBA52B;#ADAD0F;#A0A0A0;100;100 dice3d0=#B5B5C9;#B5918C;#858084;81;100;y dice3d1=#DBA52B;#ADAD0F;#3D3D3D;128;100;n dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#E5E5E5;#C1C1C1;#E5E5E5;81;0 cubetext3d=#000000;#000000;#000000;100;100 base3d=#020533;#514F6D;#5B5B5B;61;0;felt.png points3d0=#FF6060;#EA7267;#C5C5C5;100;100;felt.png points3d1=#7CA8C9;#4FA0DD;#C5C5C5;100;100;felt.png border3d=#BF4E35;#BF694A;#8B6234;100;100;pine.png hinge3d=#DEDD5D;#E3CC8A;#C6B985;100;0;hinge.png numbers3d=#FFFFFF;#FFFFFF;#E5E5E5;100;100 background3d=#9BB149;#8D4B7D;#6E6E6E;100;0;Water01.png Red Green Nardy Pillards board=#6C9856;0.00 border=#004000 wood=walnut hinges=n light=51;60 shape=0.2 chequers0=#98BFA5;1.00;3.10;1.00;51.00 chequers1=#982533;1.00;3.00;1.00;41.00 dice0=#B4E2B4;1.00;3.00;y dice1=#5A2D31;1.00;30.00;y dot0=#005600 dot1=#FAF208 cube=#D6BA00 points0=#CAFDDB;0.00 points1=#B52D3C;0.00 hinges3d=n piecetype=0 piecetexturetype=0 roundededges=n roundedpoints=n bgintrays=y lighttype=d lightposx=-0.700000 lightposy=3.500000 lightposz=4.300000 lightambient=45 lightdiffuse=60 lightspecular=100 chequers3d0=#98BFA5;#B5C69E;#43A268;81;100 chequers3d1=#992632;#A2423B;#AA412A;100;100 dice3d0=#98BFA5;#B5C69E;#43A268;81;100;y dice3d1=#992632;#A2423B;#AA412A;100;100;y dot3d0=#005600;#005B00;#000000;100;100 dot3d1=#F4ED07;#E5DC23;#BDBDBD;100;100 cube3d=#CEA507;#E0BF00;#E5E5E5;98;0 cubetext3d=#8328AA;#2F1645;#000000;100;100 base3d=#6B9956;#3A873C;#686868;95;0 points3d0=#C9FCDB;#86EBBD;#838383;100;100;pine2.png points3d1=#B52D3D;#9E3533;#717171;100;100;pine2.png border3d=#AA814C;#756645;#606060;102;100;stain.png hinge3d=#CC975B;#DAB056;#FFE09A;100;0;hinge2.png numbers3d=#D2D2D2;#D2D2D2;#E5E5E5;100;100 background3d=#E06A35;#AA5344;#515151;100;0;Grass01.png Zox-Vegas Greg Cattanach/Albert Silver board=#72CE70;0.09 border=#003F00 wood=walnut hinges=y light=150;50 shape=0.5 chequers0=#F9F9F9;1.00;2.90;0.30;20.10 chequers1=#D21818;1.00;3.00;0.20;20.10 dice0=#FFFFFF;0.30;3.00;n dice1=#000000;1.00;30.00;y dot0=#010101 dot1=#FFFFFF cube=#E5E5E5 points0=#E05454;0.09 points1=#4B4B4B;0.09 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=1.000000 lightposy=1.700000 lightposz=5.000000 lightambient=55 lightdiffuse=55 lightspecular=80 chequers3d0=#FFFFFF;#FFFFFF;#E5E2E2;81;100;wood.png chequers3d1=#F71919;#FF210F;#AA412A;100;100;wood.png dice3d0=#FFFFFF;#FFFFFF;#E5E2E2;81;100;y dice3d1=#F71919;#FF210F;#AA412A;100;100;y dot3d0=#000A00;#111111;#000000;100;100 dot3d1=#E8F4D6;#FFF4FF;#BDBDBD;100;100 cube3d=#E0FCE2;#E0BFDB;#E5E5E5;98;0 cubetext3d=#6B52AA;#382C71;#000000;100;100 base3d=#74B172;#49AA4B;#000000;120;0;suede.png points3d0=#DD5151;#DD5B56;#000000;100;100;suede.png points3d1=#4C4C4C;#494C49;#000000;100;100;suede.png border3d=#735733;#62553A;#606060;102;100;berch.png hinge3d=#E3E042;#D4AB53;#FFE09A;100;0;hinge2.png numbers3d=#C8D294;#B3E3E7;#553D43;128;100 background3d=#6A2AAF;#40487B;#515151;100;0;wavesand01.png Irish Gold Michael Depreli board=#FFD872;0.09 border=#000100 wood=paint hinges=y light=150;50 shape=0.5 chequers0=#FFFFFF;1.00;3.50;1.00;100.00 chequers1=#47904B;1.00;3.00;0.90;14.80 dice0=#FFFFFF;1.00;100.00;y dice1=#47904B;0.90;14.80;y dot0=#458E49 dot1=#EBEDF0 cube=#D4D4C4 points0=#CC7F00;0.09 points1=#7F3F00;0.20 hinges3d=y piecetype=0 piecetexturetype=0 roundededges=y bgintrays=y roundedpoints=y lighttype=p lightposx=1.600000 lightposy=1.200000 lightposz=1.500000 lightambient=30 lightdiffuse=80 lightspecular=100 chequers3d0=#F2F2F2;#EAEAEA;#FFFFFF;100;100 chequers3d1=#478E49;#4C7C3F;#3F3F3F;98;100 dice3d0=#F2F2F2;#EAEAEA;#FFFFFF;100;100;y dice3d1=#478E49;#4C7C3F;#3F3F3F;98;100;y dot3d0=#0F2A15;#5D854B;#323432;128;100 dot3d1=#E8F4EA;#D1D8CE;#1B1B1B;128;100 cube3d=#D1D6C9;#384058;#CBCCCB;80;0 cubetext3d=#CC41C2;#403C6C;#000001;128;100 base3d=#D0B15D;#D4B935;#334F3F;128;0;suede.png points3d0=#CC7F00;#C18408;#49181D;128;100;wavesand01.png points3d1=#823A00;#963F00;#47514A;128;100;wavesand01.png border3d=#161616;#1C1C1C;#37465C;128;100;marble.png hinge3d=#772534;#81342B;#E9C944;115;0;hinge.png numbers3d=#A6A847;#E7DCAE;#010101;116;100 background3d=#82AD61;#62776E;#CA6A6D;116;0;alder.png Union Jack Michael Depreli board=#FFFFFF;0.09 border=#000100 wood=paint hinges=y light=150;50 shape=0.5 chequers0=#FFFFFF;1.00;3.50;1.00;100.00 chequers1=#2917BF;1.00;3.00;0.90;14.80 dice0=#FFFFFF;1.00;100.00;y dice1=#2917BF;0.90;14.80;y dot0=#2816BF dot1=#EBEDF0 cube=#D4D4C4 points0=#010100;0.09 points1=#F30A0A;0.20 hinges3d=y piecetype=0 piecetexturetype=0 roundededges=y bgintrays=y roundedpoints=n lighttype=p lightposx=0.000000 lightposy=2.000000 lightposz=3.500000 lightambient=50 lightdiffuse=65 lightspecular=80 chequers3d0=#E0E0E0;#E8E8E8;#5E0000;75;100 chequers3d1=#2816BF;#201A4C;#3F3F3F;70;100 dice3d0=#E0E0E0;#E8E8E8;#5E0000;75;100;y dice3d1=#2816BF;#201A4C;#3F3F3F;70;100;y dot3d0=#2816BF;#5012BF;#4C4F4C;128;100 dot3d1=#E8E8E8;#E5EDE5;#1B1B1B;128;100 cube3d=#611FBF;#1B92B2;#CBCCCB;80;0 cubetext3d=#C1D03F;#E3B866;#00008C;98;100 base3d=#FFFFFF;#FFFFFF;#263B2F;128;0;pine.png points3d0=#000000;#333232;#49181D;128;100;pine.png points3d1=#F30A0A;#9E3426;#47514A;128;100;pine.png border3d=#191919;#333332;#37465C;128;100 hinge3d=#F2D05B;#BF9664;#E9C944;63;0;hinge.png numbers3d=#C4CCBC;#E7E0D5;#010101;116;100 background3d=#30D427;#51D2BA;#CA41C7;116;0;felt.png Espaùa Ian Shaw board=#FFD772;0.09 border=#003F00 wood=oak hinges=y light=150;50 shape=0.5 chequers0=#EBD765;1.00;3.40;0.90;20.50 chequers1=#8E211F;1.00;3.00;1.00;20.10 dice0=#F7E26B;0.00;20.50;y dice1=#8E211F;1.00;20.10;y dot0=#701515 dot1=#EDD3A6 cube=#E5C997 points0=#AD2323;0.20 points1=#D4A527;0.09 hinges3d=y piecetype=0 piecetexturetype=0 roundededges=n bgintrays=n roundedpoints=n lighttype=p lightposx=0.600000 lightposy=0.600000 lightposz=3.600000 lightambient=35 lightdiffuse=80 lightspecular=90 chequers3d0=#EAD666;#CCC693;#42424C;91;100;wood.png chequers3d1=#912621;#911E16;#3F3F3F;70;100;wood.png dice3d0=#EAD666;#CCC693;#42424C;91;100;y dice3d1=#912621;#911E16;#3F3F3F;70;100;y dot3d0=#7C0C14;#75070A;#4C4F4C;128;100 dot3d1=#E5CEA8;#EDD6A5;#1B1B1B;128;100 cube3d=#E2BA91;#D8BA93;#CBCCCB;80;0 cubetext3d=#2F4C81;#0000A2;#00008C;98;100 base3d=#FFFFFF;#FFFFFF;#000000;128;0;ash.png points3d0=#FFA5A0;#DB4C5A;#49181D;128;100;maple.png points3d1=#FFE8A0;#FFD893;#47514A;128;100;maple.png border3d=#FFFFFF;#FFFFFF;#37465C;128;100;oak.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#7A7889;#E7E675;#010101;116;100 background3d=#D45588;#933E98;#CA41C7;116;0;redwood.png 30's Board JP White board=#DEBC63;0.09 border=#B0F1A6 wood=paint hinges=n light=150;50 shape=0.5 chequers0=#E9E16E;1.00;3.00;0.90;19.90 chequers1=#164919;1.00;3.00;0.90;14.80 dice0=#E9E16E;0.90;19.90;y dice1=#164919;0.90;14.80;y dot0=#000000 dot1=#EBEDF0 cube=#F3F12E points0=#309829;0.09 points1=#FFFFFF;0.20 hinges3d=n piecetype=0 piecetexturetype=0 roundededges=y bgintrays=y roundedpoints=n lighttype=p lightposx=0.700000 lightposy=0.700000 lightposz=3.800000 lightambient=50 lightdiffuse=70 lightspecular=100 chequers3d0=#EADB70;#CCC693;#42424C;91;100 chequers3d1=#164919;#639245;#3F3F3F;70;100 dice3d0=#EADB70;#CCC693;#42424C;91;100;y dice3d1=#164919;#639245;#3F3F3F;70;100;y dot3d0=#010000;#260203;#4C4F4C;128;100 dot3d1=#E5E8F2;#EDF7FF;#1B1B1B;128;100 cube3d=#C9E2A4;#D4D8BF;#CBCCCB;80;0 cubetext3d=#1C2D4D;#8C3BA2;#00008C;98;100 base3d=#FDDD77;#F5C17D;#000000;128;0;felt.png points3d0=#72FF72;#72FF5A;#49181D;128;100;felt.png points3d1=#FFFFFF;#FFFFFF;#47514A;128;100;felt.png border3d=#B5EDA8;#A8E5B2;#37465C;128;100;Grass01.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#8CA46F;#A0B586;#010101;116;100 background3d=#8C6ED4;#682C6C;#CA41C7;116;0;maple.png Easy Going Albert Silver board=#FFEDCB;0.00 border=#5A2F33 wood=paint hinges=y light=147;60 shape=0.3 chequers0=#FFFFFF;1.00;3.00;0.80;89.20 chequers1=#8D0000;1.00;3.00;0.70;14.80 dice0=#FFFFFF;0.80;89.20;y dice1=#8D0000;0.70;14.80;y dot0=#000000 dot1=#EBEDF0 cube=#B1C5CE points0=#E9CED1;0.00 points1=#A0ADD6;0.00 hinges3d=y piecetype=0 piecetexturetype=0 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=3.100000 lightposy=1.500000 lightposz=4.500000 lightambient=50 lightdiffuse=75 lightspecular=70 chequers3d0=#FFE5E5;#FFDDDD;#858084;81;100 chequers3d1=#910000;#A0000F;#A0A0A0;100;100 dice3d0=#FFE5E5;#FFDDDD;#858084;81;100;y dice3d1=#910000;#A0000F;#A0A0A0;100;100;y dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#B0B5A1;#BBB599;#E5E5E5;81;0 cubetext3d=#372F55;#312343;#000000;100;100 base3d=#FFE5BC;#FFDBC9;#010101;128;0;suede.png points3d0=#DBB2C4;#EAA8B2;#010101;128;100;suede.png points3d1=#A0AABC;#96BAC6;#010101;128;100;suede.png border3d=#872561;#8B5160;#8B6234;100;100;oak.png hinge3d=#DED761;#E3CC8A;#C6B985;100;0;hinge.png numbers3d=#7CA697;#6A9467;#010101;100;100 background3d=#9BB149;#8D4B7D;#6E6E6E;100;0;ash.png Nature Albert Silver board=#77B3C5;0.09 border=#003F00 wood=ebony hinges=y light=150;50 shape=0.5 chequers0=#FFDDBC;1.00;1.00;0.20;3.00 chequers1=#C4590A;1.00;1.50;1.00;30.00 dice0=#F12525;0.20;3.00;y dice1=#00000B;1.00;30.00;y dot0=#010101 dot1=#EDEDED cube=#F7F7F7 points0=#58BB58;0.20 points1=#265126;0.20 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=d lightposx=3.000000 lightposy=0.200000 lightposz=2.600000 lightambient=55 lightdiffuse=70 lightspecular=70 chequers3d0=#FFDFBC;#FBD8B6;#FFFFFF;81;100 chequers3d1=#C55909;#AD4D0F;#E0E0E0;100;100 dice3d0=#FFDFBC;#FBD8B6;#FFFFFF;81;100;y dice3d1=#C55909;#AD4D0F;#E0E0E0;100;100;y dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#E5E5E5;#E0E0E0;#E5E5E5;81;0 cubetext3d=#000000;#000000;#000000;100;100 base3d=#FFFFFF;#FFFFFF;#707070;61;0;Water01.png points3d0=#7DDC7D;#59D267;#C5C5C5;100;100;Grass01.png points3d1=#1E661E;#106A13;#C5C5C5;100;100;Grass01.png border3d=#FFFFFF;#FFFFFF;#FFFFFF;71;100;EarthSand01.png hinge3d=#CC975B;#DAB056;#FFE09A;100;0;Hinge2.png numbers3d=#FFFFFF;#FFFFFF;#E5E5E5;100;100 background3d=#FFFFFF;#FFFFFF;#FFFFFF;100;0;wavesand01.png Oak and Maple Ausbilder Schmidt board=#FBE19D;0.00 border=#D3452F wood=paint hinges=y light=150;50 shape=0.3 chequers0=#EBEBEB;1.00;3.00;0.80;89.20 chequers1=#191919;1.00;3.00;0.70;14.80 dice0=#EBEBEB;0.80;89.20;y dice1=#191919;0.70;14.80;y dot0=#000000 dot1=#F2F2F2 cube=#EFEFEF points0=#CB4F2C;0.00 points1=#832100;0.00 hinges3d=y piecetype=0 piecetexturetype=0 roundededges=y bgintrays=n lighttype=d lightposx=3.000000 lightposy=0.000000 lightposz=3.000000 lightambient=50 lightdiffuse=70 lightspecular=100 chequers3d0=#F7F7F7;#E0E0E0;#E5E5E5;81;100 chequers3d1=#0C0C0C;#262626;#E5E5E5;100;100 dice3d0=#F7F7F7;#E0E0E0;#E5E5E5;81;100;y dice3d1=#0C0C0C;#262626;#E5E5E5;100;100;y dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#FFFFFF;#E0E0E0;#E5E5E5;81;0 cubetext3d=#000000;#000000;#000000;100;100 base3d=#FDFFCE;#F9C46C;#FFEA9B;61;0;maple.png points3d0=#D63B17;#C16442;#A85330;100;100;oak.png points3d1=#8E0000;#794200;#9E510C;100;100;oak.png border3d=#CC2C23;#DA5F3B;#CC5510;79;100;oak.png hinge3d=#895B49;#7D613D;#EACE8E;100;0;hinge.png numbers3d=#FFFFFF;#FFFFFF;#E5E5E5;100;100 background3d=#FBFFB5;#FEFFAA;#FEFF7E;100;0;oak.png Alyssum Ruth Schneider board=#4B2B1E;0.09 border=#8B4630 wood=paint hinges=n light=150;50 shape=0.5 chequers0=#AD5635;1.00;1.50;0.20;3.00 chequers1=#F7D7AF;1.00;1.50;0.80;30.00 dice0=#633F06;0.10;6.70;y dice1=#EDDCAE;0.30;4.20;n dot0=#C7C7C7 dot1=#000000 cube=#F7B76A points0=#8E9CB8;0.09 points1=#FFD9AD;0.09 hinges3d=n piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=0.000000 lightposy=2.000000 lightposz=3.500000 lightambient=50 lightdiffuse=70 lightspecular=100 chequers3d0=#AD5635;#AD5635;#FF0000;60;100 chequers3d1=#F7D7AF;#F7D7AF;#3F3F3F;70;100 dice3d0=#633F06;#633F06;#FF0000;100;100;y dice3d1=#EDDCAE;#EDDCAE;#3F3F3F;70;100;n dot3d0=#C7C7C7;#C7C7C7;#4C4F4C;128;100 dot3d1=#000000;#000000;#1B1B1B;128;100 cube3d=#F7B76A;#F7B76A;#CBCCCB;80;100 cubetext3d=#000066;#00007F;#00008C;98;100 base3d=#4B2B1E;#4B2B1E;#000000;128;100;felt.png points3d0=#8E9CB8;#8E9CB8;#49181D;128;100;felt.png points3d1=#FFD9AD;#FFD9AD;#47514A;128;100;felt.png border3d=#8B4630;#8B4630;#37465C;128;100;alder.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#AB78CC;#E7E675;#010101;116;100 background3d=#D45588;#933E98;#CA41C7;116;0;felt.png Curtis cool Ian Curtis board=#54566A;0.20 border=#7F5213 wood=walnut hinges=n light=150;50 shape=0.5 chequers0=#29235E;1.00;1.40;0.30;31.90 chequers1=#CEC46D;1.00;1.40;0.30;31.90 dice0=#29235E;0.30;31.90;y dice1=#EDE657;0.30;87.10;n dot0=#FFFFFF dot1=#1B1B1B cube=#C3BCBA points0=#57A0D2;0.20 points1=#F9F08B;0.20 hinges3d=n piecetype=0 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=d lightposx=-0.700000 lightposy=3.500000 lightposz=4.300000 lightambient=50 lightdiffuse=70 lightspecular=100 chequers3d0=#1D2070;#386262;#827E85;81;100 chequers3d1=#F1F55D;#EFED74;#9E9E9E;100;100 dice3d0=#1D2070;#386262;#827E85;81;100;y dice3d1=#F1F55D;#EFED74;#9E9E9E;100;100;y dot3d0=#FFFFFF;#FFFFFF;#FFFFFF;100;100 dot3d1=#000000;#000000;#0B0B0B;100;100 cube3d=#FFFFFF;#D6D6D6;#B5B5B5;98;0 cubetext3d=#6B52AA;#382C71;#000000;100;100 base3d=#4F5260;#696487;#686868;95;0;suede.png points3d0=#C8C886;#EBEAB5;#838383;100;100;suede.png points3d1=#77C3CC;#9BD5DC;#717171;100;100;suede.png border3d=#E9AE66;#B39D69;#606060;102;100;maple.png hinge3d=#CC975B;#DAB056;#FFEFC6;100;0 numbers3d=#070707;#030303;#E5E5E5;100;100 background3d=#E06A35;#AA5344;#515151;100;0;Grass01.png Zolda Wilson Amaral Jorge board=#F5F9D3;0.20 border=#CEA567 wood=beech hinges=n light=150;50 shape=0.5 chequers0=#FFFFFF;1.00;1.40;0.30;31.90 chequers1=#AF0000;1.00;1.40;0.30;31.90 dice0=#FFFEFE;0.30;31.90;n dice1=#FF2525;0.30;87.10;n dot0=#000000 dot1=#F4F4EC cube=#DFF147 points0=#D11717;0.20 points1=#007800;0.20 hinges3d=n piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=0.200000 lightposy=1.900000 lightposz=3.30 lightambient=45 lightdiffuse=75 lightspecular=95 chequers3d0=#FFFFFF;#FFFFFF;#FF0000;60;100 chequers3d1=#AF0000;#AF0000;#3F3F3F;70;100 dice3d0=#FFFEFE;#FFFEFE;#FF0000;100;100;n dice3d1=#FF2525;#FF2525;#3F3F3F;70;100;n dot3d0=#000000;#000000;#4C4F4C;128;100 dot3d1=#F4F4EC;#F4F4EC;#1B1B1B;128;100 cube3d=#E0F248;#E0F248;#CBCCCB;80;100 cubetext3d=#000066;#00007F;#00008C;98;100 base3d=#F5F9D3;#F5F9D3;#000000;128;100;felt.png points3d0=#D11717;#D11717;#49181D;128;100;felt.png points3d1=#007800;#007800;#47514A;128;100;felt.png border3d=#CEA567;#CEA567;#37465C;128;100;alder.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#AB78CC;#E7E675;#010101;116;100 background3d=#D45588;#933E98;#CA41C7;116;0;felt.png Mundica Wilson Amaral Jorge board=#0B0B0B;0.20 border=#FFFFFF wood=willow hinges=y light=150;50 shape=0.5 chequers0=#F9F9F9;1.00;2.80;0.30;20.10 chequers1=#DEDA19;1.00;3.50;0.00;4.90 dice0=#FFFFFF;0.30;3.00;n dice1=#EEFB15;0.20;20.10;n dot0=#010101 dot1=#1E0101 cube=#FFFFFF points0=#42CC22;0.00 points1=#FDFF40;0.00 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=n roundedpoints=n lighttype=p lightposx=0.000000 lightposy=1.000000 lightposz=3.000000 lightambient=45 lightdiffuse=75 lightspecular=95 chequers3d0=#F9F9F9;#F9F9F9;#FF0000;60;100 chequers3d1=#DEDA19;#DEDA19;#3F3F3F;70;100 dice3d0=#FFFFFF;#FFFFFF;#FF0000;100;100;n dice3d1=#EEFB15;#EEFB15;#3F3F3F;70;100;n dot3d0=#010101;#010101;#4C4F4C;128;100 dot3d1=#1E0101;#1E0101;#1B1B1B;128;100 cube3d=#FFFFFF;#FFFFFF;#CBCCCB;80;100 cubetext3d=#000066;#00007F;#00008C;98;100 base3d=#0B0B0B;#0B0B0B;#000000;128;100;felt.png points3d0=#42CC22;#42CC22;#49181D;128;100;felt.png points3d1=#FDFF40;#FDFF40;#47514A;128;100;felt.png border3d=#FFFFFF;#FFFFFF;#37465C;128;100;alder.png hinge3d=#D8F233;#99BF0C;#E9C944;63;0;hinge.png numbers3d=#AB78CC;#E7E675;#010101;116;100 background3d=#D45588;#933E98;#CA41C7;116;0;felt.png Playok Andre Eppler board=#577457;0.00 border=#5A3B3B wood=paint hinges=n light=121;52 shape=0.3 chequers0=#EF0000;1.00;2.50;0.00;53.30 chequers1=#E6E6E6;1.00;3.20;0.10;39.10 dice0=#EF0000;0.00;53.30;y dice1=#E6E6E6;0.10;39.10;y dot0=#FFFFFF dot1=#000000 cube=#D4D4C4 points0=#E7E7CF;0.00 points1=#CE1414;0.00 hinges3d=n piecetype=0 piecetexturetype=0 roundededges=y bgintrays=n roundedpoints=n lighttype=d lightposx=3.000000 lightposy=0.000000 lightposz=3.000000 lightambient=50 lightdiffuse=70 lightspecular=70 chequers3d0=#E60000;#F00000;#E5E5E5;96;100 chequers3d1=#E6E6E6;#FFFFFF;#E5E5E5;81;100 dice3d0=#E60000;#F00000;#E5E5E5;96;100;y dice3d1=#E6E6E6;#FFFFFF;#E5E5E5;81;100;y dot3d0=#FFFFFF;#789D7A;#000000;100;100 dot3d1=#212121;#307834;#322B2B;100;100 cube3d=#8FCFEF;#D9D9BE;#E5E5E5;81;0 cubetext3d=#70006F;#1E1E1E;#000000;100;100 base3d=#3C5A3C;#3C5A3C;#FFEA9B;61;0 points3d0=#FFE6C1;#AAAA8C;#A85330;100;100 points3d1=#AA1414;#6D000C;#9E510C;100;100 border3d=#5A3C3C;#0A040A;#B5561E;79;100 hinge3d=#895B49;#E3CB1A;#EACE8E;100;0;hinge2.png numbers3d=#FFFFFF;#FCCFCF;#E5E5E5;100;100 background3d=#8FCFEF;#8FCFEF;#FEFF7E;100;0 Waves Matti Kamppinen board=#FFFFFF;0.09 border=#737B88 wood=paint hinges=y light=150;50 shape=0.5 chequers0=#FDDBB9;1.00;1.00;0.20;3.00 chequers1=#9D3355;1.00;1.50;1.00;30.00 dice0=#FDDBB9;0.20;3.00;y dice1=#9D3355;1.00;30.00;y dot0=#000000 dot1=#F2F2F2 cube=#E2E2E2 points0=#A0C1E3;0.20 points1=#223F89;0.20 hinges3d=y piecetype=0 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=d lightposx=3.000000 lightposy=0.200000 lightposz=2.600000 lightambient=55 lightdiffuse=70 lightspecular=70 chequers3d0=#FFDFBC;#FBD8B6;#FFFFFF;81;100 chequers3d1=#CD236D;#6E433E;#E5EBEE;100;100 dice3d0=#FFDFBC;#FBD8B6;#FFFFFF;81;100;y dice3d1=#CD236D;#6E433E;#E5EBEE;100;100;y dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#E5E5E5;#E0E0E0;#E5E5E5;81;0 cubetext3d=#000000;#000000;#000000;100;100 base3d=#FFFFFF;#FFFFFF;#707070;61;0;Water01.png points3d0=#BCCEE0;#84B4E6;#C5C5C5;100;100;Grass01.png points3d1=#354CA9;#10336A;#C5C5C5;100;100;Grass01.png border3d=#5D666D;#8991A4;#FFFFFF;71;100;marble.png hinge3d=#CC975B;#DAB056;#FFE09A;100;0;hinge2.png numbers3d=#FFFFFF;#FFFFFF;#E5E5E5;100;100 background3d=#FFFFFF;#FFFFFF;#FFFFFF;100;0;wavesand01.png Vuitton Matti Kamppinen board=#383531;0.09 border=#787781 wood=paint hinges=y light=150;50 shape=0.5 chequers0=#E5F1D7;1.00;1.00;0.20;3.00 chequers1=#753746;1.00;1.50;1.00;30.00 dice0=#E5F1D7;0.20;3.00;y dice1=#753746;1.00;30.00;y dot0=#000000 dot1=#F2F2F2 cube=#E2E2E2 points0=#E1CB9A;0.20 points1=#C68A43;0.20 hinges3d=y piecetype=1 piecetexturetype=1 roundededges=y bgintrays=y roundedpoints=n lighttype=d lightposx=3.000000 lightposy=0.200000 lightposz=2.600000 lightambient=55 lightdiffuse=70 lightspecular=70 chequers3d0=#F2F9EA;#D8E9C4;#FFFFFF;81;100 chequers3d1=#7C2B4E;#6E433E;#E5EBEE;100;100 dice3d0=#F2F9EA;#D8E9C4;#FFFFFF;81;100;y dice3d1=#7C2B4E;#6E433E;#E5EBEE;100;100;y dot3d0=#000000;#000000;#000000;100;100 dot3d1=#FFFFFF;#E5E5E5;#E5E5E5;100;100 cube3d=#E5E5E5;#E0E0E0;#E5E5E5;81;0 cubetext3d=#000000;#000000;#000000;100;100 base3d=#383531;#383531;#707070;61;0 points3d0=#E1CB9A;#E1CB9A;#C5C5C5;100;100 points3d1=#C68A43;#C68A43;#C5C5C5;100;100 border3d=#675E5E;#8991A4;#FFFFFF;71;100;marble.png hinge3d=#E6B885;#EDB94A;#FFE09A;100;0;hinge2.png numbers3d=#FFFFFF;#FFFFFF;#E5E5E5;100;100 background3d=#FFFFFF;#FFFFFF;#FFFFFF;100;0;wavesand01.png gnubg-1.08.003/depcomp000755 001751 000024 00000056020 14600637122 014201 0ustar00pmstaff000000 000000 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gnubg-1.08.003/missing000755 001751 000024 00000015336 14600637122 014230 0ustar00pmstaff000000 000000 #! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gnubg-1.08.003/sgf_l.c000644 001751 000024 00000237646 14613445366 014114 0ustar00pmstaff000000 000000 #line 1 "sgf_l.c" #line 3 "sgf_l.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer sgf_create_buffer #define yy_delete_buffer sgf_delete_buffer #define yy_scan_buffer sgf_scan_buffer #define yy_scan_string sgf_scan_string #define yy_scan_bytes sgf_scan_bytes #define yy_init_buffer sgf_init_buffer #define yy_flush_buffer sgf_flush_buffer #define yy_load_buffer_state sgf_load_buffer_state #define yy_switch_to_buffer sgf_switch_to_buffer #define yypush_buffer_state sgfpush_buffer_state #define yypop_buffer_state sgfpop_buffer_state #define yyensure_buffer_stack sgfensure_buffer_stack #define yy_flex_debug sgf_flex_debug #define yyin sgfin #define yyleng sgfleng #define yylex sgflex #define yylineno sgflineno #define yyout sgfout #define yyrestart sgfrestart #define yytext sgftext #define yywrap sgfwrap #define yyalloc sgfalloc #define yyrealloc sgfrealloc #define yyfree sgffree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define sgf_create_buffer_ALREADY_DEFINED #else #define yy_create_buffer sgf_create_buffer #endif #ifdef yy_delete_buffer #define sgf_delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer sgf_delete_buffer #endif #ifdef yy_scan_buffer #define sgf_scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer sgf_scan_buffer #endif #ifdef yy_scan_string #define sgf_scan_string_ALREADY_DEFINED #else #define yy_scan_string sgf_scan_string #endif #ifdef yy_scan_bytes #define sgf_scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes sgf_scan_bytes #endif #ifdef yy_init_buffer #define sgf_init_buffer_ALREADY_DEFINED #else #define yy_init_buffer sgf_init_buffer #endif #ifdef yy_flush_buffer #define sgf_flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer sgf_flush_buffer #endif #ifdef yy_load_buffer_state #define sgf_load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state sgf_load_buffer_state #endif #ifdef yy_switch_to_buffer #define sgf_switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer sgf_switch_to_buffer #endif #ifdef yypush_buffer_state #define sgfpush_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state sgfpush_buffer_state #endif #ifdef yypop_buffer_state #define sgfpop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state sgfpop_buffer_state #endif #ifdef yyensure_buffer_stack #define sgfensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack sgfensure_buffer_stack #endif #ifdef yylex #define sgflex_ALREADY_DEFINED #else #define yylex sgflex #endif #ifdef yyrestart #define sgfrestart_ALREADY_DEFINED #else #define yyrestart sgfrestart #endif #ifdef yylex_init #define sgflex_init_ALREADY_DEFINED #else #define yylex_init sgflex_init #endif #ifdef yylex_init_extra #define sgflex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra sgflex_init_extra #endif #ifdef yylex_destroy #define sgflex_destroy_ALREADY_DEFINED #else #define yylex_destroy sgflex_destroy #endif #ifdef yyget_debug #define sgfget_debug_ALREADY_DEFINED #else #define yyget_debug sgfget_debug #endif #ifdef yyset_debug #define sgfset_debug_ALREADY_DEFINED #else #define yyset_debug sgfset_debug #endif #ifdef yyget_extra #define sgfget_extra_ALREADY_DEFINED #else #define yyget_extra sgfget_extra #endif #ifdef yyset_extra #define sgfset_extra_ALREADY_DEFINED #else #define yyset_extra sgfset_extra #endif #ifdef yyget_in #define sgfget_in_ALREADY_DEFINED #else #define yyget_in sgfget_in #endif #ifdef yyset_in #define sgfset_in_ALREADY_DEFINED #else #define yyset_in sgfset_in #endif #ifdef yyget_out #define sgfget_out_ALREADY_DEFINED #else #define yyget_out sgfget_out #endif #ifdef yyset_out #define sgfset_out_ALREADY_DEFINED #else #define yyset_out sgfset_out #endif #ifdef yyget_leng #define sgfget_leng_ALREADY_DEFINED #else #define yyget_leng sgfget_leng #endif #ifdef yyget_text #define sgfget_text_ALREADY_DEFINED #else #define yyget_text sgfget_text #endif #ifdef yyget_lineno #define sgfget_lineno_ALREADY_DEFINED #else #define yyget_lineno sgfget_lineno #endif #ifdef yyset_lineno #define sgfset_lineno_ALREADY_DEFINED #else #define yyset_lineno sgfset_lineno #endif #ifdef yywrap #define sgfwrap_ALREADY_DEFINED #else #define yywrap sgfwrap #endif #ifdef yyalloc #define sgfalloc_ALREADY_DEFINED #else #define yyalloc sgfalloc #endif #ifdef yyrealloc #define sgfrealloc_ALREADY_DEFINED #else #define yyrealloc sgfrealloc #endif #ifdef yyfree #define sgffree_ALREADY_DEFINED #else #define yyfree sgffree #endif #ifdef yytext #define sgftext_ALREADY_DEFINED #else #define yytext sgftext #endif #ifdef yyleng #define sgfleng_ALREADY_DEFINED #else #define yyleng sgfleng #endif #ifdef yyin #define sgfin_ALREADY_DEFINED #else #define yyin sgfin #endif #ifdef yyout #define sgfout_ALREADY_DEFINED #else #define yyout sgfout #endif #ifdef yy_flex_debug #define sgf_flex_debug_ALREADY_DEFINED #else #define yy_flex_debug sgf_flex_debug #endif #ifdef yylineno #define sgflineno_ALREADY_DEFINED #else #define yylineno sgflineno #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined(__FreeBSD__) || \ (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) #define yy_current_buffer YY_CURRENT_BUFFER /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart ( FILE *input_file ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); void yy_delete_buffer ( YY_BUFFER_STATE b ); void yy_flush_buffer ( YY_BUFFER_STATE b ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); void yypop_buffer_state ( void ); static void yyensure_buffer_stack ( void ); static void yy_load_buffer_state ( void ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); void *yyalloc ( yy_size_t ); void *yyrealloc ( void *, yy_size_t ); void yyfree ( void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define sgfwrap() (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; typedef const struct yy_trans_info *yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #ifdef yytext_ptr #undef yytext_ptr #endif #define yytext_ptr yytext static yy_state_type yy_get_previous_state ( void ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); static int yy_get_next_buffer ( void ); static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 13 #define YY_END_OF_BUFFER 14 struct yy_trans_info { flex_int16_t yy_verify; flex_int16_t yy_nxt; }; static const struct yy_trans_info yy_transition[2845] = { { 0, 0 }, { 0,2589 }, { 0, 0 }, { 0,2587 }, { 1,1032 }, { 2,1032 }, { 3,1032 }, { 4,1032 }, { 5,1032 }, { 6,1032 }, { 7,1032 }, { 8,1032 }, { 9,1034 }, { 10,1039 }, { 11,1034 }, { 12,1034 }, { 13,1034 }, { 14,1032 }, { 15,1032 }, { 16,1032 }, { 17,1032 }, { 18,1032 }, { 19,1032 }, { 20,1032 }, { 21,1032 }, { 22,1032 }, { 23,1032 }, { 24,1032 }, { 25,1032 }, { 26,1032 }, { 27,1032 }, { 28,1032 }, { 29,1032 }, { 30,1032 }, { 31,1032 }, { 32,1034 }, { 33,1032 }, { 34,1032 }, { 35,1032 }, { 36,1032 }, { 37,1032 }, { 38,1032 }, { 39,1032 }, { 40,1036 }, { 41,1036 }, { 42,1032 }, { 43,1032 }, { 44,1032 }, { 45,1032 }, { 46,1032 }, { 47,1032 }, { 48,1032 }, { 49,1032 }, { 50,1032 }, { 51,1032 }, { 52,1032 }, { 53,1032 }, { 54,1032 }, { 55,1032 }, { 56,1032 }, { 57,1032 }, { 58,1032 }, { 59,1036 }, { 60,1032 }, { 61,1032 }, { 62,1032 }, { 63,1032 }, { 64,1032 }, { 65,1041 }, { 66,1041 }, { 67,1041 }, { 68,1041 }, { 69,1041 }, { 70,1041 }, { 71,1041 }, { 72,1041 }, { 73,1041 }, { 74,1041 }, { 75,1041 }, { 76,1041 }, { 77,1041 }, { 78,1041 }, { 79,1041 }, { 80,1041 }, { 81,1041 }, { 82,1041 }, { 83,1041 }, { 84,1041 }, { 85,1041 }, { 86,1041 }, { 87,1041 }, { 88,1041 }, { 89,1041 }, { 90,1041 }, { 91,1054 }, { 92,1032 }, { 93,1032 }, { 94,1032 }, { 95,1032 }, { 96,1032 }, { 97,1099 }, { 98,1099 }, { 99,1099 }, { 100,1099 }, { 101,1099 }, { 102,1099 }, { 103,1099 }, { 104,1099 }, { 105,1099 }, { 106,1099 }, { 107,1099 }, { 108,1099 }, { 109,1099 }, { 110,1099 }, { 111,1099 }, { 112,1099 }, { 113,1099 }, { 114,1099 }, { 115,1099 }, { 116,1099 }, { 117,1099 }, { 118,1099 }, { 119,1099 }, { 120,1099 }, { 121,1099 }, { 122,1099 }, { 123,1032 }, { 124,1032 }, { 125,1032 }, { 126,1032 }, { 127,1032 }, { 128,1032 }, { 129,1032 }, { 130,1032 }, { 131,1032 }, { 132,1032 }, { 133,1032 }, { 134,1032 }, { 135,1032 }, { 136,1032 }, { 137,1032 }, { 138,1032 }, { 139,1032 }, { 140,1032 }, { 141,1032 }, { 142,1032 }, { 143,1032 }, { 144,1032 }, { 145,1032 }, { 146,1032 }, { 147,1032 }, { 148,1032 }, { 149,1032 }, { 150,1032 }, { 151,1032 }, { 152,1032 }, { 153,1032 }, { 154,1032 }, { 155,1032 }, { 156,1032 }, { 157,1032 }, { 158,1032 }, { 159,1032 }, { 160,1032 }, { 161,1032 }, { 162,1032 }, { 163,1032 }, { 164,1032 }, { 165,1032 }, { 166,1032 }, { 167,1032 }, { 168,1032 }, { 169,1032 }, { 170,1032 }, { 171,1032 }, { 172,1032 }, { 173,1032 }, { 174,1032 }, { 175,1032 }, { 176,1032 }, { 177,1032 }, { 178,1032 }, { 179,1032 }, { 180,1032 }, { 181,1032 }, { 182,1032 }, { 183,1032 }, { 184,1032 }, { 185,1032 }, { 186,1032 }, { 187,1032 }, { 188,1032 }, { 189,1032 }, { 190,1032 }, { 191,1032 }, { 192,1032 }, { 193,1032 }, { 194,1032 }, { 195,1032 }, { 196,1032 }, { 197,1032 }, { 198,1032 }, { 199,1032 }, { 200,1032 }, { 201,1032 }, { 202,1032 }, { 203,1032 }, { 204,1032 }, { 205,1032 }, { 206,1032 }, { 207,1032 }, { 208,1032 }, { 209,1032 }, { 210,1032 }, { 211,1032 }, { 212,1032 }, { 213,1032 }, { 214,1032 }, { 215,1032 }, { 216,1032 }, { 217,1032 }, { 218,1032 }, { 219,1032 }, { 220,1032 }, { 221,1032 }, { 222,1032 }, { 223,1032 }, { 224,1032 }, { 225,1032 }, { 226,1032 }, { 227,1032 }, { 228,1032 }, { 229,1032 }, { 230,1032 }, { 231,1032 }, { 232,1032 }, { 233,1032 }, { 234,1032 }, { 235,1032 }, { 236,1032 }, { 237,1032 }, { 238,1032 }, { 239,1032 }, { 240,1032 }, { 241,1032 }, { 242,1032 }, { 243,1032 }, { 244,1032 }, { 245,1032 }, { 246,1032 }, { 247,1032 }, { 248,1032 }, { 249,1032 }, { 250,1032 }, { 251,1032 }, { 252,1032 }, { 253,1032 }, { 254,1032 }, { 255,1032 }, { 256,1032 }, { 0, 0 }, { 0,2329 }, { 1, 774 }, { 2, 774 }, { 3, 774 }, { 4, 774 }, { 5, 774 }, { 6, 774 }, { 7, 774 }, { 8, 774 }, { 9, 776 }, { 10, 781 }, { 11, 776 }, { 12, 776 }, { 13, 776 }, { 14, 774 }, { 15, 774 }, { 16, 774 }, { 17, 774 }, { 18, 774 }, { 19, 774 }, { 20, 774 }, { 21, 774 }, { 22, 774 }, { 23, 774 }, { 24, 774 }, { 25, 774 }, { 26, 774 }, { 27, 774 }, { 28, 774 }, { 29, 774 }, { 30, 774 }, { 31, 774 }, { 32, 776 }, { 33, 774 }, { 34, 774 }, { 35, 774 }, { 36, 774 }, { 37, 774 }, { 38, 774 }, { 39, 774 }, { 40, 778 }, { 41, 778 }, { 42, 774 }, { 43, 774 }, { 44, 774 }, { 45, 774 }, { 46, 774 }, { 47, 774 }, { 48, 774 }, { 49, 774 }, { 50, 774 }, { 51, 774 }, { 52, 774 }, { 53, 774 }, { 54, 774 }, { 55, 774 }, { 56, 774 }, { 57, 774 }, { 58, 774 }, { 59, 778 }, { 60, 774 }, { 61, 774 }, { 62, 774 }, { 63, 774 }, { 64, 774 }, { 65, 783 }, { 66, 783 }, { 67, 783 }, { 68, 783 }, { 69, 783 }, { 70, 783 }, { 71, 783 }, { 72, 783 }, { 73, 783 }, { 74, 783 }, { 75, 783 }, { 76, 783 }, { 77, 783 }, { 78, 783 }, { 79, 783 }, { 80, 783 }, { 81, 783 }, { 82, 783 }, { 83, 783 }, { 84, 783 }, { 85, 783 }, { 86, 783 }, { 87, 783 }, { 88, 783 }, { 89, 783 }, { 90, 783 }, { 91, 796 }, { 92, 774 }, { 93, 774 }, { 94, 774 }, { 95, 774 }, { 96, 774 }, { 97, 841 }, { 98, 841 }, { 99, 841 }, { 100, 841 }, { 101, 841 }, { 102, 841 }, { 103, 841 }, { 104, 841 }, { 105, 841 }, { 106, 841 }, { 107, 841 }, { 108, 841 }, { 109, 841 }, { 110, 841 }, { 111, 841 }, { 112, 841 }, { 113, 841 }, { 114, 841 }, { 115, 841 }, { 116, 841 }, { 117, 841 }, { 118, 841 }, { 119, 841 }, { 120, 841 }, { 121, 841 }, { 122, 841 }, { 123, 774 }, { 124, 774 }, { 125, 774 }, { 126, 774 }, { 127, 774 }, { 128, 774 }, { 129, 774 }, { 130, 774 }, { 131, 774 }, { 132, 774 }, { 133, 774 }, { 134, 774 }, { 135, 774 }, { 136, 774 }, { 137, 774 }, { 138, 774 }, { 139, 774 }, { 140, 774 }, { 141, 774 }, { 142, 774 }, { 143, 774 }, { 144, 774 }, { 145, 774 }, { 146, 774 }, { 147, 774 }, { 148, 774 }, { 149, 774 }, { 150, 774 }, { 151, 774 }, { 152, 774 }, { 153, 774 }, { 154, 774 }, { 155, 774 }, { 156, 774 }, { 157, 774 }, { 158, 774 }, { 159, 774 }, { 160, 774 }, { 161, 774 }, { 162, 774 }, { 163, 774 }, { 164, 774 }, { 165, 774 }, { 166, 774 }, { 167, 774 }, { 168, 774 }, { 169, 774 }, { 170, 774 }, { 171, 774 }, { 172, 774 }, { 173, 774 }, { 174, 774 }, { 175, 774 }, { 176, 774 }, { 177, 774 }, { 178, 774 }, { 179, 774 }, { 180, 774 }, { 181, 774 }, { 182, 774 }, { 183, 774 }, { 184, 774 }, { 185, 774 }, { 186, 774 }, { 187, 774 }, { 188, 774 }, { 189, 774 }, { 190, 774 }, { 191, 774 }, { 192, 774 }, { 193, 774 }, { 194, 774 }, { 195, 774 }, { 196, 774 }, { 197, 774 }, { 198, 774 }, { 199, 774 }, { 200, 774 }, { 201, 774 }, { 202, 774 }, { 203, 774 }, { 204, 774 }, { 205, 774 }, { 206, 774 }, { 207, 774 }, { 208, 774 }, { 209, 774 }, { 210, 774 }, { 211, 774 }, { 212, 774 }, { 213, 774 }, { 214, 774 }, { 215, 774 }, { 216, 774 }, { 217, 774 }, { 218, 774 }, { 219, 774 }, { 220, 774 }, { 221, 774 }, { 222, 774 }, { 223, 774 }, { 224, 774 }, { 225, 774 }, { 226, 774 }, { 227, 774 }, { 228, 774 }, { 229, 774 }, { 230, 774 }, { 231, 774 }, { 232, 774 }, { 233, 774 }, { 234, 774 }, { 235, 774 }, { 236, 774 }, { 237, 774 }, { 238, 774 }, { 239, 774 }, { 240, 774 }, { 241, 774 }, { 242, 774 }, { 243, 774 }, { 244, 774 }, { 245, 774 }, { 246, 774 }, { 247, 774 }, { 248, 774 }, { 249, 774 }, { 250, 774 }, { 251, 774 }, { 252, 774 }, { 253, 774 }, { 254, 774 }, { 255, 774 }, { 256, 774 }, { 0, 0 }, { 0,2071 }, { 1, 707 }, { 2, 707 }, { 3, 707 }, { 4, 707 }, { 5, 707 }, { 6, 707 }, { 7, 707 }, { 8, 707 }, { 9, 707 }, { 10, 707 }, { 11, 707 }, { 12, 707 }, { 13, 707 }, { 14, 707 }, { 15, 707 }, { 16, 707 }, { 17, 707 }, { 18, 707 }, { 19, 707 }, { 20, 707 }, { 21, 707 }, { 22, 707 }, { 23, 707 }, { 24, 707 }, { 25, 707 }, { 26, 707 }, { 27, 707 }, { 28, 707 }, { 29, 707 }, { 30, 707 }, { 31, 707 }, { 32, 707 }, { 33, 707 }, { 34, 707 }, { 35, 707 }, { 36, 707 }, { 37, 707 }, { 38, 707 }, { 39, 707 }, { 40, 707 }, { 41, 707 }, { 42, 707 }, { 43, 707 }, { 44, 707 }, { 45, 707 }, { 46, 707 }, { 47, 707 }, { 48, 707 }, { 49, 707 }, { 50, 707 }, { 51, 707 }, { 52, 707 }, { 53, 707 }, { 54, 707 }, { 55, 707 }, { 56, 707 }, { 57, 707 }, { 58, 707 }, { 59, 707 }, { 60, 707 }, { 61, 707 }, { 62, 707 }, { 63, 707 }, { 64, 707 }, { 65, 707 }, { 66, 707 }, { 67, 707 }, { 68, 707 }, { 69, 707 }, { 70, 707 }, { 71, 707 }, { 72, 707 }, { 73, 707 }, { 74, 707 }, { 75, 707 }, { 76, 707 }, { 77, 707 }, { 78, 707 }, { 79, 707 }, { 80, 707 }, { 81, 707 }, { 82, 707 }, { 83, 707 }, { 84, 707 }, { 85, 707 }, { 86, 707 }, { 87, 707 }, { 88, 707 }, { 89, 707 }, { 90, 707 }, { 91, 707 }, { 92, 964 }, { 93, 540 }, { 94, 707 }, { 95, 707 }, { 96, 707 }, { 97, 707 }, { 98, 707 }, { 99, 707 }, { 100, 707 }, { 101, 707 }, { 102, 707 }, { 103, 707 }, { 104, 707 }, { 105, 707 }, { 106, 707 }, { 107, 707 }, { 108, 707 }, { 109, 707 }, { 110, 707 }, { 111, 707 }, { 112, 707 }, { 113, 707 }, { 114, 707 }, { 115, 707 }, { 116, 707 }, { 117, 707 }, { 118, 707 }, { 119, 707 }, { 120, 707 }, { 121, 707 }, { 122, 707 }, { 123, 707 }, { 124, 707 }, { 125, 707 }, { 126, 707 }, { 127, 707 }, { 128, 707 }, { 129, 707 }, { 130, 707 }, { 131, 707 }, { 132, 707 }, { 133, 707 }, { 134, 707 }, { 135, 707 }, { 136, 707 }, { 137, 707 }, { 138, 707 }, { 139, 707 }, { 140, 707 }, { 141, 707 }, { 142, 707 }, { 143, 707 }, { 144, 707 }, { 145, 707 }, { 146, 707 }, { 147, 707 }, { 148, 707 }, { 149, 707 }, { 150, 707 }, { 151, 707 }, { 152, 707 }, { 153, 707 }, { 154, 707 }, { 155, 707 }, { 156, 707 }, { 157, 707 }, { 158, 707 }, { 159, 707 }, { 160, 707 }, { 161, 707 }, { 162, 707 }, { 163, 707 }, { 164, 707 }, { 165, 707 }, { 166, 707 }, { 167, 707 }, { 168, 707 }, { 169, 707 }, { 170, 707 }, { 171, 707 }, { 172, 707 }, { 173, 707 }, { 174, 707 }, { 175, 707 }, { 176, 707 }, { 177, 707 }, { 178, 707 }, { 179, 707 }, { 180, 707 }, { 181, 707 }, { 182, 707 }, { 183, 707 }, { 184, 707 }, { 185, 707 }, { 186, 707 }, { 187, 707 }, { 188, 707 }, { 189, 707 }, { 190, 707 }, { 191, 707 }, { 192, 707 }, { 193, 707 }, { 194, 707 }, { 195, 707 }, { 196, 707 }, { 197, 707 }, { 198, 707 }, { 199, 707 }, { 200, 707 }, { 201, 707 }, { 202, 707 }, { 203, 707 }, { 204, 707 }, { 205, 707 }, { 206, 707 }, { 207, 707 }, { 208, 707 }, { 209, 707 }, { 210, 707 }, { 211, 707 }, { 212, 707 }, { 213, 707 }, { 214, 707 }, { 215, 707 }, { 216, 707 }, { 217, 707 }, { 218, 707 }, { 219, 707 }, { 220, 707 }, { 221, 707 }, { 222, 707 }, { 223, 707 }, { 224, 707 }, { 225, 707 }, { 226, 707 }, { 227, 707 }, { 228, 707 }, { 229, 707 }, { 230, 707 }, { 231, 707 }, { 232, 707 }, { 233, 707 }, { 234, 707 }, { 235, 707 }, { 236, 707 }, { 237, 707 }, { 238, 707 }, { 239, 707 }, { 240, 707 }, { 241, 707 }, { 242, 707 }, { 243, 707 }, { 244, 707 }, { 245, 707 }, { 246, 707 }, { 247, 707 }, { 248, 707 }, { 249, 707 }, { 250, 707 }, { 251, 707 }, { 252, 707 }, { 253, 707 }, { 254, 707 }, { 255, 707 }, { 256, 542 }, { 0, 0 }, { 0,1813 }, { 1, 449 }, { 2, 449 }, { 3, 449 }, { 4, 449 }, { 5, 449 }, { 6, 449 }, { 7, 449 }, { 8, 449 }, { 9, 449 }, { 10, 449 }, { 11, 449 }, { 12, 449 }, { 13, 449 }, { 14, 449 }, { 15, 449 }, { 16, 449 }, { 17, 449 }, { 18, 449 }, { 19, 449 }, { 20, 449 }, { 21, 449 }, { 22, 449 }, { 23, 449 }, { 24, 449 }, { 25, 449 }, { 26, 449 }, { 27, 449 }, { 28, 449 }, { 29, 449 }, { 30, 449 }, { 31, 449 }, { 32, 449 }, { 33, 449 }, { 34, 449 }, { 35, 449 }, { 36, 449 }, { 37, 449 }, { 38, 449 }, { 39, 449 }, { 40, 449 }, { 41, 449 }, { 42, 449 }, { 43, 449 }, { 44, 449 }, { 45, 449 }, { 46, 449 }, { 47, 449 }, { 48, 449 }, { 49, 449 }, { 50, 449 }, { 51, 449 }, { 52, 449 }, { 53, 449 }, { 54, 449 }, { 55, 449 }, { 56, 449 }, { 57, 449 }, { 58, 449 }, { 59, 449 }, { 60, 449 }, { 61, 449 }, { 62, 449 }, { 63, 449 }, { 64, 449 }, { 65, 449 }, { 66, 449 }, { 67, 449 }, { 68, 449 }, { 69, 449 }, { 70, 449 }, { 71, 449 }, { 72, 449 }, { 73, 449 }, { 74, 449 }, { 75, 449 }, { 76, 449 }, { 77, 449 }, { 78, 449 }, { 79, 449 }, { 80, 449 }, { 81, 449 }, { 82, 449 }, { 83, 449 }, { 84, 449 }, { 85, 449 }, { 86, 449 }, { 87, 449 }, { 88, 449 }, { 89, 449 }, { 90, 449 }, { 91, 449 }, { 92, 706 }, { 93, 282 }, { 94, 449 }, { 95, 449 }, { 96, 449 }, { 97, 449 }, { 98, 449 }, { 99, 449 }, { 100, 449 }, { 101, 449 }, { 102, 449 }, { 103, 449 }, { 104, 449 }, { 105, 449 }, { 106, 449 }, { 107, 449 }, { 108, 449 }, { 109, 449 }, { 110, 449 }, { 111, 449 }, { 112, 449 }, { 113, 449 }, { 114, 449 }, { 115, 449 }, { 116, 449 }, { 117, 449 }, { 118, 449 }, { 119, 449 }, { 120, 449 }, { 121, 449 }, { 122, 449 }, { 123, 449 }, { 124, 449 }, { 125, 449 }, { 126, 449 }, { 127, 449 }, { 128, 449 }, { 129, 449 }, { 130, 449 }, { 131, 449 }, { 132, 449 }, { 133, 449 }, { 134, 449 }, { 135, 449 }, { 136, 449 }, { 137, 449 }, { 138, 449 }, { 139, 449 }, { 140, 449 }, { 141, 449 }, { 142, 449 }, { 143, 449 }, { 144, 449 }, { 145, 449 }, { 146, 449 }, { 147, 449 }, { 148, 449 }, { 149, 449 }, { 150, 449 }, { 151, 449 }, { 152, 449 }, { 153, 449 }, { 154, 449 }, { 155, 449 }, { 156, 449 }, { 157, 449 }, { 158, 449 }, { 159, 449 }, { 160, 449 }, { 161, 449 }, { 162, 449 }, { 163, 449 }, { 164, 449 }, { 165, 449 }, { 166, 449 }, { 167, 449 }, { 168, 449 }, { 169, 449 }, { 170, 449 }, { 171, 449 }, { 172, 449 }, { 173, 449 }, { 174, 449 }, { 175, 449 }, { 176, 449 }, { 177, 449 }, { 178, 449 }, { 179, 449 }, { 180, 449 }, { 181, 449 }, { 182, 449 }, { 183, 449 }, { 184, 449 }, { 185, 449 }, { 186, 449 }, { 187, 449 }, { 188, 449 }, { 189, 449 }, { 190, 449 }, { 191, 449 }, { 192, 449 }, { 193, 449 }, { 194, 449 }, { 195, 449 }, { 196, 449 }, { 197, 449 }, { 198, 449 }, { 199, 449 }, { 200, 449 }, { 201, 449 }, { 202, 449 }, { 203, 449 }, { 204, 449 }, { 205, 449 }, { 206, 449 }, { 207, 449 }, { 208, 449 }, { 209, 449 }, { 210, 449 }, { 211, 449 }, { 212, 449 }, { 213, 449 }, { 214, 449 }, { 215, 449 }, { 216, 449 }, { 217, 449 }, { 218, 449 }, { 219, 449 }, { 220, 449 }, { 221, 449 }, { 222, 449 }, { 223, 449 }, { 224, 449 }, { 225, 449 }, { 226, 449 }, { 227, 449 }, { 228, 449 }, { 229, 449 }, { 230, 449 }, { 231, 449 }, { 232, 449 }, { 233, 449 }, { 234, 449 }, { 235, 449 }, { 236, 449 }, { 237, 449 }, { 238, 449 }, { 239, 449 }, { 240, 449 }, { 241, 449 }, { 242, 449 }, { 243, 449 }, { 244, 449 }, { 245, 449 }, { 246, 449 }, { 247, 449 }, { 248, 449 }, { 249, 449 }, { 250, 449 }, { 251, 449 }, { 252, 449 }, { 253, 449 }, { 254, 449 }, { 255, 449 }, { 256, 284 }, { 0, 6 }, { 0,1555 }, { 0, 1 }, { 0,1553 }, { 0, 2 }, { 0,1551 }, { 0, 0 }, { 0, 1 }, { 0,1548 }, { 0, 3 }, { 0,1546 }, { 0, 0 }, { 9, 704 }, { 10, 704 }, { 11, 704 }, { 12, 704 }, { 13, 704 }, { 9, 699 }, { 10, 699 }, { 11, 699 }, { 12, 699 }, { 13, 699 }, { 0, 5 }, { 0,1533 }, { 0, 10 }, { 0,1531 }, { 0, 7 }, { 0,1529 }, { 0, 12 }, { 0,1527 }, { 0, 9 }, { 0,1525 }, { 0, 8 }, { 0,1523 }, { 0, 0 }, { 32, 704 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 699 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 4 }, { 0,1488 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 699 }, { 66, 699 }, { 67, 699 }, { 68, 699 }, { 69, 699 }, { 70, 699 }, { 71, 699 }, { 72, 699 }, { 73, 699 }, { 74, 699 }, { 75, 699 }, { 76, 699 }, { 77, 699 }, { 78, 699 }, { 79, 699 }, { 80, 699 }, { 81, 699 }, { 82, 699 }, { 83, 699 }, { 84, 699 }, { 85, 699 }, { 86, 699 }, { 87, 699 }, { 88, 699 }, { 89, 699 }, { 90, 699 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 757 }, { 98, 757 }, { 99, 757 }, { 100, 757 }, { 101, 757 }, { 102, 757 }, { 103, 757 }, { 104, 757 }, { 105, 757 }, { 106, 757 }, { 107, 757 }, { 108, 757 }, { 109, 757 }, { 110, 757 }, { 111, 757 }, { 112, 757 }, { 113, 757 }, { 114, 757 }, { 115, 757 }, { 116, 757 }, { 117, 757 }, { 118, 757 }, { 119, 757 }, { 120, 757 }, { 121, 757 }, { 122, 757 }, { 65, 791 }, { 66, 791 }, { 67, 791 }, { 68, 791 }, { 69, 791 }, { 70, 791 }, { 71, 791 }, { 72, 791 }, { 73, 791 }, { 74, 791 }, { 75, 791 }, { 76, 791 }, { 77, 791 }, { 78, 791 }, { 79, 791 }, { 80, 791 }, { 81, 791 }, { 82, 791 }, { 83, 791 }, { 84, 791 }, { 85, 791 }, { 86, 791 }, { 87, 791 }, { 88, 791 }, { 89, 791 }, { 90, 791 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 849 }, { 98, 849 }, { 99, 849 }, { 100, 849 }, { 101, 849 }, { 102, 849 }, { 103, 849 }, { 104, 849 }, { 105, 849 }, { 106, 849 }, { 107, 849 }, { 108, 849 }, { 109, 849 }, { 110, 849 }, { 111, 849 }, { 112, 849 }, { 113, 849 }, { 114, 849 }, { 115, 849 }, { 116, 849 }, { 117, 849 }, { 118, 849 }, { 119, 849 }, { 120, 849 }, { 121, 849 }, { 122, 849 }, { 0, 11 }, { 0,1364 }, { 1, 849 }, { 2, 849 }, { 3, 849 }, { 4, 849 }, { 5, 849 }, { 6, 849 }, { 7, 849 }, { 8, 849 }, { 9, 849 }, { 10, 849 }, { 11, 849 }, { 12, 849 }, { 13, 849 }, { 14, 849 }, { 15, 849 }, { 16, 849 }, { 17, 849 }, { 18, 849 }, { 19, 849 }, { 20, 849 }, { 21, 849 }, { 22, 849 }, { 23, 849 }, { 24, 849 }, { 25, 849 }, { 26, 849 }, { 27, 849 }, { 28, 849 }, { 29, 849 }, { 30, 849 }, { 31, 849 }, { 32, 849 }, { 33, 849 }, { 34, 849 }, { 35, 849 }, { 36, 849 }, { 37, 849 }, { 38, 849 }, { 39, 849 }, { 40, 849 }, { 41, 849 }, { 42, 849 }, { 43, 849 }, { 44, 849 }, { 45, 849 }, { 46, 849 }, { 47, 849 }, { 48, 849 }, { 49, 849 }, { 50, 849 }, { 51, 849 }, { 52, 849 }, { 53, 849 }, { 54, 849 }, { 55, 849 }, { 56, 849 }, { 57, 849 }, { 58, 849 }, { 59, 849 }, { 60, 849 }, { 61, 849 }, { 62, 849 }, { 63, 849 }, { 64, 849 }, { 65, 849 }, { 66, 849 }, { 67, 849 }, { 68, 849 }, { 69, 849 }, { 70, 849 }, { 71, 849 }, { 72, 849 }, { 73, 849 }, { 74, 849 }, { 75, 849 }, { 76, 849 }, { 77, 849 }, { 78, 849 }, { 79, 849 }, { 80, 849 }, { 81, 849 }, { 82, 849 }, { 83, 849 }, { 84, 849 }, { 85, 849 }, { 86, 849 }, { 87, 849 }, { 88, 849 }, { 89, 849 }, { 90, 849 }, { 91, 849 }, { 0, 0 }, { 0, 0 }, { 94, 849 }, { 95, 849 }, { 96, 849 }, { 97, 849 }, { 98, 849 }, { 99, 849 }, { 100, 849 }, { 101, 849 }, { 102, 849 }, { 103, 849 }, { 104, 849 }, { 105, 849 }, { 106, 849 }, { 107, 849 }, { 108, 849 }, { 109, 849 }, { 110, 849 }, { 111, 849 }, { 112, 849 }, { 113, 849 }, { 114, 849 }, { 115, 849 }, { 116, 849 }, { 117, 849 }, { 118, 849 }, { 119, 849 }, { 120, 849 }, { 121, 849 }, { 122, 849 }, { 123, 849 }, { 124, 849 }, { 125, 849 }, { 126, 849 }, { 127, 849 }, { 128, 849 }, { 129, 849 }, { 130, 849 }, { 131, 849 }, { 132, 849 }, { 133, 849 }, { 134, 849 }, { 135, 849 }, { 136, 849 }, { 137, 849 }, { 138, 849 }, { 139, 849 }, { 140, 849 }, { 141, 849 }, { 142, 849 }, { 143, 849 }, { 144, 849 }, { 145, 849 }, { 146, 849 }, { 147, 849 }, { 148, 849 }, { 149, 849 }, { 150, 849 }, { 151, 849 }, { 152, 849 }, { 153, 849 }, { 154, 849 }, { 155, 849 }, { 156, 849 }, { 157, 849 }, { 158, 849 }, { 159, 849 }, { 160, 849 }, { 161, 849 }, { 162, 849 }, { 163, 849 }, { 164, 849 }, { 165, 849 }, { 166, 849 }, { 167, 849 }, { 168, 849 }, { 169, 849 }, { 170, 849 }, { 171, 849 }, { 172, 849 }, { 173, 849 }, { 174, 849 }, { 175, 849 }, { 176, 849 }, { 177, 849 }, { 178, 849 }, { 179, 849 }, { 180, 849 }, { 181, 849 }, { 182, 849 }, { 183, 849 }, { 184, 849 }, { 185, 849 }, { 186, 849 }, { 187, 849 }, { 188, 849 }, { 189, 849 }, { 190, 849 }, { 191, 849 }, { 192, 849 }, { 193, 849 }, { 194, 849 }, { 195, 849 }, { 196, 849 }, { 197, 849 }, { 198, 849 }, { 199, 849 }, { 200, 849 }, { 201, 849 }, { 202, 849 }, { 203, 849 }, { 204, 849 }, { 205, 849 }, { 206, 849 }, { 207, 849 }, { 208, 849 }, { 209, 849 }, { 210, 849 }, { 211, 849 }, { 212, 849 }, { 213, 849 }, { 214, 849 }, { 215, 849 }, { 216, 849 }, { 217, 849 }, { 218, 849 }, { 219, 849 }, { 220, 849 }, { 221, 849 }, { 222, 849 }, { 223, 849 }, { 224, 849 }, { 225, 849 }, { 226, 849 }, { 227, 849 }, { 228, 849 }, { 229, 849 }, { 230, 849 }, { 231, 849 }, { 232, 849 }, { 233, 849 }, { 234, 849 }, { 235, 849 }, { 236, 849 }, { 237, 849 }, { 238, 849 }, { 239, 849 }, { 240, 849 }, { 241, 849 }, { 242, 849 }, { 243, 849 }, { 244, 849 }, { 245, 849 }, { 246, 849 }, { 247, 849 }, { 248, 849 }, { 249, 849 }, { 250, 849 }, { 251, 849 }, { 252, 849 }, { 253, 849 }, { 254, 849 }, { 255, 849 }, { 0, 12 }, { 0,1107 }, { 1,-420 }, { 2,-420 }, { 3,-420 }, { 4,-420 }, { 5,-420 }, { 6,-420 }, { 7,-420 }, { 8,-420 }, { 9,-420 }, { 10,-418 }, { 11,-420 }, { 12,-420 }, { 13,-420 }, { 14,-420 }, { 15,-420 }, { 16,-420 }, { 17,-420 }, { 18,-420 }, { 19,-420 }, { 20,-420 }, { 21,-420 }, { 22,-420 }, { 23,-420 }, { 24,-420 }, { 25,-420 }, { 26,-420 }, { 27,-420 }, { 28,-420 }, { 29,-420 }, { 30,-420 }, { 31,-420 }, { 32,-420 }, { 33,-420 }, { 34,-420 }, { 35,-420 }, { 36,-420 }, { 37,-420 }, { 38,-420 }, { 39,-420 }, { 40,-420 }, { 41,-420 }, { 42,-420 }, { 43,-420 }, { 44,-420 }, { 45,-420 }, { 46,-420 }, { 47,-420 }, { 48,-420 }, { 49,-420 }, { 50,-420 }, { 51,-420 }, { 52,-420 }, { 53,-420 }, { 54,-420 }, { 55,-420 }, { 56,-420 }, { 57,-420 }, { 58,-420 }, { 59,-420 }, { 60,-420 }, { 61,-420 }, { 62,-420 }, { 63,-420 }, { 64,-420 }, { 65,-420 }, { 66,-420 }, { 67,-420 }, { 68,-420 }, { 69,-420 }, { 70,-420 }, { 71,-420 }, { 72,-420 }, { 73,-420 }, { 74,-420 }, { 75,-420 }, { 76,-420 }, { 77,-420 }, { 78,-420 }, { 79,-420 }, { 80,-420 }, { 81,-420 }, { 82,-420 }, { 83,-420 }, { 84,-420 }, { 85,-420 }, { 86,-420 }, { 87,-420 }, { 88,-420 }, { 89,-420 }, { 90,-420 }, { 91,-420 }, { 92,-420 }, { 93,-416 }, { 94,-420 }, { 95,-420 }, { 96,-420 }, { 97,-420 }, { 98,-420 }, { 99,-420 }, { 100,-420 }, { 101,-420 }, { 102,-420 }, { 103,-420 }, { 104,-420 }, { 105,-420 }, { 106,-420 }, { 107,-420 }, { 108,-420 }, { 109,-420 }, { 110,-420 }, { 111,-420 }, { 112,-420 }, { 113,-420 }, { 114,-420 }, { 115,-420 }, { 116,-420 }, { 117,-420 }, { 118,-420 }, { 119,-420 }, { 120,-420 }, { 121,-420 }, { 122,-420 }, { 123,-420 }, { 124,-420 }, { 125,-420 }, { 126,-420 }, { 127,-420 }, { 128,-420 }, { 129,-420 }, { 130,-420 }, { 131,-420 }, { 132,-420 }, { 133,-420 }, { 134,-420 }, { 135,-420 }, { 136,-420 }, { 137,-420 }, { 138,-420 }, { 139,-420 }, { 140,-420 }, { 141,-420 }, { 142,-420 }, { 143,-420 }, { 144,-420 }, { 145,-420 }, { 146,-420 }, { 147,-420 }, { 148,-420 }, { 149,-420 }, { 150,-420 }, { 151,-420 }, { 152,-420 }, { 153,-420 }, { 154,-420 }, { 155,-420 }, { 156,-420 }, { 157,-420 }, { 158,-420 }, { 159,-420 }, { 160,-420 }, { 161,-420 }, { 162,-420 }, { 163,-420 }, { 164,-420 }, { 165,-420 }, { 166,-420 }, { 167,-420 }, { 168,-420 }, { 169,-420 }, { 170,-420 }, { 171,-420 }, { 172,-420 }, { 173,-420 }, { 174,-420 }, { 175,-420 }, { 176,-420 }, { 177,-420 }, { 178,-420 }, { 179,-420 }, { 180,-420 }, { 181,-420 }, { 182,-420 }, { 183,-420 }, { 184,-420 }, { 185,-420 }, { 186,-420 }, { 187,-420 }, { 188,-420 }, { 189,-420 }, { 190,-420 }, { 191,-420 }, { 192,-420 }, { 193,-420 }, { 194,-420 }, { 195,-420 }, { 196,-420 }, { 197,-420 }, { 198,-420 }, { 199,-420 }, { 200,-420 }, { 201,-420 }, { 202,-420 }, { 203,-420 }, { 204,-420 }, { 205,-420 }, { 206,-420 }, { 207,-420 }, { 208,-420 }, { 209,-420 }, { 210,-420 }, { 211,-420 }, { 212,-420 }, { 213,-420 }, { 214,-420 }, { 215,-420 }, { 216,-420 }, { 217,-420 }, { 218,-420 }, { 219,-420 }, { 220,-420 }, { 221,-420 }, { 222,-420 }, { 223,-420 }, { 224,-420 }, { 225,-420 }, { 226,-420 }, { 227,-420 }, { 228,-420 }, { 229,-420 }, { 230,-420 }, { 231,-420 }, { 232,-420 }, { 233,-420 }, { 234,-420 }, { 235,-420 }, { 236,-420 }, { 237,-420 }, { 238,-420 }, { 239,-420 }, { 240,-420 }, { 241,-420 }, { 242,-420 }, { 243,-420 }, { 244,-420 }, { 245,-420 }, { 246,-420 }, { 247,-420 }, { 248,-420 }, { 249,-420 }, { 250,-420 }, { 251,-420 }, { 252,-420 }, { 253,-420 }, { 254,-420 }, { 255,-420 }, { 256,-420 }, { 0, 1 }, { 0, 849 }, { 0, 3 }, { 0, 847 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 }, { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 3 }, { 0, 789 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 589 }, { 98, 589 }, { 99, 589 }, { 100, 589 }, { 101, 589 }, { 102, 589 }, { 103, 589 }, { 104, 589 }, { 105, 589 }, { 106, 589 }, { 107, 589 }, { 108, 589 }, { 109, 589 }, { 110, 589 }, { 111, 589 }, { 112, 589 }, { 113, 589 }, { 114, 589 }, { 115, 589 }, { 116, 589 }, { 117, 589 }, { 118, 589 }, { 119, 589 }, { 120, 589 }, { 121, 589 }, { 122, 589 }, { 65, -58 }, { 66, -58 }, { 67, -58 }, { 68, -58 }, { 69, -58 }, { 70, -58 }, { 71, -58 }, { 72, -58 }, { 73, -58 }, { 74, -58 }, { 75, -58 }, { 76, -58 }, { 77, -58 }, { 78, -58 }, { 79, -58 }, { 80, -58 }, { 81, -58 }, { 82, -58 }, { 83, -58 }, { 84, -58 }, { 85, -58 }, { 86, -58 }, { 87, -58 }, { 88, -58 }, { 89, -58 }, { 90, -58 }, { 0, 3 }, { 0, 697 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 4 }, { 0, 639 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-150 }, { 66,-150 }, { 67,-150 }, { 68,-150 }, { 69,-150 }, { 70,-150 }, { 71,-150 }, { 72,-150 }, { 73,-150 }, { 74,-150 }, { 75,-150 }, { 76,-150 }, { 77,-150 }, { 78,-150 }, { 79,-150 }, { 80,-150 }, { 81,-150 }, { 82,-150 }, { 83,-150 }, { 84,-150 }, { 85,-150 }, { 86,-150 }, { 87,-150 }, { 88,-150 }, { 89,-150 }, { 90,-150 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, -92 }, { 98, -92 }, { 99, -92 }, { 100, -92 }, { 101, -92 }, { 102, -92 }, { 103, -92 }, { 104, -92 }, { 105, -92 }, { 106, -92 }, { 107, -92 }, { 108, -92 }, { 109, -92 }, { 110, -92 }, { 111, -92 }, { 112, -92 }, { 113, -92 }, { 114, -92 }, { 115, -92 }, { 116, -92 }, { 117, -92 }, { 118, -92 }, { 119, -92 }, { 120, -92 }, { 121, -92 }, { 122, -92 }, { 65, -58 }, { 66, -58 }, { 67, -58 }, { 68, -58 }, { 69, -58 }, { 70, -58 }, { 71, -58 }, { 72, -58 }, { 73, -58 }, { 74, -58 }, { 75, -58 }, { 76, -58 }, { 77, -58 }, { 78, -58 }, { 79, -58 }, { 80, -58 }, { 81, -58 }, { 82, -58 }, { 83, -58 }, { 84, -58 }, { 85, -58 }, { 86, -58 }, { 87, -58 }, { 88, -58 }, { 89, -58 }, { 90, -58 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 11 }, { 0, 515 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 }, { 0, 0 }, { 0, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 0, 3 }, { 0, 258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 257, 14 }, { 1, 0 }, }; static const struct yy_trans_info *yy_start_state_list[5] = { &yy_transition[1], &yy_transition[3], &yy_transition[261], &yy_transition[519], &yy_transition[777], } ; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "../gnubg/sgf_l.l" /* * Copyright (C) 2000 Gary Wong * Copyright (C) 2002-2015 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: sgf_l.l,v 1.3 2020/04/12 19:02:41 plm Exp $ */ #line 22 "../gnubg/sgf_l.l" #include "common.h" #include #include "list.h" #include "sgf.h" #include "sgf_y.h" #include static int error( char *s ) { /* refer to yy_fatal_error, to shut up the compiler */ (void) yy_fatal_error; if( SGFErrorHandler ) SGFErrorHandler( s, 0 ); else fprintf( stderr, "%s\n", s ); return 0; } #define YY_FATAL_ERROR(m) error(m) #line 1263 "sgf_l.c" #define YY_NO_INPUT 1 #line 1266 "sgf_l.c" #define INITIAL 0 #define value 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( void ); int yyget_debug ( void ); void yyset_debug ( int debug_flag ); YY_EXTRA_TYPE yyget_extra ( void ); void yyset_extra ( YY_EXTRA_TYPE user_defined ); FILE *yyget_in ( void ); void yyset_in ( FILE * _in_str ); FILE *yyget_out ( void ); void yyset_out ( FILE * _out_str ); int yyget_leng ( void ); char *yyget_text ( void ); int yyget_lineno ( void ); void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( void ); #else extern int yywrap ( void ); #endif #endif #ifndef YY_NO_UNPUT #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( void ); #else static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 63 "../gnubg/sgf_l.l" #line 1484 "sgf_l.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yy_start_state_list[(yy_start)]; yy_match: { const struct yy_trans_info *yy_trans_info; YY_CHAR yy_c; for ( yy_c = YY_SC_TO_UI(*yy_cp); (yy_trans_info = &yy_current_state[yy_c])-> yy_verify == yy_c; yy_c = YY_SC_TO_UI(*++yy_cp) ) yy_current_state += yy_trans_info->yy_nxt; } yy_find_action: yy_act = yy_current_state[-1].yy_nxt; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 64 "../gnubg/sgf_l.l" /* ignore */ YY_BREAK case 2: YY_RULE_SETUP #line 65 "../gnubg/sgf_l.l" return *yytext; YY_BREAK case 3: YY_RULE_SETUP #line 66 "../gnubg/sgf_l.l" { char *pch; sgflval.ach[ 1 ] = 0; for( pch = yytext; *pch; pch++ ) if( isupper( *pch ) ) { sgflval.ach[ 0 ] = *pch; break; } for( pch++; *pch; pch++ ) if( isupper( *pch ) ) { sgflval.ach[ 1 ] = *pch; break; } return PROPERTY; } YY_BREAK case 4: YY_RULE_SETUP #line 85 "../gnubg/sgf_l.l" /* ignore -- this rule avoids making flex back up */ YY_BREAK case 5: YY_RULE_SETUP #line 86 "../gnubg/sgf_l.l" BEGIN(value); return '['; YY_BREAK case 6: YY_RULE_SETUP #line 87 "../gnubg/sgf_l.l" { error( _("illegal character in SGF file" )); } YY_BREAK case 7: YY_RULE_SETUP #line 89 "../gnubg/sgf_l.l" /* ignore -- we want value strings null-terminated */ YY_BREAK case 8: YY_RULE_SETUP #line 90 "../gnubg/sgf_l.l" { sgflval.pch = strdup( "]" ); return VALUETEXT; } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 91 "../gnubg/sgf_l.l" /* ignore */ YY_BREAK case 10: YY_RULE_SETUP #line 92 "../gnubg/sgf_l.l" BEGIN(INITIAL); return ']'; YY_BREAK case 11: /* rule 11 can match eol */ YY_RULE_SETUP #line 93 "../gnubg/sgf_l.l" { sgflval.pch = strdup( yytext ); return VALUETEXT; } YY_BREAK case 12: YY_RULE_SETUP #line 94 "../gnubg/sgf_l.l" { sgflval.pch = strdup( yytext ); return VALUETEXT; } YY_BREAK case 13: YY_RULE_SETUP #line 96 "../gnubg/sgf_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK #line 1607 "sgf_l.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(value): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { yy_state_type yy_current_state; char *yy_cp; yy_current_state = yy_start_state_list[(yy_start)]; for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { yy_current_state += yy_current_state[(*yy_cp ? YY_SC_TO_UI(*yy_cp) : 256)].yy_nxt; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { int yy_is_jam; int yy_c = 256; const struct yy_trans_info *yy_trans_info; yy_trans_info = &yy_current_state[(unsigned int) yy_c]; yy_current_state += yy_trans_info->yy_nxt; yy_is_jam = (yy_trans_info->yy_verify != yy_c); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) #ifdef YY_FLEX_LEX_COMPAT return 0; #else return EOF; #endif if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf ); yyfree( (void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg ) { fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param _line_number line number * */ void yyset_lineno (int _line_number ) { yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str ) { yyin = _in_str ; } void yyset_out (FILE * _out_str ) { yyout = _out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int _bdebug ) { yy_flex_debug = _bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 96 "../gnubg/sgf_l.l" gnubg-1.08.003/external_l.c000644 001751 000024 00000240100 14613445366 015132 0ustar00pmstaff000000 000000 #line 1 "external_l.c" #line 3 "external_l.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define ext__create_buffer_ALREADY_DEFINED #else #define yy_create_buffer ext__create_buffer #endif #ifdef yy_delete_buffer #define ext__delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer ext__delete_buffer #endif #ifdef yy_scan_buffer #define ext__scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer ext__scan_buffer #endif #ifdef yy_scan_string #define ext__scan_string_ALREADY_DEFINED #else #define yy_scan_string ext__scan_string #endif #ifdef yy_scan_bytes #define ext__scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes ext__scan_bytes #endif #ifdef yy_init_buffer #define ext__init_buffer_ALREADY_DEFINED #else #define yy_init_buffer ext__init_buffer #endif #ifdef yy_flush_buffer #define ext__flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer ext__flush_buffer #endif #ifdef yy_load_buffer_state #define ext__load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state ext__load_buffer_state #endif #ifdef yy_switch_to_buffer #define ext__switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer ext__switch_to_buffer #endif #ifdef yypush_buffer_state #define ext_push_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state ext_push_buffer_state #endif #ifdef yypop_buffer_state #define ext_pop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state ext_pop_buffer_state #endif #ifdef yyensure_buffer_stack #define ext_ensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack ext_ensure_buffer_stack #endif #ifdef yylex #define ext_lex_ALREADY_DEFINED #else #define yylex ext_lex #endif #ifdef yyrestart #define ext_restart_ALREADY_DEFINED #else #define yyrestart ext_restart #endif #ifdef yylex_init #define ext_lex_init_ALREADY_DEFINED #else #define yylex_init ext_lex_init #endif #ifdef yylex_init_extra #define ext_lex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra ext_lex_init_extra #endif #ifdef yylex_destroy #define ext_lex_destroy_ALREADY_DEFINED #else #define yylex_destroy ext_lex_destroy #endif #ifdef yyget_debug #define ext_get_debug_ALREADY_DEFINED #else #define yyget_debug ext_get_debug #endif #ifdef yyset_debug #define ext_set_debug_ALREADY_DEFINED #else #define yyset_debug ext_set_debug #endif #ifdef yyget_extra #define ext_get_extra_ALREADY_DEFINED #else #define yyget_extra ext_get_extra #endif #ifdef yyset_extra #define ext_set_extra_ALREADY_DEFINED #else #define yyset_extra ext_set_extra #endif #ifdef yyget_in #define ext_get_in_ALREADY_DEFINED #else #define yyget_in ext_get_in #endif #ifdef yyset_in #define ext_set_in_ALREADY_DEFINED #else #define yyset_in ext_set_in #endif #ifdef yyget_out #define ext_get_out_ALREADY_DEFINED #else #define yyget_out ext_get_out #endif #ifdef yyset_out #define ext_set_out_ALREADY_DEFINED #else #define yyset_out ext_set_out #endif #ifdef yyget_leng #define ext_get_leng_ALREADY_DEFINED #else #define yyget_leng ext_get_leng #endif #ifdef yyget_text #define ext_get_text_ALREADY_DEFINED #else #define yyget_text ext_get_text #endif #ifdef yyget_lineno #define ext_get_lineno_ALREADY_DEFINED #else #define yyget_lineno ext_get_lineno #endif #ifdef yyset_lineno #define ext_set_lineno_ALREADY_DEFINED #else #define yyset_lineno ext_set_lineno #endif #ifdef yyget_column #define ext_get_column_ALREADY_DEFINED #else #define yyget_column ext_get_column #endif #ifdef yyset_column #define ext_set_column_ALREADY_DEFINED #else #define yyset_column ext_set_column #endif #ifdef yywrap #define ext_wrap_ALREADY_DEFINED #else #define yywrap ext_wrap #endif #ifdef yyget_lval #define ext_get_lval_ALREADY_DEFINED #else #define yyget_lval ext_get_lval #endif #ifdef yyset_lval #define ext_set_lval_ALREADY_DEFINED #else #define yyset_lval ext_set_lval #endif #ifdef yyalloc #define ext_alloc_ALREADY_DEFINED #else #define yyalloc ext_alloc #endif #ifdef yyrealloc #define ext_realloc_ALREADY_DEFINED #else #define yyrealloc ext_realloc #endif #ifdef yyfree #define ext_free_ALREADY_DEFINED #else #define yyfree ext_free #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined(__FreeBSD__) || \ (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif /* For convenience, these vars (plus the bison vars far below) are macros in the reentrant scanner. */ #define yyin yyg->yyin_r #define yyout yyg->yyout_r #define yyextra yyg->yyextra_r #define yyleng yyg->yyleng_r #define yytext yyg->yytext_r #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) #define yy_flex_debug yyg->yy_flex_debug_r /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin , yyscanner ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = yyg->yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) #define yy_current_buffer YY_CURRENT_BUFFER /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] void yyrestart ( FILE *input_file , yyscan_t yyscanner ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); void yypop_buffer_state ( yyscan_t yyscanner ); static void yyensure_buffer_stack ( yyscan_t yyscanner ); static void yy_load_buffer_state ( yyscan_t yyscanner ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); void *yyalloc ( yy_size_t , yyscan_t yyscanner ); void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); void yyfree ( void * , yyscan_t yyscanner ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define ext_wrap(yyscanner) (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); static int yy_get_next_buffer ( yyscan_t yyscanner ); static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; #define YY_NUM_RULES 36 #define YY_END_OF_BUFFER 37 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[281] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 35, 34, 34, 35, 35, 18, 35, 35, 17, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 35, 35, 17, 30, 32, 32, 32, 32, 32, 32, 35, 35, 17, 33, 33, 33, 33, 33, 33, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 0, 15, 0, 0, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 17, 32, 32, 32, 32, 32, 32, 32, 0, 33, 0, 17, 33, 33, 33, 33, 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 13, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 33, 33, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 7, 0, 0, 32, 32, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 6, 0, 0, 0, 32, 33, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 20, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 12, 5, 0, 0, 0, 0, 11, 0, 0, 26, 0, 0, 0, 19, 21, 0, 25, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 1, 5, 6, 6, 1, 7, 6, 7, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 1, 1, 1, 1, 1, 1, 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, 21, 6, 1, 6, 1, 21, 1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 21, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 21, 6, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[60] = { 0, 1, 1, 2, 1, 1, 1, 1, 3, 3, 1, 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 flex_int16_t yy_base[291] = { 0, 0, 0, 59, 118, 177, 236, 295, 0, 353, 0, 361, 818, 68, 70, 287, 281, 818, 68, 270, 70, 49, 65, 53, 93, 66, 62, 115, 117, 62, 60, 77, 104, 120, 121, 93, 99, 272, 268, 136, 818, 262, 138, 143, 180, 142, 182, 243, 222, 167, 209, 187, 181, 208, 163, 195, 193, 220, 194, 218, 242, 113, 239, 236, 252, 225, 197, 207, 818, 200, 164, 205, 253, 258, 345, 347, 340, 235, 348, 237, 235, 329, 217, 348, 354, 367, 346, 353, 345, 345, 350, 351, 385, 165, 818, 152, 398, 146, 386, 407, 403, 410, 406, 388, 148, 818, 142, 412, 123, 408, 420, 417, 432, 416, 419, 415, 420, 426, 399, 426, 440, 426, 405, 420, 90, 422, 421, 433, 427, 433, 436, 440, 452, 466, 475, 480, 485, 491, 452, 450, 493, 470, 462, 495, 492, 499, 497, 506, 495, 514, 498, 517, 479, 485, 511, 512, 498, 500, 515, 508, 514, 107, 94, 520, 519, 508, 538, 528, 532, 547, 518, 562, 564, 528, 569, 571, 573, 538, 569, 577, 573, 584, 568, 573, 588, 565, 582, 580, 568, 583, 582, 83, 598, 591, 603, 609, 582, 613, 587, 588, 597, 630, 633, 597, 601, 637, 599, 622, 620, 609, 645, 649, 653, 621, 818, 655, 623, 648, 649, 661, 641, 637, 642, 649, 643, 642, 645, 672, 676, 678, 665, 663, 659, 670, 689, 696, 700, 674, 702, 664, 676, 675, 679, 685, 698, 699, 713, 716, 692, 719, 723, 704, 705, 709, 707, 733, 738, 701, 740, 709, 714, 720, 744, 747, 755, 730, 729, 758, 739, 762, 751, 748, 768, 770, 772, 755, 775, 777, 779, 782, 818, 793, 796, 799, 802, 805, 808, 85, 811, 814, 79 } ; static const flex_int16_t yy_def[291] = { 0, 280, 1, 281, 281, 282, 282, 280, 7, 7, 9, 280, 280, 280, 280, 283, 284, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 285, 286, 287, 280, 287, 287, 287, 287, 287, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 284, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 285, 280, 286, 287, 287, 287, 287, 287, 287, 287, 287, 288, 280, 289, 290, 290, 290, 290, 290, 290, 290, 290, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 287, 287, 287, 287, 290, 290, 290, 290, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 287, 287, 290, 290, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 287, 290, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 0, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280 } ; static const flex_int16_t yy_nxt[878] = { 0, 12, 13, 14, 15, 16, 17, 18, 19, 20, 12, 12, 21, 12, 22, 23, 24, 12, 25, 26, 12, 12, 12, 12, 27, 28, 29, 30, 12, 31, 32, 12, 33, 12, 12, 34, 12, 21, 12, 22, 23, 24, 12, 25, 26, 12, 12, 12, 27, 28, 29, 30, 12, 31, 32, 12, 33, 12, 12, 34, 12, 35, 36, 37, 38, 12, 18, 19, 39, 40, 66, 66, 66, 66, 73, 42, 70, 71, 70, 71, 74, 79, 108, 43, 44, 75, 80, 76, 97, 45, 86, 87, 88, 214, 46, 92, 92, 161, 73, 162, 42, 92, 92, 162, 77, 74, 79, 43, 44, 75, 80, 76, 78, 45, 86, 87, 162, 88, 46, 12, 35, 36, 37, 38, 12, 18, 19, 39, 40, 77, 81, 280, 89, 83, 42, 90, 91, 78, 120, 84, 82, 85, 43, 44, 70, 96, 280, 105, 45, 98, 280, 280, 105, 46, 280, 81, 89, 94, 83, 42, 90, 91, 120, 84, 82, 85, 43, 44, 99, 94, 102, 280, 45, 72, 98, 70, 107, 46, 12, 35, 36, 47, 48, 12, 18, 19, 49, 40, 280, 280, 280, 113, 99, 51, 102, 280, 100, 103, 109, 66, 66, 52, 53, 280, 101, 68, 110, 54, 115, 118, 114, 68, 55, 70, 71, 113, 280, 280, 51, 134, 134, 100, 103, 109, 111, 52, 53, 105, 101, 77, 110, 54, 112, 115, 118, 114, 55, 12, 35, 36, 47, 48, 12, 18, 19, 49, 40, 105, 116, 111, 82, 117, 51, 119, 77, 83, 112, 129, 121, 131, 52, 53, 72, 85, 122, 132, 54, 123, 124, 125, 280, 55, 116, 94, 82, 117, 94, 51, 119, 72, 83, 129, 121, 131, 52, 53, 68, 85, 122, 132, 54, 68, 123, 124, 125, 55, 12, 13, 14, 12, 12, 12, 18, 19, 20, 12, 12, 56, 57, 58, 12, 59, 12, 12, 12, 60, 12, 12, 12, 61, 62, 63, 12, 64, 12, 32, 12, 12, 12, 12, 34, 12, 56, 57, 58, 12, 59, 12, 12, 12, 60, 12, 12, 61, 62, 63, 12, 64, 12, 32, 12, 12, 12, 12, 34, 35, 36, 126, 127, 128, 130, 280, 133, 40, 135, 12, 12, 12, 136, 137, 137, 138, 139, 12, 280, 140, 141, 65, 142, 12, 143, 12, 126, 127, 128, 130, 133, 92, 92, 135, 12, 12, 12, 136, 280, 138, 280, 139, 12, 140, 141, 65, 142, 12, 143, 12, 70, 96, 144, 134, 134, 280, 137, 137, 280, 280, 280, 147, 280, 145, 70, 107, 134, 134, 280, 280, 152, 280, 280, 155, 148, 153, 144, 149, 137, 137, 159, 146, 154, 156, 280, 147, 134, 134, 145, 158, 280, 150, 151, 160, 163, 152, 164, 155, 148, 165, 153, 166, 149, 157, 159, 146, 167, 154, 156, 168, 169, 170, 171, 171, 158, 150, 151, 160, 163, 173, 164, 134, 134, 165, 174, 166, 134, 134, 157, 176, 167, 172, 172, 168, 169, 177, 170, 137, 137, 175, 175, 137, 137, 173, 280, 134, 134, 280, 174, 280, 280, 280, 137, 137, 176, 182, 179, 181, 280, 177, 134, 134, 183, 137, 137, 178, 280, 186, 180, 280, 184, 185, 280, 187, 188, 280, 189, 190, 191, 182, 192, 179, 181, 193, 194, 194, 183, 195, 196, 178, 198, 186, 180, 197, 197, 184, 185, 187, 199, 188, 189, 200, 190, 191, 280, 192, 280, 193, 171, 171, 172, 172, 195, 196, 198, 194, 194, 175, 175, 137, 137, 280, 199, 137, 137, 280, 200, 203, 201, 280, 137, 137, 202, 204, 205, 205, 280, 208, 209, 210, 280, 211, 212, 213, 215, 215, 216, 218, 206, 194, 194, 217, 203, 201, 207, 134, 134, 202, 204, 197, 197, 208, 219, 209, 210, 211, 220, 212, 213, 221, 222, 216, 218, 206, 223, 217, 134, 134, 207, 134, 134, 224, 280, 205, 205, 280, 219, 225, 226, 230, 220, 227, 227, 221, 222, 228, 228, 231, 223, 229, 229, 215, 215, 232, 233, 240, 224, 234, 234, 235, 236, 225, 226, 230, 237, 238, 239, 241, 227, 227, 242, 231, 228, 228, 229, 229, 243, 245, 232, 233, 240, 244, 248, 235, 236, 234, 234, 250, 237, 238, 239, 241, 246, 246, 251, 242, 247, 247, 249, 249, 252, 243, 245, 253, 254, 244, 255, 248, 256, 246, 246, 250, 247, 247, 257, 249, 249, 259, 251, 258, 258, 260, 261, 267, 252, 262, 265, 253, 254, 263, 263, 255, 266, 256, 264, 264, 258, 258, 257, 268, 269, 269, 259, 263, 263, 260, 270, 261, 267, 262, 265, 264, 264, 271, 272, 272, 266, 273, 269, 269, 274, 275, 278, 268, 272, 272, 276, 276, 277, 277, 270, 276, 276, 277, 277, 279, 279, 271, 279, 279, 280, 273, 280, 280, 280, 274, 275, 278, 41, 41, 41, 50, 50, 50, 67, 280, 67, 69, 280, 69, 93, 280, 93, 95, 280, 95, 104, 280, 104, 106, 280, 106, 11, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280 } ; static const flex_int16_t yy_chk[878] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 13, 14, 14, 21, 3, 18, 18, 20, 20, 22, 25, 290, 3, 3, 23, 26, 23, 287, 3, 29, 30, 31, 191, 3, 35, 35, 124, 21, 124, 3, 36, 36, 162, 24, 22, 25, 3, 3, 23, 26, 23, 24, 3, 29, 30, 161, 31, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24, 27, 108, 32, 28, 4, 33, 34, 24, 61, 28, 27, 28, 4, 4, 39, 39, 42, 106, 4, 42, 45, 43, 104, 4, 97, 27, 32, 95, 28, 4, 33, 34, 61, 28, 27, 28, 4, 4, 43, 93, 45, 54, 4, 70, 42, 49, 49, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 44, 52, 46, 54, 43, 5, 45, 51, 44, 46, 51, 66, 66, 5, 5, 55, 44, 69, 52, 5, 56, 58, 55, 67, 5, 71, 71, 54, 53, 50, 5, 82, 82, 44, 46, 51, 53, 5, 5, 48, 44, 59, 52, 5, 53, 56, 58, 55, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 47, 57, 53, 65, 57, 6, 60, 59, 62, 53, 77, 63, 79, 6, 6, 72, 62, 63, 80, 6, 64, 72, 73, 41, 6, 57, 38, 65, 57, 37, 6, 60, 19, 62, 77, 63, 79, 6, 6, 16, 62, 63, 80, 6, 15, 64, 72, 73, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 74, 75, 76, 78, 11, 81, 9, 83, 9, 9, 9, 84, 85, 85, 86, 87, 9, 0, 88, 89, 9, 90, 9, 91, 9, 74, 75, 76, 78, 81, 92, 92, 83, 9, 9, 9, 84, 98, 86, 103, 87, 9, 88, 89, 9, 90, 9, 91, 9, 96, 96, 98, 99, 99, 100, 101, 101, 102, 99, 109, 103, 101, 100, 107, 107, 110, 110, 113, 111, 115, 114, 110, 118, 109, 116, 98, 111, 112, 112, 122, 102, 117, 119, 112, 103, 120, 120, 100, 121, 0, 113, 114, 123, 125, 115, 126, 118, 109, 127, 116, 128, 111, 120, 122, 102, 129, 117, 119, 130, 131, 132, 133, 133, 121, 113, 114, 123, 125, 138, 126, 134, 134, 127, 139, 128, 135, 135, 120, 141, 129, 136, 136, 130, 131, 142, 132, 137, 137, 140, 140, 143, 143, 138, 144, 145, 145, 148, 139, 146, 150, 145, 147, 147, 141, 152, 146, 150, 147, 142, 149, 149, 153, 151, 151, 144, 149, 156, 148, 151, 154, 155, 0, 157, 158, 0, 159, 160, 163, 152, 164, 146, 150, 165, 166, 166, 153, 167, 168, 144, 170, 156, 148, 169, 169, 154, 155, 157, 173, 158, 159, 177, 160, 163, 0, 164, 0, 165, 171, 171, 172, 172, 167, 168, 170, 174, 174, 175, 175, 176, 176, 178, 173, 179, 179, 180, 177, 182, 178, 179, 181, 181, 180, 183, 184, 184, 181, 185, 186, 187, 0, 188, 189, 190, 192, 192, 193, 198, 184, 194, 194, 196, 182, 178, 184, 195, 195, 180, 183, 197, 197, 185, 199, 186, 187, 188, 200, 189, 190, 203, 204, 193, 198, 184, 206, 196, 201, 201, 184, 202, 202, 207, 201, 205, 205, 202, 199, 208, 209, 213, 200, 210, 210, 203, 204, 211, 211, 216, 206, 212, 212, 215, 215, 217, 218, 225, 207, 219, 219, 220, 221, 208, 209, 213, 222, 223, 224, 226, 227, 227, 230, 216, 228, 228, 229, 229, 231, 233, 217, 218, 225, 232, 237, 220, 221, 234, 234, 239, 222, 223, 224, 226, 235, 235, 240, 230, 236, 236, 238, 238, 241, 231, 233, 242, 243, 232, 244, 237, 245, 246, 246, 239, 247, 247, 248, 249, 249, 251, 240, 250, 250, 252, 253, 260, 241, 254, 257, 242, 243, 255, 255, 244, 259, 245, 256, 256, 258, 258, 248, 261, 262, 262, 251, 263, 263, 252, 265, 253, 260, 254, 257, 264, 264, 266, 267, 267, 259, 268, 269, 269, 270, 271, 275, 261, 272, 272, 273, 273, 274, 274, 265, 276, 276, 277, 277, 278, 278, 266, 279, 279, 0, 268, 0, 0, 0, 270, 271, 275, 281, 281, 281, 282, 282, 282, 283, 0, 283, 284, 0, 284, 285, 0, 285, 286, 0, 286, 288, 0, 288, 289, 0, 289, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "../gnubg/external_l.l" #line 2 "../gnubg/external_l.l" /* * Copyright (C) 2014-2015 Michael Petch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: external_l.l,v 1.33 2023/06/11 21:20:12 plm Exp $ */ #include "common.h" #include "external.h" #include "external_y.h" extern int ext_parse(yyscan_t scanner); void escapes(const char *cp, char *tp); #define PROCESS_YYTEXT_STRING \ if (yytext[0] == '\'' || yytext[0] == '\"') { \ yytext[strlen(yytext) - 1] = '\0'; \ escapes(yytext+1, yytext); \ } \ yylval->str = g_string_new(yytext) #line 965 "external_l.c" #define YY_NO_INPUT 1 #line 968 "external_l.c" #define INITIAL 0 #define SBOARDP1 1 #define SBOARDP2 2 #define OPTIONS 3 #define VALLIST 4 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif /* Holds the entire state of the reentrant scanner. */ struct yyguts_t { /* User-defined. Not touched by flex. */ YY_EXTRA_TYPE yyextra_r; /* The rest are the same as the globals declared in the non-reentrant scanner. */ FILE *yyin_r, *yyout_r; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ char yy_hold_char; int yy_n_chars; int yyleng_r; char *yy_c_buf_p; int yy_init; int yy_start; int yy_did_buffer_switch_on_eof; int yy_start_stack_ptr; int yy_start_stack_depth; int *yy_start_stack; yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; int yylineno_r; int yy_flex_debug_r; char *yytext_r; int yy_more_flag; int yy_more_len; YYSTYPE * yylval_r; }; /* end struct yyguts_t */ static int yy_init_globals ( yyscan_t yyscanner ); /* This must go here because YYSTYPE and YYLTYPE are included * from bison output in section 1.*/ # define yylval yyg->yylval_r int yylex_init (yyscan_t* scanner); int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( yyscan_t yyscanner ); int yyget_debug ( yyscan_t yyscanner ); void yyset_debug ( int debug_flag , yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); FILE *yyget_in ( yyscan_t yyscanner ); void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); FILE *yyget_out ( yyscan_t yyscanner ); void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); int yyget_leng ( yyscan_t yyscanner ); char *yyget_text ( yyscan_t yyscanner ); int yyget_lineno ( yyscan_t yyscanner ); void yyset_lineno ( int _line_number , yyscan_t yyscanner ); int yyget_column ( yyscan_t yyscanner ); void yyset_column ( int _column_no , yyscan_t yyscanner ); YYSTYPE * yyget_lval ( yyscan_t yyscanner ); void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( yyscan_t yyscanner ); #else extern int yywrap ( yyscan_t yyscanner ); #endif #endif #ifndef YY_NO_UNPUT #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * , yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( yyscan_t yyscanner ); #else static int input ( yyscan_t yyscanner ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex \ (YYSTYPE * yylval_param , yyscan_t yyscanner); #define YY_DECL int yylex \ (YYSTYPE * yylval_param , yyscan_t yyscanner) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; if ( !yyg->yy_init ) { yyg->yy_init = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_load_buffer_state( yyscanner ); } { #line 60 "../gnubg/external_l.l" #line 1247 "external_l.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; /* Support of yytext. */ *yy_cp = yyg->yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yyg->yy_start; yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 281 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 818 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yyg->yy_hold_char; yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; case 1: YY_RULE_SETUP #line 62 "../gnubg/external_l.l" { BEGIN(SBOARDP1); return FIBSBOARD; } YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP #line 66 "../gnubg/external_l.l" { return PROMPT; } YY_BREAK case 3: /* rule 3 can match eol */ YY_RULE_SETUP #line 67 "../gnubg/external_l.l" { return NEW; } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 68 "../gnubg/external_l.l" { return OLD; } YY_BREAK case 5: /* rule 5 can match eol */ YY_RULE_SETUP #line 69 "../gnubg/external_l.l" { return E_INTERFACE; } YY_BREAK case 6: /* rule 6 can match eol */ YY_RULE_SETUP #line 70 "../gnubg/external_l.l" { return HELP; } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 71 "../gnubg/external_l.l" { return SET; } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP #line 72 "../gnubg/external_l.l" { return DEBUG; } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 73 "../gnubg/external_l.l" { return INTERFACEVERSION; } YY_BREAK case 10: /* rule 10 can match eol */ YY_RULE_SETUP #line 74 "../gnubg/external_l.l" { return EXIT; } YY_BREAK case 11: /* rule 11 can match eol */ YY_RULE_SETUP #line 75 "../gnubg/external_l.l" { return EVALUATION; } YY_BREAK case 12: /* rule 12 can match eol */ YY_RULE_SETUP #line 76 "../gnubg/external_l.l" { return FIBSBOARD; } YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP #line 78 "../gnubg/external_l.l" { yylval->boolean = 1; return (E_BOOLEAN); } YY_BREAK case 14: /* rule 14 can match eol */ YY_RULE_SETUP #line 81 "../gnubg/external_l.l" { yylval->boolean = 0; return (E_BOOLEAN); } YY_BREAK case 15: YY_RULE_SETUP #line 86 "../gnubg/external_l.l" { PROCESS_YYTEXT_STRING; return E_STRING; } YY_BREAK case 16: YY_RULE_SETUP #line 91 "../gnubg/external_l.l" { yylval->floatnum = (float) atof(yytext); return E_FLOAT; } YY_BREAK case 17: YY_RULE_SETUP #line 96 "../gnubg/external_l.l" { yylval->intnum = atoi(yytext); return E_INTEGER; } YY_BREAK case 18: YY_RULE_SETUP #line 100 "../gnubg/external_l.l" return (yytext[0]); YY_BREAK case 19: /* rule 19 can match eol */ YY_RULE_SETUP #line 103 "../gnubg/external_l.l" { return RESIGNATION; } YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP #line 104 "../gnubg/external_l.l" { return BEAVERS; } YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP #line 105 "../gnubg/external_l.l" { return CRAWFORDRULE; } YY_BREAK case 22: /* rule 22 can match eol */ YY_RULE_SETUP #line 106 "../gnubg/external_l.l" { return CUBE; } YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP #line 107 "../gnubg/external_l.l" { return CUBEFUL; } YY_BREAK case 24: /* rule 24 can match eol */ YY_RULE_SETUP #line 108 "../gnubg/external_l.l" { return CUBELESS; } YY_BREAK case 25: /* rule 25 can match eol */ YY_RULE_SETUP #line 109 "../gnubg/external_l.l" { return DETERMINISTIC; } YY_BREAK case 26: /* rule 26 can match eol */ YY_RULE_SETUP #line 110 "../gnubg/external_l.l" { return JACOBYRULE; } YY_BREAK case 27: /* rule 27 can match eol */ YY_RULE_SETUP #line 111 "../gnubg/external_l.l" { return NOISE; } YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP #line 112 "../gnubg/external_l.l" { return PLIES; } YY_BREAK case 29: /* rule 29 can match eol */ YY_RULE_SETUP #line 113 "../gnubg/external_l.l" { return PRUNE; } YY_BREAK case 30: YY_RULE_SETUP #line 116 "../gnubg/external_l.l" { return (yytext[0]); } YY_BREAK case 31: /* rule 31 can match eol */ YY_RULE_SETUP #line 120 "../gnubg/external_l.l" { BEGIN(OPTIONS); return FIBSBOARDEND; } YY_BREAK case 32: YY_RULE_SETUP #line 125 "../gnubg/external_l.l" { PROCESS_YYTEXT_STRING; BEGIN(SBOARDP2); return E_STRING; } YY_BREAK case 33: YY_RULE_SETUP #line 130 "../gnubg/external_l.l" { PROCESS_YYTEXT_STRING; BEGIN(VALLIST); return E_STRING; } YY_BREAK case 34: /* rule 34 can match eol */ YY_RULE_SETUP #line 136 "../gnubg/external_l.l" ; /* ignore whitespace */ YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(SBOARDP1): case YY_STATE_EOF(SBOARDP2): case YY_STATE_EOF(OPTIONS): case YY_STATE_EOF(VALLIST): #line 138 "../gnubg/external_l.l" { BEGIN(INITIAL); return (EOL); } YY_BREAK case 35: YY_RULE_SETUP #line 142 "../gnubg/external_l.l" { BEGIN(INITIAL); yylval->character = yytext[0]; return (E_CHARACTER); } YY_BREAK case 36: YY_RULE_SETUP #line 147 "../gnubg/external_l.l" ECHO; YY_BREAK #line 1552 "external_l.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yyg->yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yyg->yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yyg->yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_END_OF_FILE: { yyg->yy_did_buffer_switch_on_eof = 0; if ( yywrap( yyscanner ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yyg->yy_c_buf_p = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = yyg->yytext_ptr; int number_to_move, i; int ret_val; if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) (yyg->yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), yyg->yy_n_chars, num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } if ( yyg->yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin , yyscanner); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } yyg->yy_n_chars += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (yyscan_t yyscanner) { yy_state_type yy_current_state; char *yy_cp; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_current_state = yyg->yy_start; for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 281 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) { int yy_is_jam; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ char *yy_cp = yyg->yy_c_buf_p; YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 281 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 280); (void)yyg; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner) #else static int input (yyscan_t yyscanner) #endif { int c; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; *yyg->yy_c_buf_p = yyg->yy_hold_char; if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) /* This was really a NUL. */ *yyg->yy_c_buf_p = '\0'; else { /* need more input */ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); ++yyg->yy_c_buf_p; switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin , yyscanner); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( yyscanner ) ) #ifdef YY_FLEX_LEX_COMPAT return 0; #else return EOF; #endif if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(yyscanner); #else return input(yyscanner); #endif } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + offset; break; } } } c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ yyg->yy_hold_char = *++yyg->yy_c_buf_p; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); yy_load_buffer_state( yyscanner ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (yyscanner); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( yyscanner ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yyg->yy_did_buffer_switch_on_eof = 1; } static void yy_load_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; yyg->yy_hold_char = *yyg->yy_c_buf_p; } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * @param yyscanner The scanner object. * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file , yyscanner); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * @param yyscanner The scanner object. */ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf , yyscanner ); yyfree( (void *) b , yyscanner ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) { int oerrno = errno; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flush_buffer( b , yyscanner); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( yyscanner ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * @param yyscanner The scanner object. */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (new_buffer == NULL) return; yyensure_buffer_stack(yyscanner); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) yyg->yy_buffer_stack_top++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * @param yyscanner The scanner object. */ void yypop_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); YY_CURRENT_BUFFER_LVALUE = NULL; if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; if (YY_CURRENT_BUFFER) { yy_load_buffer_state( yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (yyscan_t yyscanner) { yy_size_t num_to_alloc; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!yyg->yy_buffer_stack) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; yyg->yy_buffer_stack_top = 0; return; } if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = yyg->yy_buffer_stack_max + grow_size; yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc (yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b , yyscanner ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * @param yyscanner The scanner object. * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) { return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n , yyscanner ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n , yyscanner); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ yyg->yy_hold_char = *yyg->yy_c_buf_p; \ *yyg->yy_c_buf_p = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyextra; } /** Get the current line number. * @param yyscanner The scanner object. */ int yyget_lineno (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yylineno; } /** Get the current column number. * @param yyscanner The scanner object. */ int yyget_column (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yycolumn; } /** Get the input stream. * @param yyscanner The scanner object. */ FILE *yyget_in (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyin; } /** Get the output stream. * @param yyscanner The scanner object. */ FILE *yyget_out (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyout; } /** Get the length of the current token. * @param yyscanner The scanner object. */ int yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; } /** Get the current token. * @param yyscanner The scanner object. */ char *yyget_text (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yytext; } /** Set the user-defined data. This data is never touched by the scanner. * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyextra = user_defined ; } /** Set the current line number. * @param _line_number line number * @param yyscanner The scanner object. */ void yyset_lineno (int _line_number , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); yylineno = _line_number; } /** Set the current column. * @param _column_no column number * @param yyscanner The scanner object. */ void yyset_column (int _column_no , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_column called with no buffer" ); yycolumn = _column_no; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * @param yyscanner The scanner object. * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyin = _in_str ; } void yyset_out (FILE * _out_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyout = _out_str ; } int yyget_debug (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yy_flex_debug; } void yyset_debug (int _bdebug , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flex_debug = _bdebug ; } /* Accessor methods for yylval and yylloc */ YYSTYPE * yyget_lval (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylval; } void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; } /* User-visible API */ /* yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ int yylex_init(yyscan_t* ptr_yy_globals) { if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); return yy_init_globals ( *ptr_yy_globals ); } /* yylex_init_extra has the same functionality as yylex_init, but follows the * convention of taking the scanner as the last argument. Note however, that * this is a *pointer* to a scanner, as it will be allocated by this call (and * is the reason, too, why this function also must handle its own declaration). * The user defined value in the first argument will be available to yyalloc in * the yyextra field. */ int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) { struct yyguts_t dummy_yyguts; yyset_extra (yy_user_defined, &dummy_yyguts); if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); yyset_extra (yy_user_defined, *ptr_yy_globals); return yy_init_globals ( *ptr_yy_globals ); } static int yy_init_globals (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ yyg->yy_buffer_stack = NULL; yyg->yy_buffer_stack_top = 0; yyg->yy_buffer_stack_max = 0; yyg->yy_c_buf_p = NULL; yyg->yy_init = 0; yyg->yy_start = 0; yyg->yy_start_stack_ptr = 0; yyg->yy_start_stack_depth = 0; yyg->yy_start_stack = NULL; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(yyscanner); } /* Destroy the stack itself. */ yyfree(yyg->yy_buffer_stack , yyscanner); yyg->yy_buffer_stack = NULL; /* Destroy the start condition stack. */ yyfree( yyg->yy_start_stack , yyscanner ); yyg->yy_start_stack = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( yyscanner); /* Destroy the main struct (reentrant only). */ yyfree ( yyscanner , yyscanner ); yyscanner = NULL; return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s , yyscan_t yyscanner) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 147 "../gnubg/external_l.l" void escapes(const char *cp, char *tp) { while (*cp) { int cval = 0; if (*cp == '\\' && strchr("0123456789xX", cp[1])) { char *dp; const char *hex = "00112233445566778899aAbBcCdDeEfF"; int dcount = 0; if (*++cp == 'x' || *cp == 'X') for (++cp; (dp = strchr(hex, *cp)) && (dcount++ < 2); cp++) cval = (cval * 16) + (int) (dp - hex) / 2; else if (*cp == '0') while (strchr("01234567",*cp) != (char*)NULL && (dcount++ < 3)) cval = (cval * 8) + (*cp++ - '0'); else while ((strchr("0123456789",*cp)!=(char*)NULL)&&(dcount++ < 3)) cval = (cval * 10) + (*cp++ - '0'); } else if (*cp == '\\') /* C-style character escapes */ { switch (*++cp) { case '\\': cval = '\\'; break; case 'n': cval = '\n'; break; case 't': cval = '\t'; break; case 'b': cval = '\b'; break; case 'r': cval = '\r'; break; default: cval = *cp; } cp++; } else cval = *cp++; *tp++ = (char) cval; } *tp = '\0'; } void ExtStartParse(yyscan_t scanner, const char* szCommand) { struct yyguts_t * yyg = (struct yyguts_t *) scanner; YY_BUFFER_STATE buf_state = NULL; BEGIN(INITIAL); buf_state = yy_scan_string(szCommand, scanner); ext_parse(scanner); yy_flush_buffer(buf_state, scanner); yy_delete_buffer(buf_state, scanner); } int ExtInitParse(yyscan_t *scancontext) { return ext_lex_init_extra(scancontext, scancontext); } void ExtDestroyParse(yyscan_t scancontext) { yylex_destroy(scancontext); } gnubg-1.08.003/drawboard.h000644 001751 000024 00000004162 14574155047 014755 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2001 Gary Wong * Copyright (C) 2000-2015 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: drawboard.h,v 1.26 2019/11/29 19:29:46 plm Exp $ */ #ifndef DRAWBOARD_H #define DRAWBOARD_H #include "gnubg-types.h" #include "external.h" extern int fClockwise; /* Player 1 moves clockwise */ extern char *DrawBoard(char *pch, const TanBoard anBoard, int fRoll, char *asz[], char *szMatchID, int nChequers); /* Fill the buffer pch with a representation of the move anMove, assuming * the board looks like anBoard. pch must have room for 28 characters plus * a trailing 0 (consider the move `bar/24* 23/22* 21/20* 19/18*'). */ #define FORMATEDMOVESIZE 29 extern char *FormatMove(char *pch, const TanBoard anBoard, const int anMove[8]); extern char *FormatMovePlain(char *pch, const TanBoard anBoard, const int anMove[8]); extern int ParseMove(char *pch, int an[8]); extern void CanonicalMoveOrder(int an[]); /* Fill the buffer pch with a FIBS "boardstyle 3" description of the game. */ extern char *FIBSBoard(char *pch, TanBoard anBoard, int fRoll, const char *szPlayer, const char *szOpp, int nMatchTo, int nScore, int nOpponent, int nDice0, int nDice1, int nCube, int fCubeOwner, int fDoubled, int fTurn, int fCrawford, int nChequers, int fPostCrawford); /* Process a board info structure from external interface */ extern int ProcessFIBSBoardInfo(FIBSBoardInfo * brdInfo, ProcessedFIBSBoard * procBrd); #endif gnubg-1.08.003/renderprefs.c000644 001751 000024 00000062466 14574155047 015335 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2003 Gary Wong * Copyright (C) 2003-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: renderprefs.c,v 1.64 2022/10/02 12:46:41 plm Exp $ */ #include "config.h" #include "backgammon.h" #include #include #include #include #include #include "render.h" #include "renderprefs.h" #if defined(USE_GTK) #include "gtkboard.h" #include "gtkgame.h" #endif #if defined(USE_BOARD3D) #include "inc3d.h" #endif const char *aszWoodName[] = { "alder", "ash", "basswood", "beech", "cedar", "ebony", "fir", "maple", "oak", "pine", "redwood", "walnut", "willow", "paint" }; static renderdata rdAppearance; /* Limit use of global... */ extern renderdata * GetMainAppearance(void) { return &rdAppearance; } extern void CopyAppearance(renderdata * prd) { memcpy(prd, &rdAppearance, sizeof(rdAppearance)); } static int SetColour(const char *sz, unsigned char anColour[]) { unsigned long n; if (strlen(sz) < 7 || *sz != '#') return -1; sz++; n = strtoul(sz, 0, 16); anColour[0] = (n & 0xFF0000) >> 16; anColour[1] = (n & 0x00FF00) >> 8; anColour[2] = (n & 0x0000FF); return 0; } static int SetColourSpeckle(const char *sz, unsigned char anColour[], int *pnSpeckle) { gchar **strs = g_strsplit(sz, ";", 0); if (SetColour(strs[0], anColour)) return -1; *pnSpeckle = (int) (g_ascii_strtod(strs[1], NULL) * 128); g_strfreev(strs); if (*pnSpeckle < 0) *pnSpeckle = 0; else if (*pnSpeckle > 128) *pnSpeckle = 128; return 0; } static int SetColourF(float arColour[4], const char *sz) { char *pch; unsigned char anColour[3]; if ((pch = strchr(sz, ';'))) *pch = 0; if (!SetColour(sz, anColour)) { arColour[0] = anColour[0] / 255.0f; arColour[1] = anColour[1] / 255.0f; arColour[2] = anColour[2] / 255.0f; return 0; } return -1; } #if defined(USE_BOARD3D) static int SetMaterialCommon(Material * pMat, const char *sz, const char **arg) { float opac; char *pch = NULL; if (SetColourF(pMat->ambientColour, sz) != 0) return -1; sz += strlen(sz) + 1; if (SetColourF(pMat->diffuseColour, sz) != 0) return -1; sz += strlen(sz) + 1; if (SetColourF(pMat->specularColour, sz) != 0) return -1; sz += strlen(sz) + 1; if ((pch = strchr(sz, ';'))) *pch = 0; if (*sz) pMat->shine = atoi(sz); else pMat->shine = 128; sz += strlen(sz) + 1; if ((pch = strchr(sz, ';'))) *pch = 0; if (*sz) opac = (float) atoi(sz) / 100.0f; else opac = 1.0f; pMat->ambientColour[3] = pMat->diffuseColour[3] = pMat->specularColour[3] = opac; pMat->alphaBlend = (opac < 1.0f) && (opac > 0.0f); if (pch) { sz += strlen(sz) + 1; if (*sz) { *arg = sz; return 1; } } return 0; } static int SetMaterial(Material * pMat, const char *sz) { int ret = 0; if (fX) { const char *arg; ret = SetMaterialCommon(pMat, sz, &arg); pMat->textureInfo = 0; pMat->pTexture = 0; if (ret > 0) { FindTexture(&pMat->textureInfo, arg); ret = 0; } } return ret; } static int SetMaterialDice(Material * pMat, const char *sz, int *flag) { const char *arg; int ret = SetMaterialCommon(pMat, sz, &arg); /* die colour same as chequer colour */ *flag = TRUE; if (ret > 0) { *flag = (toupper(*arg) == 'Y'); ret = 0; } return ret; } #endif /* Set colour, alpha, refraction, shine, specular. */ static int SetColourARSS(float aarColour[2][4], float arRefraction[2], float arCoefficient[2], float arExponent[2], char *sz, int i) { char *pch; if ((pch = strchr(sz, ';'))) *pch++ = 0; if (!SetColourF(aarColour[i], sz)) { if (pch) { /* alpha */ aarColour[i][3] = (float) g_ascii_strtod(pch, NULL); if ((pch = strchr(pch, ';'))) *pch++ = 0; } else aarColour[i][3] = 1.0f; /* opaque */ if (pch) { /* refraction */ arRefraction[i] = (float) g_ascii_strtod(pch, NULL); if ((pch = strchr(pch, ';'))) *pch++ = 0; } else arRefraction[i] = 1.5f; if (pch) { /* shine */ arCoefficient[i] = (float) g_ascii_strtod(pch, NULL); if ((pch = strchr(pch, ';'))) *pch++ = 0; } else arCoefficient[i] = 0.5f; if (pch) { /* specular */ arExponent[i] = (float) g_ascii_strtod(pch, NULL); if ((pch = strchr(pch, ';'))) *pch = 0; } else arExponent[i] = 10.0f; return 0; } return -1; } /* Set colour, shine, specular, flag. */ static int SetColourSSF(float aarColour[2][4], gfloat arCoefficient[2], gfloat arExponent[2], int afDieColour[2], char *sz, int i) { char *pch; if ((pch = strchr(sz, ';'))) *pch++ = 0; if (!SetColourF(aarColour[i], sz)) { if (pch) { /* shine */ arCoefficient[i] = (gfloat) g_ascii_strtod(pch, NULL); if ((pch = strchr(pch, ';'))) *pch++ = 0; } else arCoefficient[i] = 0.5f; if (pch) { /* specular */ arExponent[i] = (gfloat) g_ascii_strtod(pch, NULL); if ((pch = strchr(pch, ';'))) *pch++ = 0; } else arExponent[i] = 10.0f; if (pch) { /* die colour same as chequer colour */ afDieColour[i] = (toupper(*pch) == 'Y'); if ((pch = strchr(pch, ';'))) *pch = 0; } else afDieColour[i] = TRUE; return 0; } return -1; } static int SetWood(const char *sz, woodtype * pbw) { woodtype bw; size_t cch = strlen(sz); for (bw = WOOD_ALDER; bw <= WOOD_PAINT; bw++) if (!StrNCaseCmp(sz, aszWoodName[bw], cch)) { *pbw = bw; return 0; } return -1; } #if defined(USE_BOARD3D) static displaytype check_for_board3d(const char *szValue) { if (*szValue == '2') return DT_2D; else if (!fX || widget3dValid) return DT_3D; return DT_2D; } #endif extern void RenderPreferencesParam(renderdata * prd, const char *szParam, char *szValue) { size_t c; int fValueError = FALSE; if (!szParam || !*szParam) return; c = strlen(szParam); if (!StrNCaseCmp(szParam, "board", c)) /* board=colour;speckle */ fValueError = SetColourSpeckle(szValue, prd->aanBoardColour[0], &prd->aSpeckle[0]); else if (!StrNCaseCmp(szParam, "border", c)) /* border=colour */ fValueError = SetColour(szValue, prd->aanBoardColour[1]); else if (!StrNCaseCmp(szParam, "cube", c)) /* cube=colour */ fValueError = SetColourF(prd->arCubeColour, szValue); else if (!StrNCaseCmp(szParam, "translucent", c)) /* deprecated option "translucent"; ignore */ ; else if (!StrNCaseCmp(szParam, "labels", c)) /* labels=bool */ prd->fLabels = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "dynamiclabels", c)) /* dynamiclabels=bool */ prd->fDynamicLabels = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "diceicon", c)) /* FIXME deprecated in favour of "set gui dicearea" */ prd->fDiceArea = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "show pips", c)) { /* FIXME deprecated in favour of "set gui animation ..." */ #if defined(USE_GTK) switch (toupper(*szValue)) { case 'N': gui_show_pips = GUI_SHOW_PIPS_NONE; break; case 'P': gui_show_pips = GUI_SHOW_PIPS_PIPS; break; case 'E': gui_show_pips = GUI_SHOW_PIPS_EPC; break; case 'W': gui_show_pips = GUI_SHOW_PIPS_WASTAGE; break; default: animGUI = ANIMATE_NONE; break; } #endif } #if defined(USE_GTK) else if (!StrNCaseCmp(szParam, "illegal", c)) /* FIXME deprecated in favour of "set gui illegal" */ fGUIIllegal = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "beep", c)) /* FIXME deprecated in favour of "set gui beep" */ fGUIBeep = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "highdie", c)) /* FIXME deprecated in favour of "set gui highdie" */ fGUIHighDieFirst = toupper(*szValue) == 'Y'; #endif else if (!StrNCaseCmp(szParam, "wood", c)) fValueError = SetWood(szValue, &prd->wt); else if (!StrNCaseCmp(szParam, "hinges", c)) prd->fHinges = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "animate", c)) { /* FIXME deprecated in favour of "set gui animation ..." */ #if defined(USE_GTK) switch (toupper(*szValue)) { case 'B': animGUI = ANIMATE_BLINK; break; case 'S': animGUI = ANIMATE_SLIDE; break; default: animGUI = ANIMATE_NONE; break; } #endif } else if (!StrNCaseCmp(szParam, "speed", c)) { /* FIXME deprecated in favour of "set gui animation speed" */ int n = atoi(szValue); if (n < 0 || n > 7) fValueError = TRUE; else { #if defined(USE_GTK) nGUIAnimSpeed = n; #endif } } else if (!StrNCaseCmp(szParam, "light", c)) { /* light=azimuth;elevation */ float rAzimuth, rElevation; gchar **split = g_strsplit(szValue, ";", 0); rAzimuth = (float) g_ascii_strtod(split[0], NULL) * F_PI / 180.0f; rElevation = (float) g_ascii_strtod(split[1], NULL) * F_PI / 180.0f; g_strfreev(split); if (rElevation < 0.0f) rElevation = 0.0f; else if (rElevation > F_PI_2) rElevation = F_PI_2; prd->arLight[2] = sinf(rElevation); prd->arLight[0] = cosf(rAzimuth) * sqrtf(1.0f - prd->arLight[2] * prd->arLight[2]); prd->arLight[1] = sinf(rAzimuth) * sqrtf(1.0f - prd->arLight[2] * prd->arLight[2]); } else if (!StrNCaseCmp(szParam, "shape", c)) { float rRound = (float) g_ascii_strtod(szValue, &szValue); prd->rRound = 1.0f - rRound; } else if (!StrNCaseCmp(szParam, "moveindicator", c)) prd->showMoveIndicator = toupper(*szValue) == 'Y'; #if defined(USE_BOARD3D) else if (!StrNCaseCmp(szParam, "boardtype", c)) prd->fDisplayType = check_for_board3d(szValue); else if (!StrNCaseCmp(szParam, "hinges3d", c)) prd->fHinges3d = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "boardshadows", c)) prd->showShadows = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "shadowdarkness", c)) prd->shadowDarkness = atoi(szValue); else if (!StrNCaseCmp(szParam, "animateroll", c)) prd->animateRoll = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "animateflag", c)) prd->animateFlag = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "curveaccuracy", c)) prd->curveAccuracy = atoi(szValue); else if (!StrNCaseCmp(szParam, "lighttype", c)) prd->lightType = *szValue == 'p' ? LT_POSITIONAL : LT_DIRECTIONAL; else if (!StrNCaseCmp(szParam, "lightposx", c)) prd->lightPos[0] = (float) g_ascii_strtod(szValue, &szValue); else if (!StrNCaseCmp(szParam, "lightposy", c)) prd->lightPos[1] = (float) g_ascii_strtod(szValue, &szValue); else if (!StrNCaseCmp(szParam, "lightposz", c)) prd->lightPos[2] = (float) g_ascii_strtod(szValue, &szValue); else if (!StrNCaseCmp(szParam, "lightambient", c)) prd->lightLevels[0] = atoi(szValue); else if (!StrNCaseCmp(szParam, "lightdiffuse", c)) prd->lightLevels[1] = atoi(szValue); else if (!StrNCaseCmp(szParam, "lightspecular", c)) prd->lightLevels[2] = atoi(szValue); else if (!StrNCaseCmp(szParam, "boardangle", c)) prd->boardAngle = (float) g_ascii_strtod(szValue, &szValue); else if (!StrNCaseCmp(szParam, "skewfactor", c)) prd->skewFactor = (float) g_ascii_strtod(szValue, &szValue); else if (!StrNCaseCmp(szParam, "planview", c)) prd->planView = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "dicesize", c)) prd->diceSize = (float) g_ascii_strtod(szValue, &szValue); else if (!StrNCaseCmp(szParam, "roundededges", c)) prd->roundedEdges = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "bgintrays", c)) prd->bgInTrays = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "roundedpoints", c)) prd->roundedPoints = toupper(*szValue) == 'Y'; else if (!StrNCaseCmp(szParam, "piecetype", c)) { prd->pieceType = (PieceType) atoi(szValue); if ((unsigned int)prd->pieceType > PT_FLAT) { prd->pieceType = PT_FLAT; fValueError = TRUE; } } else if (!StrNCaseCmp(szParam, "piecetexturetype", c)) prd->pieceTextureType = (PieceTextureType) atoi(szValue); else if ((!StrNCaseCmp(szParam, "chequers3d", strlen("chequers3d")) || !StrNCaseCmp(szParam, "checkers3d", strlen("checkers3d"))) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) fValueError = SetMaterial(&prd->ChequerMat[szParam[c - 1] - '0'], szValue); else if (!StrNCaseCmp(szParam, "dice3d", strlen("dice3d")) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) fValueError = SetMaterialDice(&prd->DiceMat[szParam[c - 1] - '0'], szValue, &prd->afDieColour3d[szParam[c - 1] - '0']); else if (!StrNCaseCmp(szParam, "dot3d", strlen("dot3d")) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) fValueError = SetMaterial(&prd->DiceDotMat[szParam[c - 1] - '0'], szValue); else if (!StrNCaseCmp(szParam, "cube3d", c)) fValueError = SetMaterial(&prd->CubeMat, szValue); else if (!StrNCaseCmp(szParam, "cubetext3d", c)) fValueError = SetMaterial(&prd->CubeNumberMat, szValue); else if (!StrNCaseCmp(szParam, "base3d", c)) fValueError = SetMaterial(&prd->BaseMat, szValue); else if (!StrNCaseCmp(szParam, "points3d", strlen("points3d")) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) fValueError = SetMaterial(&prd->PointMat[szParam[c - 1] - '0'], szValue); else if (!StrNCaseCmp(szParam, "border3d", c)) fValueError = SetMaterial(&prd->BoxMat, szValue); else if (!StrNCaseCmp(szParam, "hinge3d", c)) fValueError = SetMaterial(&prd->HingeMat, szValue); else if (!StrNCaseCmp(szParam, "numbers3d", c)) fValueError = SetMaterial(&prd->PointNumberMat, szValue); else if (!StrNCaseCmp(szParam, "background3d", c)) fValueError = SetMaterial(&prd->BackGroundMat, szValue); #endif else if (c > 1 && (!StrNCaseCmp(szParam, "chequers", c - 1) || !StrNCaseCmp(szParam, "checkers", c - 1)) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) /* chequers=colour;alpha;refrac;shine;spec */ fValueError = SetColourARSS(prd->aarColour, prd->arRefraction, prd->arCoefficient, prd->arExponent, szValue, szParam[c - 1] - '0'); else if (c > 1 && (!StrNCaseCmp(szParam, "dice", c - 1) || !StrNCaseCmp(szParam, "dice", c - 1)) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) /* dice=colour;shine;spec;flag */ fValueError = SetColourSSF(prd->aarDiceColour, prd->arDiceCoefficient, prd->arDiceExponent, prd->afDieColour, szValue, szParam[c - 1] - '0'); else if (c > 1 && (!StrNCaseCmp(szParam, "dot", c - 1) || !StrNCaseCmp(szParam, "dot", c - 1)) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) /* dot=colour */ fValueError = SetColourF(prd->aarDiceDotColour[szParam[c - 1] - '0'], szValue); else if (c > 1 && !StrNCaseCmp(szParam, "points", c - 1) && (szParam[c - 1] == '0' || szParam[c - 1] == '1')) /* pointsn=colour;speckle */ fValueError = SetColourSpeckle(szValue, prd->aanBoardColour[szParam[c - 1] - '0' + 2], &prd->aSpeckle[szParam[c - 1] - '0' + 2]); if (fValueError) outputf(_("`%s' is not a legal value for parameter `%s'.\n"), szValue, szParam); } #if defined(USE_BOARD3D) char * WriteMaterial(Material * pMat) { /* Bit of a hack to remove memory allocation worries */ #define NUM_MATS 20 static int cur = 0; static char buf[NUM_MATS][100]; cur = (cur + 1) % NUM_MATS; sprintf(buf[cur], "#%02X%02X%02X;#%02X%02X%02X;#%02X%02X%02X;%d;%d", (int) (pMat->ambientColour[0] * 0xFF), (int) (pMat->ambientColour[1] * 0xFF), (int) (pMat->ambientColour[2] * 0xFF), (int) (pMat->diffuseColour[0] * 0xFF), (int) (pMat->diffuseColour[1] * 0xFF), (int) (pMat->diffuseColour[2] * 0xFF), (int) (pMat->specularColour[0] * 0xFF), (int) (pMat->specularColour[1] * 0xFF), (int) (pMat->specularColour[2] * 0xFF), pMat->shine, (int) ((pMat->ambientColour[3] + .001f) * 100)); if (pMat->textureInfo) { strcat(buf[cur], ";"); strcat(buf[cur], MaterialGetTextureFilename(pMat)); } return buf[cur]; } char * WriteMaterialDice(renderdata * prd, int num) { char *buf = WriteMaterial(&prd->DiceMat[num]); strcat(buf, ";"); strcat(buf, prd->afDieColour3d[num] ? "y" : "n"); return buf; } #endif extern void SaveRenderingSettings(FILE * pf) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar buf1[G_ASCII_DTOSTR_BUF_SIZE]; gchar buf2[G_ASCII_DTOSTR_BUF_SIZE]; gchar buf3[G_ASCII_DTOSTR_BUF_SIZE]; renderdata *prd = GetMainAppearance(); float rElevation = asinf(prd->arLight[2]) * 180.0f / F_PI; float rAzimuth = (fabsf(prd->arLight[2] - 1.0f) < 1e-5f) ? 0.0f : acosf(prd->arLight[0] / sqrtf(1.0f - prd->arLight[2] * prd->arLight[2])) * 180.0f / F_PI; if (prd->arLight[1] < 0) rAzimuth = 360 - rAzimuth; g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", (float) prd->aSpeckle[0] / 128.0f); fprintf(pf, "set appearance board=#%02X%02X%02X;%s ", prd->aanBoardColour[0][0], prd->aanBoardColour[0][1], prd->aanBoardColour[0][2], buf); fprintf(pf, "border=#%02X%02X%02X ", prd->aanBoardColour[1][0], prd->aanBoardColour[1][1], prd->aanBoardColour[1][2]); fprintf(pf, "moveindicator=%c ", prd->showMoveIndicator ? 'y' : 'n'); #if defined(USE_BOARD3D) fprintf(pf, "boardtype=%c ", display_is_2d(prd) ? '2' : '3'); fprintf(pf, "hinges3d=%c ", prd->fHinges3d ? 'y' : 'n'); fprintf(pf, "boardshadows=%c ", prd->showShadows ? 'y' : 'n'); fprintf(pf, "shadowdarkness=%d ", prd->shadowDarkness); fprintf(pf, "animateroll=%c ", prd->animateRoll ? 'y' : 'n'); fprintf(pf, "animateflag=%c ", prd->animateFlag ? 'y' : 'n'); fprintf(pf, "curveaccuracy=%u ", prd->curveAccuracy); fprintf(pf, "lighttype=%c ", prd->lightType == LT_POSITIONAL ? 'p' : 'd'); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->lightPos[0]); fprintf(pf, "lightposx=%s ", buf); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->lightPos[1]); fprintf(pf, "lightposy=%s ", buf); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->lightPos[2]); fprintf(pf, "lightposz=%s ", buf); fprintf(pf, "lightambient=%d ", prd->lightLevels[0]); fprintf(pf, "lightdiffuse=%d ", prd->lightLevels[1]); fprintf(pf, "lightspecular=%d ", prd->lightLevels[2]); fprintf(pf, "boardangle=%.0f ", prd->boardAngle); fprintf(pf, "skewfactor=%.0f ", prd->skewFactor); fprintf(pf, "planview=%c ", prd->planView ? 'y' : 'n'); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->diceSize); fprintf(pf, "dicesize=%s ", buf); fprintf(pf, "roundededges=%c ", prd->roundedEdges ? 'y' : 'n'); fprintf(pf, "bgintrays=%c ", prd->bgInTrays ? 'y' : 'n'); fprintf(pf, "roundedpoints=%c ", prd->roundedPoints ? 'y' : 'n'); fprintf(pf, "piecetype=%d ", prd->pieceType); fprintf(pf, "piecetexturetype=%d ", prd->pieceTextureType); fprintf(pf, "chequers3d0=%s ", WriteMaterial(&prd->ChequerMat[0])); fprintf(pf, "chequers3d1=%s ", WriteMaterial(&prd->ChequerMat[1])); fprintf(pf, "dice3d0=%s ", WriteMaterialDice(prd, 0)); fprintf(pf, "dice3d1=%s ", WriteMaterialDice(prd, 1)); fprintf(pf, "dot3d0=%s ", WriteMaterial(&prd->DiceDotMat[0])); fprintf(pf, "dot3d1=%s ", WriteMaterial(&prd->DiceDotMat[1])); fprintf(pf, "cube3d=%s ", WriteMaterial(&prd->CubeMat)); fprintf(pf, "cubetext3d=%s ", WriteMaterial(&prd->CubeNumberMat)); fprintf(pf, "base3d=%s ", WriteMaterial(&prd->BaseMat)); fprintf(pf, "points3d0=%s ", WriteMaterial(&prd->PointMat[0])); fprintf(pf, "points3d1=%s ", WriteMaterial(&prd->PointMat[1])); fprintf(pf, "border3d=%s ", WriteMaterial(&prd->BoxMat)); fprintf(pf, "hinge3d=%s ", WriteMaterial(&prd->HingeMat)); fprintf(pf, "numbers3d=%s ", WriteMaterial(&prd->PointNumberMat)); fprintf(pf, "background3d=%s ", WriteMaterial(&prd->BackGroundMat)); #endif fprintf(pf, "labels=%c ", prd->fLabels ? 'y' : 'n'); fprintf(pf, "dynamiclabels=%c ", prd->fDynamicLabels ? 'y' : 'n'); fprintf(pf, "wood=%s ", aszWoodName[prd->wt]); fprintf(pf, "hinges=%c ", prd->fHinges ? 'y' : 'n'); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.1f", rAzimuth); g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%.1f", rElevation); fprintf(pf, "light=%s;%s ", buf, buf1); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%0.1f", (1.0f - prd->rRound)); fprintf(pf, "shape=%s ", buf); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->aarColour[0][3]); g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arRefraction[0]); g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arCoefficient[0]); g_ascii_formatd(buf3, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arExponent[0]); fprintf(pf, "chequers0=#%02X%02X%02X;%s;%s;%s;%s ", (int) (prd->aarColour[0][0] * 0xFF), (int) (prd->aarColour[0][1] * 0xFF), (int) (prd->aarColour[0][2] * 0xFF), buf, buf1, buf2, buf3); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->aarColour[1][3]); g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arRefraction[1]); g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arCoefficient[1]); g_ascii_formatd(buf3, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arExponent[1]); fprintf(pf, "chequers1=#%02X%02X%02X;%s;%s;%s;%s ", (int) (prd->aarColour[1][0] * 0xFF), (int) (prd->aarColour[1][1] * 0xFF), (int) (prd->aarColour[1][2] * 0xFF), buf, buf1, buf2, buf3); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arDiceCoefficient[0]); g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arDiceExponent[0]); fprintf(pf, "dice0=#%02X%02X%02X;%s;%s;%c ", (int) (prd->aarDiceColour[0][0] * 0xFF), (int) (prd->aarDiceColour[0][1] * 0xFF), (int) (prd->aarDiceColour[0][2] * 0xFF), buf, buf1, prd->afDieColour[0] ? 'y' : 'n'); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arDiceCoefficient[1]); g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->arDiceExponent[1]); fprintf(pf, "dice1=#%02X%02X%02X;%s;%s;%c ", (int) (prd->aarDiceColour[1][0] * 0xFF), (int) (prd->aarDiceColour[1][1] * 0xFF), (int) (prd->aarDiceColour[1][2] * 0xFF), buf, buf1, prd->afDieColour[1] ? 'y' : 'n'); fprintf(pf, "dot0=#%02X%02X%02X ", (int) (prd->aarDiceDotColour[0][0] * 0xFF), (int) (prd->aarDiceDotColour[0][1] * 0xFF), (int) (prd->aarDiceDotColour[0][2] * 0xFF)); fprintf(pf, "dot1=#%02X%02X%02X ", (int) (prd->aarDiceDotColour[1][0] * 0xFF), (int) (prd->aarDiceDotColour[1][1] * 0xFF), (int) (prd->aarDiceDotColour[1][2] * 0xFF)); fprintf(pf, "cube=#%02X%02X%02X ", (int) (prd->arCubeColour[0] * 0xFF), (int) (prd->arCubeColour[1] * 0xFF), (int) (prd->arCubeColour[2] * 0xFF)); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->aSpeckle[2] / 128.0); fprintf(pf, "points0=#%02X%02X%02X;%s ", prd->aanBoardColour[2][0], prd->aanBoardColour[2][1], prd->aanBoardColour[2][2], buf); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->aSpeckle[3] / 128.0); fprintf(pf, "points1=#%02X%02X%02X;%s\n", prd->aanBoardColour[3][0], prd->aanBoardColour[3][1], prd->aanBoardColour[3][2], buf); } gnubg-1.08.003/win32/000755 001751 000024 00000000000 14613451675 013576 5ustar00pmstaff000000 000000 gnubg-1.08.003/dbprovider.h000644 001751 000024 00000005356 14574155047 015156 0ustar00pmstaff000000 000000 /* * Copyright (C) 2008-2009 Jon Kinsey * Copyright (C) 2008-2018 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: dbprovider.h,v 1.21 2022/01/19 22:42:28 plm Exp $ */ #ifndef DBPROVIDER_H #define DBPROVIDER_H #include #include extern int storeGameStats; typedef struct { size_t cols, rows; char ***data; size_t *widths; } RowSet; typedef struct { int (*Connect) (const char *database, const char *user, const char *password, const char *hostname); void (*Disconnect) (void); RowSet *(*Select) (const char *str); int (*UpdateCommand) (const char *str); void (*Commit) (void); GList *(*GetDatabaseList) (const char *user, const char *password, const char *hostname); int (*DeleteDatabase) (const char *database, const char *user, const char *password, const char *hostname); const char *name; const char *shortname; const char *desc; int HasUserDetails; int storeGameStats; char *database; char *username; char *password; char *hostname; } DBProvider; typedef enum { INVALID_PROVIDER = -1, #if defined(USE_SQLITE) SQLITE, #endif #if defined(USE_PYTHON) #if !defined(USE_SQLITE) PYTHON_SQLITE, #endif PYTHON_MYSQL, PYTHON_POSTGRES #endif } DBProviderType; #if defined(USE_PYTHON) #define NUM_PROVIDERS 3 #elif defined(USE_SQLITE) #define NUM_PROVIDERS 1 #else #define NUM_PROVIDERS 0 #endif extern DBProviderType dbProviderType; DBProvider *GetDBProvider(DBProviderType dbType); const char *TestDB(DBProviderType dbType); DBProvider *ConnectToDB(DBProviderType dbType); void DefaultDBSettings(void); void SetDBType(const char *type); void SetDBSettings(DBProviderType dbType, const char *database, const char *user, const char *password, const char *hostname); void RelationalSaveSettings(FILE * pf); void SetDBParam(const char *db, const char *key, const char *value); extern int CreateDatabase(DBProvider * pdb); const char *GetProviderName(int i); extern RowSet *RunQuery(const char *sz); extern int RunQueryValue(const DBProvider * pdb, const char *query); extern void FreeRowset(RowSet * pRow); #endif gnubg-1.08.003/gtkboard.c000644 001751 000024 00000415172 14610037046 014574 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2003 Gary Wong * Copyright (C) 2002-2022 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /*! \file gtkboard.c * \brief gtk board for playing in the GUI */ #include "config.h" #include "gtklocdefs.h" #include #include #include #include #include #include #include #include "backgammon.h" #include "drawboard.h" #include "gtkboard.h" #include "gtkgame.h" #include "gtk-multiview.h" #include "gtkprefs.h" #include "positionid.h" #include "render.h" #include "renderprefs.h" #include "sound.h" #include "matchid.h" #include "boardpos.h" #include "matchequity.h" #include "gtktoolbar.h" #include "boarddim.h" #if defined(USE_BOARD3D) #include "inc3d.h" #endif /* minimum time in milliseconds before a drag to the * same point is considered a real drag rather than a click */ #define CLICK_TIME 450 /* After this time show drag target help */ #define HINT_TIME 150 animation animGUI = ANIMATE_SLIDE; int fGUIBeep = TRUE; int fGUIHighDieFirst = TRUE; int fGUIIllegal = FALSE; int fShowIDs = TRUE; GuiShowPips gui_show_pips = GUI_SHOW_PIPS_EPC; int fGUIDragTargetHelp = TRUE; int fGUIGrayEdit = TRUE; unsigned int nGUIAnimSpeed = 4; int animate_player, *animate_move_list, animation_finished = TRUE; static GtkVBoxClass *parent_class = NULL; typedef struct { unsigned char *TTachDice[2], *TTachPip[2], *TTachGrayDice[1], *TTachGrayPip[1]; BoardData *bd; manualDiceType mdt; } SetDiceData; /* todo - tidy set cube like above */ static unsigned char *TTachCube, *TTachCubeFaces; static randctx rctx; #define RAND irand( &rctx ) static gint board_set(Board * board, gchar * board_text, const gint resigned, const gint cube_use); static void InitialPos(BoardData * bd); #if GTK_CHECK_VERSION(3,0,0) /* default orientation is horizontal, set to vertical in board_init() */ G_DEFINE_TYPE(Board, board, GTK_TYPE_BOX) #else G_DEFINE_TYPE(Board, board, GTK_TYPE_VBOX) #endif static int inPreviewWindow; extern GtkWidget * board_new(renderdata * prd, int inPreview) { /* Create widget */ GtkWidget *board = g_object_new(TYPE_BOARD, NULL); /* Initialize board data members */ BoardData *bd = BOARD(board)->board_data; bd->rd = prd; bd->rd->nSize = (unsigned int) -1; bd->jacoby_flag = ms.fJacoby = fJacoby; bd->crawford_game = 0; bd->cube = 1; bd->cube_use = 0; bd->doubled = 0; bd->cube_owner = 0; bd->resigned = 0; bd->diceShown = DICE_BELOW_BOARD; bd->grayBoard = FALSE; bd->turn = 0; bd->x_dice[0] = bd->y_dice[0] = 0; bd->x_dice[1] = bd->y_dice[1] = 0; inPreviewWindow = inPreview; InitialPos(bd); bd->move_list.cMoves = 0; return board; } static void InitialPos(BoardData * bd) { /* Set up initial board position */ int ip[] = { 0, -2, 0, 0, 0, 0, 5, 0, 3, 0, 0, 0, -5, 5, 0, 0, 0, -3, 0, -5, 0, 0, 0, 0, 2, 0, 0, 0 }; memcpy(bd->points, ip, sizeof(bd->points)); #if defined(USE_BOARD3D) if (widget3dValid) updatePieceOccPos(bd, bd->bd3d); #endif } extern void InitBoardPreview(BoardData * bd) { /* Show set position */ InitialPos(bd); bd->cube_use = 1; bd->crawford_game = 0; bd->jacoby_flag = ms.fJacoby; bd->doubled = bd->cube_owner = bd->cube = 0; bd->resigned = 0; bd->diceShown = DICE_ON_BOARD; bd->diceRoll[0] = 4; bd->diceRoll[1] = 3; bd->colour = bd->turn = 1; } static int intersects(int x0, int y0, int cx0, int cy0, int x1, int y1, int cx1, int cy1) { return (y1 + cy1 > y0) && (y1 < y0 + cy0) && (x1 + cx1 > x0) && (x1 < x0 + cx0); } static void board_beep(BoardData * UNUSED(bd)) { if (fGUIBeep) gdk_display_beep(gdk_display_get_default()); } extern void read_board(BoardData * bd, TanBoard points) { gint i; for (i = 0; i < 24; i++) { points[bd->turn <= 0][i] = bd->points[24 - i] < 0 ? abs(bd->points[24 - i]) : 0; points[bd->turn > 0][i] = bd->points[i + 1] > 0 ? abs(bd->points[i + 1]) : 0; } points[bd->turn <= 0][24] = abs(bd->points[0]); points[bd->turn > 0][24] = abs(bd->points[25]); } static void write_points(gint points[28], const gint turn, const gint nchequers, TanBoard anBoard) { gint i; gint anOff[2]; TanBoard an; memcpy(an, anBoard, sizeof an); if (turn < 0) SwapSides(an); for (i = 0; i < 28; ++i) points[i] = 0; /* Opponent on bar */ points[0] = -(int) an[0][24]; /* Board */ for (i = 0; i < 24; i++) { if (an[1][i]) points[i + 1] = an[1][i]; if (an[0][i]) points[24 - i] = -(int) an[0][i]; } /* Player on bar */ points[25] = an[1][24]; anOff[0] = anOff[1] = nchequers; for (i = 0; i < 25; i++) { anOff[0] -= an[0][i]; anOff[1] -= an[1][i]; } points[26] = anOff[1]; points[27] = -anOff[0]; } static void write_board(BoardData * bd, TanBoard anBoard) { write_points(bd->points, bd->turn, bd->nchequers, anBoard); } static void chequer_position(int point, int chequer, int *px, int *py) { ChequerPosition(fClockwise, point, chequer, px, py); } static void point_area(BoardData * bd, int n, int *px, int *py, int *pcx, int *pcy) { PointArea(fClockwise, bd->rd->nSize, n, px, py, pcx, pcy); } static void resign_position(BoardData * bd, int *px, int *py, int *porient) { ResignPosition(bd->resigned, px, py, porient); } static void RenderArea(BoardData * bd, unsigned char *puch, int x, int y, int cx, int cy) { TanBoard anBoard; unsigned int anDice[2]; int anOff[2], anDicePosition[2][2], anCubePosition[2], anArrowPosition[2], nOrient; int anResignPosition[2], nResignOrientation; read_board(bd, anBoard); if (bd->colour != bd->turn) SwapSides(anBoard); anOff[0] = -bd->points[27]; anOff[1] = bd->points[26]; anDice[0] = bd->diceRoll[0]; anDice[1] = bd->diceRoll[1]; anDicePosition[0][0] = bd->x_dice[0]; anDicePosition[0][1] = bd->y_dice[0]; anDicePosition[1][0] = bd->x_dice[1]; anDicePosition[1][1] = bd->y_dice[1]; CubePosition(bd->crawford_game, bd->cube_use, bd->doubled, bd->cube_owner, fClockwise, &anCubePosition[0], &anCubePosition[1], &nOrient); resign_position(bd, anResignPosition, anResignPosition + 1, &nResignOrientation); ArrowPosition(fClockwise, bd->turn, bd->rd->nSize, &anArrowPosition[0], &anArrowPosition[1]); CalculateArea(bd->rd, puch, cx * 3, &bd->ri, anBoard, anOff, anDice, anDicePosition, bd->colour == bd->turn, anCubePosition, LogCube(bd->cube) + (bd->doubled != 0), nOrient, anResignPosition, abs(bd->resigned), nResignOrientation, anArrowPosition, bd->playing, bd->turn == 1, x, y, cx, cy); } static void draw_rgb_image(cairo_t * cr, unsigned char *data, int x, int y, int width, int height) { GdkPixbuf *pixbuf; pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, FALSE, 8, width, height, width * 3, NULL, NULL); gdk_cairo_set_source_pixbuf(cr, pixbuf, x, y); cairo_paint(cr); g_object_unref(pixbuf); } static void board_draw_area(cairo_t * cr, gint x, gint y, gint cx, gint cy, BoardData * bd) { unsigned char *puch; puch = malloc(cx * cy * 3); RenderArea(bd, puch, x, y, cx, cy); draw_rgb_image(cr, puch, x, y, cx, cy); free(puch); } #if GTK_CHECK_VERSION(3,0,0) static gboolean board_draw(GtkWidget * drawing_area, cairo_t * cr, BoardData * bd) { if (bd->rd->nSize == 0) return TRUE; board_draw_area(cr, 0, 0, gtk_widget_get_allocated_width(drawing_area), gtk_widget_get_allocated_height(drawing_area), bd); return TRUE; } #else static gboolean board_expose(GtkWidget * drawing_area, GdkEventExpose * event, BoardData * bd) { int x, y, cx, cy; cairo_t *cr; g_assert(GTK_IS_DRAWING_AREA(drawing_area)); if (bd->rd->nSize == 0) return TRUE; x = event->area.x; y = event->area.y; cx = event->area.width; cy = event->area.height; if (x < 0) { cx += x; x = 0; } if (y < 0) { cy += y; y = 0; } if (y + cy > BOARD_HEIGHT * (int) bd->rd->nSize) cy = BOARD_HEIGHT * bd->rd->nSize - y; if (x + cx > BOARD_WIDTH * (int) bd->rd->nSize) cx = BOARD_WIDTH * bd->rd->nSize - x; if (cx <= 0 || cy <= 0) return TRUE; cr = gdk_cairo_create(gtk_widget_get_window(drawing_area)); board_draw_area(cr, x, y, cx, cy, bd); cairo_destroy(cr); return TRUE; } #endif extern void stop_board_expose(BoardData * bd) { #if GTK_CHECK_VERSION(3,0,0) g_signal_handlers_disconnect_by_func(G_OBJECT(bd->drawing_area), (gpointer) G_CALLBACK(board_draw), bd); #else g_signal_handlers_disconnect_by_func(G_OBJECT(bd->drawing_area), (gpointer) G_CALLBACK(board_expose), bd); #endif } static void board_invalidate_rect(GtkWidget * drawing_area, int x, int y, int cx, int cy, BoardData * UNUSED(bd)) { g_assert(GTK_IS_DRAWING_AREA(drawing_area)); { GdkRectangle r; r.x = x; r.y = y; r.width = cx; r.height = cy; if (gtk_widget_get_window(drawing_area)) gdk_window_invalidate_rect(gtk_widget_get_window(drawing_area), &r, FALSE); } } static void board_invalidate_point(BoardData * bd, int n) { int x, y, cx, cy; if (bd->rd->nSize == 0) return; point_area(bd, n, &x, &y, &cx, &cy); board_invalidate_rect(bd->drawing_area, x, y, cx, cy, bd); } static void board_invalidate_dice(BoardData * bd) { int x, y, cx, cy; x = bd->x_dice[0] * bd->rd->nSize; y = bd->y_dice[0] * bd->rd->nSize; cx = DIE_WIDTH * bd->rd->nSize; cy = DIE_HEIGHT * bd->rd->nSize; board_invalidate_rect(bd->drawing_area, x, y, cx, cy, bd); x = bd->x_dice[1] * bd->rd->nSize; y = bd->y_dice[1] * bd->rd->nSize; board_invalidate_rect(bd->drawing_area, x, y, cx, cy, bd); } static void board_invalidate_labels(BoardData * bd) { int x, y, cx, cy; x = 0; y = 0; cx = BOARD_WIDTH * bd->rd->nSize; cy = BORDER_HEIGHT * bd->rd->nSize; board_invalidate_rect(bd->drawing_area, x, y, cx, cy, bd); x = 0; y = (BOARD_HEIGHT - BORDER_HEIGHT) * bd->rd->nSize; cx = BOARD_WIDTH * bd->rd->nSize; cy = BORDER_HEIGHT * bd->rd->nSize; board_invalidate_rect(bd->drawing_area, x, y, cx, cy, bd); } static void board_invalidate_cube(BoardData * bd) { int x, y, orient; CubePosition(bd->crawford_game, bd->cube_use, bd->doubled, bd->cube_owner, fClockwise, &x, &y, &orient); board_invalidate_rect(bd->drawing_area, x * bd->rd->nSize, y * bd->rd->nSize, CUBE_WIDTH * bd->rd->nSize, CUBE_HEIGHT * bd->rd->nSize, bd); } static void board_invalidate_resign(BoardData * bd) { int x, y, orient; resign_position(bd, &x, &y, &orient); board_invalidate_rect(bd->drawing_area, x * bd->rd->nSize, y * bd->rd->nSize, RESIGN_WIDTH * bd->rd->nSize, RESIGN_HEIGHT * bd->rd->nSize, bd); } static void board_invalidate_arrow(BoardData * bd) { int x, y; ArrowPosition(fClockwise, bd->turn, bd->rd->nSize, &x, &y); board_invalidate_rect(bd->drawing_area, x, y, ARROW_WIDTH * bd->rd->nSize, ARROW_HEIGHT * bd->rd->nSize, bd); } static int board_point(GtkWidget * UNUSED(board), BoardData * bd, int x0, int y0) { int i, x, y, cx, cy, xCube, yCube; x0 /= bd->rd->nSize; y0 /= bd->rd->nSize; if (intersects(x0, y0, 0, 0, bd->x_dice[0], bd->y_dice[0], DIE_WIDTH, DIE_HEIGHT) || intersects(x0, y0, 0, 0, bd->x_dice[1], bd->y_dice[1], DIE_WIDTH, DIE_HEIGHT)) return POINT_DICE; CubePosition(bd->crawford_game, bd->cube_use, bd->doubled, bd->cube_owner, fClockwise, &xCube, &yCube, NULL); if (intersects(x0, y0, 0, 0, xCube, yCube, CUBE_WIDTH, CUBE_HEIGHT)) return POINT_CUBE; resign_position(bd, &xCube, &yCube, NULL); if (intersects(x0, y0, 0, 0, xCube, yCube, CUBE_WIDTH, CUBE_HEIGHT)) return POINT_RESIGN; /* jsc: support for faster rolling of dice by clicking board * * These arguments should be dynamically calculated instead * of hardcoded, but it's too painful right now. */ if (intersects(x0, y0, 0, 0, (BOARD_WIDTH + BAR_WIDTH) / 2, BORDER_HEIGHT + 5 * CHEQUER_HEIGHT, 6 * CHEQUER_WIDTH, BOARD_HEIGHT - 10 * CHEQUER_HEIGHT - BORDER_HEIGHT * 3)) return POINT_RIGHT; else if (intersects(x0, y0, 0, 0, BEAROFF_WIDTH, BORDER_HEIGHT + 5 * CHEQUER_HEIGHT, 6 * CHEQUER_WIDTH, BOARD_HEIGHT - 10 * CHEQUER_HEIGHT - BORDER_HEIGHT * 3)) return POINT_LEFT; for (i = 0; i < 28; i++) { point_area(bd, i, &x, &y, &cx, &cy); x /= bd->rd->nSize; y /= bd->rd->nSize; cx /= bd->rd->nSize; cy /= bd->rd->nSize; if (intersects(x0, y0, 0, 0, x, y, cx, cy)) return i; } return -1; } static void update_gnubg_id(BoardData * bd, const TanBoard points) { int anScore[2]; int fCubeOwner; gchar *str; anScore[0] = bd->score_opponent; anScore[1] = bd->score; if (bd->can_double) { if (bd->opponent_can_double) fCubeOwner = -1; else fCubeOwner = 1; } else { fCubeOwner = 0; } str = g_strdup_printf("%s:%s", PositionID(points), MatchID(bd->diceRoll, ms.fTurn, ms.fResigned, ms.fDoubled, ms.fMove, fCubeOwner, bd->crawford_game, bd->match_to, anScore, bd->cube, ms.fJacoby, ms.gs)); gtk_label_set_text(GTK_LABEL(pwGnubgID), str); g_free(str); } extern char * ReturnHits(TanBoard anBoard) { int aiHit[15]; int i, j, k, l, m, n, c; movelist ml; int aiDiceHit[6][6]; memset(aiHit, 0, sizeof(aiHit)); memset(aiDiceHit, 0, sizeof(aiDiceHit)); SwapSides(anBoard); /* find blots */ for (i = 0; i < 6; ++i) for (j = 0; j <= i; ++j) { if (!(c = GenerateMoves(&ml, (ConstTanBoard) anBoard, i + 1, j + 1, FALSE))) /* no legal moves */ continue; k = 0; for (l = 0; l < 24; ++l) if (anBoard[0][l] == 1) { for (m = 0; m < c; ++m) { move *pm = &ml.amMoves[m]; for (n = 0; n < 4 && pm->anMove[2 * n] > -1; ++n) if (pm->anMove[2 * n + 1] == (23 - l)) { /* hit */ aiHit[k] += 2 - (i == j); ++aiDiceHit[i][j]; /* next point */ goto nextpoint; } } nextpoint: ++k; } } for (j = 14; j >= 0; --j) if (aiHit[j]) break; if (j >= 0) { char *pch = g_malloc(3 * (j + 1) + 200); strcpy(pch, ""); for (i = 0; i <= j; ++i) if (aiHit[i]) sprintf(strchr(pch, 0), "%d ", aiHit[i]); for (n = 0, i = 0; i < 6; ++i) for (j = 0; j <= i; ++j) n += (aiDiceHit[i][j] > 0) * (2 - (i == j)); sprintf(strchr(pch, 0), ngettext("(no hit: %d roll)", "(no hit: %d rolls)", (36 - n)), 36 - n); return pch; } return NULL; } static void show_pip_none(BoardData * UNUSED(bd), const TanBoard UNUSED(points), GString * gst[4]) { g_string_append_printf(gst[0], _("n/a")); g_string_append_printf(gst[1], _("n/a")); g_string_append_printf(gst[2], _("Pips: ")); g_string_append_printf(gst[3], _("Pips: ")); } static void show_pip_pip(BoardData * bd, const TanBoard points, GString * gst[4]) { unsigned int anPip[2]; int f; PipCount(points, anPip); f = (bd->turn > 0); g_string_append_printf(gst[0], "%u (%+d)", anPip[!f], (int) (anPip[!f] - anPip[f])); g_string_append_printf(gst[1], "%u (%+d)", anPip[f], (int) (anPip[f] - anPip[!f])); g_string_append_printf(gst[2], _("Pips: ")); g_string_append_printf(gst[3], _("Pips: ")); } static void show_pip_epc(BoardData * bd, const TanBoard points, GString * gst[4]) { int f; float arEPC[2]; if (EPC(points, arEPC, NULL, NULL, NULL, TRUE) != 0) { show_pip_pip(bd, points, gst); return; } f = (bd->turn > 0); g_string_append_printf(gst[0], "%.2f (%+.2f)", arEPC[!f], arEPC[!f] - arEPC[f]); g_string_append_printf(gst[1], "%.2f (%+.2f)", arEPC[f], arEPC[f] - arEPC[!f]); g_string_append_printf(gst[2], _("EPC: ")); g_string_append_printf(gst[3], _("EPC: ")); } static void show_pip_pwe(BoardData * bd, const TanBoard points, GString * gst[4]) { unsigned int anPip[2]; int f; float arEPC[2]; if (EPC(points, arEPC, NULL, NULL, NULL, TRUE) != 0) { show_pip_pip(bd, points, gst); return; } PipCount(points, anPip); f = (bd->turn > 0); g_string_append_printf(gst[0], " %u + %.2f = %.2f(%+.2f)", anPip[!f], arEPC[!f] - (float) anPip[!f], arEPC[!f], arEPC[!f] - arEPC[f]); g_string_append_printf(gst[1], " %u + %.2f = %.2f(%+.2f)", anPip[f], arEPC[f] - (float) anPip[f], arEPC[f], arEPC[f] - arEPC[!f]); g_string_append_printf(gst[2], _("EPC: ")); g_string_append_printf(gst[3], _("EPC: ")); } extern void update_pipcount(BoardData * bd, const TanBoard points) { int i; GString *gst[4]; for (i = 0; i < 4; i++) gst[i] = g_string_new(NULL); switch (gui_show_pips) { case GUI_SHOW_PIPS_WASTAGE: show_pip_pwe(bd, points, gst); break; case GUI_SHOW_PIPS_EPC: show_pip_epc(bd, points, gst); break; case GUI_SHOW_PIPS_PIPS: show_pip_pip(bd, points, gst); break; default: show_pip_none(bd, points, gst); } gtk_label_set_text(GTK_LABEL(bd->pipcount0), gst[0]->str); gtk_label_set_text(GTK_LABEL(bd->pipcount1), gst[1]->str); gtk_label_set_text(GTK_LABEL(bd->pipcountlabel0), gst[2]->str); gtk_label_set_text(GTK_LABEL(bd->pipcountlabel1), gst[3]->str); for (i = 0; i < 4; i++) g_string_free(gst[i], TRUE); UpdateTheoryData(bd, TT_PIPCOUNT | TT_EPC | TT_KLEINCOUNT, points); } /* A chequer has been moved or the board has been updated -- update the * move and position ID labels. */ static int update_move(BoardData * bd) { char *move = _("Illegal move"), move_buf[FORMATEDMOVESIZE]; unsigned int i; TanBoard points; positionkey key; int fIncomplete = TRUE, fIllegal = TRUE; read_board(bd, points); update_gnubg_id(bd, (ConstTanBoard) points); update_pipcount(bd, (ConstTanBoard) points); bd->valid_move = NULL; if (ToolbarIsEditing(pwToolbar) && bd->playing) { move = _("(Editing)"); fIncomplete = fIllegal = FALSE; } else if (EqualBoards((ConstTanBoard) points, (ConstTanBoard) bd->old_board)) { /* no move has been made */ move = NULL; fIncomplete = fIllegal = FALSE; } else { PositionKey((ConstTanBoard) points, &key); for (i = 0; i < bd->move_list.cMoves; i++) if (EqualKeys(bd->move_list.amMoves[i].key, key)) { bd->valid_move = bd->move_list.amMoves + i; fIncomplete = bd->valid_move->cMoves < bd->move_list.cMaxMoves || bd->valid_move->cPips < bd->move_list.cMaxPips; fIllegal = FALSE; FormatMove(move_buf, (ConstTanBoard) bd->old_board, bd->valid_move->anMove); move = move_buf; break; } /* show number of return hits */ UpdateTheoryData(bd, TT_RETURNHITS, msBoard()); if (bd->valid_move) { TanBoard anBoard; char *pch; PositionFromKey(anBoard, &bd->valid_move->key); if ((pch = ReturnHits(anBoard))) { outputf(_("Return hits: %s\n"), pch); outputx(); g_free(pch); } else { outputl(""); outputx(); } } } #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_state_flags(bd->wmove, fIncomplete ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_NORMAL, TRUE); #else gtk_widget_set_state(bd->wmove, fIncomplete ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL); #endif gtk_label_set_text(GTK_LABEL(bd->wmove), move); return (fIllegal && !fGUIIllegal) ? -1 : 0; } static void Confirm(BoardData * bd) { char move[FORMATEDMOVESIZE]; TanBoard points; read_board(bd, points); if (!bd->move_list.cMoves && EqualBoards((ConstTanBoard) points, (ConstTanBoard) bd->old_board)) UserCommand("move"); else if (bd->valid_move && bd->valid_move->cMoves == bd->move_list.cMaxMoves && bd->valid_move->cPips == bd->move_list.cMaxPips) { FormatMovePlain(move, (ConstTanBoard)bd->old_board, bd->valid_move->anMove); UserCommand(move); } else /* Illegal move */ board_beep(bd); } static void board_start_drag(GtkWidget * UNUSED(widget), BoardData * bd, int drag_point, int x, int y) { bd->drag_point = drag_point; bd->drag_colour = bd->points[drag_point] < 0 ? -1 : 1; bd->points[drag_point] -= bd->drag_colour; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { SetMovingPieceRotation(bd, bd->bd3d, bd->drag_point); updatePieceOccPos(bd, bd->bd3d); } else #endif { board_invalidate_point(bd, drag_point); #if !GTK_CHECK_VERSION(3,22,0) gdk_window_process_updates(gtk_widget_get_window(bd->drawing_area), FALSE); #endif bd->x_drag = x; bd->y_drag = y; } } /*! \brief generates a list of legal (sub)moves * \param dice the dice * \param real_board the board being dragged from * \param old_board the board before the move * \param pml the output list of moves */ static void generate_drag_moves(guint * dice, TanBoard real_board, TanBoard old_board, movelist * pml) { if (dice[0] != dice[1] && memcmp(real_board, old_board, sizeof(TanBoard)) != 0) { /* only complete moves to disallow moving, e.g., a 2 twice in a * 42 roll */ GenerateMoves(pml, (ConstTanBoard) old_board, dice[0], dice[1], FALSE); } else { /* complete and partial moves */ GenerateMoves(pml, (ConstTanBoard) old_board, dice[0], dice[1], TRUE); } } /*! \brief the possible legal permutation of dice * \param dice the dice * \param perm the output permutations */ static void setup_dice_perm(const guint * const dice, gint perm[][5]) { /* long but simple */ if (dice[0] == dice[1]) { perm[0][0] = dice[0]; perm[0][1] = -1; perm[1][0] = dice[0]; perm[1][1] = dice[0]; perm[1][2] = -1; perm[2][0] = dice[0]; perm[2][1] = dice[0]; perm[2][2] = dice[0]; perm[2][3] = -1; perm[3][0] = dice[0]; perm[3][1] = dice[0]; perm[3][2] = dice[0]; perm[3][3] = dice[0]; perm[3][4] = -1; } else { perm[0][0] = dice[0]; perm[0][1] = -1; perm[1][0] = dice[1]; perm[1][1] = -1; perm[2][0] = dice[0]; perm[2][1] = dice[1]; perm[2][2] = -1; perm[3][0] = dice[1]; perm[3][1] = dice[0]; perm[3][2] = -1; } } /*! \brief apply a dice permutation to the board * \param board the real board * \param from_point the drag point in, the dest point out * \param permi the dice permutation * \return 1 if the move is legal, 0 otherwise */ static int apply_perm(TanBoard board, int *from_point, int permi[]) { int j; for (j = 0; permi[j] > 0; j++) { if (ApplySubMove(board, *from_point, permi[j], TRUE) != 0) return 0; *from_point = MAX(-1, *from_point - permi[j]); } return 1; } /*! \brief finds legal destinations for a dragged chequer * \param bd The board with a chequer lifted * \param dest_points the legal destinations if any * \return TRUE when legal destinations are found */ static gboolean legal_dest_points(BoardData * bd, int dest_points[4]) { unsigned int i; movelist ml; int count = 0; TanBoard real_board; int player = bd->drag_colour == -1 ? 0 : 1; int drag_point; gint perm[4][5]; /* initialise */ for (i = 0; i < 4; i++) dest_points[i] = -1; g_return_val_if_fail(ap[player].pt == PLAYER_HUMAN, FALSE); drag_point = player ? bd->drag_point - 1 : 24 - bd->drag_point; /* the current board including the dragged chequer */ read_board(bd, real_board); real_board[1][drag_point]++; generate_drag_moves(bd->diceRoll, real_board, bd->old_board, &ml); setup_dice_perm(bd->diceRoll, perm); for (i = 0; i < 4; i++) { TanBoard board; int from_point = drag_point; memcpy(board, real_board, sizeof(TanBoard)); if (!apply_perm(board, &from_point, perm[i])) continue; if (!board_in_list(&ml, (ConstTanBoard) bd->old_board, (ConstTanBoard) board, NULL)) continue; /* from_point is now the final dest */ if (from_point == -1) { /* bearoff */ dest_points[count++] = player ? 26 : 27; } else { dest_points[count++] = player ? from_point + 1 : 24 - from_point; } } return count ? TRUE : FALSE; } #if defined(USE_BOARD3D) static void board_drag(GtkWidget * widget, BoardData * bd, int x, int y) #else static void board_drag(GtkWidget * UNUSED(widget), BoardData * bd, int x, int y) #endif { cairo_t *cr; unsigned char *puch, *puchNew, *puchChequer; int s = bd->rd->nSize; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { if (MouseMove3d(bd, bd->bd3d, bd->rd, x, y)) gtk_widget_queue_draw(widget); return; } #endif #if !GTK_CHECK_VERSION(3,22,0) gdk_window_process_updates(gtk_widget_get_window(bd->drawing_area), FALSE); #endif if (s == 0) return; puch = g_alloca(6 * s * 6 * s * 3); puchNew = g_alloca(6 * s * 6 * s * 3); puchChequer = g_alloca(6 * s * 6 * s * 3); RenderArea(bd, puch, bd->x_drag - 3 * s, bd->y_drag - 3 * s, 6 * s, 6 * s); RenderArea(bd, puchNew, x - 3 * s, y - 3 * s, 6 * s, 6 * s); RefractBlendClip(puchChequer, 6 * s * 3, 0, 0, 6 * s, 6 * s, puchNew, 6 * s * 3, 0, 0, bd->ri.achChequer[bd->drag_colour > 0], 6 * s * 4, 0, 0, bd->ri.asRefract[bd->drag_colour > 0], 6 * s, 6 * s, 6 * s); { gtk_locdef_region *pr; gtk_locdef_rectangle r; r.x = bd->x_drag - 3 * s; r.y = bd->y_drag - 3 * s; r.width = 6 * s; r.height = 6 * s; pr = gtk_locdef_create_rectangle(&r); r.x = x - 3 * s; r.y = y - 3 * s; gtk_locdef_union_rectangle(pr, &r); gdk_window_begin_paint_region(gtk_widget_get_window(bd->drawing_area), pr); gtk_locdef_region_destroy(pr); } cr = gdk_cairo_create(gtk_widget_get_window(bd->drawing_area)); draw_rgb_image(cr, puch, bd->x_drag - 3 * s, bd->y_drag - 3 * s, 6 * s, 6 * s); draw_rgb_image(cr, puchChequer, x - 3 * s, y - 3 * s, 6 * s, 6 * s); cairo_destroy(cr); gdk_window_end_paint(gtk_widget_get_window(bd->drawing_area)); bd->x_drag = x; bd->y_drag = y; } static void board_end_drag(GtkWidget * UNUSED(widget), BoardData * bd) { cairo_t *cr; unsigned char *puch; int s = bd->rd->nSize; #if !GTK_CHECK_VERSION(3,22,0) gdk_window_process_updates(gtk_widget_get_window(bd->drawing_area), FALSE); #endif if (s == 0) return; puch = g_alloca(6 * s * 6 * s * 3); RenderArea(bd, puch, bd->x_drag - 3 * s, bd->y_drag - 3 * s, 6 * s, 6 * s); cr = gdk_cairo_create(gtk_widget_get_window(bd->drawing_area)); draw_rgb_image(cr, puch, bd->x_drag - 3 * s, bd->y_drag - 3 * s, 6 * s, 6 * s); cairo_destroy(cr); } /* This code is called on a button release event * * Since this code has side-effects, it should only be called from * button_release_event(). Mainly, it assumes that a checker * has been picked up. If the move fails, that pickup will be reverted. */ static gboolean place_chequer_or_revert(BoardData * bd, int dest) { /* This procedure has grown more complicated than I like * We might want to discard most of it and use a calculated * list of valid destination points (since we have the code for that available * * Known problems: * * Not tested for "allow dragging to illegal points". Unlikely to work, might crash * It is not possible to drag checkers from the bearoff tray. This must be corrected in * the pick-up code - this proc should be ready for it. * * Nis Jorgensen, 2004-06-17 */ int hitCheckers[4] = { 0, 0, 0, 0 }; int unhitCheckers[4] = { 0, 0, 0, 0 }; int bar, hit = 0; gboolean placed = TRUE; int unhit = 0; int oldpoints[28]; int passpoint; int source, dest2, i; int diceset = (bd->diceRoll[0] >= 1 && bd->diceRoll[0] <= 6 && bd->diceRoll[1] >= 1 && bd->diceRoll[1] <= 6); /* dest2 is the destination point used for numerical calculations */ dest2 = dest; source = bd->drag_point; /* This is the opponents bar point */ bar = bd->drag_colour == bd->colour ? 25 - bd->bar : bd->bar; if (dest == -1 || (bd->drag_colour > 0 ? bd->points[dest] < -1 : bd->points[dest] > 1) || dest == bar || dest > 27) { placed = FALSE; dest = dest2 = source; } else if (dest >= 26) { /* bearing off */ dest = bd->drag_colour > 0 ? 26 : 27; dest2 = bd->drag_colour > 0 ? 0 : 25; } /* Check for hits, undoing hits, including pick-and pass */ if (((source - dest2) * bd->drag_colour > 0) /*We are moving forward */ ||ToolbarIsEditing(pwToolbar)) { /* Or in edit mode */ if (bd->points[dest] == -bd->drag_colour) { /* outputf ("Hitting on %d \n", dest); */ hit++; hitCheckers[0] = dest; bd->points[dest] = 0; bd->points[bar] -= bd->drag_colour; board_invalidate_point(bd, bar); } if (diceset && (bd->diceRoll[0] == bd->diceRoll[1])) { for (i = 1; i <= 3; i++) { passpoint = source - i * bd->diceRoll[0] * bd->drag_colour; if ((dest2 - passpoint) * bd->drag_colour >= 0) break; if (bd->points[passpoint] == -bd->drag_colour) { hit++; hitCheckers[i] = passpoint; bd->points[passpoint] += bd->drag_colour; bd->points[bar] -= bd->drag_colour; board_invalidate_point(bd, bar); board_invalidate_point(bd, passpoint); } } } else { if (diceset && (Abs(source - dest2) == bd->diceRoll[0] + bd->diceRoll[1] || (dest > 25 && Abs(source - dest2) > MAX(bd->diceRoll[0], bd->diceRoll[1])) )) for (i = 0; i < 2; i++) { passpoint = source - bd->diceRoll[i] * bd->drag_colour; if ((dest2 - passpoint) * bd->drag_colour >= 0) continue; if (bd->points[passpoint] == -bd->drag_colour) { hit++; hitCheckers[i + 1] = passpoint; bd->points[passpoint] += bd->drag_colour; bd->points[bar] -= bd->drag_colour; board_invalidate_point(bd, bar); board_invalidate_point(bd, passpoint); break; } } } } else if ((source - dest2) * bd->drag_colour < 0) { /* * Check for taking chequer off point where we hit */ /* check if the opponent had a chequer on the drag point (source), * and that it's not pick'n'pass */ write_points(oldpoints, bd->turn, bd->nchequers, bd->old_board); if (oldpoints[source] == -bd->drag_colour) { unhit++; unhitCheckers[0] = source; bd->points[bar] += bd->drag_colour; board_invalidate_point(bd, bar); bd->points[source] -= bd->drag_colour; board_invalidate_point(bd, source); } if (diceset && (bd->diceRoll[0] == bd->diceRoll[1])) { /* Doubles are tricky - we can have pick-and-passed with 2 chequers */ for (i = 1; i <= 3; i++) { passpoint = source + i * bd->diceRoll[0] * bd->drag_colour; if ((dest2 - passpoint) * bd->drag_colour <= 0) break; if ((oldpoints[passpoint] == -bd->drag_colour) && /*there was a blot */ (bd->points[passpoint] == 0) && /* We actually did p&p */ bd->points[source] == oldpoints[source]) { /* We didn't p&p with a second checker */ unhit++; unhitCheckers[i] = passpoint; bd->points[bar] += bd->drag_colour; bd->points[passpoint] -= bd->drag_colour; board_invalidate_point(bd, bar); board_invalidate_point(bd, passpoint); } } } else if (diceset) { for (i = 0; i < 2; i++) { passpoint = source + bd->diceRoll[i] * bd->drag_colour; if ((dest2 - passpoint) * bd->drag_colour <= 0) continue; if ((oldpoints[passpoint] == -bd->drag_colour) && (bd->points[passpoint] == 0)) { unhit++; unhitCheckers[i + 1] = passpoint; bd->points[bar] += bd->drag_colour; board_invalidate_point(bd, bar); bd->points[passpoint] -= bd->drag_colour; board_invalidate_point(bd, passpoint); } } } } bd->points[dest] += bd->drag_colour; board_invalidate_point(bd, dest); if (source != dest) { if (update_move(bd)) { /* the move was illegal; undo it */ bd->points[source] += bd->drag_colour; board_invalidate_point(bd, source); bd->points[dest] -= bd->drag_colour; board_invalidate_point(bd, dest); if (hit > 0) { bd->points[bar] += hit * bd->drag_colour; board_invalidate_point(bd, bar); for (i = 0; i < 4; i++) if (hitCheckers[i] > 0) { bd->points[hitCheckers[i]] = -bd->drag_colour; board_invalidate_point(bd, hitCheckers[i]); } } if (unhit > 0) { bd->points[bar] -= unhit * bd->drag_colour; board_invalidate_point(bd, bar); for (i = 0; i < 4; i++) if (unhitCheckers[i] > 0) { bd->points[unhitCheckers[i]] += bd->drag_colour; board_invalidate_point(bd, unhitCheckers[i]); } } update_move(bd); placed = FALSE; } } board_invalidate_point(bd, placed ? dest : source); #if defined(USE_BOARD3D) if (placed && display_is_3d(bd->rd)) PlaceMovingPieceRotation(bd, bd->bd3d, dest, source); #endif return placed; } /* jsc: Special version :( of board_point which also allows clicking on a * small border and all bearoff trays */ static int board_point_with_border(GtkWidget * UNUSED(board), BoardData * bd, int x0, int y0) { int i, x, y, cx, cy, xCube, yCube; x0 /= bd->rd->nSize; y0 /= bd->rd->nSize; /* Similar to board_point, but adds the nasty y-=3 cy+=3 border * allowances */ if (intersects(x0, y0, 0, 0, bd->x_dice[0], bd->y_dice[0], DIE_WIDTH, DIE_HEIGHT) || intersects(x0, y0, 0, 0, bd->x_dice[1], bd->y_dice[1], DIE_WIDTH, DIE_HEIGHT)) return POINT_DICE; CubePosition(bd->crawford_game, bd->cube_use, bd->doubled, bd->cube_owner, fClockwise, &xCube, &yCube, NULL); if (intersects(x0, y0, 0, 0, xCube, yCube, CUBE_WIDTH, CUBE_HEIGHT)) return POINT_CUBE; if (intersects(x0, y0, 0, 0, (BOARD_WIDTH + BAR_WIDTH) / 2, BORDER_HEIGHT + 5 * CHEQUER_HEIGHT, 6 * CHEQUER_WIDTH, BOARD_HEIGHT - 10 * CHEQUER_HEIGHT - BORDER_HEIGHT * 3)) return POINT_RIGHT; else if (intersects(x0, y0, 0, 0, BEAROFF_WIDTH, BORDER_HEIGHT + 5 * CHEQUER_HEIGHT, 6 * CHEQUER_WIDTH, BOARD_HEIGHT - 10 * CHEQUER_HEIGHT - BORDER_HEIGHT * 3)) return POINT_LEFT; for (i = 0; i < 30; i++) { point_area(bd, i, &x, &y, &cx, &cy); x /= bd->rd->nSize; y /= bd->rd->nSize; cx /= bd->rd->nSize; cy /= bd->rd->nSize; /* Adjusted bear-off y slightly (i == 0 and 25) */ if (y < 6 * CHEQUER_HEIGHT) { if (i > 0) y -= (BORDER_HEIGHT); } if (i == 25) y -= (BORDER_HEIGHT); cy += BORDER_HEIGHT; if (intersects(x0, y0, 0, 0, x, y, cx, cy)) return i; } resign_position(bd, &xCube, &yCube, NULL); if (intersects(x0, y0, 0, 0, xCube, yCube, CUBE_WIDTH, CUBE_HEIGHT)) return POINT_RESIGN; /* Could not find an overlapping point */ return -1; } /* jsc: Given (x0,y0) which is ASSUMED to intersect point, return a * non-negative integer i representing the ith chequer position which * intersects (x0, y0). On failure, return -1 */ static int board_chequer_number(GtkWidget * UNUSED(board), BoardData * bd, int point, int x0, int y0) { int i, y, cx, cy, dy, c_chequer; if (point < 0 || point > 27) return -1; if (bd->rd->nSize == 0) return -1; x0 /= bd->rd->nSize; y0 /= bd->rd->nSize; c_chequer = (!point || point == 25) ? 3 : 5; cx = CHEQUER_WIDTH; y = positions[fClockwise][point][1]; dy = -positions[fClockwise][point][2]; if (dy < 0) cy = -dy; else cy = dy; /* FIXME: test for border overlap before for() loop to see if we * should return 0, and return -1 if the for() loop completes */ for (i = 1; i <= c_chequer; ++i) { /* We use cx+1 and cy+1 because intersects may return 0 at boundary */ if (intersects(x0, y0, 0, 0, positions[fClockwise][point][0], y, cx + 1, cy + 1)) return i; y += dy; } /* Didn't intersect any position on the point */ return 0; } #if defined(USE_BOARD3D) static void updateBoard(GtkWidget * board, BoardData * bd) #else static void updateBoard(GtkWidget * UNUSED(board), BoardData * bd) #endif { TanBoard points; read_board(bd, points); update_gnubg_id(bd, (ConstTanBoard) points); update_pipcount(bd, (ConstTanBoard) points); #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { gtk_widget_queue_draw(board); updatePieceOccPos(bd, bd->bd3d); } #endif } /* Snowie style editing: we will try to place i chequers of the * indicated colour on point n. The x,y coordinates will be used to * map to a point n and a checker position i. * * Clicking on a point occupied by the opposite color clears the point * first. If not enough chequers are available in the bearoff tray, * we try to add what we can. So if there are no chequers in the * bearoff tray, no chequers will be added. This may be a point of * confusion during usage. Clicking on the outside border of a point * corresponds to i=0, i.e. remove all chequers from that point. */ static void board_quick_edit(GtkWidget * board, BoardData * bd, int x, int y, int dragging) { int current, delta, c_chequer; int off, opponent_off; int opponent_bar; int n, i; int colour = bd->drag_button == 1 ? 1 : -1; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) n = BoardPoint3d(bd, x, y); else #endif /* Map (x,y) to a point from 0..27 using a version of * board_point() that ignores the dice and cube and which allows * clicking on a narrow border */ n = board_point_with_border(board, bd, x, y); if (!dragging && (n == POINT_UNUSED0 || n == POINT_UNUSED1 || n == 26 || n == 27)) { board_invalidate_dice(bd); board_invalidate_cube(bd); if (n == 26 || n == 27) { /* click on bearoff tray in edit mode -- bear off all chequers */ for (i = 0; i < 26; i++) { bd->points[i] = 0; } bd->points[26] = bd->nchequers; bd->points[27] = -bd->nchequers; /* Reset dice and cube */ ms.anDice[0] = ms.anDice[1] = 0; ms.fTurn = ms.fMove = 1; ms.fResigned = ms.fDoubled = 0; bd->diceRoll[0] = bd->diceRoll[1] = 0; bd->diceShown = DICE_BELOW_BOARD; bd->turn = 1; ms.nCube = 1; bd->cube = 0; ms.fCubeOwner = -1; bd->cube_owner = 0; ms.gs = GAME_PLAYING; } else { /* if (n == POINT_UNUSED0 || n == POINT_UNUSED1) */ /* click on unused bearoff tray in edit mode -- reset to starting position */ TanBoard anBoard; InitBoard(anBoard, ms.bgv); /* Reset dice and cube */ ms.anDice[0] = ms.anDice[1] = 0; ms.fTurn = ms.fMove = 1; ms.fResigned = ms.fDoubled = 0; bd->diceRoll[0] = bd->diceRoll[1] = 0; bd->diceShown = DICE_BELOW_BOARD; bd->turn = 1; ms.nCube = 1; bd->cube = 0; ms.fCubeOwner = -1; bd->cube_owner = 0; ms.gs = GAME_PLAYING; write_board(bd, anBoard); } #if defined(USE_BOARD3D) if (!display_is_3d(bd->rd)) #endif { board_invalidate_cube(bd); for (i = 0; i < 28; i++) board_invalidate_point(bd, i); } updateBoard(board, bd); } /* Only points or bar allowed */ if (n < 0 || n > 25) return; /* Make sure that if we drag across a bar, we started on that bar. * This is to make sure that if you drag a prime across say point * 4 to point 9, you don't inadvertently add chequers to the bar */ if (dragging && (n == 0 || n == 25) && n != bd->qedit_point) return; bd->qedit_point = n; off = (colour == 1) ? 26 : 27; opponent_off = (colour == 1) ? 27 : 26; opponent_bar = (colour == 1) ? 0 : 25; /* Can't add checkers to the wrong bar */ if (n == opponent_bar) return; c_chequer = (n == 0 || n == 25) ? 3 : 5; current = abs(bd->points[n]); /* Given n, map (x, y) to the ith checker position on point n */ #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) i = BoardSubPoint3d(bd, x, y, n); else #endif i = board_chequer_number(board, bd, n, x, y); if (i < 0) return; /* We are at the maximum position in the point, so we should not * respond to dragging. Each click will try to add one more * chequer */ if (!dragging && i >= c_chequer && current >= c_chequer) i = current + 1; /* Clear chequers of the other colour from this point */ if (current && ((SGN(bd->points[n])) != colour)) { bd->points[opponent_off] += current * -colour; bd->points[n] = 0; current = 0; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { gtk_widget_queue_draw(board); updatePieceOccPos(bd, bd->bd3d); } else #endif { board_invalidate_point(bd, n); board_invalidate_point(bd, opponent_off); } } delta = i - current; /* No chequers of our colour added or removed */ if (delta == 0) return; if (delta < 0) { /* Need to remove some chequers of the same colour */ bd->points[off] -= delta * colour; bd->points[n] += delta * colour; } else { int mv, avail = abs(bd->points[off]); /* any free chequers? */ if (!avail) return; /* move up to delta chequers, from avail chequers to point n */ mv = (avail > delta) ? delta : avail; bd->points[off] -= mv * colour; bd->points[n] += mv * colour; } #if defined(USE_BOARD3D) if (!display_is_3d(bd->rd)) #endif { board_invalidate_point(bd, n); board_invalidate_point(bd, off); } updateBoard(board, bd); } static int ForcedMove(TanBoard anBoard, unsigned int anDice[2]) { movelist ml; GenerateMoves(&ml, (ConstTanBoard) anBoard, anDice[0], anDice[1], FALSE); if (ml.cMoves == 1) { ApplyMove(anBoard, ml.amMoves[0].anMove, TRUE); return TRUE; } else return FALSE; } static int GreedyBearoff(TanBoard anBoard, unsigned int anDice[2]) { movelist ml; unsigned int i, iMove, cMoves; /* check for all chequers inside home quadrant */ for (i = 6; i < 25; ++i) if (anBoard[1][i]) return FALSE; cMoves = (anDice[0] == anDice[1]) ? 4 : 2; GenerateMoves(&ml, (ConstTanBoard) anBoard, anDice[0], anDice[1], FALSE); for (i = 0; i < ml.cMoves; i++) for (iMove = 0; iMove < cMoves; iMove++) if ((ml.amMoves[i].anMove[iMove << 1] < 0) || (ml.amMoves[i].anMove[(iMove << 1) + 1] != -1)) /* not a bearoff move */ break; else if (iMove == cMoves - 1) { /* All dice bear off */ ApplyMove(anBoard, ml.amMoves[i].anMove, TRUE); return TRUE; } return FALSE; } extern int UpdateMove(BoardData * bd, TanBoard anBoard) { int old_points[28]; int i, j; int an[28]; int rc; memcpy(old_points, bd->points, sizeof old_points); write_board(bd, anBoard); for (i = 0, j = 0; i < 28; ++i) if (old_points[i] != bd->points[i]) an[j++] = i; if ((rc = update_move(bd))) /* illegal move */ memcpy(bd->points, old_points, sizeof old_points); /* Show move */ #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { updatePieceOccPos(bd, bd->bd3d); DrawScene3d(bd->bd3d); } else #endif { for (i = 0; i < j; ++i) board_invalidate_point(bd, an[i]); } return rc; } static void ShowBoardPopup(GdkEventButton * event) { static GtkWidget *boardMenu = NULL; if (!boardMenu) { GtkWidget *menu_item; boardMenu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label(_("Undo Move")); gtk_menu_shell_append(GTK_MENU_SHELL(boardMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(GTKUndo), NULL); menu_item = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(boardMenu), menu_item); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new_with_label(_("Score Sheet")); gtk_menu_shell_append(GTK_MENU_SHELL(boardMenu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(GTKShowScoreSheet), NULL); } #if GTK_CHECK_VERSION(3,22,0) gtk_menu_popup_at_pointer(GTK_MENU(boardMenu), (GdkEvent *)event); #else gtk_menu_popup(GTK_MENU(boardMenu), NULL, NULL, NULL, NULL, event->button, event->time); #endif } extern gboolean board_button_press(GtkWidget * board, GdkEventButton * event, BoardData * bd) { int x = (int) event->x; int y = (int) event->y; int editing = ToolbarIsEditing(pwToolbar); int numOnPoint; /* Ignore double-clicks and multiple presses */ if (event->type != GDK_BUTTON_PRESS || bd->drag_point >= 0) return TRUE; if (!bd->playing) { if (quick_roll() == 0) board_beep(bd); return TRUE; } #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Ignore clicks when animating */ GtkAllocation allocation; if (Animating3d(bd->bd3d)) return TRUE; gtk_widget_get_allocation(board, &allocation); /* Reverse screen y coords for openGL */ y = allocation.height - y; bd->drag_point = BoardPoint3d(bd, x, y); } else #endif if (editing && !(event->state & GDK_CONTROL_MASK)) bd->drag_point = board_point_with_border(board, bd, x, y); else bd->drag_point = board_point(board, bd, x, y); bd->click_time = gdk_event_get_time((GdkEvent *) event); bd->drag_button = event->button; bd->DragTargetHelp = 0; /* Set dice in editing mode */ if (editing && (bd->drag_point == POINT_DICE || bd->drag_point == POINT_LEFT || bd->drag_point == POINT_RIGHT)) { if (bd->drag_point == POINT_LEFT && bd->turn != -1) UserCommand("set turn 0"); else if (bd->drag_point == POINT_RIGHT && bd->turn != 1) UserCommand("set turn 1"); /* Avoid dragging after selection causing pieces to appear */ bd->drag_point = -2; GTKSetDice(NULL, 0, NULL); return TRUE; } switch (bd->drag_point) { case -1: if (event->button == 3) { /* Show context menu when right click on nothing */ ShowBoardPopup(event); return TRUE; } /* Click on illegal area. */ board_beep(bd); return TRUE; case POINT_CUBE: /* Clicked on cube; double. */ bd->drag_point = -1; if (editing) { GTKSetCube(NULL, 0, NULL); /* Avoid dragging after selection causing pieces to appear */ bd->drag_point = -2; } else if (bd->doubled) { switch (event->button) { case 1: /* left */ UserCommand("take"); break; case 2: /* center */ if (!bd->match_to) UserCommand("redouble"); else UserCommand("take"); break; case 3: default: /* right */ UserCommand("drop"); break; } } else UserCommand("double"); return TRUE; case POINT_RESIGN: #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { StopIdle3d(bd, bd->bd3d); /* clicked on resignation symbol */ updateFlagOccPos(bd, bd->bd3d); } #endif bd->drag_point = -1; if (bd->resigned && !editing) UserCommand(event->button == 1 ? "accept" : "reject"); return TRUE; case POINT_DICE: #if defined(USE_BOARD3D) if (display_is_3d(bd->rd) && bd->diceShown == DICE_BELOW_BOARD) { /* Click on dice (below board) - shake */ bd->drag_point = -1; if (quick_roll() != 0) board_beep(bd); return TRUE; } #endif bd->drag_point = -1; if (event->button == 1) { if (ms.gs == GAME_RESIGNED) UserCommand("new game"); else /* Clicked on dice; end move. */ Confirm(bd); } else { /* Other buttons on dice swaps positions. */ swap_us(bd->diceRoll, bd->diceRoll + 1); /* Display swapped dice */ #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) gtk_widget_queue_draw(board); else #endif board_invalidate_dice(bd); } return TRUE; case POINT_LEFT: case POINT_RIGHT: /* If playing and dice not rolled yet, this code handles * rolling the dice if bottom player clicks the right side of * the board, or the top player clicks the left side of the * board (his/her right side). */ if (bd->diceShown <= DICE_BELOW_BOARD) { /* NB: the UserCommand() call may cause reentrancies, * so it is vital to reset bd->drag_point first! */ bd->drag_point = -1; quick_roll(); return TRUE; } bd->drag_point = -1; return TRUE; default: /* Points */ /* Don't let them move chequers unless the dice have been * rolled, or they're editing the board. */ if (bd->diceShown != DICE_ON_BOARD && !editing) { outputl(_("You must roll the dice before you can move.")); outputx(); board_beep(bd); bd->drag_point = -1; return TRUE; } if (ap[ms.fTurn].pt != PLAYER_HUMAN && !editing) { /* calling CommandPlay here may lead to crashes if * the click is in the small time frame between end * of player turn and next computer turn */ outputl(_("It is the computer's turn -- type `play' to force it to " "move immediately.")); outputx(); board_beep(bd); bd->drag_point = -1; return TRUE; } if (editing && !(event->state & GDK_CONTROL_MASK)) { board_quick_edit(board, bd, x, y, 0); bd->drag_point = -1; return TRUE; } if ((bd->drag_point == POINT_UNUSED0) || (bd->drag_point == POINT_UNUSED1)) { /* Clicked in un-used bear-off tray */ bd->drag_point = -1; return TRUE; } /* if nDragPoint is 26 or 27 (i.e. off), bear off as many chequers as possible. */ if (!editing && bd->drag_point == (53 - bd->turn) / 2) { /* user clicked on bear-off tray: try to bear-off chequers or * show forced move */ TanBoard anBoard; memcpy(anBoard, msBoard(), sizeof(TanBoard)); bd->drag_colour = bd->turn; bd->drag_point = -1; if (ForcedMove(anBoard, bd->diceRoll) || GreedyBearoff(anBoard, bd->diceRoll)) { int old_points[28]; memcpy(old_points, bd->points, sizeof old_points); /* we've found a move: update board */ if (UpdateMove(bd, anBoard)) { /* should not happen as ForcedMove and GreedyBearoff * always return legal moves */ g_assert_not_reached(); } /* Play a sound if any chequers have moved */ if (memcmp(old_points, bd->points, sizeof old_points)) playSound(SOUND_CHEQUER); } return TRUE; } /* How many chequers on clicked point */ numOnPoint = bd->points[bd->drag_point]; /* Click on an empty point or opponent blot; try to make the point. */ if (!editing && bd->drag_point <= 24 && (numOnPoint == 0 || numOnPoint == -bd->turn)) { int n[2], bar; int old_points[28]; TanBoard points; positionkey key; memcpy(old_points, bd->points, sizeof old_points); bd->drag_colour = bd->turn; bar = bd->drag_colour == bd->colour ? 25 - bd->bar : bd->bar; if (bd->diceRoll[0] == bd->diceRoll[1]) { /* Rolled a double; find the two closest chequers to make * the point. */ int c = 0; int i; n[0] = n[1] = -1; for (i = 0; i < 4 && c < 2; i++) { int j = bd->drag_point + bd->diceRoll[0] * bd->drag_colour * (i + 1); if (j < 0 || j > 25) break; while (c < 2 && bd->points[j] * bd->drag_colour > 0) { /* temporarily take chequer, so it's not used again */ bd->points[j] -= bd->drag_colour; n[c++] = j; } } /* replace chequers removed above */ for (i = 0; i < c; i++) bd->points[n[i]] += bd->drag_colour; } else { /* Rolled a non-double; take one chequer from each point * indicated by the dice. */ n[0] = bd->drag_point + bd->diceRoll[0] * bd->drag_colour; n[1] = bd->drag_point + bd->diceRoll[1] * bd->drag_colour; } if (n[0] >= 0 && n[0] <= 25 && n[1] >= 0 && n[1] <= 25 && bd->points[n[0]] * bd->drag_colour > 0 && bd->points[n[1]] * bd->drag_colour > 0) { /* the point can be made */ if (bd->points[bd->drag_point]) /* hitting the opponent in the process */ bd->points[bar] -= bd->drag_colour; bd->points[n[0]] -= bd->drag_colour; bd->points[n[1]] -= bd->drag_colour; bd->points[bd->drag_point] = bd->drag_colour << 1; read_board(bd, points); PositionKey((ConstTanBoard) points, &key); if (!update_move(bd)) { /* Show Move */ #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { updatePieceOccPos(bd, bd->bd3d); gtk_widget_queue_draw(board); } else #endif { board_invalidate_point(bd, n[0]); board_invalidate_point(bd, n[1]); board_invalidate_point(bd, bd->drag_point); board_invalidate_point(bd, bar); } playSound(SOUND_CHEQUER); } else { /* the move to make the point wasn't legal; undo it. */ memcpy(bd->points, old_points, sizeof bd->points); update_move(bd); board_beep(bd); } } else board_beep(bd); bd->drag_point = -1; return TRUE; } if (numOnPoint == 0) { /* clicked on empty point */ board_beep(bd); bd->drag_point = -1; return TRUE; } bd->drag_colour = numOnPoint < 0 ? -1 : 1; /* trying to move opponent's chequer */ if (!editing && bd->drag_colour != bd->turn) { board_beep(bd); bd->drag_point = -1; return TRUE; } /* Start Dragging piece */ board_start_drag(board, bd, bd->drag_point, x, y); board_drag(board, bd, x, y); return TRUE; } } /*! \brief callback for release of mouse button * \param board the GtkBoard * \param event the event containing the xy pos * \param bd board data */ extern gboolean board_button_release(GtkWidget * board, GdkEventButton * event, BoardData * bd) { int x = (int) event->x; int y = (int) event->y; int editing = ToolbarIsEditing(pwToolbar); int release_point; int drag_time; int legal_point = -1; int i, j; if (bd->drag_point < 0) return TRUE; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Reverse screen y coords for OpenGL */ GtkAllocation allocation; gtk_widget_get_allocation(board, &allocation); y = allocation.height - y; release_point = BoardPoint3d(bd, x, y); } else #endif { board_end_drag(board, bd); release_point = board_point(board, bd, x, y); } drag_time = gdk_event_get_time((GdkEvent *) event) - bd->click_time; if (!editing && release_point == bd->drag_point && drag_time < CLICK_TIME) { int dests[2] = { -1, -1 }; if (bd->drag_colour == bd->turn) { /* Button 1 tries the left roll first. * other buttons try the right dice roll first */ if (bd->drag_button == 1) { dests[0] = bd->drag_point - bd->diceRoll[0] * bd->drag_colour; dests[1] = bd->drag_point - bd->diceRoll[1] * bd->drag_colour; } else { dests[1] = bd->drag_point - bd->diceRoll[0] * bd->drag_colour; dests[0] = bd->drag_point - bd->diceRoll[1] * bd->drag_colour; } } legal_dest_points(bd, bd->iTargetHelpPoints); for (i = 0; i < 2; ++i) { int dest = dests[i]; if ((dest <= 0) || (dest >= 25)) /* bearing off */ dest = bd->drag_colour > 0 ? 26 : 27; for (j = 0; j < 4; j++) { if (bd->iTargetHelpPoints[j] < 0) continue; if (dest == bd->iTargetHelpPoints[j]) { legal_point = dest; goto move_chequer; } } } } /* if we haven't found a legal move yet we parse the release point * to place_chequer_or revert. That is either an illegal move or a * drag n' drop */ if (legal_point < 0) legal_point = release_point; move_chequer: if (place_chequer_or_revert(bd, legal_point)) playSound(SOUND_CHEQUER); else { if (release_point >= 0) board_invalidate_point(bd, release_point); board_beep(bd); } #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Update 3d Display */ updatePieceOccPos(bd, bd->bd3d); gtk_widget_queue_draw(board); } else #endif { /* undo drag target help */ if (fGUIDragTargetHelp && bd->DragTargetHelp) { for (i = 0; i <= 3; ++i) { if (bd->iTargetHelpPoints[i] != -1) board_invalidate_point(bd, bd->iTargetHelpPoints[i]); } } } bd->DragTargetHelp = 0; bd->drag_point = -1; return TRUE; } extern gboolean board_motion_notify(GtkWidget * board, GdkEventMotion * event, BoardData * bd) { int x = (int) event->x; int y = (int) event->y; int editing = ToolbarIsEditing(pwToolbar); #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Reverse screen y coords for openGL */ GtkAllocation allocation; gtk_widget_get_allocation(board, &allocation); y = allocation.height - y; } #endif /* In quick editing mode, dragging across points */ if (editing && !(event->state & GDK_CONTROL_MASK) && bd->drag_point == -1) { board_quick_edit(board, bd, x, y, 1); return TRUE; } if (bd->drag_point < 0) return TRUE; board_drag(board, bd, x, y); if (fGUIDragTargetHelp && !bd->DragTargetHelp && !editing) { /* Decide if drag targets should be shown (shown after small pause) */ if ((ap[bd->drag_colour == -1 ? 0 : 1].pt == PLAYER_HUMAN) /* not for computer turn */ &&gdk_event_get_time((GdkEvent *) event) - bd->click_time > HINT_TIME) { bd->DragTargetHelp = legal_dest_points(bd, bd->iTargetHelpPoints); } } #if defined(USE_BOARD3D) if (display_is_2d(bd->rd)) #endif { if (bd->DragTargetHelp) { /* Display 2d drag target help */ gint i, ptx, pty, ptcx, ptcy; cairo_t *cr; #if GTK_CHECK_VERSION(3,0,0) GdkRGBA TargetHelpRGBA; TargetHelpRGBA.red = 0.0; TargetHelpRGBA.green = 1.0; TargetHelpRGBA.blue = 0.0; TargetHelpRGBA.alpha = 1.0; #else GdkColor TargetHelpColor; /* values of RGB components within GdkColor are * taken from 0 to 65535, not 0 to 255. */ TargetHelpColor.red = 0 * (65535 / 255); TargetHelpColor.green = 255 * (65535 / 255); TargetHelpColor.blue = 0 * (65535 / 255); TargetHelpColor.pixel = (guint32) (TargetHelpColor.red * 65536 + TargetHelpColor.green * 256 + TargetHelpColor.blue); /* get the closest color available in the colormap if no 24-bit */ gdk_colormap_alloc_color(gtk_widget_get_colormap(board), &TargetHelpColor, TRUE, TRUE); #endif cr = gdk_cairo_create(gtk_widget_get_window(board)); #if GTK_CHECK_VERSION(3,0,0) gdk_cairo_set_source_rgba(cr, &TargetHelpRGBA); #else gdk_cairo_set_source_color(cr, &TargetHelpColor); #endif /* draw help rectangles around target points */ for (i = 0; i <= 3; ++i) { if (bd->iTargetHelpPoints[i] != -1) { /* calculate region coordinates for point */ point_area(bd, bd->iTargetHelpPoints[i], &ptx, &pty, &ptcx, &ptcy); cairo_rectangle(cr, ptx + 1, pty + 1, ptcx - 2, ptcy - 2); cairo_set_line_width(cr, 1); cairo_stroke(cr); } } cairo_destroy(cr); } } return TRUE; } static void UpdateCrawfordToggle(GtkWidget * pw, BoardData * bd); static void board_set_crawford(GtkWidget * pw, BoardData * bd); /* recursion */ static void board_set_jacoby(GtkWidget * pw, BoardData * bd); static void match_change_val(GtkWidget * pw, BoardData * bd); static void score_changed(const GtkAdjustment * const adj, BoardData * bd) { gchar buf[32]; int nMatchLen = (int) gtk_adjustment_get_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(bd->match))); if ((bd->match_to != nMatchLen) && (adj == bd->amatch)) { /* reset limits for scores if match length is changed */ gdouble upper = (gdouble) ((nMatchLen == 0) ? 32767 : nMatchLen - 1); gtk_adjustment_set_upper(bd->ascore0, upper); gtk_adjustment_set_upper(bd->ascore1, upper); } #if !GTK_CHECK_VERSION(3,18,0) gtk_adjustment_changed(bd->ascore0); gtk_adjustment_changed(bd->ascore1); #endif if (nMatchLen) { if (bd->score_opponent >= nMatchLen) sprintf(buf, _("%d (won match)"), bd->score_opponent); else sprintf(buf, _("%d (%d-away)"), bd->score_opponent, nMatchLen - bd->score_opponent); gtk_label_set_text(GTK_LABEL(bd->lscore0), buf); if (bd->score >= nMatchLen) sprintf(buf, _("%d (won match)"), bd->score); else sprintf(buf, _("%d (%d-away)"), bd->score, nMatchLen - bd->score); gtk_label_set_text(GTK_LABEL(bd->lscore1), buf); } else { /* money game */ sprintf(buf, "%d", bd->score_opponent); gtk_label_set_text(GTK_LABEL(bd->lscore0), buf); sprintf(buf, "%d", bd->score); gtk_label_set_text(GTK_LABEL(bd->lscore1), buf); } UpdateCrawfordToggle(NULL, bd); } extern void RollDice2d(BoardData * bd) { int x, y, cx, cy; bd->x_dice[0] = RAND % (3 * DIE_WIDTH) + BEAROFF_WIDTH + 1; bd->x_dice[1] = RAND % (6 * CHEQUER_WIDTH - 2 - bd->x_dice[0]) + bd->x_dice[0] + DIE_WIDTH + 1; if (bd->colour == bd->turn) { bd->x_dice[0] += 6 * CHEQUER_WIDTH + BAR_WIDTH; bd->x_dice[1] += 6 * CHEQUER_WIDTH + BAR_WIDTH; } #define POINT_GAP (BOARD_HEIGHT - 10 * CHEQUER_HEIGHT - 2 * BORDER_HEIGHT) #if (POINT_GAP > DIE_HEIGHT) bd->y_dice[0] = RAND % (POINT_GAP - DIE_HEIGHT) + 5 * CHEQUER_HEIGHT + BORDER_HEIGHT; bd->y_dice[1] = RAND % (POINT_GAP - DIE_HEIGHT) + 5 * CHEQUER_HEIGHT + BORDER_HEIGHT; #else bd->y_dice[0] = 5 * CHEQUER_HEIGHT + BORDER_HEIGHT; bd->y_dice[1] = 5 * CHEQUER_HEIGHT + BORDER_HEIGHT; #endif if (bd->rd->nSize > 0) { int iAttempt = 0, iPoint; for (iPoint = 1; iPoint <= 24; iPoint++) { if (abs(bd->points[iPoint]) >= 5) { point_area(bd, iPoint, &x, &y, &cx, &cy); x /= bd->rd->nSize; y /= bd->rd->nSize; cx /= bd->rd->nSize; cy /= bd->rd->nSize; if ((intersects(bd->x_dice[0], bd->y_dice[0], DIE_WIDTH, DIE_HEIGHT, x, y, cx, cy) || intersects(bd->x_dice[1], bd->y_dice[1], DIE_WIDTH, DIE_HEIGHT, x, y, cx, cy)) && iAttempt++ < 0x80) { /* Try placing again */ RollDice2d(bd); } } } } } static void SetCrawfordToggle(BoardData * bd) { if (bd->crawford && (bd->crawford_game != gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->crawford)))) { /* Block handler to stop warning message in click handler */ g_signal_handlers_block_by_func(G_OBJECT(bd->crawford), (gpointer) G_CALLBACK(board_set_crawford), bd); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->crawford), bd->crawford_game); g_signal_handlers_unblock_by_func(G_OBJECT(bd->crawford), (gpointer) G_CALLBACK(board_set_crawford), bd); } } static void SetJacobyToggle(BoardData * bd) { if (bd->jacoby && (bd->jacoby_flag != gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->jacoby)))) { /* Block handler to stop warning message in click handler */ g_signal_handlers_block_by_func(G_OBJECT(bd->jacoby), (gpointer) G_CALLBACK(board_set_jacoby), bd); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->jacoby), bd->jacoby_flag); g_signal_handlers_unblock_by_func(G_OBJECT(bd->jacoby), (gpointer) G_CALLBACK(board_set_jacoby), bd); } } static int board_text_to_setting(gchar ** board_text, gint * failed) { if (*failed) return 0; if (*(*board_text)++ != ':') { *failed = 1; return 0; } return (int) strtol(*board_text, (char **) board_text, 10); } static gint board_set(Board * board, gchar * board_text, const gint resigned, const gint cube_use) { BoardData *bd = board->board_data; gchar *dest, buf[32]; gint i, *pn, **ppn; gint old_board[28]; unsigned int old_cube; int old_doubled, old_crawford, old_xCube, old_yCube, editing; int old_resigned; int old_xResign, old_yResign; int old_turn; int old_diceShown; int old_jacoby; int redrawNeeded = 0; gint failed = 0; int *match_settings[3]; unsigned int old_dice[2]; match_settings[0] = &bd->match_to; match_settings[1] = &bd->score; match_settings[2] = &bd->score_opponent; old_dice[0] = bd->diceRoll[0]; old_dice[1] = bd->diceRoll[1]; old_diceShown = bd->diceShown; old_turn = bd->turn; editing = bd->playing && ToolbarIsEditing(pwToolbar); if (!board_text) return -1; if (strncmp(board_text, "board:", 6)) return -1; board_text += 6; for (dest = bd->name, i = 31; i && *board_text && *board_text != ':'; i--) *dest++ = *board_text++; *dest = 0; board_text++; for (dest = bd->name_opponent, i = 31; i && *board_text && *board_text != ':'; i--) *dest++ = *board_text++; *dest = 0; for (i = 3, ppn = match_settings; i--;) { **ppn++ = board_text_to_setting(&board_text, &failed); } if (failed) return -1; for (i = 0, pn = bd->points; i < 26; i++) { old_board[i] = *pn; *pn++ = board_text_to_setting(&board_text, &failed); } if (failed) return -1; old_board[26] = bd->points[26]; old_board[27] = bd->points[27]; old_cube = bd->cube; old_doubled = bd->doubled; old_crawford = bd->crawford_game; old_jacoby = bd->jacoby_flag; old_resigned = bd->resigned; CubePosition(bd->crawford_game, bd->cube_use, bd->doubled, bd->cube_owner, fClockwise, &old_xCube, &old_yCube, NULL); resign_position(bd, &old_xResign, &old_yResign, NULL); bd->resigned = resigned; bd->turn = board_text_to_setting(&board_text, &failed); bd->diceRoll[0] = board_text_to_setting(&board_text, &failed); bd->diceRoll[1] = board_text_to_setting(&board_text, &failed); board_text_to_setting(&board_text, &failed); board_text_to_setting(&board_text, &failed); bd->cube = board_text_to_setting(&board_text, &failed); bd->can_double = board_text_to_setting(&board_text, &failed); bd->opponent_can_double = board_text_to_setting(&board_text, &failed); bd->doubled = board_text_to_setting(&board_text, &failed); bd->colour = board_text_to_setting(&board_text, &failed); bd->direction = board_text_to_setting(&board_text, &failed); bd->home = board_text_to_setting(&board_text, &failed); bd->bar = board_text_to_setting(&board_text, &failed); bd->off = board_text_to_setting(&board_text, &failed); bd->off_opponent = board_text_to_setting(&board_text, &failed); bd->on_bar = board_text_to_setting(&board_text, &failed); bd->on_bar_opponent = board_text_to_setting(&board_text, &failed); bd->to_move = board_text_to_setting(&board_text, &failed); bd->forced = board_text_to_setting(&board_text, &failed); board_text_to_setting(&board_text, &failed); /* skip fPostCrawford */ bd->crawford_game = !board_text_to_setting(&board_text, &failed); bd->jacoby_flag = ms.fJacoby; if (failed) return -1; if (bd->colour < 0) bd->off = -bd->off; else bd->off_opponent = -bd->off_opponent; if (bd->direction < 0) { bd->points[26] = bd->off; bd->points[27] = bd->off_opponent; } else { bd->points[26] = bd->off_opponent; bd->points[27] = bd->off; } /* calculate number of chequers */ bd->nchequers = 0; for (i = 0; i < 28; ++i) if (bd->points[i] > 0) bd->nchequers += bd->points[i]; if (!editing) { gtk_entry_set_text(GTK_ENTRY(bd->name0), bd->name_opponent); gtk_entry_set_text(GTK_ENTRY(bd->name1), bd->name); gtk_label_set_text(GTK_LABEL(bd->lname0), bd->name_opponent); gtk_label_set_text(GTK_LABEL(bd->lname1), bd->name); if (bd->match_to) { sprintf(buf, "%d", bd->match_to); gtk_label_set_text(GTK_LABEL(bd->lmatch), buf); } else { gtk_label_set_text(GTK_LABEL(bd->lmatch), _("unlimited")); } gtk_spin_button_set_value(GTK_SPIN_BUTTON(bd->score0), bd->score_opponent); gtk_spin_button_set_value(GTK_SPIN_BUTTON(bd->score1), bd->score); gtk_spin_button_set_value(GTK_SPIN_BUTTON(bd->match), bd->match_to); score_changed(NULL, bd); /* gtk_adjustment_value_changed ( GTK_ADJUSTMENT ( bd->amatch ) ); */ if (bd->crawford) { gtk_widget_set_sensitive(bd->crawford, FALSE); } if (bd->jacoby) { gtk_widget_set_sensitive(bd->jacoby, FALSE); } read_board(bd, bd->old_board); update_pipcount(bd, (ConstTanBoard) bd->old_board); } update_gnubg_id(bd, (ConstTanBoard) bd->old_board); update_move(bd); if (fGUIHighDieFirst) { if (bd->diceRoll[0] < bd->diceRoll[1]) swap_us(bd->diceRoll, bd->diceRoll + 1); } else { /* shuffle them in case they were ordered */ if (RAND % 2) swap_us(bd->diceRoll, bd->diceRoll + 1); } if (bd->diceRoll[0] != old_dice[0] || bd->diceRoll[1] != old_dice[1] || (bd->diceRoll[0] > 0 && old_diceShown == DICE_BELOW_BOARD) || editing) { redrawNeeded = 1; if (bd->x_dice[0] > 0 #if defined(USE_BOARD3D) && display_is_2d(bd->rd) #endif ) { /* dice were visible before; now they're not */ int ax[2]; ax[0] = bd->x_dice[0]; ax[1] = bd->x_dice[1]; bd->x_dice[0] = bd->x_dice[1] = -DIE_WIDTH - 3; if (bd->rd->nSize > 0) { board_invalidate_rect(bd->drawing_area, ax[0] * bd->rd->nSize, bd->y_dice[0] * bd->rd->nSize, DIE_WIDTH * bd->rd->nSize, DIE_HEIGHT * bd->rd->nSize, bd); board_invalidate_rect(bd->drawing_area, ax[1] * bd->rd->nSize, bd->y_dice[1] * bd->rd->nSize, DIE_WIDTH * bd->rd->nSize, DIE_HEIGHT * bd->rd->nSize, bd); } } if (bd->diceRoll[0] == 0) { /* Dice not on board */ bd->x_dice[0] = bd->x_dice[1] = -DIE_WIDTH - 3; if ((bd->diceRoll[0] == 0 && old_dice[0] > 0) && (bd->diceRoll[1] == 0 && old_dice[1] > 0)) { bd->diceShown = DICE_BELOW_BOARD; /* Keep showing shaken values */ bd->diceRoll[0] = old_dice[0]; bd->diceRoll[1] = old_dice[1]; } else bd->diceShown = DICE_NOT_SHOWN; } else { #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Has been shaken, so roll dice */ if (bd->diceShown == DICE_ROLLING) { bd->diceShown = DICE_ON_BOARD; RollDice3d(bd, bd->bd3d, bd->rd); redrawNeeded = 0; } else { /* Move dice to new position */ setDicePos(bd, bd->bd3d); } } else #endif { RollDice2d(bd); } bd->diceShown = DICE_ON_BOARD; } } if (bd->diceShown == DICE_ON_BOARD) { GenerateMoves(&bd->move_list, (ConstTanBoard) bd->old_board, bd->diceRoll[0], bd->diceRoll[1], TRUE); /* bd->move_list contains pointers to static data, so we need to * copy the actual moves into private storage. */ g_free(bd->all_moves); bd->all_moves = g_malloc(bd->move_list.cMoves * sizeof(move)); bd->move_list.amMoves = memcpy(bd->all_moves, bd->move_list.amMoves, bd->move_list.cMoves * sizeof(move)); bd->valid_move = NULL; } if (bd->rd->nSize == 0) return 0; if (bd->turn != old_turn) { #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { /* Make sure flag shadow is correct if players are swapped when resigned */ if (bd->resigned) updateFlagOccPos(bd, bd->bd3d); } #endif redrawNeeded = 1; } if (bd->doubled != old_doubled || bd->cube != old_cube || bd->cube_owner != bd->opponent_can_double - bd->can_double || cube_use != bd->cube_use || bd->crawford_game != old_crawford || bd->jacoby_flag != old_jacoby) { int xCube, yCube; redrawNeeded = 1; bd->cube_owner = bd->opponent_can_double - bd->can_double; bd->cube_use = cube_use; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { RecalcViewingVolume(bd); /* Cube may be out of top of screen */ } else #endif { /* erase old cube */ board_invalidate_rect(bd->drawing_area, old_xCube * bd->rd->nSize, old_yCube * bd->rd->nSize, 8 * bd->rd->nSize, 8 * bd->rd->nSize, bd); CubePosition(bd->crawford_game, bd->cube_use, bd->doubled, bd->cube_owner, fClockwise, &xCube, &yCube, NULL); /* draw new cube */ board_invalidate_rect(bd->drawing_area, xCube * bd->rd->nSize, yCube * bd->rd->nSize, 8 * bd->rd->nSize, 8 * bd->rd->nSize, bd); } } if (bd->resigned != old_resigned) { int xResign, yResign; redrawNeeded = 1; /* erase old resign */ board_invalidate_rect(bd->drawing_area, old_xResign * bd->rd->nSize, old_yResign * bd->rd->nSize, 8 * bd->rd->nSize, 8 * bd->rd->nSize, bd); resign_position(bd, &xResign, &yResign, NULL); /* draw new resign */ board_invalidate_rect(bd->drawing_area, xResign * bd->rd->nSize, yResign * bd->rd->nSize, 8 * bd->rd->nSize, 8 * bd->rd->nSize, bd); #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) ShowFlag3d(bd, bd->bd3d, bd->rd); #endif } if (fClockwise != bd->rd->fClockwise) { /* This is complete overkill, but we need to recalculate the * board pixmap if the points are numbered and the direction * changes. */ board_free_pixmaps(bd); bd->rd->fClockwise = fClockwise; board_create_pixmaps(pwBoard, bd); gtk_widget_queue_draw(bd->drawing_area); ToolbarSetClockwise(pwToolbar, fClockwise); return 0; } #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { if (redrawNeeded) DrawScene3d(bd->bd3d); } else #endif { for (i = 0; i < 28; i++) if (bd->points[i] != old_board[i]) { board_invalidate_point(bd, i); } if (redrawNeeded) { board_invalidate_dice(bd); board_invalidate_labels(bd); board_invalidate_cube(bd); board_invalidate_resign(bd); board_invalidate_arrow(bd); } } return 0; } unsigned int convert_point(int i, int player) { if (player) return (i < 0) ? 26 : i + 1; else return (i < 0) ? 27 : 24 - i; } static gint board_blink_timeout(gpointer p) { Board *board = p; BoardData *pbd = board->board_data; int src, dest, src_cheq = 0, dest_cheq = 0, colour; static int blink_move, blink_count; if (blink_move >= 8 || animate_move_list[blink_move] < 0 || fInterrupt) { blink_move = 0; animation_finished = TRUE; return FALSE; } src = convert_point(animate_move_list[blink_move], animate_player); dest = convert_point(animate_move_list[blink_move + 1], animate_player); colour = animate_player ? 1 : -1; if (!(blink_count & 1)) { src_cheq = pbd->points[src]; dest_cheq = pbd->points[dest]; if (pbd->points[dest] == -colour) { pbd->points[dest] = 0; if (blink_count == 4) { pbd->points[animate_player ? 0 : 25] -= colour; board_invalidate_point(pbd, animate_player ? 0 : 25); } } pbd->points[src] -= colour; pbd->points[dest] += colour; } board_invalidate_point(pbd, src); board_invalidate_point(pbd, dest); if (!(blink_count & 1) && blink_count < 4) { pbd->points[src] = src_cheq; pbd->points[dest] = dest_cheq; } if (blink_count++ >= 4) { blink_count = 0; blink_move += 2; } #if !GTK_CHECK_VERSION(3,22,0) gdk_window_process_updates(gtk_widget_get_window(pbd->drawing_area), FALSE); #endif return TRUE; } static gint board_slide_timeout(gpointer p) { Board *board = p; BoardData *bd = board->board_data; int src, dest, colour; static int slide_move, slide_phase, x, y, x_mid, x_dest, y_dest, y_lift; if (fInterrupt && bd->drag_point >= 0) { board_end_drag(bd->drawing_area, bd); bd->drag_point = -1; } if (slide_move >= 8 || animate_move_list[slide_move] < 0 || fInterrupt) { slide_move = slide_phase = 0; animation_finished = TRUE; return FALSE; } src = convert_point(animate_move_list[slide_move], animate_player); dest = convert_point(animate_move_list[slide_move + 1], animate_player); colour = animate_player ? 1 : -1; switch (slide_phase) { case 0: #define SLIDE_BOTTOM (BOARD_HEIGHT / 2 - 3 * CHEQUER_HEIGHT) #define SLIDE_MIDDLE (BOARD_HEIGHT / 2) #define SLIDE_TOP (SLIDE_MIDDLE + 3 * CHEQUER_HEIGHT) /* start slide */ chequer_position(src, abs(bd->points[src]), &x, &y); x += (CHEQUER_WIDTH / 2); y += (CHEQUER_HEIGHT / 2); if (y < SLIDE_BOTTOM) y_lift = SLIDE_BOTTOM; else if (y < SLIDE_MIDDLE) y_lift = y + CHEQUER_HEIGHT / 2; else if (y > SLIDE_TOP) y_lift = SLIDE_TOP; else y_lift = y - CHEQUER_HEIGHT / 2; chequer_position(dest, abs(bd->points[dest]) + 1, &x_dest, &y_dest); x_dest += CHEQUER_WIDTH / 2; y_dest += CHEQUER_HEIGHT / 2; x_mid = (x + x_dest) >> 1; board_start_drag(bd->drawing_area, bd, src, x * bd->rd->nSize, y * bd->rd->nSize); slide_phase++; /* fall through */ case 1: /* lift */ if (y < SLIDE_MIDDLE && y < y_lift) { y += 2; break; } else if (y > SLIDE_MIDDLE && y > y_lift) { y -= 2; break; } else slide_phase++; /* fall through */ case 2: /* to mid point */ if (y > SLIDE_MIDDLE) y--; else if (y < SLIDE_MIDDLE) y++; if (x > x_mid + 2) { x -= CHEQUER_WIDTH / 2; break; } else if (x < x_mid - 2) { x += CHEQUER_WIDTH / 2; break; } else slide_phase++; /* fall through */ case 3: /* from mid point */ if (y > y_dest + 1) y -= 2; else if (y < y_dest - 1) y += 2; if (x < x_dest - 2) { x += CHEQUER_WIDTH / 2; break; } else if (x > x_dest + 2) { x -= CHEQUER_WIDTH / 2; break; } else slide_phase++; /* fall through */ case 4: /* drop */ if (y > y_dest + 2) y -= CHEQUER_HEIGHT / 2; else if (y < y_dest - 2) y += CHEQUER_HEIGHT / 2; else { board_end_drag(bd->drawing_area, bd); if (bd->points[dest] == -colour) { bd->points[dest] = 0; bd->points[animate_player ? 0 : 25] -= colour; board_invalidate_point(bd, animate_player ? 0 : 25); } bd->points[dest] += colour; board_invalidate_point(bd, dest); bd->drag_point = -1; slide_phase = 0; slide_move += 2; #if !GTK_CHECK_VERSION(3,22,0) gdk_window_process_updates(gtk_widget_get_window(bd->drawing_area), FALSE); #endif playSound(SOUND_CHEQUER); return TRUE; } break; default: g_assert_not_reached(); } board_drag(bd->drawing_area, bd, x * bd->rd->nSize, y * bd->rd->nSize); return TRUE; } extern void board_animate(Board * board, int move[8], int player) { if (animGUI == ANIMATE_NONE || ms.fResigned) { return; } animate_move_list = move; animate_player = player; animation_finished = FALSE; #if defined(USE_BOARD3D) { BoardData *bd = board->board_data; if (display_is_3d(bd->rd)) { AnimateMove3d(bd, bd->bd3d); return; } } #endif if (animGUI == ANIMATE_BLINK) g_timeout_add(0x300 >> nGUIAnimSpeed, board_blink_timeout, board); else /* ANIMATE_SLIDE */ g_timeout_add(0x100 >> nGUIAnimSpeed, board_slide_timeout, board); while (!animation_finished) { GTKSuspendInput(); gtk_main_iteration(); GTKResumeInput(); } } extern void board_set_playing(Board * board, gboolean f) { BoardData *bd = board->board_data; bd->playing = f; } static void update_buttons(BoardData * bd) { toolbarcontrol c; c = ToolbarUpdate(pwToolbar, &ms, bd->diceShown, bd->computer_turn, bd->playing); if (bd->rd->fDiceArea #if defined(USE_BOARD3D) && (display_is_2d(bd->rd)) #endif ) { if (c == C_ROLLDOUBLE) gtk_widget_show_all(bd->dice_area); else gtk_widget_hide(bd->dice_area); } } extern gint game_set(Board * board, TanBoard points, int roll, const gchar * name, const gchar * opp_name, gint matchto, gint score, gint opp_score, gint die0, gint die1, gint computer_turn, gint nchequers) { gchar board_str[256]; BoardData *bd = board->board_data; TanBoard old_points; /* Treat a reset of the position to old_board as a no-op while * in edit mode. */ if (ToolbarIsEditing(pwToolbar) && bd->playing && EqualBoards((ConstTanBoard) bd->old_board, (ConstTanBoard) points)) { read_board(bd, old_points); if (bd->turn < 0) SwapSides(old_points); points = old_points; } else memcpy(bd->old_board, points, sizeof(bd->old_board)); FIBSBoard(board_str, points, roll, name, opp_name, matchto, score, opp_score, die0, die1, ms.nCube, ms.fCubeOwner, ms.fDoubled, ms.fTurn, ms.fCrawford, nchequers, ms.fPostCrawford); if (gtk_widget_get_realized(pwMain)) board_set(board, board_str, ms.fResigned == -1 ? 0 : -bd->turn * ms.fResigned, ms.fCubeUse); /* FIXME update names, score, match length */ if (bd->rd->nSize == 0) return 0; bd->computer_turn = computer_turn; if (die0) { if (fGUIHighDieFirst) { if (die0 < die1) swap(&die0, &die1); } else { /* shuffle them in case they were ordered */ if (RAND % 2) swap(&die0, &die1); } } update_buttons(bd); #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { UpdateShadows(bd->bd3d); DrawScene3d(bd->bd3d); } else #endif { if (fJustSwappedPlayers) { if (ms.anDice[0] > 0) RollDice2d(bd); gtk_widget_queue_draw(bd->drawing_area); fJustSwappedPlayers = FALSE; } } return 0; } int showingGray; void GrayScaleColC(unsigned char *pCols) { float tmp[3]; float gs; tmp[0] = pCols[0] + 128.0f; tmp[1] = pCols[1] + 128.0f; tmp[2] = pCols[2] + 128.0f; gs = ((tmp[0] + tmp[1] + tmp[2]) / 3.0f) * 2.0f; pCols[0] = (unsigned char) ((tmp[0] + gs) / 3.0f - 128.0f); pCols[1] = (unsigned char) ((tmp[1] + gs) / 3.0f - 128.0f); pCols[2] = (unsigned char) ((tmp[2] + gs) / 3.0f - 128.0f); } /* Create all of the size/colour-dependent pixmaps. */ extern void board_create_pixmaps(GtkWidget * UNUSED(board), BoardData * bd) { unsigned char auch[20 * 20 * 3], auchBoard[BOARD_WIDTH * 3 * BOARD_HEIGHT * 3 * 3], auchChequers[2][CHEQUER_WIDTH * 3 * CHEQUER_HEIGHT * 3 * 4]; unsigned short asRefract[2][CHEQUER_WIDTH * 3 * CHEQUER_HEIGHT * 3]; int i, nSizeReal; int fgrayBoard = FALSE; unsigned char aanBoardColourTemp[4][4]; #if defined(USE_BOARD3D) float aarColourTemp[2][4]; float arCubeColourTemp[4]; float aarDiceColourTemp[2][4]; float aarDiceDotColourTemp[2][4]; int fdisp3d = FALSE; if (display_is_3d(bd->rd)) { int j; fdisp3d = TRUE; /* As settings currently separate, copy 3d colours so 2d dialog colours (small chequers, dice etc.) are correct */ memcpy(aarColourTemp, bd->rd->aarColour, sizeof(bd->rd->aarColour)); memcpy(aanBoardColourTemp[0], bd->rd->aanBoardColour[0], sizeof(bd->rd->aanBoardColour[0])); memcpy(arCubeColourTemp, bd->rd->arCubeColour, sizeof(bd->rd->arCubeColour)); memcpy(aarDiceColourTemp, bd->rd->aarDiceColour, sizeof(bd->rd->aarDiceColour)); memcpy(aarDiceDotColourTemp, bd->rd->aarDiceDotColour, sizeof(bd->rd->aarDiceDotColour)); for (j = 0; j < 4; j++) { bd->rd->aanBoardColour[0][j] = (unsigned char) (bd->rd->BaseMat.ambientColour[j] * 0xff); bd->rd->arCubeColour[j] = bd->rd->CubeMat.ambientColour[j]; for (i = 0; i < 2; i++) { bd->rd->aarColour[i][j] = bd->rd->ChequerMat[i].ambientColour[j]; bd->rd->aarDiceColour[i][j] = bd->rd->DiceMat[i].ambientColour[j]; bd->rd->aarDiceDotColour[i][j] = bd->rd->DiceDotMat[i].ambientColour[j]; } } } else #endif { if (bd->grayBoard) { showingGray = bd->grayBoard; fgrayBoard = TRUE; memcpy(aanBoardColourTemp, bd->rd->aanBoardColour, sizeof(bd->rd->aanBoardColour)); for (i = 0; i < 4; i++) GrayScaleColC(bd->rd->aanBoardColour[i]); } } RenderImages(bd->rd, &bd->ri); nSizeReal = bd->rd->nSize; bd->rd->nSize = 3; RenderBoard(bd->rd, auchBoard, BOARD_WIDTH * 3); RenderChequers(bd->rd, auchChequers[0], auchChequers[1], asRefract[0], asRefract[1], CHEQUER_WIDTH * 3 * 4); bd->rd->nSize = nSizeReal; for (i = 0; i < 2; i++) { cairo_t *cr; CopyArea(auch, 20 * 3, auchBoard + 3 * 3 * BOARD_WIDTH * 3 + 3 * 3 * 3, BOARD_WIDTH * 3 * 3, 10, 10); CopyArea(auch + 10 * 3, 20 * 3, auchBoard + 3 * 3 * BOARD_WIDTH * 3 + 3 * 3 * 3, BOARD_WIDTH * 3 * 3, 10, 10); CopyArea(auch + 10 * 3 * 20, 20 * 3, auchBoard + 3 * 3 * BOARD_WIDTH * 3 + 3 * 3 * 3, BOARD_WIDTH * 3 * 3, 10, 10); CopyArea(auch + 10 * 3 + 10 * 3 * 20, 20 * 3, auchBoard + 3 * 3 * BOARD_WIDTH * 3 + 3 * 3 * 3, BOARD_WIDTH * 3 * 3, 10, 10); RefractBlend(auch + 20 * 3 + 3, 20 * 3, auchBoard + 3 * 3 * BOARD_WIDTH * 3 + 3 * 3 * 3, BOARD_WIDTH * 3 * 3, auchChequers[i], CHEQUER_WIDTH * 3 * 4, asRefract[i], CHEQUER_WIDTH * 3, CHEQUER_WIDTH * 3, CHEQUER_HEIGHT * 3); cr = gtk_locdef_cairo_create_from_surface(bd->appmKey[i]); draw_rgb_image(cr, auch, 0, 0, 20, 20); cairo_destroy(cr); } #if defined(USE_BOARD3D) if (fdisp3d) { /* Restore 2d colours */ g_assert(display_is_3d(bd->rd)); memcpy(bd->rd->aarColour, aarColourTemp, sizeof(bd->rd->aarColour)); memcpy(bd->rd->aanBoardColour[0], aanBoardColourTemp[0], sizeof(bd->rd->aanBoardColour[0])); memcpy(bd->rd->arCubeColour, arCubeColourTemp, sizeof(bd->rd->arCubeColour)); memcpy(bd->rd->aarDiceColour, aarDiceColourTemp, sizeof(bd->rd->aarDiceColour)); memcpy(bd->rd->aarDiceDotColour, aarDiceDotColourTemp, sizeof(bd->rd->aarDiceDotColour)); } else #endif { if (fgrayBoard) { g_assert(bd->grayBoard); showingGray = FALSE; memcpy(bd->rd->aanBoardColour, aanBoardColourTemp, sizeof(bd->rd->aanBoardColour)); } } } extern void board_free_pixmaps(BoardData * bd) { FreeImages(&bd->ri); } #if defined(USE_BOARD3D) extern void DisplayCorrectBoardType(BoardData * bd, BoardData3d * UNUSED(bd3d), renderdata * UNUSED(prd)) { if (display_is_3d(bd->rd)) { gtk_widget_hide(bd->drawing_area); gtk_widget_show(GetDrawingArea3d(bd->bd3d)); DrawScene3d(bd->bd3d); updateHingeOccPos(bd->bd3d, bd->rd->fHinges3d); } else { if (widget3dValid) gtk_widget_hide(GetDrawingArea3d(bd->bd3d)); gtk_widget_show(bd->drawing_area); gtk_widget_queue_draw(bd->drawing_area); } } #endif static void board_size_allocate(GtkWidget * board, GtkAllocation * allocation) { BoardData *bd = BOARD(board)->board_data; guint old_size = bd->rd->nSize, new_size; GtkAllocation child_allocation; GtkRequisition requisition; #if GTK_CHECK_VERSION(3,0,0) GTK_WIDGET_CLASS(board_parent_class)->size_allocate(board, allocation); #endif gtk_widget_set_allocation(board, allocation); /* position ID, match ID: just below toolbar */ if (bd->rd->fShowGameInfo) { #if GTK_CHECK_VERSION(3,0,0) gtk_widget_get_preferred_size(bd->table, &requisition, NULL); #else gtk_widget_get_child_requisition(bd->table, &requisition); #endif allocation->height -= requisition.height; child_allocation.x = allocation->x; child_allocation.y = allocation->y + allocation->height; child_allocation.width = allocation->width; child_allocation.height = requisition.height; gtk_widget_size_allocate(bd->table, &child_allocation); } /* ensure there is room for the dice area or the move, whichever is * bigger */ if (bd->rd->fDiceArea #if defined(USE_BOARD3D) && (display_is_2d(bd->rd)) #endif ) { new_size = MIN(allocation->width / BOARD_WIDTH, (allocation->height - 2) / (BOARD_HEIGHT + DIE_HEIGHT)); /* FIXME: is 89 correct? */ /* subtract pixels used */ allocation->height -= new_size * DIE_HEIGHT + 2; } else { new_size = MIN(allocation->width / BOARD_WIDTH, (allocation->height - 2) / BOARD_HEIGHT); } /* If the window manager honours our minimum size this won't happen, but... */ if (new_size < 1) new_size = 1; if ((bd->rd->nSize = new_size) != old_size && gtk_widget_get_realized(board)) { board_free_pixmaps(bd); board_create_pixmaps(board, bd); } #if defined(USE_BOARD3D) child_allocation.width = allocation->width; child_allocation.height = allocation->height; child_allocation.x = allocation->x; child_allocation.y = allocation->y; if (widget3dValid) gtk_widget_size_allocate(GetDrawingArea3d(bd->bd3d), &child_allocation); #endif child_allocation.width = BOARD_WIDTH * bd->rd->nSize; child_allocation.x = allocation->x + ((allocation->width - child_allocation.width) >> 1); child_allocation.height = BOARD_HEIGHT * bd->rd->nSize; child_allocation.y = allocation->y + ((allocation->height - BOARD_HEIGHT * bd->rd->nSize) >> 1); #if GTK_CHECK_VERSION(3,0,0) { gint min_width, min_height; gtk_widget_get_preferred_width(bd->drawing_area, &min_width, NULL); gtk_widget_get_preferred_height(bd->drawing_area, &min_height, NULL); g_assert(child_allocation.width >= min_width); g_assert(child_allocation.height >= min_height); } #endif gtk_widget_size_allocate(bd->drawing_area, &child_allocation); /* allocation for dice area */ if (bd->rd->fDiceArea #if defined(USE_BOARD3D) && (display_is_2d(bd->rd)) #endif ) { child_allocation.width = (2 * DIE_WIDTH + 1) * bd->rd->nSize; child_allocation.x += (BOARD_WIDTH - (2 * DIE_WIDTH + 1)) * bd->rd->nSize; child_allocation.height = DIE_HEIGHT * bd->rd->nSize; child_allocation.y += BOARD_HEIGHT * bd->rd->nSize + 1; gtk_widget_size_allocate(bd->dice_area, &child_allocation); } } static void AddChild(GtkWidget * pw, GtkRequisition * pr) { GtkRequisition r; #if GTK_CHECK_VERSION(3,0,0) gtk_widget_get_preferred_size(pw, &r, NULL); #else gtk_widget_size_request(pw, &r); #endif if (r.width > pr->width) pr->width = r.width; pr->height += r.height; } static void board_size_request(GtkWidget * pw, GtkRequisition * pr) { BoardData *bd; if (!pr) return; pr->width = pr->height = 0; if (!pw) return; bd = BOARD(pw)->board_data; AddChild(bd->table, pr); if (bd->rd->fDiceArea) pr->height += DIE_HEIGHT; if (pr->width < BOARD_WIDTH) pr->width = BOARD_WIDTH; pr->height += BOARD_HEIGHT + 2; } #if GTK_CHECK_VERSION(3,0,0) static void board_get_preferred_width(GtkWidget * widget, gint * minimal_width, gint * natural_width) { GtkRequisition requisition; board_size_request(widget, &requisition); *minimal_width = *natural_width = requisition.width; } static void board_get_preferred_height(GtkWidget * widget, gint * minimal_height, gint * natural_height) { GtkRequisition requisition; board_size_request(widget, &requisition); *minimal_height = *natural_height = requisition.height; } #endif static void board_realize(GtkWidget * board) { BoardData *bd = BOARD(board)->board_data; if (GTK_WIDGET_CLASS(parent_class)->realize) GTK_WIDGET_CLASS(parent_class)->realize(board); board_create_pixmaps(board, bd); } static void board_show_child(GtkWidget * pwChild, BoardData * pbd) { if (pwChild != pbd->dice_area) gtk_widget_show_all(pwChild); } /* Show all children except the dice area; that one hides and shows * itself. */ static void board_show_all(GtkWidget * pw) { BoardData *bd = BOARD(pw)->board_data; gtk_container_foreach(GTK_CONTAINER(pw), (GtkCallback) board_show_child, bd); gtk_widget_show(pw); } static void UpdateCrawfordToggle(GtkWidget * UNUSED(pw), BoardData * bd) { int anScoreNew[2]; int allowCrawford; /* Adjust the crawford toggle box by disabling it when the score & matchlen * make crawford impossible */ int nMatchLen = (int) gtk_adjustment_get_value(GTK_ADJUSTMENT(bd->amatch)); anScoreNew[0] = (int) gtk_adjustment_get_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(bd->score0))); anScoreNew[1] = (int) gtk_adjustment_get_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(bd->score1))); allowCrawford = ((nMatchLen > 0) && (anScoreNew[0] != anScoreNew[1]) && (((nMatchLen - anScoreNew[0]) == 1) || ((nMatchLen - anScoreNew[1]) == 1)) && (anScoreNew[0] < nMatchLen && anScoreNew[1] < nMatchLen)); gtk_widget_set_sensitive(bd->crawford, allowCrawford); if (!allowCrawford && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->crawford)) == TRUE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->crawford), FALSE); } static void match_change_val(GtkWidget * UNUSED(pw), BoardData * bd) { int nMatchLen = (int) gtk_adjustment_get_value(GTK_ADJUSTMENT(bd->amatch)); if (nMatchLen && gtk_widget_get_parent_window(GTK_WIDGET(bd->jacoby))) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->jacoby), fJacoby); gtk_container_remove(GTK_CONTAINER(bd->pwvboxcnt), bd->jacoby); gtk_container_add(GTK_CONTAINER(bd->pwvboxcnt), bd->crawford); gtk_widget_show(bd->crawford); } else if (nMatchLen == 0 && gtk_widget_get_parent_window(GTK_WIDGET(bd->crawford))) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->crawford), FALSE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->jacoby), fJacoby); gtk_container_remove(GTK_CONTAINER(bd->pwvboxcnt), bd->crawford); gtk_container_add(GTK_CONTAINER(bd->pwvboxcnt), bd->jacoby); gtk_widget_show(bd->jacoby); } } static void board_set_crawford(GtkWidget * UNUSED(pw), BoardData * bd) { /* Don't allow changes unless editing */ if (!ToolbarIsEditing(pwToolbar)) { SetCrawfordToggle(bd); outputl(_("You can only change whether this is the Crawford game when editing")); outputx(); } } static void board_set_jacoby(GtkWidget * UNUSED(pw), BoardData * bd) { /* Don't allow changes unless editing */ if (!ToolbarIsEditing(pwToolbar)) { SetJacobyToggle(bd); outputl(_("You can only enable Jacoby while editing a position")); outputx(); } } extern void board_edit(BoardData * bd) { int f = ToolbarIsEditing(pwToolbar); int changed = FALSE; update_move(bd); update_buttons(bd); if (bd->crawford) gtk_widget_set_sensitive(bd->crawford, f); if (bd->jacoby) gtk_widget_set_sensitive(bd->jacoby, f); if (fGUIGrayEdit) bd->grayBoard = f; else bd->grayBoard = FALSE; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { DrawScene3d(bd->bd3d); } else #endif { board_free_pixmaps(bd); board_create_pixmaps(pwBoard, bd); gtk_widget_queue_draw(bd->drawing_area); } if (f) { /* Close hint window */ DestroyPanel(WINDOW_HINT); /* Entering edit mode: enable entry fields for names and scores */ gtk_multiview_set_current(GTK_MULTIVIEW(bd->mname0), bd->name0); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mname1), bd->name1); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mscore0), bd->score0); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mscore1), bd->score1); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mmatch), bd->match); } else { /* Editing complete; set board. */ TanBoard points; int anScoreNew[2], nMatchToNew, crawford, jacoby; const char *pch0, *pch1; char sz[64]; /* "set board XXXXXXXXXXXXXX" */ /* We need to query all the widgets before issuing any commands, * since those commands have side effects which disturb other * widgets. */ crawford = jacoby = FALSE; if (bd->crawford) crawford = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->crawford)); if (bd->jacoby) jacoby = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->jacoby)); pch0 = gtk_entry_get_text(GTK_ENTRY(bd->name0)); pch1 = gtk_entry_get_text(GTK_ENTRY(bd->name1)); anScoreNew[0] = (int) gtk_adjustment_get_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(bd->score0))); anScoreNew[1] = (int) gtk_adjustment_get_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(bd->score1))); nMatchToNew = (int) gtk_adjustment_get_value(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(bd->match))); read_board(bd, points); outputpostpone(); /* NB: these comparisons are case-sensitive, and do not use * CompareNames(), so that the user can modify the case of names. We * need to change the names together, because set player 0 name changes * the contents of the player 1 gtk_entry and thereby pch1. */ if (strcmp(pch0, ap[0].szName) || strcmp(pch1, ap[1].szName)) { char sz0[64], sz1[64]; sprintf(sz0, "set player 0 name %s", pch0); sprintf(sz1, "set player 1 name %s", pch1); UserCommand(sz0); UserCommand(sz1); } if (bd->playing && !EqualBoards(msBoard(), (ConstTanBoard) points)) { sprintf(sz, "set board %s", PositionID((ConstTanBoard) points)); UserCommand(sz); } if (anScoreNew[0] != ms.anScore[0] || anScoreNew[1] != ms.anScore[1]) changed = TRUE; if (jacoby != bd->jacoby_flag || nMatchToNew != ms.nMatchTo) { if (!nMatchToNew) bd->crawford_game = crawford = FALSE; else ms.fJacoby = bd->jacoby_flag = jacoby; changed = TRUE; } if (nMatchToNew != ms.nMatchTo || changed) { /* new match length; issue "set matchid ..." command */ if (nMatchToNew) if ((anScoreNew[0] >= nMatchToNew) || (anScoreNew[1] >= nMatchToNew)) anScoreNew[0] = anScoreNew[1] = 0; if ((bd->diceRoll[0] > 6) || (bd->diceRoll[1] > 6)) { bd->diceRoll[0] = bd->diceRoll[1] = 0; } sprintf(sz, "set matchid %s", MatchID(bd->diceRoll, ms.fTurn, ms.fResigned, ms.fDoubled, ms.fMove, ms.fCubeOwner, crawford, nMatchToNew, anScoreNew, bd->cube, jacoby, ms.gs)); UserCommand(sz); } /* Update if crawford was changed. */ if (crawford != bd->crawford_game) { sprintf(sz, "set crawford %s", crawford ? "on" : "off"); UserCommand(sz); bd->crawford_game = ms.fCrawford = crawford; } if (crawford) { ms.fCubeOwner = -1; ms.nCube = 1; bd->cube_owner = 0; bd->cube = 0; bd->doubled = 0; } outputresume(); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mname0), bd->lname0); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mname1), bd->lname1); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mscore0), bd->lscore0); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mscore1), bd->lscore1); gtk_multiview_set_current(GTK_MULTIVIEW(bd->mmatch), bd->lmatch); } } static void DrawAlphaImage(cairo_t * cr, int x, int y, unsigned char *puchSrc, int nStride, int cx, int cy) { unsigned char *puch, *puchDest, *auch = g_alloca(cx * cy * 4); int ix, iy; GdkPixbuf *ppb; puchDest = auch; puch = puchSrc; nStride -= cx * 4; for (iy = 0; iy < cy; iy++) { for (ix = 0; ix < cx; ix++) { puchDest[0] = (unsigned char) (puch[0] * 0x100 / (0x100 - puch[3])); puchDest[1] = (unsigned char) (puch[1] * 0x100 / (0x100 - puch[3])); puchDest[2] = (unsigned char) (puch[2] * 0x100 / (0x100 - puch[3])); puchDest[3] = (unsigned char) (0xFF - puch[3]); puch += 4; puchDest += 4; } puch += nStride; } ppb = gdk_pixbuf_new_from_data(auch, GDK_COLORSPACE_RGB, TRUE, 8, cx, cy, cx * 4, NULL, NULL); gdk_cairo_set_source_pixbuf(cr, ppb, x, y); cairo_paint(cr); g_object_unref(G_OBJECT(ppb)); } extern void DrawDie(cairo_t * cr, unsigned char *achDice[], unsigned char *achPip[], const int s, int x, int y, int fColour, int n, int alpha) { int ix, iy, afPip[9]; GdkPixbuf *pixbuf; if (alpha) DrawAlphaImage(cr, x, y, achDice[fColour], DIE_WIDTH * s * 4, DIE_WIDTH * s, DIE_HEIGHT * s); else draw_rgb_image(cr, achDice[fColour], x, y, DIE_WIDTH * s, DIE_HEIGHT * s); afPip[0] = afPip[8] = (n == 2) || (n == 3) || (n == 4) || (n == 5) || (n == 6); afPip[1] = afPip[7] = 0; afPip[2] = afPip[6] = (n == 4) || (n == 5) || (n == 6); afPip[3] = afPip[5] = n == 6; afPip[4] = n & 1; pixbuf = gdk_pixbuf_new_from_data(achPip[fColour], GDK_COLORSPACE_RGB, FALSE, 8, s, s, s * 3, NULL, NULL); for (iy = 0; iy < 3; iy++) for (ix = 0; ix < 3; ix++) if (afPip[iy * 3 + ix]) { gdk_cairo_set_source_pixbuf(cr, pixbuf, (int) (s * 1.5 + x + 1.5 * s * ix), (int) (s * 1.5 + y + 1.5 * s * iy)); cairo_paint(cr); } g_object_unref(pixbuf); } static gboolean dice_draw(GtkWidget * UNUSED(dice), cairo_t * cr, BoardData * bd) { if (bd->rd->nSize == 0 || bd->diceShown == DICE_NOT_SHOWN) return TRUE; DrawDie(cr, bd->ri.achDice, bd->ri.achPip, bd->rd->nSize, 0, 0, bd->turn > 0, bd->diceRoll[0], TRUE); DrawDie(cr, bd->ri.achDice, bd->ri.achPip, bd->rd->nSize, (DIE_WIDTH + 1) * bd->rd->nSize, 0, bd->turn > 0, bd->diceRoll[1], TRUE); return TRUE; } #if ! GTK_CHECK_VERSION(3,0,0) static gboolean dice_expose(GtkWidget * dice, GdkEventExpose * UNUSED(event), BoardData * bd) { cairo_t *cr; cr = gdk_cairo_create(gtk_widget_get_window(dice)); dice_draw(dice, cr, bd); cairo_destroy(cr); return TRUE; } #endif static gboolean dice_press(GtkWidget * UNUSED(dice), GdkEvent * UNUSED(event), BoardData * UNUSED(bd)) { quick_roll(); return TRUE; } static gboolean key_press(GtkWidget * UNUSED(pw), GdkEvent * UNUSED(event), void *p) { if (ToolbarIsEditing(pwToolbar)) UserCommand(p ? "set turn 1" : "set turn 0"); return TRUE; } /* Create a widget to display a single chequer (used as a key in the * player table). */ static GtkWidget * chequer_key_new(int iPlayer, Board * board) { GtkWidget *pw = gtk_event_box_new(), *pwImage; BoardData *bd = board->board_data; char sz[128]; gtk_event_box_set_visible_window(GTK_EVENT_BOX(pw), FALSE); bd->appmKey[iPlayer] = gtk_locdef_surface_create(GTK_WIDGET(board), 20, 20); pwImage = gtk_locdef_image_new_from_surface(bd->appmKey[iPlayer]); gtk_container_add(GTK_CONTAINER(pw), pwImage); gtk_widget_add_events(pw, GDK_BUTTON_PRESS_MASK); g_signal_connect(G_OBJECT(pw), "button_press_event", G_CALLBACK(key_press), iPlayer ? pw : NULL); sprintf(sz, _("Set player %d on roll."), iPlayer); gtk_widget_set_tooltip_text(pw, sz); return pw; } static void board_init(Board * board) { BoardData *bd = g_malloc(sizeof(*bd)); GtkWidget *pw; GtkWidget *pwFrame; GtkWidget *pwvbox; int signals; #if GTK_CHECK_VERSION(3,0,0) gtk_orientable_set_orientation(GTK_ORIENTABLE(board), GTK_ORIENTATION_VERTICAL); #endif board->board_data = bd; bd->widget = GTK_WIDGET(board); bd->drag_point = -1; bd->crawford_game = FALSE; bd->jacoby_flag = FALSE; bd->playing = FALSE; bd->cube_use = TRUE; bd->all_moves = NULL; bd->x_dice[0] = bd->x_dice[1] = -10; bd->diceRoll[0] = bd->diceRoll[1] = 0; /* board drawing area */ bd->drawing_area = gtk_drawing_area_new(); /* gtk_widget_set_name(GTK_WIDGET(bd->drawing_area), "background"); */ gtk_widget_set_size_request(bd->drawing_area, BOARD_WIDTH, BOARD_HEIGHT); signals = GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; if (!inPreviewWindow) signals |= GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK; gtk_widget_add_events(GTK_WIDGET(bd->drawing_area), signals); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_hexpand(bd->drawing_area, TRUE); gtk_widget_set_vexpand(bd->drawing_area, TRUE); #endif gtk_box_pack_start(GTK_BOX(board), bd->drawing_area, TRUE, TRUE, 0); #if defined(USE_BOARD3D) /* 3d board drawing area */ widget3dValid = widget3dValid ? CreateGLWidget(bd, !inPreviewWindow) : FALSE; if (widget3dValid) { gtk_box_pack_start(GTK_BOX(board), GetDrawingArea3d(bd->bd3d), TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_hexpand(GetDrawingArea3d(bd->bd3d), TRUE); gtk_widget_set_vexpand(GetDrawingArea3d(bd->bd3d), TRUE); #endif } else bd->bd3d = NULL; #endif /* various stuff below the board */ #if GTK_CHECK_VERSION(3,0,0) bd->table = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else bd->table = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_end(GTK_BOX(board), bd->table, FALSE, TRUE, 0); /* * player 0 */ pwFrame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(bd->table), pwFrame, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwvbox); /* first row: picture of chequer + name of player */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); /* picture of chequer */ bd->key0 = chequer_key_new(0, board); gtk_box_pack_start(GTK_BOX(pw), bd->key0, FALSE, FALSE, 4); /* name of player */ bd->mname0 = gtk_multiview_new(); gtk_box_pack_start(GTK_BOX(pw), bd->mname0, FALSE, FALSE, 8); bd->name0 = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(bd->name0), MAX_NAME_LEN); bd->lname0 = gtk_label_new(NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(bd->lname0, GTK_ALIGN_START); gtk_widget_set_valign(bd->lname0, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(bd->lname0), 0, 0.5); #endif gtk_container_add(GTK_CONTAINER(bd->mname0), bd->lname0); gtk_container_add(GTK_CONTAINER(bd->mname0), bd->name0); /* second row: "Score" + score */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); /* score label */ gtk_box_pack_start(GTK_BOX(pw), gtk_label_new(_("Score:")), FALSE, FALSE, 4); /* score */ bd->mscore0 = gtk_multiview_new(); gtk_box_pack_start(GTK_BOX(pw), bd->mscore0, FALSE, FALSE, 8); bd->ascore0 = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 32767, 1, 1, 0)); bd->score0 = gtk_spin_button_new(GTK_ADJUSTMENT(bd->ascore0), 1, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(bd->score0), TRUE); bd->lscore0 = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(bd->mscore0), bd->lscore0); gtk_container_add(GTK_CONTAINER(bd->mscore0), bd->score0); /* third row: pip count and epc */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); /* pip count label */ gtk_box_pack_start(GTK_BOX(pw), bd->pipcountlabel0 = gtk_label_new(NULL), FALSE, FALSE, 4); /* pip count */ /* FIXME: this box looks different than that of the score above, probably because it contains only labels while the other has a an adjustment. */ gtk_box_pack_start(GTK_BOX(pw), bd->pipcount0 = gtk_label_new(NULL), FALSE, FALSE, 8); /* * player 1 */ pwFrame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(bd->table), pwFrame, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwvbox); /* first row: picture of chequer + name of player */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); /* picture of chequer */ bd->key1 = chequer_key_new(1, board); gtk_box_pack_start(GTK_BOX(pw), bd->key1, FALSE, FALSE, 4); /* name of player */ bd->mname1 = gtk_multiview_new(); gtk_box_pack_start(GTK_BOX(pw), bd->mname1, FALSE, FALSE, 8); bd->name1 = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(bd->name1), MAX_NAME_LEN); bd->lname1 = gtk_label_new(NULL); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(bd->lname1, GTK_ALIGN_START); gtk_widget_set_valign(bd->lname1, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(bd->lname1), 0, 0.5); #endif gtk_container_add(GTK_CONTAINER(bd->mname1), bd->lname1); gtk_container_add(GTK_CONTAINER(bd->mname1), bd->name1); /* second row: "Score" + score */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); /* score label */ gtk_box_pack_start(GTK_BOX(pw), gtk_label_new(_("Score:")), FALSE, FALSE, 4); /* score */ bd->mscore1 = gtk_multiview_new(); gtk_box_pack_start(GTK_BOX(pw), bd->mscore1, FALSE, FALSE, 8); bd->ascore1 = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 32767, 1, 1, 0)); bd->score1 = gtk_spin_button_new(GTK_ADJUSTMENT(bd->ascore1), 1, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(bd->score1), TRUE); bd->lscore1 = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(bd->mscore1), bd->lscore1); gtk_container_add(GTK_CONTAINER(bd->mscore1), bd->score1); /* third row: pip count and epc */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); /* pip count label */ gtk_box_pack_start(GTK_BOX(pw), bd->pipcountlabel1 = gtk_label_new(NULL), FALSE, FALSE, 4); /* pip count */ gtk_box_pack_start(GTK_BOX(pw), bd->pipcount1 = gtk_label_new(NULL), FALSE, FALSE, 8); /* * move string, match length, crawford flag, dice */ pwFrame = gtk_frame_new(NULL); gtk_box_pack_end(GTK_BOX(bd->table), pwFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwvbox); /* move string */ gtk_box_pack_start(GTK_BOX(pwvbox), bd->wmove = gtk_label_new(NULL), FALSE, FALSE, 0); gtk_widget_set_name(bd->wmove, "gnubg-move-current"); /* match length */ #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pw), gtk_label_new(_("Match:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pw), bd->mmatch = gtk_multiview_new(), FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(bd->mmatch), bd->lmatch = gtk_label_new(NULL)); bd->amatch = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, MAXSCORE, 1, 1, 0)); bd->match = gtk_spin_button_new(GTK_ADJUSTMENT(bd->amatch), 1, 0); g_signal_connect(G_OBJECT(bd->match), "value-changed", G_CALLBACK(match_change_val), bd); gtk_container_add(GTK_CONTAINER(bd->mmatch), bd->match); /* crawford and jacoby flag */ bd->crawford = gtk_check_button_new_with_label(_("Crawford game")); bd->jacoby = gtk_check_button_new_with_label(_("Jacoby")); /* g_signal_connect( G_OBJECT( bd->crawford ), "toggled", * G_CALLBACK( board_set_crawford ), bd ); * g_signal_connect( G_OBJECT( bd->jacoby ), "toggled", * G_CALLBACK( board_set_jacoby ), bd ); */ bd->pwvboxcnt = gtk_event_box_new(); if (ms.nMatchTo) gtk_container_add(GTK_CONTAINER(bd->pwvboxcnt), bd->crawford); else gtk_container_add(GTK_CONTAINER(bd->pwvboxcnt), bd->jacoby); gtk_box_pack_start(GTK_BOX(pwvbox), bd->pwvboxcnt, FALSE, FALSE, 0); g_object_ref(bd->jacoby); g_object_ref(bd->crawford); #if !GTK_CHECK_VERSION(3,18,0) gtk_adjustment_value_changed(GTK_ADJUSTMENT(bd->amatch)); #endif /* dice drawing area */ gtk_container_add(GTK_CONTAINER(board), bd->dice_area = gtk_drawing_area_new()); /* gtk_widget_set_name( GTK_WIDGET(bd->dice_area), "dice_area"); */ gtk_widget_set_size_request(bd->dice_area, 2 * DIE_WIDTH + 1, DIE_HEIGHT); gtk_widget_add_events(GTK_WIDGET(bd->dice_area), GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK); #if GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(bd->drawing_area), "draw", G_CALLBACK(board_draw), bd); #else g_signal_connect(G_OBJECT(bd->drawing_area), "expose_event", G_CALLBACK(board_expose), bd); #endif g_signal_connect(G_OBJECT(bd->drawing_area), "button_press_event", G_CALLBACK(board_button_press), bd); g_signal_connect(G_OBJECT(bd->drawing_area), "button_release_event", G_CALLBACK(board_button_release), bd); g_signal_connect(G_OBJECT(bd->drawing_area), "motion_notify_event", G_CALLBACK(board_motion_notify), bd); #if GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(bd->dice_area), "draw", G_CALLBACK(dice_draw), bd); #else g_signal_connect(G_OBJECT(bd->dice_area), "expose_event", G_CALLBACK(dice_expose), bd); #endif g_signal_connect(G_OBJECT(bd->dice_area), "button_press_event", G_CALLBACK(dice_press), bd); g_signal_connect(G_OBJECT(bd->amatch), "value-changed", G_CALLBACK(score_changed), bd); g_signal_connect(G_OBJECT(bd->ascore0), "value-changed", G_CALLBACK(score_changed), bd); g_signal_connect(G_OBJECT(bd->ascore1), "value-changed", G_CALLBACK(score_changed), bd); UpdateCrawfordToggle(NULL, bd); } static void board_class_init(BoardClass * c) { parent_class = g_type_class_peek_parent(c); g_assert(parent_class); ((GtkWidgetClass *) c)->size_allocate = board_size_allocate; #if GTK_CHECK_VERSION(3,0,0) ((GtkWidgetClass *) c)->get_preferred_width = board_get_preferred_width; ((GtkWidgetClass *) c)->get_preferred_height = board_get_preferred_height; #else ((GtkWidgetClass *) c)->size_request = board_size_request; #endif ((GtkWidgetClass *) c)->realize = board_realize; ((GtkWidgetClass *) c)->show_all = board_show_all; } #define N_CUBES_IN_WIDGET 7 static gboolean cube_widget_draw(GtkWidget * cube, cairo_t * cr, BoardData * bd) { int n, nValue; unsigned char *puch; int setSize = bd->rd->nSize; int cubeStride = setSize * CUBE_WIDTH * 4; int cubeFaceStride = setSize * CUBE_LABEL_WIDTH * 3; n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cube), "user_data")); if ((nValue = n % N_CUBES_IN_WIDGET - 1) == -1) nValue = 5; /* use 64 cube for 1 */ puch = g_alloca(cubeFaceStride * CUBE_LABEL_HEIGHT * setSize); CopyAreaRotateClip(puch, cubeFaceStride, 0, 0, CUBE_LABEL_WIDTH * setSize, CUBE_LABEL_HEIGHT * setSize, TTachCubeFaces, cubeFaceStride, 0, CUBE_LABEL_HEIGHT * setSize * nValue, CUBE_LABEL_WIDTH * setSize, CUBE_LABEL_HEIGHT * setSize, 2 - n / N_CUBES_IN_WIDGET); DrawAlphaImage(cr, 0, 0, TTachCube, cubeStride, CUBE_WIDTH * setSize, CUBE_HEIGHT * setSize); draw_rgb_image(cr, puch, setSize, setSize, CUBE_LABEL_WIDTH * setSize, CUBE_LABEL_HEIGHT * setSize); return TRUE; } #if ! GTK_CHECK_VERSION(3,0,0) static gboolean cube_widget_expose(GtkWidget * cube, GdkEventExpose * UNUSED(event), BoardData * bd) { cairo_t *cr; cr = gdk_cairo_create(gtk_widget_get_window(cube)); cube_widget_draw(cube, cr, bd); cairo_destroy(cr); return TRUE; } #endif static gboolean cube_widget_press(GtkWidget * cube, GdkEvent * UNUSED(event), BoardData * UNUSED(bd)) { GtkWidget *pwTable = gtk_widget_get_parent(cube); int n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cube), "user_data")); int *an = g_object_get_data(G_OBJECT(pwTable), "user_data"); an[0] = n % N_CUBES_IN_WIDGET; /* value */ if (n < N_CUBES_IN_WIDGET) an[1] = 0; /* top player */ else if (n < N_CUBES_IN_WIDGET * 2) an[1] = -1; /* centred */ else an[1] = 1; /* bottom player */ gtk_widget_destroy(pwTable); return TRUE; } extern void DestroySetCube(GObject * UNUSED(po), GtkWidget * pw) { free(TTachCubeFaces); free(TTachCube); gtk_widget_destroy(pw); } extern GtkWidget * board_cube_widget(Board * board) { #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pw; #else GtkWidget *pw; #endif GtkWidget *pwCube; BoardData *bd = board->board_data; int x, y; int setSize = bd->rd->nSize; int cubeStride = setSize * CUBE_WIDTH * 4; int cubeFaceStride = setSize * CUBE_LABEL_WIDTH * 3; renderdata rd; #if GTK_CHECK_VERSION(3,0,0) pw = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pw), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pw), TRUE); #else pw = gtk_table_new(3, N_CUBES_IN_WIDGET, TRUE); #endif CopyAppearance(&rd); rd.nSize = setSize; #if defined(USE_BOARD3D) if (display_is_3d(bd->rd)) { for (x = 0; x < 4; x++) rd.arCubeColour[x] = bd->rd->CubeMat.ambientColour[x]; } #endif TTachCube = malloc(cubeStride * setSize * CUBE_HEIGHT); TTachCubeFaces = malloc(cubeFaceStride * setSize * CUBE_LABEL_HEIGHT * 13); RenderCube(&rd, TTachCube, cubeStride); RenderCubeFaces(&rd, TTachCubeFaces, cubeFaceStride, TTachCube, cubeStride); for (y = 0; y <= 2; y++) { for (x = 0; x <= N_CUBES_IN_WIDGET - 1; x++) { pwCube = gtk_drawing_area_new(); g_object_set_data(G_OBJECT(pwCube), "user_data", GINT_TO_POINTER((y * N_CUBES_IN_WIDGET + x))); gtk_widget_set_size_request(pwCube, CUBE_WIDTH * setSize, CUBE_HEIGHT * setSize); gtk_widget_add_events(pwCube, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK); #if GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(pwCube), "draw", G_CALLBACK(cube_widget_draw), bd); gtk_grid_attach(GTK_GRID(pw), pwCube, x, y, 1, 1); #else g_signal_connect(G_OBJECT(pwCube), "expose_event", G_CALLBACK(cube_widget_expose), bd); gtk_table_attach_defaults(GTK_TABLE(pw), pwCube, x, x + 1, y, y + 1); #endif g_signal_connect(G_OBJECT(pwCube), "button_press_event", G_CALLBACK(cube_widget_press), bd); } } #if GTK_CHECK_VERSION(3,0,0) gtk_grid_set_row_spacing(GTK_GRID(pw), 4 * setSize); gtk_grid_set_column_spacing(GTK_GRID(pw), 4 * setSize); #else gtk_table_set_row_spacings(GTK_TABLE(pw), 4 * setSize); gtk_table_set_col_spacings(GTK_TABLE(pw), 2 * setSize); #endif gtk_container_set_border_width(GTK_CONTAINER(pw), setSize); return pw; } static gboolean setdice_widget_draw(GtkWidget * dice, cairo_t * cr, SetDiceData * sdd) { int setSize = sdd->bd->rd->nSize; int n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dice), "user_data")); if (sdd->mdt == MT_FIRSTMOVE && (n % 6 == n / 6)) { DrawDie(cr, sdd->TTachGrayDice, sdd->TTachGrayPip, setSize, 0, 0, 0, n % 6 + 1, FALSE); DrawDie(cr, sdd->TTachGrayDice, sdd->TTachGrayPip, setSize, DIE_WIDTH * setSize, 0, 0, n / 6 + 1, FALSE); } else { int col1, col2; if (sdd->mdt == MT_STANDARD) col1 = col2 = (sdd->bd->turn == 1) ? 1 : 0; else if (sdd->mdt == MT_EDIT && (n % 6 == n / 6)) { col1 = 1; col2 = 0; } else col1 = col2 = ((n % 6) <= n / 6); DrawDie(cr, sdd->TTachDice, sdd->TTachPip, setSize, 0, 0, col1, n % 6 + 1, FALSE); DrawDie(cr, sdd->TTachDice, sdd->TTachPip, setSize, DIE_WIDTH * setSize, 0, col2, n / 6 + 1, FALSE); } return TRUE; } #if ! GTK_CHECK_VERSION(3,0,0) static gboolean setdice_widget_expose(GtkWidget * dice, GdkEventExpose * UNUSED(event), SetDiceData * sdd) { cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(dice)); setdice_widget_draw(dice, cr, sdd); cairo_destroy(cr); return TRUE; } #endif static gboolean dice_widget_press(GtkWidget * dice, GdkEvent * UNUSED(event), BoardData * UNUSED(bd)) { GtkWidget *pwTable = gtk_widget_get_parent(gtk_widget_get_parent(dice)); int n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dice), "user_data")); int *an = g_object_get_data(G_OBJECT(pwTable), "user_data"); an[0] = n % 6 + 1; an[1] = n / 6 + 1; gtk_widget_destroy(gtk_widget_get_toplevel(dice)); return TRUE; } static void DestroySetDice(GtkWidget * po, void *data) { SetDiceData *sdd = (SetDiceData *) data; free(sdd->TTachDice[0]); free(sdd->TTachDice[1]); free(sdd->TTachPip[0]); free(sdd->TTachPip[1]); free(sdd->TTachGrayDice[0]); free(sdd->TTachGrayPip[0]); gtk_widget_destroy(gtk_widget_get_toplevel(po)); g_free(sdd); } #if defined(USE_BOARD3D) extern void Copy3dDiceColour(renderdata * prd) { if (display_is_3d(prd)) { int i, j; for (j = 0; j < 4; j++) { for (i = 0; i < 2; i++) { prd->aarColour[i][j] = prd->ChequerMat[i].ambientColour[j]; prd->aarDiceColour[i][j] = prd->DiceMat[i].ambientColour[j]; prd->aarDiceDotColour[i][j] = prd->DiceDotMat[i].ambientColour[j]; } } } } #endif extern GtkWidget * board_dice_widget(Board * board, manualDiceType mdt) { GtkWidget *main_table; GtkWidget *pw; GtkWidget *pwDice; GtkWidget *label; char *str; BoardData *bd = board->board_data; int x, y; int setSize = bd->rd->nSize; int diceStride = setSize * DIE_WIDTH * 4; int pipStride = setSize * 3; renderdata rd; SetDiceData *sdd = (SetDiceData *) g_malloc(sizeof(SetDiceData)); #if GTK_CHECK_VERSION(3,0,0) main_table = gtk_grid_new(); pw = gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(pw), TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(pw), TRUE); #else main_table = gtk_table_new(2, 2, FALSE); pw = gtk_table_new(6, 6, TRUE); #endif sdd->bd = bd; sdd->mdt = mdt; if (mdt == MT_FIRSTMOVE) { str = g_strdup_printf(_("%s wins opening roll"), ap[0].szName); label = gtk_label_new(str); g_free(str); } else { int player = 0; if (mdt == MT_STANDARD) player = (bd->turn == 1) ? 1 : 0; str = g_strdup_printf(_("%s to roll"), ap[player].szName); label = gtk_label_new(str); g_free(str); } #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(main_table), label, 1, 0, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(main_table), label, 1, 2, 0, 1); #endif if (mdt != MT_STANDARD) { if (mdt == MT_FIRSTMOVE) { str = g_strdup_printf(_("%s wins opening roll"), ap[1].szName); label = gtk_label_new(str); g_free(str); } else { str = g_strdup_printf(_("%s to roll"), ap[1].szName); label = gtk_label_new(str); g_free(str); } gtk_label_set_angle(GTK_LABEL(label), 90); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(main_table), label, 0, 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(main_table), label, 0, 1, 1, 2); #endif } #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(main_table), pw, 1, 1, 1, 1); #else gtk_table_attach_defaults(GTK_TABLE(main_table), pw, 1, 2, 1, 2); #endif CopyAppearance(&rd); rd.nSize = setSize; #if defined(USE_BOARD3D) Copy3dDiceColour(&rd); #endif sdd->TTachDice[0] = malloc(diceStride * setSize * DIE_HEIGHT); sdd->TTachDice[1] = malloc(diceStride * setSize * DIE_HEIGHT); sdd->TTachPip[0] = malloc(pipStride * setSize); sdd->TTachPip[1] = malloc(pipStride * setSize); RenderDice(&rd, sdd->TTachDice[0], sdd->TTachDice[1], diceStride, FALSE); RenderPips(&rd, sdd->TTachPip[0], sdd->TTachPip[1], pipStride); if (mdt == MT_FIRSTMOVE) { /* Gray dice for doubles on first move */ sdd->TTachGrayDice[0] = malloc(diceStride * setSize * DIE_HEIGHT); sdd->TTachGrayPip[0] = malloc(pipStride * setSize); rd.aarDiceColour[0][0] = rd.aarDiceColour[0][1] = rd.aarDiceColour[0][2] = .75; rd.aarDiceColour[1][0] = rd.aarDiceColour[1][1] = rd.aarDiceColour[1][2] = .75; rd.aarDiceDotColour[0][0] = rd.aarDiceDotColour[0][1] = rd.aarDiceDotColour[0][2] = .25; rd.aarDiceDotColour[1][0] = rd.aarDiceDotColour[1][1] = rd.aarDiceDotColour[1][2] = .25; rd.afDieColour[0] = rd.afDieColour[1] = 0; RenderDice(&rd, sdd->TTachGrayDice[0], sdd->TTachGrayDice[0], diceStride, FALSE); RenderPips(&rd, sdd->TTachGrayPip[0], sdd->TTachGrayPip[0], pipStride); } else sdd->TTachGrayDice[0] = sdd->TTachGrayPip[0] = NULL; for (y = 0; y < 6; y++) { for (x = 0; x < 6; x++) { pwDice = gtk_drawing_area_new(); g_object_set_data(G_OBJECT(pwDice), "user_data", GINT_TO_POINTER((y * 6 + x))); gtk_widget_set_size_request(pwDice, 2 * DIE_WIDTH * setSize, DIE_HEIGHT * setSize); gtk_widget_add_events(pwDice, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK); #if GTK_CHECK_VERSION(3,0,0) g_signal_connect(G_OBJECT(pwDice), "draw", G_CALLBACK(setdice_widget_draw), sdd); gtk_grid_attach(GTK_GRID(pw), pwDice, x, y, 1, 1); #else g_signal_connect(G_OBJECT(pwDice), "expose_event", G_CALLBACK(setdice_widget_expose), sdd); gtk_table_attach_defaults(GTK_TABLE(pw), pwDice, x, x + 1, y, y + 1); #endif g_signal_connect(G_OBJECT(pwDice), "button_press_event", G_CALLBACK(dice_widget_press), bd); } } #if GTK_CHECK_VERSION(3,0,0) gtk_grid_set_row_spacing(GTK_GRID(pw), 2 * setSize); gtk_grid_set_column_spacing(GTK_GRID(pw), 1 * setSize); #else gtk_table_set_row_spacings(GTK_TABLE(pw), 2 * setSize); gtk_table_set_col_spacings(GTK_TABLE(pw), 1 * setSize); #endif gtk_container_set_border_width(GTK_CONTAINER(pw), setSize); g_signal_connect(G_OBJECT(main_table), "destroy", G_CALLBACK(DestroySetDice), sdd); return main_table; } #if defined(USE_BOARD3D) extern void InitBoardData(BoardData * bd) { /* Initialize some BoardData settings on new game start */ /* Only needed for 3d board */ if (display_is_3d(bd->rd)) { /* Move cube back to center */ bd->cube = 0; bd->cube_owner = 0; bd->doubled = 0; bd->resigned = 0; /* Set dice so 3d roll happens */ bd->diceShown = DICE_BELOW_BOARD; bd->diceRoll[0] = bd->diceRoll[1] = 0; UpdateShadows(bd->bd3d); updateFlagOccPos(bd, bd->bd3d); RecalcViewingVolume(bd); } } #endif gnubg-1.08.003/credits.sh000755 001751 000024 00000021711 14574155047 014632 0ustar00pmstaff000000 000000 #!/bin/sh # Copyright (C) 1998-2004 Gary Wong # Copyright (C) 2004-2023 the AUTHORS # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # $Id: credits.sh,v 1.168 2023/10/18 21:33:42 plm Exp $ # authors=/tmp/auth.$$ contributors=/tmp/cont.$$ support=/tmp/supp.$$ translations=/tmp/trans.$$ credit=/tmp/cred.$$ extra=/tmp/extra.$$ cat > $authors < $contributors < $support < $translations < $credit < $extra < credits.h <. */ #include typedef struct { char* Name; char* Type; } credEntry; typedef struct { const char* Title; credEntry *Entry; } credits; extern credEntry ceAuthors[]; extern credEntry ceContrib[]; extern credEntry ceTranslations[]; extern credEntry ceSupport[]; extern credEntry ceCredits[]; extern credits creditList[]; extern const char aszAUTHORS[]; extern const char aszCOPYRIGHT[]; EOF cat > credits.c <. */ #include "common.h" #include #include "credits.h" const char aszCOPYRIGHT[] = N_("Copyright (C) 1999-2004 Gary Wong.\n" "Copyright (C) 2004-2024 the AUTHORS; for details type \`show version'."); credEntry ceAuthors[] = { EOF # Authors cat $authors | sed -e 's/.*/ {"&", 0},/g' >> credits.c cat >> credits.c <> credits.c <> credits.c cat >> credits.c <> credits.c <> credits.c cat >> credits.c <> credits.c <> credits.c cat >> credits.c <> credits.c <> credits.c cat >> credits.c <> credits.c < AUTHORS <> AUTHORS cat >> AUTHORS <> AUTHORS cat >> AUTHORS <> AUTHORS cat >> AUTHORS <> AUTHORS cat >> AUTHORS <> AUTHORS cat >> AUTHORS <<'EOF' Credit is also due to those who have published information about backgammon playing programs (references will appear here later). GNU Backgammon has borrowed ideas from: EOF pr -4 -t < $extra | expand | sed 's/^/ /' >> AUTHORS cat >> AUTHORS <<'EOF' The manual for GNU Backgammon includes a chapter describing the rules of backgammon, written by Tom Keith for his Backgammon Galore web site . Library code from the following authors has been included in GNU Backgammon: Austin Appleby (the MurmurHash3 hashing function) Ulrich Drepper (an implementation of the public domain MD5 algorithm) Bob Jenkins (the ISAAC pseudo random number generator) Mutsuo Saito and Makoto Matsumoto (the Mersenne Twister PRNG) Brian Paul (the TR tile rendering library) Claes Tornberg (the mec match equity table generator) If you feel that you're not given credits for your contributions to GNU Backgammon please write to one of the developers. Please send bug reports for GNU Backgammon to: EOF # # Add AUTHORS to credits.c # cat >> credits.c <> credits.c cat >> credits.c <. */ #include "common.h" #include #include "credits.h" const char aszCOPYRIGHT[] = N_("Copyright (C) 1999-2004 Gary Wong.\n" "Copyright (C) 2004-2024 the AUTHORS; for details type `show version'."); credEntry ceAuthors[] = { {"Joseph Heled", 0}, {"Oystein Johansen", 0}, {"Jonathan Kinsey", 0}, {"David Montgomery", 0}, {"Jim Segrave", 0}, {"Joern Thyssen", 0}, {"Gary Wong", 0}, {"Christian Anthon", 0}, {"Michael Petch", 0}, {"Philippe Michel", 0}, {0, 0} }; credEntry ceContrib[] = { {"Olivier Baur", 0}, {"Holger Bochnig", 0}, {"Guido Flohr", 0}, {"Nis Joergensen", 0}, {"Petr Kadlec", 0}, {"Isaac Keslassy", 0}, {"Kaoru Takahashi", 0}, {"Stein Kulseth", 0}, {"Ingo Macherius", 0}, {"Jeremy Moore", 0}, {"Rod Roark", 0}, {"Aaron Tikuisis", 0}, {0, 0} }; credEntry ceSupport[] = { {"Oystein Johansen", N_("Web Pages") }, {"Achim Mueller", N_("Manual") }, {"Nardy Pillards", N_("Web Pages") }, {"Albert Silver", N_("Tutorial") }, {0, 0} }; credEntry ceTranslations[] = { {"Petr Kadlec", N_("Czech") }, {"Joern Thyssen", N_("Danish") }, {"Matti Kamppinen", N_("Finnish") }, {"Olivier Baur", N_("French") }, {"Achim Mueller", N_("German") }, {"Vangelis Skarmoutsos", N_("Greek") }, {"Hlynur Sigurgislason", N_("Icelandic") }, {"Renzo Campagna", N_("Italian") }, {"Yoshito Takeuchi", N_("Japanese") }, {"Mihai Varzaru", N_("Romanian") }, {"Dmitri I Gouliaev", N_("Russian") }, {"Fernando García García", N_("Spanish") }, {"Akif Dinc", N_("Turkish") }, {0, 0} }; credEntry ceCredits[] = { {"Fotis", 0}, {"Russ Allbery", 0}, {"Misja Alma", 0}, {"Kazuaki Asai", 0}, {"Eric Augustine", 0}, {"Steve Baedke", 0}, {"Erik Barfoed", 0}, {"Ron Barry", 0}, {"Frank Berger", 0}, {"Hans Berliner", 0}, {"Jim Borror", 0}, {"Chuck Bower", 0}, {"Nick Bratby", 0}, {"Adrian Bunk", 0}, {"Craig Campbell", 0}, {"Timothy Chow", 0}, {"John Chuang", 0}, {"Tristan Colgate", 0}, {"Olivier Croisille", 0}, {"Ned Cross", 0}, {"Ian Curtis", 0}, {"Christopher D. Yep", 0}, {"Bill Davidson", 0}, {"Giulio De Marco", 0}, {"Michael Depreli", 0}, {"Alberta di Silvio", 0}, {"Ian Dunstan", 0}, {"Max Durbano", 0}, {"Peter Eberhard", 0}, {"Robert Eberlein", 0}, {"James F. Kibler", 0}, {"Dan Fandrich", 0}, {"Kennedy Fraser", 0}, {"Ric Gerace", 0}, {"Michel Grimminck", 0}, {"Eric Groleau", 0}, {"Jeff Haferman", 0}, {"Alain Henry", 0}, {"Jens Hoefkens", 0}, {"Casey Hopkins", 0}, {"Martin Janke", 0}, {"Rick Janowski", 0}, {"Morten Juul Henriksen", 0}, {"Neil Kazaross", 0}, {"Mathias Kegelmann", 0}, {"Matija Kejzar", 0}, {"Johnny Kirk", 0}, {"Gerhard Knop", 0}, {"Robert Konigsberg", 0}, {"Martin Krainer", 0}, {"Elias Kritikos", 0}, {"Corrin Lakeland", 0}, {"Tim Laursen", 0}, {"Myshkin LeVine", 0}, {"Eli Liang", 0}, {"Ege Lundgren", 0}, {"Kevin Maguire", 0}, {"Massimiliano Maini", 0}, {"Alix Martin", 0}, {"Tom Martin", 0}, {"John Marttila", 0}, {"William Maslen", 0}, {"Joachim Matussek", 0}, {"Thomas Meyer", 0}, {"Daniel Murphy", 0}, {"Magnar Naustdalslid", 0}, {"Dave Neary", 0}, {"Rolf Nielsen", 0}, {"Mirori Orange", 0}, {"Peter Orum", 0}, {"Roy Passfield", 0}, {"Thomas Patrick", 0}, {"Billie Patterson", 0}, {"Zvezdan Petkovic", 0}, {"Petri Pitkanen", 0}, {"Sam Pottle", 0}, {"Henrik Ravn", 0}, {"James Rech", 0}, {"Jared Riley", 0}, {"Klaus Rindholt", 0}, {"Oliver Riordan", 0}, {"Alex Romosan", 0}, {"Hans-Juergen Schaefer", 0}, {"Steve Schreiber", 0}, {"Martin Schrode", 0}, {"Hugh Sconyers", 0}, {"Paul Selick", 0}, {"Sho Sengoku", 0}, {"Ian Shaw", 0}, {"Brian Sheppard", 0}, {"Peter Sochovsky", 0}, {"Mark Spencer", 0}, {"Scott Steiner", 0}, {"Maik Stiebler", 0}, {"W. Stroop (Rob)", 0}, {"Daisuke Takahashi", 0}, {"Yoshito Takeuchi", 0}, {"Gerry Tesauro", 0}, {"Jacques Thiriat", 0}, {"Malene Thyssen", 0}, {"Claes Tornberg", 0}, {"Stefan van den Berg", 0}, {"Bert Van Kerckhove", 0}, {"Sander van Rijnswou", 0}, {"Robert-Jan Veldhuizen", 0}, {"Morten Wang", 0}, {"JP White", 0}, {"Jeff White", 0}, {"Mike Whitton", 0}, {"Chris Wilson", 0}, {"Simon Woodhead", 0}, {"Kit Woolsey", 0}, {"Frank Worrell", 0}, {"Anders Zachrison", 0}, {"Douglas Zare", 0}, {"Michael Zehr", 0}, {"Tilemachos Zoidis", 0}, {"Louis Zulli", 0}, {0, 0} }; credits creditList[] = { {N_("Authors"), ceAuthors}, {N_("Code Contributors"), ceContrib}, {N_("Translations"), ceTranslations}, {N_("Support"), ceSupport}, {0, 0} }; const char aszAUTHORS[] = " GNU Backgammon was written by:\n" "\n" " Joseph Heled Jim Segrave Michael Petch\n" " Oystein Johansen Joern Thyssen Philippe Michel\n" " Jonathan Kinsey Gary Wong\n" " David Montgomery Christian Anthon\n" " \n" " Support by:\n" "\n" " Oystein Johansen (Web Pages) Nardy Pillards (Web Pages)\n" " Achim Mueller (Manual) Albert Silver (Tutorial)\n" "\n" " Contributors of code include:\n" "\n" " Olivier Baur Petr Kadlec Ingo Macherius\n" " Holger Bochnig Isaac Keslassy Jeremy Moore\n" " Guido Flohr Kaoru Takahashi Rod Roark\n" " Nis Joergensen Stein Kulseth Aaron Tikuisis\n" "\n" " Translations by:\n" "\n" " Petr Kadlec (Czech)\n" " Joern Thyssen (Danish)\n" " Matti Kamppinen (Finnish)\n" " Olivier Baur (French)\n" " Achim Mueller (German)\n" " Vangelis Skarmoutsos (Greek)\n" " Hlynur Sigurgislason (Icelandic)\n" " Renzo Campagna (Italian)\n" " Yoshito Takeuchi (Japanese)\n" " Mihai Varzaru (Romanian)\n" " Dmitri I Gouliaev (Russian)\n" " Fernando García García (Spanish)\n" " Akif Dinc (Turkish)\n" "\n" " Contributors (of bug reports and suggestions) include:\n" "\n" " Russ Allbery Neil Kazaross Jared Riley\n" " Misja Alma Mathias Kegelmann Klaus Rindholt\n" " Kazuaki Asai Matija Kejzar Oliver Riordan\n" " Eric Augustine Bert Van Kerckhove Alex Romosan\n" " Erik Barfoed James F. Kibler Hans-Juergen Schaefer\n" " Ron Barry Johnny Kirk Steve Schreiber\n" " Steve Baedke Gerhard Knop Hugh Sconyers\n" " Stefan van den Berg Robert Konigsberg Martin Schrode\n" " Frank Berger Martin Krainer Paul Selick\n" " Jim Borror Elias Kritikos Sho Sengoku\n" " Chuck Bower Corrin Lakeland Ian Shaw\n" " Adrian Bunk Tim Laursen Alberta di Silvio\n" " Nick Bratby Myshkin LeVine Peter Sochovsky\n" " Craig Campbell Eli Liang Mark Spencer\n" " Timothy Chow Ege Lundgren Scott Steiner\n" " John Chuang Kevin Maguire Maik Stiebler\n" " Tristan Colgate Massimiliano Maini W. Stroop (Rob)\n" " Olivier Croisille Giulio De Marco Daisuke Takahashi\n" " Ned Cross John Marttila Yoshito Takeuchi\n" " Ian Curtis Alix Martin Jacques Thiriat\n" " Bill Davidson Tom Martin Malene Thyssen\n" " Michael Depreli William Maslen Claes Tornberg\n" " Ian Dunstan Joachim Matussek Sander van Rijnswou\n" " Max Durbano Thomas Meyer Robert-Jan Veldhuizen\n" " Peter Eberhard Daniel Murphy Morten Wang\n" " Robert Eberlein Magnar Naustdalslid Jeff White\n" " Fotis Dave Neary JP White\n" " Dan Fandrich Rolf Nielsen Mike Whitton\n" " Kennedy Fraser Mirori Orange Chris Wilson\n" " Ric Gerace Peter Orum Simon Woodhead\n" " Michel Grimminck Roy Passfield Kit Woolsey\n" " Eric Groleau Thomas Patrick Frank Worrell\n" " Jeff Haferman Billie Patterson Christopher D. Yep\n" " Morten Juul Henriksen Zvezdan Petkovic Anders Zachrison\n" " Alain Henry Petri Pitkanen Douglas Zare\n" " Jens Hoefkens Sam Pottle Tilemachos Zoidis\n" " Casey Hopkins Henrik Ravn Louis Zulli\n" " Martin Janke James Rech\n" "\n" "\n" " Credit is also due to those who have published information about backgammon\n" " playing programs (references will appear here later). GNU Backgammon has\n" " borrowed ideas from:\n" "\n" " Hans Berliner Rick Janowski Gerry Tesauro Douglas Zare\n" " Chuck Bower Brian Sheppard Morten Wang Michael Zehr\n" "\n" " \n" " The manual for GNU Backgammon includes a chapter describing the rules of\n" " backgammon, written by Tom Keith for his Backgammon Galore web site\n" " .\n" "\n" "\n" " Library code from the following authors has been included in GNU Backgammon:\n" "\n" " Austin Appleby (the MurmurHash3 hashing function)\n" " Ulrich Drepper (an implementation of the public domain MD5 algorithm)\n" " Bob Jenkins (the ISAAC pseudo random number generator)\n" " Mutsuo Saito and Makoto Matsumoto (the Mersenne Twister PRNG)\n" " Brian Paul (the TR tile rendering library)\n" " Claes Tornberg (the mec match equity table generator)\n" "\n" "\n" " If you feel that you're not given credits for your contributions to\n" " GNU Backgammon please write to one of the developers.\n" "\n" "\n" " Please send bug reports for GNU Backgammon to: \n" ; gnubg-1.08.003/latex.c000644 001751 000024 00000043707 14574155047 014130 0ustar00pmstaff000000 000000 /* * Copyright (C) 2001-2002 Gary Wong * Copyright (C) 2002-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: latex.c,v 1.60 2021/12/06 23:15:17 plm Exp $ */ #include "config.h" #include #include #include "analysis.h" #include "backgammon.h" #include "drawboard.h" #include "export.h" #include "format.h" #include static const char *aszLuckTypeLaTeXAbbr[] = { "$--$", "$-$", "", "$+$", "$++$" }; static void Points1_12(FILE * pf, int y) { int i; if (fClockwise) for (i = 1; i <= 12; i++) fprintf(pf, "\\put(%d,%d){\\makebox(20,10){\\textsl{\\tiny %d}}}\n", 50 + i * 20 + (i > 6) * 20, y, i); else for (i = 1; i <= 12; i++) fprintf(pf, "\\put(%d,%d){\\makebox(20,10){\\textsl{\\tiny %d}}}\n", 330 - i * 20 - (i > 6) * 20, y, i); } static void Points13_24(FILE * pf, int y) { int i; if (fClockwise) for (i = 13; i <= 24; i++) fprintf(pf, "\\put(%d,%d){\\makebox(20,10){\\textsl{\\tiny %d}}}\n", 570 - i * 20 - (i > 18) * 20, y, i); else for (i = 13; i <= 24; i++) fprintf(pf, "\\put(%d,%d){\\makebox(20,10){\\textsl{\\tiny %d}}}\n", i * 20 - 190 + (i > 18) * 20, y, i); } static void LaTeXPrologue(FILE * pf) { fputs("\\documentclass{article}\n" "\\usepackage{epic,eepic,textcomp,ucs}\n" "\\usepackage[utf8x]{inputenc}\n" "\\newcommand{\\board}{\n" "\\shade\\path(70,20)(80,120)(90,20)(110,20)(120,120)(130,20)" "(150,20)(160,120)\n" "(170,20)(70,20)\n" "\\path(70,20)(80,120)(90,20)(100,120)(110,20)(120,120)(130,20)" "(140,120)(150,20)\n" "(160,120)(170,20)(180,120)(190,20)\n" "\\shade\\path(90,240)(100,140)(110,240)(130,240)(140,140)(150,240)" "(170,240)\n" "(180,140)(190,240)(90,240)\n" "\\path(70,240)(80,140)(90,240)(100,140)(110,240)(120,140)(130,240)" "(140,140)\n" "(150,240)(160,140)(170,240)(180,140)(190,240)\n" "\\shade\\path(210,20)(220,120)(230,20)(250,20)(260,120)(270,20)" "(290,20)(300,120)\n" "(310,20)(210,20)\n" "\\path(210,20)(220,120)(230,20)(240,120)(250,20)(260,120)(270,20)" "(280,120)\n" "(290,20)(300,120)(310,20)(320,120)(330,20)\n" "\\shade\\path(230,240)(240,140)(250,240)(270,240)(280,140)" "(290,240)(310,240)\n" "(320,140)(330,240)(230,240)\n" "\\path(210,240)(220,140)(230,240)(240,140)(250,240)(260,140)" "(270,240)(280,140)\n" "(290,240)(300,140)(310,240)(320,140)(330,240)\n" "\\path(60,10)(340,10)(340,250)(60,250)(60,10)\n" "\\path(70,20)(190,20)(190,240)(70,240)(70,20)\n" "\\path(210,20)(330,20)(330,240)(210,240)(210,20)}\n\n", pf); fputs("\\newcommand{\\blackboard}{\n" "\\board\n", pf); Points1_12(pf, 10); Points13_24(pf, 240); fputs("}\n\n", pf); fputs("\\newcommand{\\whiteboard}{\n" "\\board\n", pf); Points1_12(pf, 240); Points13_24(pf, 10); fputs("}\n\n" "\\addtolength\\textwidth{144pt}\n" "\\addtolength\\textheight{144pt}\n" "\\addtolength\\oddsidemargin{-72pt}\n" "\\addtolength\\evensidemargin{-72pt}\n" "\\addtolength\\topmargin{-72pt}\n\n" "\\setlength{\\unitlength}{0.20mm}\n\n" /* user should set size */ "\\begin{document}\n", pf); /* FIXME define commands for \cubetext, \labeltext, etc. here, which * are scaled to a size specified by the user. The other functions * should then use those definitions. */ } static void LaTeXEpilogue(FILE * pf) { fputs("\\end{document}\n", pf); } static void DrawLaTeXPoint(FILE * pf, int i, int fPlayer, unsigned int c) { unsigned int j; int x, y = 0; if (i < 6) x = 320 - 20 * i; else if (i < 12) x = 300 - 20 * i; else if (i < 18) x = 20 * i - 160; else if (i < 24) x = 20 * i - 140; else if (i == 24) /* bar */ x = 200; else /* off */ x = 365; if (fClockwise) x = 400 - x; for (j = 0; j < c; j++) { if (j == 5 || (i == 24 && j == 3)) { fprintf(pf, "\\whiten\\path(%d,%d)(%d,%d)(%d,%d)(%d,%d)(%d,%d)\n" "\\path(%d,%d)(%d,%d)(%d,%d)(%d,%d)(%d,%d)\n" "\\put(%d,%d){\\makebox(10,10){\\textsf{\\tiny %u}}}\n", x - 5, y - 5, x + 5, y - 5, x + 5, y + 5, x - 5, y + 5, x - 5, y - 5, x - 5, y - 5, x + 5, y - 5, x + 5, y + 5, x - 5, y + 5, x - 5, y - 5, x - 5, y - 5, c); break; } if (i == 24) /* bar */ y = fPlayer ? 60 + 20 * j : 200 - 20 * j; else if (fPlayer) y = i < 12 || i == 25 ? 30 + 20 * j : 230 - 20 * j; else y = i >= 12 && i != 25 ? 30 + 20 * j : 230 - 20 * j; fprintf(pf, fPlayer ? "\\put(%d,%d){\\circle{10}}" "\\put(%d,%d){\\blacken\\circle{20}}\n" : "\\put(%d,%d){\\whiten\\circle{20}}" "\\put(%d,%d){\\circle{20}}\n", x, y, x, y); } } static void PrintLaTeXBoard(FILE * pf, matchstate * pms, int fPlayer) { unsigned int anOff[2] = { 15, 15 }; int i, x, y; /* FIXME print position ID and pip count, and the player on roll. * Print player names too? */ fprintf(pf, "\\bigskip\\pagebreak[1]\\begin{center}\\begin{picture}" "(356,240)(22,10)\n" "\\%sboard\n", fPlayer ? "black" : "white"); for (i = 0; i < 25; i++) { anOff[0] -= pms->anBoard[0][i]; anOff[1] -= pms->anBoard[1][i]; DrawLaTeXPoint(pf, i, 0, pms->anBoard[!fPlayer][i]); DrawLaTeXPoint(pf, i, 1, pms->anBoard[fPlayer][i]); } DrawLaTeXPoint(pf, 25, 0, anOff[!fPlayer]); DrawLaTeXPoint(pf, 25, 1, anOff[fPlayer]); if (fClockwise) x = 365; else x = 35; if (pms->fCubeOwner < 0) y = 130; else if (pms->fCubeOwner) y = 30; else y = 230; fprintf(pf, "\\path(%d,%d)(%d,%d)(%d,%d)(%d,%d)(%d,%d)" "\\put(%d,%d){\\makebox(24,24){\\textsf{\\large %d}}}\n", x - 12, y - 12, x + 12, y - 12, x + 12, y + 12, x - 12, y + 12, x - 12, y - 12, x - 12, y - 12, pms->nCube == 1 ? 64 : pms->nCube); fputs("\\end{picture}\\end{center}\\vspace{-4mm}\n\n\\nopagebreak[4]\n", pf); } /* * This was removed at first when unicode encoding was used, but we * still need to escape what could cause problems (like % $ _ * etc...). Just to be safe, we escape everything but simple accented * characters. */ static void LaTeXEscape(FILE * pf, char *pch) { /* Translation table from GNU recode, by Francois Pinard. */ static struct translation { const unsigned char uch; const char *sz; } at[] = { { 10, "\n\n"}, /* \n */ { 35, "\\#"}, /* # */ { 36, "\\$"}, /* $ */ { 37, "\\%"}, /* % */ { 38, "\\&"}, /* & */ { 60, "\\mbox{$<$}"}, /* < */ { 62, "\\mbox{$>$}"}, /* > */ { 92, "\\mbox{$\\backslash{}$}"}, /* \ */ { 94, "\\^{}"}, /* ^ */ { 95, "\\_"}, /* _ */ { 123, "\\{"}, /* { */ { 124, "\\mbox{$|$}"}, /* | */ { 125, "\\}"}, /* } */ { 126, "\\~{}"}, /* ~ */ { 160, "~"}, /* no-break space */ { 161, "!`"}, /* inverted exclamation mark */ { 163, "\\pound{}"}, /* pound sign */ { 167, "\\S{}"}, /* paragraph sign, section sign */ { 168, "\\\"{}"}, /* diaeresis */ { 169, "\\copyright{}"}, /* copyright sign */ { 171, "``"}, /* left angle quotation mark */ { 172, "\\neg{}"}, /* not sign */ { 173, "\\-"}, /* soft hyphen */ { 176, "\\mbox{$^\\circ$}"}, /* degree sign */ { 177, "\\mbox{$\\pm$}"}, /* plus-minus sign */ { 178, "\\mbox{$^2$}"}, /* superscript two */ { 179, "\\mbox{$^3$}"}, /* superscript three */ { 180, "\\'{}"}, /* acute accent */ { 181, "\\mbox{$\\mu$}"}, /* small greek mu, micro sign */ { 183, "\\cdotp"}, /* middle dot */ { 184, "\\,{}"}, /* cedilla */ { 185, "\\mbox{$^1$}"}, /* superscript one */ { 187, "''"}, /* right angle quotation mark */ { 188, "\\frac1/4{}"}, /* vulgar fraction one quarter */ { 189, "\\frac1/2{}"}, /* vulgar fraction one half */ { 190, "\\frac3/4{}"}, /* vulgar fraction three quarters */ { 191, "?`"}, /* inverted question mark */ { 0, NULL} }; int i; if (!pch) return; while (*pch) { for (i = 0; at[i].uch; i++) if (at[i].uch > *pch) { /* no translation required */ putc(*pch, pf); break; } else if (at[i].uch == *pch) { /* translation found */ fputs(at[i].sz, pf); break; } pch++; } } static void PrintLaTeXComment(FILE * pf, char *pch) { LaTeXEscape(pf, pch); if (pch != NULL) fputs(pch, pf); fputs("\n\n", pf); } static void PrintLaTeXCubeAnalysis(FILE * pf, const matchstate * pms, int fPlayer, float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], const evalsetup * pes, int fTake) { cubeinfo ci; if (pes->et == EVAL_NONE) return; SetCubeInfo(&ci, pms->nCube, pms->fCubeOwner, fPlayer, pms->nMatchTo, pms->anScore, pms->fCrawford, pms->fJacoby, nBeavers, pms->bgv); /* FIXME use center and tabular environment instead of verbatim */ fputs("{\\begin{quote}\\footnotesize\\begin{verbatim}\n", pf); fputs(OutputCubeAnalysis(aarOutput, aarStdDev, pes, &ci, fTake), pf); fputs("\\end{verbatim}\\end{quote}}\n", pf); } static const char * PlayerSymbol(int fPlayer) { return fPlayer ? "\\textbullet{}" : "\\textopenbullet{}"; } static void ExportGameLaTeX(FILE * pf, listOLD * plGame) { listOLD *pl; moverecord *pmr; matchstate msExport; int fTook = FALSE; unsigned int i; char sz[1024]; doubletype dt = DT_NORMAL; listOLD *pl_hint = NULL; updateStatisticsGame(plGame); if (game_is_last(plGame)) pl_hint = game_add_pmr_hint(plGame); for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) { pmr = pl->p; FixMatchState(&msExport, pmr); switch (pmr->mt) { case MOVE_GAMEINFO: dt = DT_NORMAL; fputs("\\clearpage\n", pf); fputs("\\noindent{\\Large ", pf); if (pmr->g.nMatch) { fprintf(pf, ngettext("%d point match", "%d points match", pmr->g.nMatch), pmr->g.nMatch); fprintf(pf, _(" (game %d)"), pmr->g.i + 1); } else fprintf(pf, _("Money session (game %d)"), pmr->g.i + 1); fputs("}\n\n\\vspace{\\baselineskip}\n\n", pf); fprintf(pf, "\\noindent\n\\makebox[0.5\\textwidth][s]" "{\\large %s ", PlayerSymbol(0)); LaTeXEscape(pf, ap[0].szName); fprintf(pf, " ("); fprintf(pf, ngettext("%d point", "%d points", pmr->g.anScore[0]), pmr->g.anScore[0]); fprintf(pf, ")\\hfill}"); fprintf(pf, "\\makebox[0.5\\textwidth][s]" "{\\large %s ", PlayerSymbol(1)); LaTeXEscape(pf, ap[1].szName); fprintf(pf, " ("); fprintf(pf, ngettext("%d point", "%d points", pmr->g.anScore[1]), pmr->g.anScore[1]); fprintf(pf, ")\\hfill}\n\n"); break; case MOVE_NORMAL: dt = DT_NORMAL; msExport.fTurn = msExport.fMove = pmr->fPlayer; if (fTook) /* no need to print board following a double/take */ fTook = FALSE; else PrintLaTeXBoard(pf, &msExport, pmr->fPlayer); PrintLaTeXCubeAnalysis(pf, &msExport, pmr->fPlayer, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, -1); /* FIXME: output cube skill */ sprintf(sz, "%s %u%u%s: ", PlayerSymbol(pmr->fPlayer), pmr->anDice[0], pmr->anDice[1], aszLuckTypeLaTeXAbbr[pmr->lt]); FormatMove(strchr(sz, 0), (ConstTanBoard) msExport.anBoard, pmr->n.anMove); fprintf(pf, "\\begin{center}%s%s\\end{center}\n\n", sz, aszSkillTypeAbbr[pmr->n.stMove]); /* FIXME use center and tabular environment instead of verbatim */ fputs("{\\footnotesize\\begin{verbatim}\n", pf); for (i = 0; i < pmr->ml.cMoves; i++) { if (i >= exsExport.nMoves && i != pmr->n.iMove) continue; putc(i == pmr->n.iMove ? '*' : ' ', pf); FormatMoveHint(sz, &msExport, &pmr->ml, i, i != pmr->n.iMove || i != pmr->ml.cMoves - 1 || i < exsExport.nMoves, TRUE, TRUE); fputs(sz, pf); } fputs("\\end{verbatim}}", pf); PrintLaTeXComment(pf, pmr->sz); break; case MOVE_DOUBLE: dt = DoubleType(msExport.fDoubled, msExport.fMove, msExport.fTurn); if (dt != DT_NORMAL) { fprintf(pf, "\\begin{center}\\emph{%s}\\end{center}", _("Cannot analyse beaver nor raccoons!")); break; } PrintLaTeXBoard(pf, &msExport, pmr->fPlayer); PrintLaTeXCubeAnalysis(pf, &msExport, pmr->fPlayer, pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, -1); /* FIXME what about beavers? */ fprintf(pf, "\\begin{center}%s %s%s\\end{center}\n\n", PlayerSymbol(pmr->fPlayer), _("Double"), aszSkillTypeAbbr[pmr->stCube]); PrintLaTeXComment(pf, pmr->sz); break; case MOVE_TAKE: if (dt != DT_NORMAL) { dt = DT_NORMAL; fprintf(pf, "\\begin{center}\\emph{%s}\\end{center}", _("Cannot analyse beaver nor raccoons!")); break; } fTook = TRUE; fprintf(pf, "\\begin{center}%s %s%s\\end{center}\n\n", PlayerSymbol(pmr->fPlayer), _("Take"), aszSkillTypeAbbr[pmr->stCube]); PrintLaTeXComment(pf, pmr->sz); break; case MOVE_DROP: if (dt != DT_NORMAL) { dt = DT_NORMAL; fprintf(pf, "\\begin{center}\\emph{%s}\\end{center}", _("Cannot analyse beaver nor raccoons!")); break; } fprintf(pf, "\\begin{center}%s %s%s\\end{center}\n\n", PlayerSymbol(pmr->fPlayer), _("Drop"), aszSkillTypeAbbr[pmr->stCube]); PrintLaTeXComment(pf, pmr->sz); break; case MOVE_RESIGN: fprintf(pf, "\\begin{center}%s %s %s\\end{center}\n\n", PlayerSymbol(pmr->fPlayer), _("Resigns"), gettext(aszGameResult[pmr->r.nResigned - 1])); /* FIXME print resignation analysis, if available */ PrintLaTeXComment(pf, pmr->sz); break; case MOVE_SETDICE: /* ignore */ break; case MOVE_SETBOARD: case MOVE_SETCUBEVAL: case MOVE_SETCUBEPOS: /* FIXME print something? */ break; } ApplyMoveRecord(&msExport, plGame, pmr); } if (pl_hint) game_remove_pmr_hint(pl_hint); /* FIXME print game result */ } extern void CommandExportGameLaTeX(char *sz) { FILE *pf; sz = NextToken(&sz); if (!plGame) { outputl(_("No game in progress (type `new game' to start one).")); return; } if (!confirmOverwrite(sz, fConfirmSave)) return; if (!sz || !*sz) { outputl(_("You must specify a file to export to (see `help export " "game latex').")); return; } if (!strcmp(sz, "-")) pf = stdout; else if ((pf = g_fopen(sz, "w")) == 0) { outputerr(sz); return; } LaTeXPrologue(pf); ExportGameLaTeX(pf, plGame); LaTeXEpilogue(pf); if (pf != stdout) fclose(pf); setDefaultFileName(sz); } extern void CommandExportMatchLaTeX(char *sz) { FILE *pf; listOLD *pl; int fDontClose = FALSE; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a file to export to (see `help export " "match latex').")); return; } if (!confirmOverwrite(sz, fConfirmSave)) return; if (!strcmp(sz, "-")) { pf = stdout; fDontClose = TRUE; } else if ((pf = g_fopen(sz, "w")) == 0) { outputerr(sz); return; } LaTeXPrologue(pf); /* FIXME write match introduction? */ for (pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext) ExportGameLaTeX(pf, pl->p); LaTeXEpilogue(pf); if (!fDontClose) fclose(pf); setDefaultFileName(sz); } gnubg-1.08.003/bearoffgammon.c000644 001751 000024 00000226075 14574155047 015617 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2002 Joseph Heled * Copyright (C) 2006-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: bearoffgammon.c,v 1.14 2019/11/16 22:45:16 plm Exp $ */ #include "config.h" #include "bearoffgammon.h" struct GroupInfo { struct GammonProbs gDefault; unsigned char *info; unsigned int base; unsigned int size; }; static struct GammonProbs all[] = { {0, 0, 0, 36}, {36, 0, 0, 35}, {35, 36, 0, 35}, {35, 35, 36, 35}, {72, 0, 0, 34}, {108, 0, 0, 33}, {107, 36, 0, 33}, {107, 35, 36, 33}, {106, 72, 0, 33}, {104, 144, 0, 33}, {103, 180, 0, 33}, {103, 179, 36, 33}, {103, 176, 144, 33}, {103, 174, 216, 33}, {103, 173, 252, 33}, {100, 288, 0, 33}, {100, 284, 144, 33}, {99, 312, 432, 33}, {99, 306, 648, 33}, {99, 305, 684, 33}, {144, 0, 0, 32}, {140, 144, 0, 32}, {138, 216, 0, 32}, {137, 248, 144, 32}, {136, 284, 144, 32}, {132, 424, 288, 32}, {130, 492, 432, 32}, {130, 484, 720, 32}, {128, 544, 1152, 32}, {128, 536, 1440, 32}, {128, 533, 1548, 32}, {128, 532, 1584, 32}, {128, 520, 2016, 32}, {128, 516, 2160, 32}, {128, 512, 2304, 32}, {180, 0, 0, 31}, {176, 144, 0, 31}, {175, 180, 0, 31}, {175, 174, 216, 31}, {175, 173, 252, 31}, {172, 288, 0, 31}, {171, 324, 0, 31}, {171, 312, 432, 31}, {171, 311, 468, 31}, {216, 0, 0, 30}, {212, 144, 0, 30}, {208, 288, 0, 30}, {200, 568, 288, 30}, {196, 704, 576, 30}, {196, 688, 1152, 30}, {196, 682, 1368, 30}, {196, 658, 2232, 30}, {196, 650, 2520, 30}, {192, 812, 1872, 30}, {192, 782, 2952, 30}, {192, 774, 3240, 30}, {242, 360, 0, 29}, {241, 396, 0, 29}, {241, 392, 144, 29}, {241, 391, 180, 29}, {238, 504, 0, 29}, {238, 502, 72, 29}, {232, 720, 0, 29}, {232, 704, 576, 29}, {231, 730, 936, 29}, {231, 729, 972, 29}, {231, 722, 1224, 29}, {231, 714, 1512, 29}, {231, 713, 1548, 29}, {230, 784, 288, 29}, {226, 916, 720, 29}, {226, 912, 864, 29}, {220, 1124, 1008, 29}, {221, 1044, 2592, 29}, {221, 1041, 2700, 29}, {220, 1108, 1584, 29}, {221, 1000, 4176, 29}, {221, 989, 4572, 29}, {219, 1104, 3024, 29}, {219, 1102, 3096, 29}, {219, 1086, 3672, 29}, {219, 1085, 3708, 29}, {288, 0, 0, 28}, {284, 144, 0, 28}, {283, 173, 252, 28}, {281, 243, 324, 28}, {280, 288, 0, 28}, {279, 305, 684, 28}, {276, 432, 0, 28}, {276, 416, 576, 28}, {268, 720, 0, 28}, {264, 848, 576, 28}, {260, 956, 1872, 28}, {260, 950, 2088, 28}, {260, 920, 3168, 28}, {260, 912, 3456, 28}, {244, 1528, 2016, 28}, {313, 391, 180, 27}, {310, 502, 72, 27}, {240, 1552, 6336, 28}, {240, 1480, 8928, 28}, {240, 1472, 9216, 28}, {304, 720, 0, 27}, {304, 704, 576, 27}, {303, 729, 972, 27}, {303, 722, 1224, 27}, {303, 714, 1512, 27}, {303, 713, 1548, 27}, {360, 0, 0, 26}, {287, 1229, 3708, 27}, {356, 144, 0, 26}, {348, 432, 0, 26}, {400, 1152, 0, 24}, {392, 1440, 0, 24}, {390, 1504, 288, 24}, {368, 2248, 2016, 24}, {368, 2212, 3312, 24}, {364, 2236, 7632, 24}, {364, 2224, 8064, 24}, {360, 2480, 4032, 24}, {360, 2472, 4320, 24}, {364, 2152, 10656, 24}, {364, 2144, 10944, 24}, {356, 2444, 10512, 24}, {356, 2442, 10584, 24}, {356, 2360, 13536, 24}, {356, 2352, 13824, 24}, }; static unsigned char x9[] = { 0, 4, 4, 5, 5, 9, 9, 10, 10, 13, 13, 14, 14, 14, }; static unsigned char x10[] = { 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, }; static unsigned char x11[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, }; static unsigned char x17[] = { 0, 35, 35, 56, 58, 70, 71, 73, 74, 76, 76, 77, 77, 77, }; static unsigned char x18[] = { 4, 20, 20, 45, 46, 47, 47, 49, 50, 51, 51, 52, 52, 52, }; static unsigned char x19[] = { 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 4, 4, 21, 21, 25, 25, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 32, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 32, 34, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 32, 34, 34, }; static unsigned char x20[] = { 1, 5, 8, 22, 24, 26, 27, 29, 31, 33, 33, 34, 34, 34, }; static unsigned char x21[] = { 0, 1, 5, 1, 5, 8, 1, 5, 8, 22, 1, 5, 8, 22, 23, 1, 5, 8, 22, 24, 26, 1, 5, 8, 22, 24, 26, 27, 1, 5, 8, 22, 24, 26, 27, 29, 1, 5, 8, 22, 24, 26, 27, 29, 30, 1, 5, 8, 22, 24, 26, 27, 29, 31, 33, 1, 5, 8, 22, 24, 26, 27, 29, 31, 33, 33, 1, 5, 8, 22, 24, 26, 27, 29, 31, 33, 33, 34, 1, 5, 8, 22, 24, 26, 27, 29, 31, 33, 33, 34, 34, }; static unsigned char x22[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, }; static unsigned char x23[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, }; static unsigned char x25[] = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static unsigned char x26[] = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static unsigned char x27[] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static unsigned char x33[] = { 4, 108, 110, 113, 114, 119, 120, 123, 124, 125, 125, 126, 126, 126, }; static unsigned char x34[] = { 20, 108, 111, 112, 113, 115, 116, 117, 118, 121, 121, 122, 122, 122, }; static unsigned char x35[] = { 0, 0, 44, 0, 44, 44, 0, 44, 44, 90, 0, 44, 44, 90, 90, 0, 44, 44, 90, 90, 96, 0, 44, 44, 90, 90, 96, 96, 0, 44, 44, 90, 90, 96, 96, 99, 0, 44, 44, 90, 90, 96, 96, 99, 99, 0, 44, 44, 90, 90, 96, 96, 99, 99, 100, 0, 44, 44, 90, 90, 96, 96, 99, 99, 100, 100, 0, 44, 44, 90, 90, 96, 96, 99, 99, 100, 100, 101, 0, 44, 44, 90, 90, 96, 96, 99, 99, 100, 100, 101, 101, }; static unsigned char x36[] = { 4, 44, 44, 86, 88, 91, 91, 92, 93, 94, 94, 95, 95, 95, }; static unsigned char x37[] = { 0, 0, 20, 0, 20, 20, 0, 20, 20, 46, 0, 20, 20, 46, 46, 0, 20, 20, 46, 46, 48, 0, 20, 20, 46, 46, 48, 48, 0, 20, 20, 46, 46, 48, 48, 53, 0, 20, 20, 46, 46, 48, 48, 53, 53, 0, 20, 20, 46, 46, 48, 48, 53, 53, 54, 0, 20, 20, 46, 46, 48, 48, 53, 53, 54, 54, 0, 20, 20, 46, 46, 48, 48, 53, 53, 54, 54, 55, 0, 20, 20, 46, 46, 48, 48, 53, 53, 54, 54, 55, 55, }; static unsigned char x38[] = { 4, 4, 20, 4, 20, 20, 4, 20, 20, 45, 4, 20, 20, 45, 46, 4, 20, 20, 45, 46, 47, 4, 20, 20, 45, 46, 47, 47, 4, 20, 20, 45, 46, 47, 47, 49, 4, 20, 20, 45, 46, 47, 47, 49, 50, 4, 20, 20, 45, 46, 47, 47, 49, 50, 51, 4, 20, 20, 45, 46, 47, 47, 49, 50, 51, 51, 4, 20, 20, 45, 46, 47, 47, 49, 50, 51, 51, 52, 4, 20, 20, 45, 46, 47, 47, 49, 50, 51, 51, 52, 52, }; static unsigned char x39[] = { 0, 0, 0, 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 4, 4, 21, 21, 25, 25, 28, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 4, 4, 21, 21, 25, 25, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 4, 4, 21, 21, 25, 25, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 4, 4, 21, 21, 25, 25, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 32, 0, 0, 4, 0, 4, 4, 0, 4, 4, 21, 0, 4, 4, 21, 21, 0, 4, 4, 21, 21, 25, 0, 4, 4, 21, 21, 25, 25, 0, 4, 4, 21, 21, 25, 25, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 32, 0, 4, 4, 21, 21, 25, 25, 28, 28, 32, 32, 34, }; static unsigned char x40[] = { 20, 82, 83, 97, 98, 102, 103, 104, 105, 106, 106, 107, 107, 109, }; static unsigned char x41[] = { 4, 4, 44, 4, 44, 45, 4, 44, 45, 62, 4, 44, 45, 56, 69, 4, 44, 45, 56, 60, 72, 4, 44, 45, 57, 60, 62, 75, 4, 44, 45, 57, 60, 62, 63, 78, 4, 44, 45, 58, 61, 62, 63, 64, 79, 4, 44, 45, 58, 61, 62, 63, 64, 66, 80, 4, 44, 45, 59, 61, 62, 63, 65, 66, 67, 80, 4, 44, 45, 59, 61, 62, 63, 65, 66, 67, 67, 81, 4, 44, 45, 59, 61, 62, 63, 65, 66, 67, 67, 68, 81, }; static unsigned char x42[] = { 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 4, 4, 6, 5, 9, 9, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 13, 0, 4, 4, 7, 5, 9, 9, 11, 10, 13, 13, 0, 4, 4, 7, 5, 9, 9, 11, 10, 13, 13, 14, 0, 4, 4, 7, 5, 9, 9, 11, 10, 13, 13, 14, 14, }; static unsigned char x43[] = { 0, 0, 0, 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 4, 4, 6, 5, 9, 9, 10, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 4, 4, 6, 5, 9, 9, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 4, 4, 6, 5, 9, 9, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 13, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 4, 4, 6, 5, 9, 9, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 13, 0, 4, 4, 7, 5, 9, 9, 11, 10, 13, 13, 0, 0, 4, 0, 4, 4, 0, 4, 4, 5, 0, 4, 4, 5, 5, 0, 4, 4, 5, 5, 9, 0, 4, 4, 6, 5, 9, 9, 0, 4, 4, 6, 5, 9, 9, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 0, 4, 4, 6, 5, 9, 9, 10, 10, 13, 0, 4, 4, 7, 5, 9, 9, 11, 10, 13, 13, 0, 4, 4, 7, 5, 9, 9, 11, 10, 13, 13, 14, }; static unsigned char x44[] = { 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 4, 4, 5, 8, 9, 9, 17, 0, 4, 4, 5, 8, 9, 9, 10, 17, 0, 4, 4, 5, 8, 9, 9, 10, 12, 18, 0, 4, 4, 5, 8, 9, 9, 10, 12, 13, 18, 0, 4, 4, 5, 8, 9, 9, 10, 12, 13, 13, 19, 0, 4, 4, 5, 8, 9, 9, 10, 12, 13, 13, 14, 19, }; static unsigned char x45[] = { 0, 0, 0, 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 4, 4, 5, 8, 9, 9, 17, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 4, 4, 5, 8, 9, 9, 17, 0, 4, 4, 5, 8, 9, 9, 10, 17, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 4, 4, 5, 8, 9, 9, 17, 0, 4, 4, 5, 8, 9, 9, 10, 17, 0, 4, 4, 5, 8, 9, 9, 10, 12, 18, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 4, 4, 5, 8, 9, 9, 17, 0, 4, 4, 5, 8, 9, 9, 10, 17, 0, 4, 4, 5, 8, 9, 9, 10, 12, 18, 0, 4, 4, 5, 8, 9, 9, 10, 12, 13, 18, 0, 0, 4, 0, 4, 4, 0, 4, 4, 9, 0, 4, 4, 5, 9, 0, 4, 4, 5, 8, 15, 0, 4, 4, 5, 8, 9, 16, 0, 4, 4, 5, 8, 9, 9, 17, 0, 4, 4, 5, 8, 9, 9, 10, 17, 0, 4, 4, 5, 8, 9, 9, 10, 12, 18, 0, 4, 4, 5, 8, 9, 9, 10, 12, 13, 18, 0, 4, 4, 5, 8, 9, 9, 10, 12, 13, 13, 19, }; static unsigned char x46[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, }; static unsigned char x47[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, }; static unsigned char x48[] = { 87, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 89, }; static unsigned char x49[] = { 4, 4, 4, 9, 5, 5, 9, 5, 5, 5, 15, 9, 9, 9, 9, 15, 9, 9, 9, 9, 9, 17, 10, 10, 10, 10, 10, 10, 17, 10, 10, 10, 10, 10, 10, 10, 18, 13, 13, 13, 13, 13, 13, 13, 13, 18, 13, 13, 13, 13, 13, 13, 13, 13, 13, 19, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 19, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 19, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }; static unsigned char x50[] = { 20, 20, 20, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 40, 36, 36, 36, 36, 36, 40, 37, 37, 37, 37, 37, 37, 41, 37, 37, 37, 37, 37, 37, 37, 41, 38, 38, 38, 38, 38, 38, 38, 38, 42, 38, 38, 38, 38, 38, 38, 38, 38, 38, 42, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 43, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 43, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 43, }; static unsigned char x51[] = { 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }; static unsigned char x52[] = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static unsigned char x53[] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static unsigned char x54[] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static unsigned char x55[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, }; static struct GroupInfo info[63] = { /* 1 100000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 2 010000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 3 110000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 4 001000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 5 101000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 6 011000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 7 111000 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 8 000100 */ {{175, 173, 252, 31}, 0, 0, 0}, /* 9 100100 */ {{0, 0, 0, 0}, x9, 91, 14}, /* 10 010100 */ {{0, 0, 0, 0}, x10, 91, 14}, /* 11 110100 */ {{0, 0, 0, 0}, x11, 364, 91}, /* 12 001100 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 13 101100 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 14 011100 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 15 111100 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 16 000010 */ {{397, 1127, 4788, 24}, 0, 0, 0}, /* 17 100010 */ {{0, 0, 0, 0}, x17, 91, 14}, /* 18 010010 */ {{0, 0, 0, 0}, x18, 91, 14}, /* 19 110010 */ {{0, 0, 0, 0}, x19, 364, 91}, /* 20 001010 */ {{0, 0, 0, 0}, x20, 91, 14}, /* 21 101010 */ {{0, 0, 0, 0}, x21, 364, 91}, /* 22 011010 */ {{0, 0, 0, 0}, x22, 364, 91}, /* 23 111010 */ {{0, 0, 0, 0}, x23, 1001, 364}, /* 24 000110 */ {{107, 35, 36, 33}, 0, 0, 0}, /* 25 100110 */ {{0, 0, 0, 0}, x25, 364, 91}, /* 26 010110 */ {{0, 0, 0, 0}, x26, 364, 91}, /* 27 110110 */ {{0, 0, 0, 0}, x27, 1001, 364}, /* 28 001110 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 29 101110 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 30 011110 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 31 111110 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 32 000001 */ {{583, 3203, 15588, 17}, 0, 0, 0}, /* 33 100001 */ {{0, 0, 0, 0}, x33, 91, 14}, /* 34 010001 */ {{0, 0, 0, 0}, x34, 91, 14}, /* 35 110001 */ {{0, 0, 0, 0}, x35, 364, 91}, /* 36 001001 */ {{0, 0, 0, 0}, x36, 91, 14}, /* 37 101001 */ {{0, 0, 0, 0}, x37, 364, 91}, /* 38 011001 */ {{0, 0, 0, 0}, x38, 364, 91}, /* 39 111001 */ {{0, 0, 0, 0}, x39, 1001, 364}, /* 40 000101 */ {{0, 0, 0, 0}, x40, 91, 14}, /* 41 100101 */ {{0, 0, 0, 0}, x41, 364, 91}, /* 42 010101 */ {{0, 0, 0, 0}, x42, 364, 91}, /* 43 110101 */ {{0, 0, 0, 0}, x43, 1001, 364}, /* 44 001101 */ {{0, 0, 0, 0}, x44, 364, 91}, /* 45 101101 */ {{0, 0, 0, 0}, x45, 1001, 364}, /* 46 011101 */ {{0, 0, 0, 0}, x46, 1001, 364}, /* 47 111101 */ {{0, 0, 0, 0}, x47, 2002, 1001}, /* 48 000011 */ {{0, 0, 0, 0}, x48, 91, 14}, /* 49 100011 */ {{0, 0, 0, 0}, x49, 364, 91}, /* 50 010011 */ {{0, 0, 0, 0}, x50, 364, 91}, /* 51 110011 */ {{0, 0, 0, 0}, x51, 1001, 364}, /* 52 001011 */ {{0, 0, 0, 0}, x52, 364, 91}, /* 53 101011 */ {{0, 0, 0, 0}, x53, 1001, 364}, /* 54 011011 */ {{0, 0, 0, 0}, x54, 1001, 364}, /* 55 111011 */ {{0, 0, 0, 0}, x55, 2002, 1001}, /* 56 000111 */ {{72, 0, 0, 34}, 0, 0, 0}, /* 57 100111 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 58 010111 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 59 110111 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 60 001111 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 61 101111 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 62 011111 */ {{0, 0, 0, 36}, 0, 0, 0}, /* 63 111111 */ {{0, 0, 0, 36}, 0, 0, 0}, }; #include #include "positionid.h" extern struct GammonProbs * getBearoffGammonProbs(const unsigned int board[6]) { int group = 0; int i; struct GroupInfo *in; for (i = 5; i >= 0; --i) { if (board[i] > 0) group += (0x1 << i); } g_assert(group > 0); in = &info[group - 1]; if (!in->info) { return &in->gDefault; } { unsigned int grpSize = 0; unsigned int b1[6] = { 0 }; unsigned int k; unsigned short index; for (k = 0; k < 6; ++k) { if ((group & (0x1 << k))) { g_assert(board[k] > 0); b1[grpSize] = board[k] - 1; grpSize++; } } index = PositionIndex(grpSize, b1); g_assert(index >= in->base && index - in->base < in->size); g_assert(in->info[index - in->base] < sizeof(all) / sizeof(all[0])); return &all[in->info[index - in->base]]; } } /* race BG part */ static long ya1[6][RBG_NPROBS] = { {36, 0, 0, 0, 0,}, {36, 0, 0, 0, 0,}, {6, 1080, 0, 0, 0,}, {6, 1080, 0, 0, 0,}, {0, 396, 32400, 0, 0,}, {0, 396, 32400, 0, 0,}, }; static long ya2[6][RBG_NPROBS] = { {36, 0, 0, 0, 0,}, {26, 360, 0, 0, 0,}, {5, 1116, 0, 0, 0,}, {5, 596, 18720, 0, 0,}, {0, 335, 33596, 36000, 0,}, {0, 235, 17666, 739080, 0,}, }; static long ya3[15][RBG_NPROBS] = { {36, 0, 0, 0, 0,}, {6, 1080, 0, 0, 0,}, {5, 1116, 0, 0, 0,}, {5, 1116, 0, 0, 0,}, {5, 1116, 0, 0, 0,}, {5, 1016, 3600, 0, 0,}, {0, 396, 32400, 0, 0,}, {0, 396, 32400, 0, 0,}, {0, 376, 33120, 0, 0,}, {0, 335, 34596, 0, 0,}, {0, 396, 32400, 0, 0,}, {0, 376, 33120, 0, 0,}, {0, 335, 34596, 0, 0,}, {0, 335, 33596, 36000, 0,}, {0, 335, 27296, 262800, 0,}, }; static long ya4[6][RBG_NPROBS] = { {36, 0, 0, 0, 0,}, {17, 684, 0, 0, 0,}, {4, 999, 5508, 0, 0,}, {4, 297, 30082, 25128, 0,}, {0, 272, 24281, 450484, 90144,}, {0, 120, 11765, 983521, 4213260,}, }; static long ya5[15][RBG_NPROBS] = { {34, 72, 0, 0, 0,}, {5, 1116, 0, 0, 0,}, {4, 1148, 144, 0, 0,}, {4, 1148, 144, 0, 0,}, {4, 1080, 2592, 0, 0,}, {4, 739, 14860, 288, 0,}, {0, 396, 32400, 0, 0,}, {0, 371, 33292, 288, 0,}, {0, 298, 35716, 7632, 0,}, {0, 272, 34033, 101900, 576,}, {0, 388, 32680, 288, 0,}, {0, 322, 34856, 7488, 0,}, {0, 272, 34794, 74504, 576,}, {0, 272, 27197, 346480, 55152,}, {0, 256, 15488, 772640, 634752,}, }; static long ya6[15][RBG_NPROBS] = { {25, 396, 0, 0, 0,}, {5, 1112, 144, 0, 0,}, {4, 1112, 1440, 0, 0,}, {4, 631, 18756, 0, 0,}, {4, 615, 19324, 288, 0,}, {4, 523, 22528, 4176, 0,}, {0, 333, 33656, 36432, 0,}, {0, 322, 33854, 43560, 0,}, {0, 297, 33393, 92540, 576,}, {0, 272, 30181, 240284, 10944,}, {0, 233, 17737, 739100, 576,}, {0, 217, 18281, 739964, 10944,}, {0, 192, 18895, 747036, 127008,}, {0, 192, 17551, 782404, 595584,}, {0, 184, 14192, 886751, 1565604,}, }; static long ya7[20][RBG_NPROBS] = { {5, 1116, 0, 0, 0,}, {4, 1148, 144, 0, 0,}, {4, 1048, 3744, 0, 0,}, {4, 999, 5508, 0, 0,}, {0, 392, 32544, 0, 0,}, {0, 375, 33156, 0, 0,}, {0, 355, 33868, 288, 0,}, {0, 335, 34588, 288, 0,}, {0, 331, 34624, 4176, 0,}, {0, 297, 35266, 25128, 0,}, {0, 371, 33292, 288, 0,}, {0, 331, 34732, 288, 0,}, {0, 298, 35716, 7632, 0,}, {0, 331, 33728, 36432, 0,}, {0, 297, 34754, 43560, 0,}, {0, 272, 34033, 101900, 576,}, {0, 330, 27470, 263016, 0,}, {0, 297, 28537, 267356, 576,}, {0, 272, 28421, 303644, 10944,}, {0, 272, 24281, 450484, 90144,}, }; static long ya8[6][RBG_NPROBS] = { {34, 72, 0, 0, 0,}, {11, 880, 720, 0, 0,}, {3, 751, 15482, 9000, 0,}, {3, 163, 30547, 225808, 104400,}, {0, 195, 14249, 822591, 3288276,}, {0, 57, 8951, 767859, 18563364,}, }; static long ya9[15][RBG_NPROBS] = { {29, 252, 0, 0, 0,}, {5, 1116, 0, 0, 0,}, {3, 1115, 2628, 0, 0,}, {3, 1146, 1512, 0, 0,}, {3, 899, 10284, 4320, 0,}, {3, 452, 25549, 34076, 576,}, {0, 392, 32544, 0, 0,}, {0, 333, 34408, 9360, 0,}, {0, 236, 35179, 106580, 26496,}, {0, 207, 27064, 426011, 397044,}, {0, 357, 33552, 9072, 0,}, {0, 249, 35142, 91080, 25920,}, {0, 207, 28985, 359990, 284184,}, {0, 207, 16674, 753203, 2083572,}, {0, 165, 8770, 941530, 7506936,}, }; static long ya10[15][RBG_NPROBS] = { {23, 468, 0, 0, 0,}, {5, 1086, 1080, 0, 0,}, {3, 1043, 5212, 288, 0,}, {3, 659, 19036, 288, 0,}, {3, 583, 21510, 9720, 0,}, {3, 368, 27767, 62980, 4608,}, {0, 325, 33734, 43992, 0,}, {0, 289, 33359, 103644, 18144,}, {0, 235, 30691, 266808, 121392,}, {0, 207, 23831, 532351, 758772,}, {0, 223, 18071, 739532, 18720,}, {0, 175, 19349, 750336, 212976,}, {0, 147, 18301, 802935, 983988,}, {0, 147, 13709, 895395, 3606660,}, {0, 129, 9184, 920983, 9389700,}, }; static long ya11[20][RBG_NPROBS] = { {5, 1112, 144, 0, 0,}, {3, 1144, 1584, 0, 0,}, {3, 1055, 4788, 0, 0,}, {3, 857, 11792, 4464, 0,}, {0, 385, 32796, 0, 0,}, {0, 371, 33292, 288, 0,}, {0, 321, 34738, 13032, 0,}, {0, 335, 34472, 4464, 0,}, {0, 308, 34657, 32780, 576,}, {0, 235, 34181, 143452, 39168,}, {0, 345, 33984, 9072, 0,}, {0, 309, 35268, 9504, 0,}, {0, 236, 35555, 93060, 25920,}, {0, 309, 34282, 45000, 0,}, {0, 235, 34783, 122124, 26784,}, {0, 207, 28547, 375536, 292176,}, {0, 307, 28169, 267628, 1152,}, {0, 235, 29373, 316128, 54000,}, {0, 207, 25276, 488623, 460260,}, {0, 207, 15791, 778381, 2321532,}, }; static long ya12[15][RBG_NPROBS] = { {17, 680, 144, 0, 0,}, {4, 983, 6076, 288, 0,}, {3, 923, 9488, 1872, 0,}, {3, 333, 29949, 29900, 576,}, {3, 331, 29167, 60532, 4608,}, {3, 283, 29081, 125244, 25920,}, {0, 263, 24605, 449718, 117720,}, {0, 245, 24912, 457129, 292860,}, {0, 222, 23475, 526367, 735732,}, {0, 207, 19394, 669443, 1573812,}, {0, 120, 11720, 984849, 4223772,}, {0, 108, 11969, 985331, 4443588,}, {0, 93, 12122, 963477, 5731884,}, {0, 93, 11334, 906514, 8803800,}, {0, 93, 9540, 858470, 12858408,}, }; static long ya13[20][RBG_NPROBS] = { {4, 1132, 720, 0, 0,}, {3, 1091, 3484, 288, 0,}, {3, 775, 14808, 2160, 0,}, {3, 715, 16754, 9864, 0,}, {0, 367, 33436, 288, 0,}, {0, 296, 35680, 11504, 576,}, {0, 284, 35649, 28172, 576,}, {0, 268, 34079, 105284, 5760,}, {0, 252, 33761, 136812, 29376,}, {0, 222, 32167, 230992, 104400,}, {0, 309, 35114, 15032, 576,}, {0, 259, 35139, 78796, 5472,}, {0, 223, 34893, 133328, 40752,}, {0, 258, 27701, 345954, 74088,}, {0, 222, 28523, 359568, 198288,}, {0, 207, 25658, 472035, 562356,}, {0, 246, 15840, 772067, 665748,}, {0, 210, 17074, 766333, 952524,}, {0, 195, 16968, 761467, 1964916,}, {0, 195, 13487, 839379, 3671460,}, }; static long ya14[20][RBG_NPROBS] = { {4, 1089, 2268, 0, 0,}, {3, 647, 19404, 2592, 0,}, {3, 559, 22396, 8928, 0,}, {3, 527, 23025, 27740, 576,}, {0, 313, 34013, 49484, 576,}, {0, 293, 33443, 95796, 5184,}, {0, 277, 32921, 134556, 32832,}, {0, 267, 30329, 241000, 26640,}, {0, 252, 30183, 263560, 103536,}, {0, 222, 28408, 360893, 299628,}, {0, 211, 18473, 740252, 31680,}, {0, 186, 19069, 747694, 157752,}, {0, 162, 19534, 758017, 303228,}, {0, 185, 17752, 783317, 628812,}, {0, 162, 18254, 788219, 874836,}, {0, 147, 17470, 814155, 1657044,}, {0, 180, 14314, 886931, 1587636,}, {0, 155, 15088, 882887, 1896516,}, {0, 141, 14977, 868919, 3196404,}, {0, 141, 12630, 886913, 5590332,}, }; static long ya15[15][RBG_NPROBS] = { {3, 1019, 6076, 288, 0,}, {0, 355, 33824, 1872, 0,}, {0, 331, 34492, 8928, 0,}, {0, 297, 35133, 29900, 576,}, {0, 284, 34771, 59668, 4608,}, {0, 285, 35948, 16112, 576,}, {0, 284, 35025, 50636, 576,}, {0, 259, 34403, 105284, 5760,}, {0, 222, 34305, 155740, 42624,}, {0, 283, 28939, 270876, 6048,}, {0, 258, 28885, 304624, 27504,}, {0, 222, 29275, 334920, 111024,}, {0, 258, 24785, 449718, 117720,}, {0, 221, 25756, 457849, 292860,}, {0, 207, 23447, 546031, 763956,}, }; static long ya16[6][RBG_NPROBS] = { {31, 180, 0, 0, 0,}, {6, 975, 3772, 288, 0,}, {2, 466, 25089, 78660, 18144,}, {2, 84, 23554, 584297, 1627164,}, {0, 116, 6951, 880249, 14356620,}, {0, 18, 6042, 425561, 36475740,}, }; static long ya17[15][RBG_NPROBS] = { {23, 468, 0, 0, 0,}, {4, 1148, 144, 0, 0,}, {2, 995, 8200, 1584, 0,}, {2, 1066, 5688, 0, 0,}, {2, 603, 22062, 10568, 576,}, {2, 205, 32081, 163840, 67248,}, {0, 383, 32860, 288, 0,}, {0, 254, 35419, 75284, 2304,}, {0, 154, 29734, 402111, 269892,}, {0, 140, 15913, 828583, 3482100,}, {0, 296, 34104, 68256, 0,}, {0, 164, 30562, 363296, 127584,}, {0, 136, 17946, 801264, 2017440,}, {0, 120, 7889, 1002899, 8538948,}, {0, 70, 5652, 775017, 21974652,}, }; static long ya18[15][RBG_NPROBS] = { {19, 608, 144, 0, 0,}, {4, 1065, 3132, 0, 0,}, {2, 884, 12012, 8208, 0,}, {2, 655, 20336, 5328, 0,}, {2, 444, 26523, 55852, 7200,}, {2, 189, 30326, 243663, 214596,}, {0, 304, 33253, 88380, 5184,}, {0, 224, 30938, 271784, 135360,}, {0, 153, 24544, 564925, 1181484,}, {0, 140, 14007, 849405, 5202684,}, {0, 193, 18775, 748820, 171648,}, {0, 117, 18938, 811339, 1255572,}, {0, 100, 13699, 913601, 5157036,}, {0, 92, 7775, 917424, 13070160,}, {0, 62, 5739, 706619, 24697476,}, }; static long ya19[20][RBG_NPROBS] = { {4, 1130, 792, 0, 0,}, {2, 1063, 5796, 0, 0,}, {2, 991, 8364, 864, 0,}, {2, 587, 22351, 20884, 1152,}, {0, 371, 33292, 288, 0,}, {0, 357, 33712, 3312, 0,}, {0, 246, 35383, 86828, 6624,}, {0, 327, 34262, 22392, 0,}, {0, 237, 34453, 131064, 39312,}, {0, 152, 28396, 445719, 527364,}, {0, 288, 34388, 68400, 0,}, {0, 260, 35352, 69984, 0,}, {0, 158, 30668, 367220, 128880,}, {0, 259, 34481, 102492, 5184,}, {0, 157, 30147, 385270, 200952,}, {0, 140, 17532, 803268, 2295216,}, {0, 257, 28879, 305844, 38016,}, {0, 155, 26546, 508717, 517068,}, {0, 140, 16334, 823115, 3133332,}, {0, 124, 7589, 978016, 9636912,}, }; static long ya20[15][RBG_NPROBS] = { {14, 776, 576, 0, 0,}, {4, 913, 8552, 1872, 0,}, {2, 767, 15983, 16868, 576,}, {2, 360, 29605, 53820, 5184,}, {2, 300, 28857, 156860, 64512,}, {2, 176, 27944, 340841, 409788,}, {0, 243, 24528, 474225, 268380,}, {0, 198, 22633, 576764, 1132416,}, {0, 150, 18321, 737255, 3182580,}, {0, 140, 12063, 859951, 7342452,}, {0, 108, 11969, 977637, 4720572,}, {0, 76, 12092, 946693, 7168140,}, {0, 64, 10674, 863340, 12566448,}, {0, 64, 7844, 761133, 19913580,}, {0, 52, 6032, 616407, 28031940,}, }; static long ya21[20][RBG_NPROBS] = { {4, 1099, 1908, 0, 0,}, {2, 1019, 7348, 1152, 0,}, {2, 751, 16778, 9000, 0,}, {2, 520, 23769, 56524, 6336,}, {0, 342, 34202, 5112, 0,}, {0, 292, 35133, 36292, 3744,}, {0, 225, 34874, 131282, 45720,}, {0, 268, 32812, 150088, 34848,}, {0, 220, 30222, 298601, 284508,}, {0, 150, 25691, 530366, 1079064,}, {0, 262, 35170, 73880, 2304,}, {0, 222, 34976, 132004, 27504,}, {0, 154, 30031, 392356, 236160,}, {0, 220, 28078, 378260, 195408,}, {0, 151, 25786, 529760, 931104,}, {0, 140, 16413, 821065, 3104748,}, {0, 210, 16875, 771659, 1018692,}, {0, 140, 17488, 793184, 2715264,}, {0, 132, 12957, 858233, 6618924,}, {0, 128, 6962, 908191, 12776580,}, }; static long ya22[20][RBG_NPROBS] = { {4, 1035, 4204, 288, 0,}, {2, 642, 20738, 7704, 0,}, {2, 555, 23523, 20180, 576,}, {2, 410, 27049, 80676, 18144,}, {0, 290, 33665, 91628, 7488,}, {0, 275, 33057, 132372, 28512,}, {0, 212, 30778, 291535, 191556,}, {0, 253, 29938, 271332, 94608,}, {0, 208, 27684, 401077, 444492,}, {0, 151, 23054, 608233, 1646748,}, {0, 184, 19038, 750756, 181008,}, {0, 164, 19390, 761061, 286956,}, {0, 113, 18750, 820147, 1368756,}, {0, 164, 17961, 797571, 824580,}, {0, 111, 17708, 838828, 2139984,}, {0, 100, 13209, 915715, 5715972,}, {0, 158, 14796, 886873, 1991484,}, {0, 106, 15120, 886295, 4018500,}, {0, 96, 12026, 896601, 8123868,}, {0, 92, 7533, 877093, 14835708,}, }; static long ya23[15][RBG_NPROBS] = { {2, 963, 9344, 1872, 0,}, {0, 331, 34550, 6840, 0,}, {0, 311, 34757, 25292, 576,}, {0, 292, 34669, 52956, 5184,}, {0, 225, 34049, 160400, 66672,}, {0, 242, 35841, 75644, 2304,}, {0, 242, 34959, 107252, 7488,}, {0, 222, 34300, 156216, 31968,}, {0, 153, 29610, 407273, 291420,}, {0, 240, 29401, 308924, 43776,}, {0, 220, 29234, 339556, 90576,}, {0, 151, 26258, 521963, 600084,}, {0, 220, 25312, 475809, 268380,}, {0, 149, 23843, 596484, 1140480,}, {0, 140, 15529, 836357, 3699900,}, }; static long ya24[15][RBG_NPROBS] = { {10, 887, 1764, 0, 0,}, {3, 719, 16407, 17156, 576,}, {2, 641, 19951, 37220, 4032,}, {2, 194, 30182, 243319, 180324,}, {2, 185, 28264, 318235, 388980,}, {2, 143, 26206, 434497, 830268,}, {0, 183, 14564, 820763, 3505716,}, {0, 160, 14565, 819849, 4610412,}, {0, 136, 13405, 831119, 6827796,}, {0, 132, 10367, 861740, 9849312,}, {0, 55, 8811, 772043, 18687492,}, {0, 47, 8633, 762062, 19650744,}, {0, 40, 8204, 717461, 22138956,}, {0, 40, 7232, 643295, 26068644,}, {0, 36, 6082, 562587, 30651156,}, }; static long ya25[20][RBG_NPROBS] = { {3, 1079, 3916, 288, 0,}, {2, 887, 11834, 10728, 0,}, {2, 476, 25507, 51044, 4032,}, {2, 402, 27073, 90180, 18144,}, {0, 318, 34810, 14312, 576,}, {0, 232, 34908, 121056, 43200,}, {0, 200, 34336, 181552, 99648,}, {0, 200, 26978, 434919, 514404,}, {0, 176, 26107, 485813, 930780,}, {0, 147, 23378, 600873, 1678428,}, {0, 221, 35079, 128568, 64368,}, {0, 182, 29423, 372592, 429264,}, {0, 148, 27194, 487861, 754668,}, {0, 176, 17571, 762085, 2047644,}, {0, 139, 17798, 786039, 2617380,}, {0, 132, 14067, 884661, 4228956,}, {0, 152, 9103, 939942, 7739064,}, {0, 113, 10135, 926300, 8712288,}, {0, 100, 9481, 906351, 10884564,}, {0, 100, 6941, 887101, 14869404,}, }; static long ya26[20][RBG_NPROBS] = { {3, 985, 7264, 1584, 0,}, {2, 595, 21997, 23276, 576,}, {2, 395, 27547, 82204, 17568,}, {2, 340, 27770, 144132, 65232,}, {0, 269, 33277, 131568, 52272,}, {0, 226, 30426, 285363, 216756,}, {0, 195, 28399, 389959, 524628,}, {0, 196, 23900, 538799, 950436,}, {0, 173, 22617, 594924, 1665792,}, {0, 146, 19382, 710497, 2957436,}, {0, 159, 19533, 759847, 378612,}, {0, 133, 18457, 807913, 1255788,}, {0, 107, 17761, 834132, 2426976,}, {0, 133, 14018, 894693, 3884652,}, {0, 105, 14160, 885933, 5322348,}, {0, 100, 11603, 903632, 8232336,}, {0, 120, 9386, 919460, 9602640,}, {0, 92, 9959, 897073, 10972332,}, {0, 88, 9081, 845101, 14167836,}, {0, 88, 6944, 797786, 18640728,}, }; static long ya27[15][RBG_NPROBS] = { {2, 850, 13146, 11448, 0,}, {0, 310, 34855, 23044, 1152,}, {0, 296, 34455, 55420, 7200,}, {0, 232, 33661, 164996, 77472,}, {0, 200, 32377, 248703, 221076,}, {0, 209, 35429, 131512, 64656,}, {0, 208, 34703, 158780, 70560,}, {0, 182, 29012, 387017, 442620,}, {0, 147, 26918, 497879, 798372,}, {0, 207, 29618, 341130, 142776,}, {0, 181, 25868, 495979, 641268,}, {0, 146, 24254, 583029, 1232172,}, {0, 180, 16617, 776622, 2574072,}, {0, 142, 16946, 792561, 3346812,}, {0, 136, 13415, 872781, 5315004,}, }; static long ya28[20][RBG_NPROBS] = { {3, 876, 11070, 5832, 0,}, {2, 355, 29081, 78820, 17568,}, {2, 312, 28766, 144712, 59904,}, {2, 268, 28254, 217343, 161604,}, {0, 227, 24896, 477159, 432324,}, {0, 209, 23554, 535275, 919188,}, {0, 185, 22006, 601857, 1648188,}, {0, 194, 19630, 671532, 1799280,}, {0, 172, 18904, 699721, 2751804,}, {0, 145, 16482, 774441, 4460508,}, {0, 100, 12078, 980097, 4863996,}, {0, 87, 12104, 965251, 5971284,}, {0, 71, 11891, 942537, 7811532,}, {0, 87, 11301, 910749, 8974044,}, {0, 70, 11128, 900933, 10344780,}, {0, 64, 10008, 845763, 14062356,}, {0, 87, 9602, 858987, 13039380,}, {0, 70, 9669, 843115, 14317092,}, {0, 64, 8948, 788345, 17503164,}, {0, 64, 7347, 721049, 22000716,}, }; static long ya29[15][RBG_NPROBS] = { {2, 711, 17893, 20684, 576,}, {0, 277, 35301, 49644, 5184,}, {0, 250, 32889, 169600, 72432,}, {0, 216, 31766, 251079, 180900,}, {0, 191, 29823, 346777, 420300,}, {0, 196, 34817, 169610, 92808,}, {0, 195, 28619, 387703, 320724,}, {0, 180, 26178, 483327, 741636,}, {0, 147, 24325, 575456, 1366128,}, {0, 185, 17665, 769685, 1232316,}, {0, 172, 17499, 767034, 2149416,}, {0, 137, 17091, 792659, 3388644,}, {0, 172, 14184, 836845, 3932460,}, {0, 137, 14526, 834307, 5213556,}, {0, 132, 11813, 863857, 7899084,}, }; static long ya30[15][RBG_NPROBS] = { {2, 537, 23595, 40820, 4032,}, {0, 260, 32786, 160172, 78768,}, {0, 239, 29984, 285233, 187740,}, {0, 215, 28156, 375495, 427140,}, {0, 191, 26442, 456345, 857628,}, {0, 147, 19675, 767435, 481284,}, {0, 147, 18377, 798257, 1053900,}, {0, 133, 17615, 821824, 1846224,}, {0, 106, 17096, 842747, 3025332,}, {0, 141, 15264, 885864, 2214432,}, {0, 128, 15090, 876847, 3371076,}, {0, 101, 14852, 877549, 4913964,}, {0, 128, 12865, 889903, 5784660,}, {0, 100, 13053, 881311, 7156692,}, {0, 96, 11075, 873594, 10184616,}, }; static long ya31[6][RBG_NPROBS] = { {0, 278, 34449, 78676, 17568,}, {0, 196, 34220, 190904, 99936,}, {0, 195, 29493, 359469, 204444,}, {0, 195, 25955, 480507, 432324,}, {0, 180, 24042, 554123, 961236,}, {0, 146, 22638, 628265, 1698012,}, }; typedef long T[RBG_NPROBS]; static T *y[] = { ya1, ya2, ya3, ya4, ya5, ya6, ya7, ya8, ya9, ya10, ya11, ya12, ya13, ya14, ya15, ya16, ya17, ya18, ya19, ya20, ya21, ya22, ya23, ya24, ya25, ya26, ya27, ya28, ya29, ya30, ya31 }; extern long * getRaceBGprobs(const unsigned int board[6]) { unsigned int tot = 0; int i; unsigned int group = 0; g_assert(board[5] == 0); for (i = 4; i >= 0; --i) { if (board[i]) group += (0x1u << i); tot += board[i]; } g_assert(group < 32); if (tot > 6) return 0; { unsigned int grpSize = 0; unsigned int b1[6] = { 0 }; unsigned int k; for (k = 0; k < 5; ++k) { if ((group & (0x1u << k))) { g_assert(board[k] > 0); b1[grpSize] = board[k] - 1; ++grpSize; } } return y[group - 1][PositionIndex(grpSize, b1)]; } } gnubg-1.08.003/gnubgstock.h000644 001751 000024 00000004441 14574155047 015156 0ustar00pmstaff000000 000000 /* * Copyright (C) 2008-2011 Christian Anthon * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: $ */ void gnubg_stock_init(void); #define GNUBG_STOCK_ACCEPT "gnubg-stock-accept" #define GNUBG_STOCK_ANTI_CLOCKWISE "gnubg-stock-anti-clockwise" #define GNUBG_STOCK_CLOCKWISE "gnubg-stock-clockwise" #define GNUBG_STOCK_DOUBLE "gnubg-stock-double" #define GNUBG_STOCK_END_GAME "gnubg-stock-end-game" #define GNUBG_STOCK_GO_NEXT_CMARKED "gnubg-stock-go-next-cmarked" #define GNUBG_STOCK_GO_NEXT_GAME "gnubg-stock-go-next-game" #define GNUBG_STOCK_GO_NEXT "gnubg-stock-go-next" #define GNUBG_STOCK_GO_NEXT_MARKED "gnubg-stock-go-next-marked" #define GNUBG_STOCK_GO_PREV_CMARKED "gnubg-stock-go-prev-cmarked" #define GNUBG_STOCK_GO_PREV_GAME "gnubg-stock-go-prev-game" #define GNUBG_STOCK_GO_PREV "gnubg-stock-go-prev" #define GNUBG_STOCK_GO_PREV_MARKED "gnubg-stock-go-prev-marked" #define GNUBG_STOCK_HINT "gnubg-stock-hint" #define GNUBG_STOCK_NEW0 "gnubg-stock-new0" #define GNUBG_STOCK_NEW11 "gnubg-stock-new11" #define GNUBG_STOCK_NEW13 "gnubg-stock-new13" #define GNUBG_STOCK_NEW15 "gnubg-stock-new15" #define GNUBG_STOCK_NEW17 "gnubg-stock-new17" #define GNUBG_STOCK_NEW1 "gnubg-stock-new1" #define GNUBG_STOCK_NEW3 "gnubg-stock-new3" #define GNUBG_STOCK_NEW5 "gnubg-stock-new5" #define GNUBG_STOCK_NEW7 "gnubg-stock-new7" #define GNUBG_STOCK_NEW9 "gnubg-stock-new9" #define GNUBG_STOCK_OK "gnubg-stock-ok" #define GNUBG_STOCK_REJECT "gnubg-stock-reject" #define GNUBG_STOCK_RESIGN "gnubg-stock-resign" #define GNUBG_STOCK_RESIGNSB "gnubg-stock-resignsb" #define GNUBG_STOCK_RESIGNSG "gnubg-stock-resignsg" #define GNUBG_STOCK_RESIGNSN "gnubg-stock-resignsn" #define GNUBG_STOCK_RUNIT "gnubg-stock-runit" gnubg-1.08.003/gtksplash.h000644 001751 000024 00000002030 14574155047 015000 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtksplash.h,v 1.7 2013/06/16 02:16:16 mdpetch Exp $ */ #ifndef GTKSPLASH_H #define GTKSPLASH_H extern GtkWidget *CreateSplash(void); extern void DestroySplash(GtkWidget * pwSplash); extern void PushSplash(GtkWidget * pwSplash, const gchar * szText0, const gchar * szText1); #endif /* GTKSPLASH_H */ gnubg-1.08.003/sgf_y.c000644 001751 000024 00000136235 14613445366 014121 0ustar00pmstaff000000 000000 /* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output, and Bison version. */ #define YYBISON 30802 /* Bison version string. */ #define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Substitute the variable and function names. */ #define yyparse sgfparse #define yylex sgflex #define yyerror sgferror #define yydebug sgfdebug #define yynerrs sgfnerrs #define yylval sgflval #define yychar sgfchar /* First part of user prologue. */ #line 21 "../gnubg/sgf_y.y" #include "common.h" #include "list.h" #include #include #include #include #include #include "sgf.h" /* Resolve a warning on older GLIBC/GNU systems that have stpcpy */ #if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE && !defined(__USE_XOPEN2K8) extern char *stpcpy(char *s1, const char *s2); #endif static listOLD *plCollection; extern int sgflex( void ); #define YYERROR_VERBOSE void ( *SGFErrorHandler )( const char *, int ) = NULL; static int sgferror( const char *s ) { if( SGFErrorHandler ) SGFErrorHandler( s, 1 ); else fprintf( stderr, "%s\n", s ); return 0; } static listOLD *NewList( void ) { listOLD *pl = g_malloc( sizeof( listOLD ) ); ListCreate( pl ); return pl; } static char *Concatenate( listOLD *pl ) { size_t cch = 0; char *sz, *pchDest, *pchSrc; for( pl = pl->plNext; pl->p; pl = pl->plNext ) cch += strlen( pl->p ); pchDest = sz = g_malloc0( cch + 1 ); while( pl->plNext != pl ) { for( pchSrc = pl->plNext->p; ( *pchDest++ = *pchSrc++ ); ) ; pchDest--; g_free( pl->plNext->p ); ListDelete( pl->plNext ); } g_free( pl ); return sz; } #line 145 "sgf_y.c" # ifndef YY_CAST # ifdef __cplusplus # define YY_CAST(Type, Val) static_cast (Val) # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else # define YY_CAST(Type, Val) ((Type) (Val)) # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) # endif # endif # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif /* Use api.header.include to #include this header instead of duplicating it here. */ #ifndef YY_SGF_SGF_Y_H_INCLUDED # define YY_SGF_SGF_Y_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int sgfdebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ PROPERTY = 258, /* PROPERTY */ VALUETEXT = 259 /* VALUETEXT */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Token kinds. */ #define YYEMPTY -2 #define YYEOF 0 #define YYerror 256 #define YYUNDEF 257 #define PROPERTY 258 #define VALUETEXT 259 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 95 "../gnubg/sgf_y.y" char ach[ 2 ]; /* property identifier */ char *pch; /* property value */ property *pp; /* complete property */ listOLD *pl; /* nodes, sequences, gametrees */ #line 213 "sgf_y.c" }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE sgflval; int sgfparse (void); #endif /* !YY_SGF_SGF_Y_H_INCLUDED */ /* Symbol kind. */ enum yysymbol_kind_t { YYSYMBOL_YYEMPTY = -2, YYSYMBOL_YYEOF = 0, /* "end of file" */ YYSYMBOL_YYerror = 1, /* error */ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ YYSYMBOL_PROPERTY = 3, /* PROPERTY */ YYSYMBOL_VALUETEXT = 4, /* VALUETEXT */ YYSYMBOL_5_ = 5, /* '(' */ YYSYMBOL_6_ = 6, /* ')' */ YYSYMBOL_7_ = 7, /* ';' */ YYSYMBOL_8_ = 8, /* '[' */ YYSYMBOL_9_ = 9, /* ']' */ YYSYMBOL_YYACCEPT = 10, /* $accept */ YYSYMBOL_Collection = 11, /* Collection */ YYSYMBOL_GameTreeSeq = 12, /* GameTreeSeq */ YYSYMBOL_GameTree = 13, /* GameTree */ YYSYMBOL_Sequence = 14, /* Sequence */ YYSYMBOL_Node = 15, /* Node */ YYSYMBOL_PropertySeq = 16, /* PropertySeq */ YYSYMBOL_Property = 17, /* Property */ YYSYMBOL_ValueSeq = 18, /* ValueSeq */ YYSYMBOL_Value = 19, /* Value */ YYSYMBOL_ValueCharSeq = 20 /* ValueCharSeq */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; #ifdef short # undef short #endif /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure and (if available) are included so that the code can choose integer types of a good width. */ #ifndef __PTRDIFF_MAX__ # include /* INFRINGES ON USER NAME SPACE */ # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YY_STDINT_H # endif #endif /* Narrow types that promote to a signed type and that can represent a signed or unsigned integer of at least N bits. In tables they can save space and decrease cache pressure. Promoting to a signed type helps avoid bugs in integer arithmetic. */ #ifdef __INT_LEAST8_MAX__ typedef __INT_LEAST8_TYPE__ yytype_int8; #elif defined YY_STDINT_H typedef int_least8_t yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef __INT_LEAST16_MAX__ typedef __INT_LEAST16_TYPE__ yytype_int16; #elif defined YY_STDINT_H typedef int_least16_t yytype_int16; #else typedef short yytype_int16; #endif /* Work around bug in HP-UX 11.23, which defines these macros incorrectly for preprocessor constants. This workaround can likely be removed in 2023, as HPE has promised support for HP-UX 11.23 (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of . */ #ifdef __hpux # undef UINT_LEAST8_MAX # undef UINT_LEAST16_MAX # define UINT_LEAST8_MAX 255 # define UINT_LEAST16_MAX 65535 #endif #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ && UINT_LEAST8_MAX <= INT_MAX) typedef uint_least8_t yytype_uint8; #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX typedef unsigned char yytype_uint8; #else typedef short yytype_uint8; #endif #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ typedef __UINT_LEAST16_TYPE__ yytype_uint16; #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ && UINT_LEAST16_MAX <= INT_MAX) typedef uint_least16_t yytype_uint16; #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX typedef unsigned short yytype_uint16; #else typedef int yytype_uint16; #endif #ifndef YYPTRDIFF_T # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ # define YYPTRDIFF_T __PTRDIFF_TYPE__ # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ # elif defined PTRDIFF_MAX # ifndef ptrdiff_t # include /* INFRINGES ON USER NAME SPACE */ # endif # define YYPTRDIFF_T ptrdiff_t # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX # else # define YYPTRDIFF_T long # define YYPTRDIFF_MAXIMUM LONG_MAX # endif #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM \ YY_CAST (YYPTRDIFF_T, \ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ ? YYPTRDIFF_MAXIMUM \ : YY_CAST (YYSIZE_T, -1))) #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) /* Stored state numbers (used for stacks). */ typedef yytype_int8 yy_state_t; /* State numbers in computations. */ typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE_PURE # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define YY_ATTRIBUTE_PURE # endif #endif #ifndef YY_ATTRIBUTE_UNUSED # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # else # define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YY_USE(E) ((void) (E)) #else # define YY_USE(E) /* empty */ #endif /* Suppress an incorrect diagnostic about yylval being uninitialized. */ #if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ # if __GNUC__ * 100 + __GNUC_MINOR__ < 407 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") # else # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ # define YY_IGNORE_USELESS_CAST_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") # define YY_IGNORE_USELESS_CAST_END \ _Pragma ("GCC diagnostic pop") #endif #ifndef YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_END #endif #define YY_ASSERT(E) ((void) (0 && (E))) #if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYPTRDIFF_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 23 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 10 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 11 /* YYNRULES -- Number of rules. */ #define YYNRULES 19 /* YYNSTATES -- Number of states. */ #define YYNSTATES 24 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 259 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ : YYSYMBOL_YYUNDEF) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 112, 112, 117, 118, 120, 123, 127, 129, 131, 134, 139, 140, 144, 147, 156, 157, 161, 166, 167 }; #endif /** Accessing symbol of state STATE. */ #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) #if YYDEBUG || 0 /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "\"invalid token\"", "PROPERTY", "VALUETEXT", "'('", "')'", "';'", "'['", "']'", "$accept", "Collection", "GameTreeSeq", "GameTree", "Sequence", "Node", "PropertySeq", "Property", "ValueSeq", "Value", "ValueCharSeq", YY_NULLPTR }; static const char * yysymbol_name (yysymbol_kind_t yysymbol) { return yytname[yysymbol]; } #endif #define YYPACT_NINF (-2) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) #define YYTABLE_NINF (-17) #define yytable_value_is_error(Yyn) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int8 yypact[] = { -2, 1, 10, -2, -2, 7, -2, -2, 2, -2, -1, -2, 11, -2, -2, -2, -2, -2, 12, -2, 13, 9, -2, -2 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_int8 yydefact[] = { 3, 0, 0, 1, 5, 0, 4, 11, 0, 7, 0, 9, 0, 8, 13, 15, 12, 6, 0, 18, 14, 0, 19, 17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -2, -2, 14, -2, -2, 15, -2, -2, -2, -2, -2 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { 0, 1, 2, 6, 8, 9, 10, 16, 18, 20, 21 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { 14, 3, 15, 11, -10, -10, -10, -3, -3, 7, -2, 4, 4, 22, 7, 5, 5, 17, 23, 0, 19, -16, 12, 13 }; static const yytype_int8 yycheck[] = { 1, 0, 3, 1, 5, 6, 7, 5, 6, 7, 0, 1, 1, 4, 7, 5, 5, 6, 9, -1, 8, 8, 8, 8 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { 0, 11, 12, 0, 1, 5, 13, 7, 14, 15, 16, 1, 12, 15, 1, 3, 17, 6, 18, 8, 19, 20, 4, 9 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int8 yyr1[] = { 0, 10, 11, 12, 12, 12, 13, 14, 14, 14, 15, 16, 16, 16, 17, 18, 18, 19, 20, 20 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 0, 2, 2, 4, 1, 2, 2, 2, 0, 2, 2, 3, 0, 2, 3, 0, 2 }; enum { YYENOMEM = -2 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Backward compatibility with an undocumented macro. Use YYerror or YYUNDEF. */ #define YYERRCODE YYUNDEF /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Kind, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { FILE *yyoutput = yyo; YY_USE (yyoutput); if (!yyvaluep) return; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { YYFPRINTF (yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); yy_symbol_value_print (yyo, yykind, yyvaluep); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule) { int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &yyvsp[(yyi + 1) - (yynrhs)]); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) ((void) 0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep) { YY_USE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /* Lookahead token kind. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ int yyparse (void) { yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* Their size. */ YYPTRDIFF_T yystacksize = YYINITDEPTH; /* The state stack: array, bottom, top. */ yy_state_t yyssa[YYINITDEPTH]; yy_state_t *yyss = yyssa; yy_state_t *yyssp = yyss; /* The semantic value stack: array, bottom, top. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp = yyvs; int yyn; /* The return value of yyparse. */ int yyresult; /* Lookahead symbol kind. */ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yysetstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: YYDPRINTF ((stderr, "Entering state %d\n", yystate)); YY_ASSERT (0 <= yystate && yystate < YYNSTATES); YY_IGNORE_USELESS_CAST_BEGIN *yyssp = YY_CAST (yy_state_t, yystate); YY_IGNORE_USELESS_CAST_END YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ YYPTRDIFF_T yysize = yyssp - yyss + 1; # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ yy_state_t *yyss1 = yyss; YYSTYPE *yyvs1 = yyvs; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF (*yyssp), &yyvs1, yysize * YYSIZEOF (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yy_state_t *yyss1 = yyss; union yyalloc *yyptr = YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YY_IGNORE_USELESS_CAST_BEGIN YYDPRINTF ((stderr, "Stack size increased to %ld\n", YY_CAST (long, yystacksize))); YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token\n")); yychar = yylex (); } if (yychar <= YYEOF) { yychar = YYEOF; yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else if (yychar == YYerror) { /* The scanner already issued an error message, process directly to error recovery. But do not keep the error token as lookahead, it is too special and may lead us to an endless loop in error recovery. */ yychar = YYUNDEF; yytoken = YYSYMBOL_YYerror; goto yyerrlab1; } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Discard the shifted token. */ yychar = YYEMPTY; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* Collection: GameTreeSeq */ #line 113 "../gnubg/sgf_y.y" { (yyval.pl) = plCollection = (yyvsp[0].pl); } #line 1215 "sgf_y.c" break; case 3: /* GameTreeSeq: %empty */ #line 117 "../gnubg/sgf_y.y" { (yyval.pl) = NewList(); } #line 1221 "sgf_y.c" break; case 4: /* GameTreeSeq: GameTreeSeq GameTree */ #line 119 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl), (yyvsp[0].pl) ); (yyval.pl) = (yyvsp[-1].pl); } #line 1227 "sgf_y.c" break; case 6: /* GameTree: '(' Sequence GameTreeSeq ')' */ #line 124 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl)->plNext, (yyvsp[-2].pl) ); (yyval.pl) = (yyvsp[-1].pl); } #line 1233 "sgf_y.c" break; case 7: /* Sequence: Node */ #line 128 "../gnubg/sgf_y.y" { (yyval.pl) = NewList(); ListInsert( (yyval.pl), (yyvsp[0].pl) ); } #line 1239 "sgf_y.c" break; case 8: /* Sequence: Sequence Node */ #line 130 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl), (yyvsp[0].pl) ); (yyval.pl) = (yyvsp[-1].pl); } #line 1245 "sgf_y.c" break; case 10: /* Node: ';' PropertySeq */ #line 135 "../gnubg/sgf_y.y" { (yyval.pl) = (yyvsp[0].pl); } #line 1251 "sgf_y.c" break; case 11: /* PropertySeq: %empty */ #line 139 "../gnubg/sgf_y.y" { (yyval.pl) = NewList(); } #line 1257 "sgf_y.c" break; case 12: /* PropertySeq: PropertySeq Property */ #line 141 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl), (yyvsp[0].pp) ); (yyval.pl) = (yyvsp[-1].pl); } #line 1263 "sgf_y.c" break; case 14: /* Property: PROPERTY ValueSeq Value */ #line 148 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl), (yyvsp[0].pch) ); (yyval.pp) = g_malloc( sizeof(property) ); (yyval.pp)->pl = (yyvsp[-1].pl); (yyval.pp)->ach[ 0 ] = (yyvsp[-2].ach)[ 0 ]; (yyval.pp)->ach[ 1 ] = (yyvsp[-2].ach)[ 1 ]; } #line 1273 "sgf_y.c" break; case 15: /* ValueSeq: %empty */ #line 156 "../gnubg/sgf_y.y" { (yyval.pl) = NewList(); } #line 1279 "sgf_y.c" break; case 16: /* ValueSeq: ValueSeq Value */ #line 158 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl), (yyvsp[0].pch) ); (yyval.pl) = (yyvsp[-1].pl); } #line 1285 "sgf_y.c" break; case 17: /* Value: '[' ValueCharSeq ']' */ #line 162 "../gnubg/sgf_y.y" { (yyval.pch) = Concatenate( (yyvsp[-1].pl) ); } #line 1291 "sgf_y.c" break; case 18: /* ValueCharSeq: %empty */ #line 166 "../gnubg/sgf_y.y" { (yyval.pl) = NewList(); } #line 1297 "sgf_y.c" break; case 19: /* ValueCharSeq: ValueCharSeq VALUETEXT */ #line 168 "../gnubg/sgf_y.y" { ListInsert( (yyvsp[-1].pl), (yyvsp[0].pch) ); (yyval.pl) = (yyvsp[-1].pl); } #line 1303 "sgf_y.c" break; #line 1307 "sgf_y.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; yyerror (YY_("syntax error")); } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYSYMBOL_YYerror; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", YY_ACCESSING_SYMBOL (yystate), yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturnlab; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturnlab; /*-----------------------------------------------------------. | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | `-----------------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; goto yyreturnlab; /*----------------------------------------------------------. | yyreturnlab -- parsing is finished, clean up and return. | `----------------------------------------------------------*/ yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif return yyresult; } #line 171 "../gnubg/sgf_y.y" extern FILE *sgfin; extern listOLD *SGFParse( FILE *pf ) { sgfin = pf; plCollection = NULL; sgfparse(); return plCollection; } #ifdef SGFTEST #ifdef HAVE_MCHECK_H #include #endif static void Indent( int n ) { while( n-- ) putchar( ' ' ); } static void PrintProperty( property *pp, int n ) { listOLD *pl; Indent( n ); putchar( pp->ach[ 0 ] ); if ( pp->ach[ 1 ] ) putchar( pp->ach[ 1 ] ); for( pl = pp->pl->plNext; pl->p; pl = pl->plNext ) printf( "[%s]", (char *) pl->p ); putchar( '\n' ); } static void PrintNode( listOLD *pl, int n ) { for( pl = pl->plNext; pl->p; pl = pl->plNext ) PrintProperty( pl->p, n ); Indent( n ); puts( "-" ); } static void PrintSequence( listOLD *pl, int n ) { for( pl = pl->plNext; pl->p; pl = pl->plNext ) PrintNode( pl->p, n ); } static void PrintGameTreeSeq( listOLD *pl, int n ); static void PrintGameTree( listOLD *pl, int n ) { pl = pl->plNext; Indent( n ); puts( "<<<<<" ); PrintSequence( pl->p, n ); PrintGameTreeSeq( pl, n + 1 ); Indent( n ); puts( ">>>>>" ); } static void PrintGameTreeSeq( listOLD *pl, int n ) { for( pl = pl->plNext; pl->p; pl = pl->plNext ) PrintGameTree( pl->p, n ); } static void Error( char *s, int f ) { fprintf( stderr, _("sgf error: %s\n"), s ); } int main( int argc, char *argv[] ) { FILE *pf = NULL; listOLD *pl; #ifdef HAVE_MTRACE mtrace(); #endif SGFErrorHandler = Error; if( argc > 1 ) if( !( pf = fopen( argv[ 1 ], "r" ) ) ) { perror( argv[ 1 ] ); return 1; } if( ( pl = SGFParse( pf ? pf : stdin ) ) ) PrintGameTreeSeq( pl, 0 ); else { puts( _("Fatal error; can't print collection.") ); fclose( pf ); return 2; } fclose( pf ); return 0; } #endif gnubg-1.08.003/external_y.c000644 001751 000024 00000247407 14613445366 015170 0ustar00pmstaff000000 000000 /* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output, and Bison version. */ #define YYBISON 30802 /* Bison version string. */ #define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* First part of user prologue. */ #line 1 "../gnubg/external_y.y" /* * Copyright (C) 2014-2015 Michael Petch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: external_y.y,v 1.36 2020/02/20 21:19:52 plm Exp $ */ #ifndef EXTERNAL_Y_H #define EXTERNAL_Y_H #define MERGE_(a,b) a##b #define LABEL_(a,b) MERGE_(a, b) #define YY_PREFIX(variable) MERGE_(ext_,variable) #define yymaxdepth YY_PREFIX(maxdepth) #define yyparse YY_PREFIX(parse) #define yylex YY_PREFIX(lex) #define yyerror YY_PREFIX(error) #define yylval YY_PREFIX(lval) #define yychar YY_PREFIX(char) #define yydebug YY_PREFIX(debug) #define yypact YY_PREFIX(pact) #define yyr1 YY_PREFIX(r1) #define yyr2 YY_PREFIX(r2) #define yydef YY_PREFIX(def) #define yychk YY_PREFIX(chk) #define yypgo YY_PREFIX(pgo) #define yyact YY_PREFIX(act) #define yyexca YY_PREFIX(exca) #define yyerrflag YY_PREFIX(errflag) #define yynerrs YY_PREFIX(nerrs) #define yyps YY_PREFIX(ps) #define yypv YY_PREFIX(pv) #define yys YY_PREFIX(s) #define yy_yys YY_PREFIX(yys) #define yystate YY_PREFIX(state) #define yytmp YY_PREFIX(tmp) #define yyv YY_PREFIX(v) #define yy_yyv YY_PREFIX(yyv) #define yyval YY_PREFIX(val) #define yylloc YY_PREFIX(lloc) #define yyreds YY_PREFIX(reds) #define yytoks YY_PREFIX(toks) #define yylhs YY_PREFIX(yylhs) #define yylen YY_PREFIX(yylen) #define yydefred YY_PREFIX(yydefred) #define yydgoto YY_PREFIX(yydgoto) #define yysindex YY_PREFIX(yysindex) #define yyrindex YY_PREFIX(yyrindex) #define yygindex YY_PREFIX(yygindex) #define yytable YY_PREFIX(yytable) #define yycheck YY_PREFIX(yycheck) #define yyname YY_PREFIX(yyname) #define yyrule YY_PREFIX(yyrule) #include #include #include #include "common.h" #include "glib-ext.h" #include "external.h" #include "backgammon.h" #include "external_y.h" /* Resolve a warning on older GLIBC/GNU systems that have stpcpy */ #if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE && !defined(__USE_XOPEN2K8) extern char *stpcpy(char *s1, const char *s2); #endif #define extcmd ext_get_extra(scanner) int YY_PREFIX(get_column) (void * yyscanner ); void YY_PREFIX(set_column) (int column_no, void * yyscanner ); extern int YY_PREFIX(lex) (YYSTYPE * yylval_param, scancontext *scanner); extern scancontext *YY_PREFIX(get_extra) (void *yyscanner ); extern void StartParse(void *scancontext); extern void yyerror(scancontext *scanner, const char *str); void yyerror(scancontext *scanner, const char *str) { if (extcmd->ExtErrorHandler) extcmd->ExtErrorHandler(extcmd, str); else fprintf(stderr,"Error: %s\n",str); } #endif #line 176 "external_y.c" # ifndef YY_CAST # ifdef __cplusplus # define YY_CAST(Type, Val) static_cast (Val) # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else # define YY_CAST(Type, Val) ((Type) (Val)) # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) # endif # endif # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif /* Use api.header.include to #include this header instead of duplicating it here. */ #ifndef YY_YY_EXTERNAL_Y_H_INCLUDED # define YY_YY_EXTERNAL_Y_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ EOL = 258, /* EOL */ EXIT = 259, /* EXIT */ DISABLED = 260, /* DISABLED */ INTERFACEVERSION = 261, /* INTERFACEVERSION */ DEBUG = 262, /* DEBUG */ SET = 263, /* SET */ NEW = 264, /* NEW */ OLD = 265, /* OLD */ OUTPUT = 266, /* OUTPUT */ E_INTERFACE = 267, /* E_INTERFACE */ HELP = 268, /* HELP */ PROMPT = 269, /* PROMPT */ E_STRING = 270, /* E_STRING */ E_CHARACTER = 271, /* E_CHARACTER */ E_INTEGER = 272, /* E_INTEGER */ E_FLOAT = 273, /* E_FLOAT */ E_BOOLEAN = 274, /* E_BOOLEAN */ FIBSBOARD = 275, /* FIBSBOARD */ FIBSBOARDEND = 276, /* FIBSBOARDEND */ EVALUATION = 277, /* EVALUATION */ CRAWFORDRULE = 278, /* CRAWFORDRULE */ JACOBYRULE = 279, /* JACOBYRULE */ RESIGNATION = 280, /* RESIGNATION */ BEAVERS = 281, /* BEAVERS */ CUBE = 282, /* CUBE */ CUBEFUL = 283, /* CUBEFUL */ CUBELESS = 284, /* CUBELESS */ DETERMINISTIC = 285, /* DETERMINISTIC */ NOISE = 286, /* NOISE */ PLIES = 287, /* PLIES */ PRUNE = 288 /* PRUNE */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Token kinds. */ #define YYEMPTY -2 #define YYEOF 0 #define YYerror 256 #define YYUNDEF 257 #define EOL 258 #define EXIT 259 #define DISABLED 260 #define INTERFACEVERSION 261 #define DEBUG 262 #define SET 263 #define NEW 264 #define OLD 265 #define OUTPUT 266 #define E_INTERFACE 267 #define HELP 268 #define PROMPT 269 #define E_STRING 270 #define E_CHARACTER 271 #define E_INTEGER 272 #define E_FLOAT 273 #define E_BOOLEAN 274 #define FIBSBOARD 275 #define FIBSBOARDEND 276 #define EVALUATION 277 #define CRAWFORDRULE 278 #define JACOBYRULE 279 #define RESIGNATION 280 #define BEAVERS 281 #define CUBE 282 #define CUBEFUL 283 #define CUBELESS 284 #define DETERMINISTIC 285 #define NOISE 286 #define PLIES 287 #define PRUNE 288 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 114 "../gnubg/external_y.y" gboolean boolean; gchar character; gfloat floatnum; gint intnum; GString *str; GValue *gv; GList *list; commandinfo *cmd; #line 306 "external_y.c" }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif int yyparse (scancontext *scanner); #endif /* !YY_YY_EXTERNAL_Y_H_INCLUDED */ /* Symbol kind. */ enum yysymbol_kind_t { YYSYMBOL_YYEMPTY = -2, YYSYMBOL_YYEOF = 0, /* "end of file" */ YYSYMBOL_YYerror = 1, /* error */ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ YYSYMBOL_EOL = 3, /* EOL */ YYSYMBOL_EXIT = 4, /* EXIT */ YYSYMBOL_DISABLED = 5, /* DISABLED */ YYSYMBOL_INTERFACEVERSION = 6, /* INTERFACEVERSION */ YYSYMBOL_DEBUG = 7, /* DEBUG */ YYSYMBOL_SET = 8, /* SET */ YYSYMBOL_NEW = 9, /* NEW */ YYSYMBOL_OLD = 10, /* OLD */ YYSYMBOL_OUTPUT = 11, /* OUTPUT */ YYSYMBOL_E_INTERFACE = 12, /* E_INTERFACE */ YYSYMBOL_HELP = 13, /* HELP */ YYSYMBOL_PROMPT = 14, /* PROMPT */ YYSYMBOL_E_STRING = 15, /* E_STRING */ YYSYMBOL_E_CHARACTER = 16, /* E_CHARACTER */ YYSYMBOL_E_INTEGER = 17, /* E_INTEGER */ YYSYMBOL_E_FLOAT = 18, /* E_FLOAT */ YYSYMBOL_E_BOOLEAN = 19, /* E_BOOLEAN */ YYSYMBOL_FIBSBOARD = 20, /* FIBSBOARD */ YYSYMBOL_FIBSBOARDEND = 21, /* FIBSBOARDEND */ YYSYMBOL_EVALUATION = 22, /* EVALUATION */ YYSYMBOL_CRAWFORDRULE = 23, /* CRAWFORDRULE */ YYSYMBOL_JACOBYRULE = 24, /* JACOBYRULE */ YYSYMBOL_RESIGNATION = 25, /* RESIGNATION */ YYSYMBOL_BEAVERS = 26, /* BEAVERS */ YYSYMBOL_CUBE = 27, /* CUBE */ YYSYMBOL_CUBEFUL = 28, /* CUBEFUL */ YYSYMBOL_CUBELESS = 29, /* CUBELESS */ YYSYMBOL_DETERMINISTIC = 30, /* DETERMINISTIC */ YYSYMBOL_NOISE = 31, /* NOISE */ YYSYMBOL_PLIES = 32, /* PLIES */ YYSYMBOL_PRUNE = 33, /* PRUNE */ YYSYMBOL_34_ = 34, /* ':' */ YYSYMBOL_35_ = 35, /* '(' */ YYSYMBOL_36_ = 36, /* ')' */ YYSYMBOL_37_ = 37, /* ',' */ YYSYMBOL_YYACCEPT = 38, /* $accept */ YYSYMBOL_commands = 39, /* commands */ YYSYMBOL_setcommand = 40, /* setcommand */ YYSYMBOL_command = 41, /* command */ YYSYMBOL_board_element = 42, /* board_element */ YYSYMBOL_board_elements = 43, /* board_elements */ YYSYMBOL_endboard = 44, /* endboard */ YYSYMBOL_sessionoption = 45, /* sessionoption */ YYSYMBOL_evaloption = 46, /* evaloption */ YYSYMBOL_sessionoptions = 47, /* sessionoptions */ YYSYMBOL_evaloptions = 48, /* evaloptions */ YYSYMBOL_boardcommand = 49, /* boardcommand */ YYSYMBOL_evalcommand = 50, /* evalcommand */ YYSYMBOL_board = 51, /* board */ YYSYMBOL_float_type = 52, /* float_type */ YYSYMBOL_string_type = 53, /* string_type */ YYSYMBOL_integer_type = 54, /* integer_type */ YYSYMBOL_boolean_type = 55, /* boolean_type */ YYSYMBOL_list_type = 56, /* list_type */ YYSYMBOL_basic_types = 57, /* basic_types */ YYSYMBOL_list = 58, /* list */ YYSYMBOL_list_element = 59, /* list_element */ YYSYMBOL_list_elements = 60 /* list_elements */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; /* Second part of user prologue. */ #line 125 "../gnubg/external_y.y" #line 394 "external_y.c" #ifdef short # undef short #endif /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure and (if available) are included so that the code can choose integer types of a good width. */ #ifndef __PTRDIFF_MAX__ # include /* INFRINGES ON USER NAME SPACE */ # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YY_STDINT_H # endif #endif /* Narrow types that promote to a signed type and that can represent a signed or unsigned integer of at least N bits. In tables they can save space and decrease cache pressure. Promoting to a signed type helps avoid bugs in integer arithmetic. */ #ifdef __INT_LEAST8_MAX__ typedef __INT_LEAST8_TYPE__ yytype_int8; #elif defined YY_STDINT_H typedef int_least8_t yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef __INT_LEAST16_MAX__ typedef __INT_LEAST16_TYPE__ yytype_int16; #elif defined YY_STDINT_H typedef int_least16_t yytype_int16; #else typedef short yytype_int16; #endif /* Work around bug in HP-UX 11.23, which defines these macros incorrectly for preprocessor constants. This workaround can likely be removed in 2023, as HPE has promised support for HP-UX 11.23 (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of . */ #ifdef __hpux # undef UINT_LEAST8_MAX # undef UINT_LEAST16_MAX # define UINT_LEAST8_MAX 255 # define UINT_LEAST16_MAX 65535 #endif #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ && UINT_LEAST8_MAX <= INT_MAX) typedef uint_least8_t yytype_uint8; #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX typedef unsigned char yytype_uint8; #else typedef short yytype_uint8; #endif #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ typedef __UINT_LEAST16_TYPE__ yytype_uint16; #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ && UINT_LEAST16_MAX <= INT_MAX) typedef uint_least16_t yytype_uint16; #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX typedef unsigned short yytype_uint16; #else typedef int yytype_uint16; #endif #ifndef YYPTRDIFF_T # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ # define YYPTRDIFF_T __PTRDIFF_TYPE__ # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ # elif defined PTRDIFF_MAX # ifndef ptrdiff_t # include /* INFRINGES ON USER NAME SPACE */ # endif # define YYPTRDIFF_T ptrdiff_t # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX # else # define YYPTRDIFF_T long # define YYPTRDIFF_MAXIMUM LONG_MAX # endif #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM \ YY_CAST (YYPTRDIFF_T, \ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ ? YYPTRDIFF_MAXIMUM \ : YY_CAST (YYSIZE_T, -1))) #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) /* Stored state numbers (used for stacks). */ typedef yytype_int8 yy_state_t; /* State numbers in computations. */ typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE_PURE # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define YY_ATTRIBUTE_PURE # endif #endif #ifndef YY_ATTRIBUTE_UNUSED # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # else # define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YY_USE(E) ((void) (E)) #else # define YY_USE(E) /* empty */ #endif /* Suppress an incorrect diagnostic about yylval being uninitialized. */ #if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ # if __GNUC__ * 100 + __GNUC_MINOR__ < 407 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") # else # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ # define YY_IGNORE_USELESS_CAST_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") # define YY_IGNORE_USELESS_CAST_END \ _Pragma ("GCC diagnostic pop") #endif #ifndef YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_END #endif #define YY_ASSERT(E) ((void) (0 && (E))) #if 1 /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* 1 */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYPTRDIFF_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 25 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 74 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 38 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 23 /* YYNRULES -- Number of rules. */ #define YYNRULES 55 /* YYNSTATES -- Number of states. */ #define YYNSTATES 85 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 288 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ : YYSYMBOL_YYUNDEF) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 35, 36, 2, 2, 37, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 34, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { 0, 173, 173, 179, 186, 192, 198, 204, 258, 263, 269, 275, 282, 290, 298, 310, 314, 319, 326, 330, 335, 340, 345, 352, 357, 362, 370, 375, 380, 385, 390, 395, 400, 408, 425, 433, 450, 455, 462, 476, 491, 503, 511, 520, 528, 536, 546, 546, 546, 546, 551, 558, 558, 563, 567, 572 }; #endif /** Accessing symbol of state STATE. */ #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) #if 1 /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "\"invalid token\"", "EOL", "EXIT", "DISABLED", "INTERFACEVERSION", "DEBUG", "SET", "NEW", "OLD", "OUTPUT", "E_INTERFACE", "HELP", "PROMPT", "E_STRING", "E_CHARACTER", "E_INTEGER", "E_FLOAT", "E_BOOLEAN", "FIBSBOARD", "FIBSBOARDEND", "EVALUATION", "CRAWFORDRULE", "JACOBYRULE", "RESIGNATION", "BEAVERS", "CUBE", "CUBEFUL", "CUBELESS", "DETERMINISTIC", "NOISE", "PLIES", "PRUNE", "':'", "'('", "')'", "','", "$accept", "commands", "setcommand", "command", "board_element", "board_elements", "endboard", "sessionoption", "evaloption", "sessionoptions", "evaloptions", "boardcommand", "evalcommand", "board", "float_type", "string_type", "integer_type", "boolean_type", "list_type", "basic_types", "list", "list_element", "list_elements", YY_NULLPTR }; static const char * yysymbol_name (yysymbol_kind_t yysymbol) { return yytname[yysymbol]; } #endif #define YYPACT_NINF (-49) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) #define YYTABLE_NINF (-1) #define yytable_value_is_error(Yyn) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int8 yypact[] = { 3, -49, 7, -23, 15, 10, 26, 0, 19, 32, 41, -49, -49, -49, -49, -14, -49, -49, 27, 18, 34, 44, -49, 16, 43, -49, -49, 12, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, 4, -49, -49, -49, -49, -49, 49, -49, 27, 27, 48, 27, -49, -49, -14, 33, 29, -49, -49, -49, -49, -49, 48, 27, -49, -49, 27, 25, 48, 27, -49, -49, -49, -8, -49, -49, -49, -49, -49, -49, -49, -49, 48, -49, -49 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_int8 yydefact[] = { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 33, 6, 53, 14, 4, 0, 0, 0, 0, 5, 0, 0, 1, 7, 38, 42, 43, 41, 44, 48, 47, 49, 46, 52, 51, 45, 54, 0, 8, 9, 10, 11, 3, 0, 35, 0, 0, 0, 0, 34, 50, 0, 0, 39, 20, 19, 21, 22, 55, 0, 0, 31, 32, 28, 0, 0, 26, 37, 36, 16, 0, 15, 30, 29, 24, 25, 23, 27, 18, 0, 40, 17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -49, -49, -49, -49, -16, -49, -49, 13, -49, -49, -49, -49, -49, 46, 1, 51, -48, -18, -49, -49, 69, 20, -49 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { 0, 9, 21, 10, 72, 73, 83, 52, 71, 27, 56, 11, 12, 13, 32, 33, 34, 35, 36, 37, 38, 39, 40 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { 41, 28, 59, 29, 30, 31, 1, 2, 3, 4, 14, 5, 15, 81, 74, 23, 6, 18, 17, 78, 79, 15, 19, 7, 20, 8, 82, 42, 43, 22, 57, 58, 25, 60, 74, 48, 49, 50, 51, 24, 53, 54, 29, 30, 26, 75, 31, 45, 76, 28, 46, 80, 48, 49, 50, 51, 63, 64, 65, 66, 67, 68, 69, 7, 55, 29, 84, 62, 77, 70, 47, 44, 16, 0, 61 }; static const yytype_int8 yycheck[] = { 18, 15, 50, 17, 18, 19, 3, 4, 5, 6, 3, 8, 35, 21, 62, 15, 13, 7, 3, 67, 68, 35, 12, 20, 14, 22, 34, 9, 10, 3, 48, 49, 0, 51, 82, 23, 24, 25, 26, 20, 36, 37, 17, 18, 3, 63, 19, 3, 66, 15, 34, 69, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 20, 15, 17, 82, 34, 67, 56, 24, 20, 3, -1, 54 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { 0, 3, 4, 5, 6, 8, 13, 20, 22, 39, 41, 49, 50, 51, 3, 35, 58, 3, 7, 12, 14, 40, 3, 15, 20, 0, 3, 47, 15, 17, 18, 19, 52, 53, 54, 55, 56, 57, 58, 59, 60, 55, 9, 10, 53, 3, 34, 51, 23, 24, 25, 26, 45, 36, 37, 15, 48, 55, 55, 54, 55, 59, 34, 27, 28, 29, 30, 31, 32, 33, 45, 46, 42, 43, 54, 55, 55, 52, 54, 54, 55, 21, 34, 44, 42 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int8 yyr1[] = { 0, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 43, 43, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 48, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 57, 57, 57, 58, 59, 59, 60, 60, 60 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 1, 1, 0, 2, 0, 2, 2, 2, 4, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 0, 1, 3 }; enum { YYENOMEM = -2 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (scanner, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Backward compatibility with an undocumented macro. Use YYerror or YYUNDEF. */ #define YYERRCODE YYUNDEF /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Kind, Value, scanner); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, scancontext *scanner) { FILE *yyoutput = yyo; YY_USE (yyoutput); YY_USE (scanner); if (!yyvaluep) return; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, scancontext *scanner) { YYFPRINTF (yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); yy_symbol_value_print (yyo, yykind, yyvaluep, scanner); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, scancontext *scanner) { int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &yyvsp[(yyi + 1) - (yynrhs)], scanner); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule, scanner); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) ((void) 0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /* Context of a parse error. */ typedef struct { yy_state_t *yyssp; yysymbol_kind_t yytoken; } yypcontext_t; /* Put in YYARG at most YYARGN of the expected tokens given the current YYCTX, and return the number of tokens stored in YYARG. If YYARG is null, return the number of expected tokens (guaranteed to be less than YYNTOKENS). Return YYENOMEM on memory exhaustion. Return 0 if there are more than YYARGN expected tokens, yet fill YYARG up to YYARGN. */ static int yypcontext_expected_tokens (const yypcontext_t *yyctx, yysymbol_kind_t yyarg[], int yyargn) { /* Actual size of YYARG. */ int yycount = 0; int yyn = yypact[+*yyctx->yyssp]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror && !yytable_value_is_error (yytable[yyx + yyn])) { if (!yyarg) ++yycount; else if (yycount == yyargn) return 0; else yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx); } } if (yyarg && yycount == 0 && 0 < yyargn) yyarg[0] = YYSYMBOL_YYEMPTY; return yycount; } #ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) # else /* Return the length of YYSTR. */ static YYPTRDIFF_T yystrlen (const char *yystr) { YYPTRDIFF_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif #endif #ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif #endif #ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYPTRDIFF_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYPTRDIFF_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; else goto append; append: default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (yyres) return yystpcpy (yyres, yystr) - yyres; else return yystrlen (yystr); } #endif static int yy_syntax_error_arguments (const yypcontext_t *yyctx, yysymbol_kind_t yyarg[], int yyargn) { /* Actual size of YYARG. */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yyctx->yytoken != YYSYMBOL_YYEMPTY) { int yyn; if (yyarg) yyarg[yycount] = yyctx->yytoken; ++yycount; yyn = yypcontext_expected_tokens (yyctx, yyarg ? yyarg + 1 : yyarg, yyargn - 1); if (yyn == YYENOMEM) return YYENOMEM; else yycount += yyn; } return yycount; } /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return -1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return YYENOMEM if the required number of bytes is too large to store. */ static int yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, const yypcontext_t *yyctx) { enum { YYARGS_MAX = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat: reported tokens (one for the "unexpected", one per "expected"). */ yysymbol_kind_t yyarg[YYARGS_MAX]; /* Cumulated lengths of YYARG. */ YYPTRDIFF_T yysize = 0; /* Actual size of YYARG. */ int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX); if (yycount == YYENOMEM) return YYENOMEM; switch (yycount) { #define YYCASE_(N, S) \ case N: \ yyformat = S; \ break default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); #undef YYCASE_ } /* Compute error message size. Don't count the "%s"s, but reserve room for the terminator. */ yysize = yystrlen (yyformat) - 2 * yycount + 1; { int yyi; for (yyi = 0; yyi < yycount; ++yyi) { YYPTRDIFF_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]); if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) yysize = yysize1; else return YYENOMEM; } } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return -1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]); yyformat += 2; } else { ++yyp; ++yyformat; } } return 0; } /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, scancontext *scanner) { YY_USE (yyvaluep); YY_USE (scanner); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN switch (yykind) { case YYSYMBOL_E_STRING: /* E_STRING */ #line 166 "../gnubg/external_y.y" { if (((*yyvaluep).str)) g_string_free(((*yyvaluep).str), TRUE); } #line 1414 "external_y.c" break; case YYSYMBOL_setcommand: /* setcommand */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1420 "external_y.c" break; case YYSYMBOL_command: /* command */ #line 169 "../gnubg/external_y.y" { if (((*yyvaluep).cmd)) { g_free(((*yyvaluep).cmd)); }} #line 1426 "external_y.c" break; case YYSYMBOL_board_element: /* board_element */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1432 "external_y.c" break; case YYSYMBOL_board_elements: /* board_elements */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1438 "external_y.c" break; case YYSYMBOL_sessionoption: /* sessionoption */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1444 "external_y.c" break; case YYSYMBOL_evaloption: /* evaloption */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1450 "external_y.c" break; case YYSYMBOL_sessionoptions: /* sessionoptions */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1456 "external_y.c" break; case YYSYMBOL_evaloptions: /* evaloptions */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1462 "external_y.c" break; case YYSYMBOL_boardcommand: /* boardcommand */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1468 "external_y.c" break; case YYSYMBOL_evalcommand: /* evalcommand */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1474 "external_y.c" break; case YYSYMBOL_board: /* board */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1480 "external_y.c" break; case YYSYMBOL_float_type: /* float_type */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1486 "external_y.c" break; case YYSYMBOL_string_type: /* string_type */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1492 "external_y.c" break; case YYSYMBOL_integer_type: /* integer_type */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1498 "external_y.c" break; case YYSYMBOL_boolean_type: /* boolean_type */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1504 "external_y.c" break; case YYSYMBOL_list_type: /* list_type */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1510 "external_y.c" break; case YYSYMBOL_basic_types: /* basic_types */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1516 "external_y.c" break; case YYSYMBOL_list: /* list */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1522 "external_y.c" break; case YYSYMBOL_list_element: /* list_element */ #line 168 "../gnubg/external_y.y" { if (((*yyvaluep).gv)) { g_value_unsetfree(((*yyvaluep).gv)); }} #line 1528 "external_y.c" break; case YYSYMBOL_list_elements: /* list_elements */ #line 167 "../gnubg/external_y.y" { if (((*yyvaluep).list)) g_list_free(((*yyvaluep).list)); } #line 1534 "external_y.c" break; default: break; } YY_IGNORE_MAYBE_UNINITIALIZED_END } /*----------. | yyparse. | `----------*/ int yyparse (scancontext *scanner) { /* Lookahead token kind. */ int yychar; /* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ YY_INITIAL_VALUE (static YYSTYPE yyval_default;) YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Number of syntax errors so far. */ int yynerrs = 0; yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* Their size. */ YYPTRDIFF_T yystacksize = YYINITDEPTH; /* The state stack: array, bottom, top. */ yy_state_t yyssa[YYINITDEPTH]; yy_state_t *yyss = yyssa; yy_state_t *yyssp = yyss; /* The semantic value stack: array, bottom, top. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp = yyvs; int yyn; /* The return value of yyparse. */ int yyresult; /* Lookahead symbol kind. */ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yysetstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: YYDPRINTF ((stderr, "Entering state %d\n", yystate)); YY_ASSERT (0 <= yystate && yystate < YYNSTATES); YY_IGNORE_USELESS_CAST_BEGIN *yyssp = YY_CAST (yy_state_t, yystate); YY_IGNORE_USELESS_CAST_END YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ YYPTRDIFF_T yysize = yyssp - yyss + 1; # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ yy_state_t *yyss1 = yyss; YYSTYPE *yyvs1 = yyvs; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF (*yyssp), &yyvs1, yysize * YYSIZEOF (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yy_state_t *yyss1 = yyss; union yyalloc *yyptr = YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YY_IGNORE_USELESS_CAST_BEGIN YYDPRINTF ((stderr, "Stack size increased to %ld\n", YY_CAST (long, yystacksize))); YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token\n")); yychar = yylex (&yylval, scanner); } if (yychar <= YYEOF) { yychar = YYEOF; yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else if (yychar == YYerror) { /* The scanner already issued an error message, process directly to error recovery. But do not keep the error token as lookahead, it is too special and may lead us to an endless loop in error recovery. */ yychar = YYUNDEF; yytoken = YYSYMBOL_YYerror; goto yyerrlab1; } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Discard the shifted token. */ yychar = YYEMPTY; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* commands: EOL */ #line 174 "../gnubg/external_y.y" { extcmd->ct = COMMAND_NONE; YYACCEPT; } #line 1816 "external_y.c" break; case 3: /* commands: SET setcommand EOL */ #line 180 "../gnubg/external_y.y" { extcmd->pCmdData = (yyvsp[-1].list); extcmd->ct = COMMAND_SET; YYACCEPT; } #line 1826 "external_y.c" break; case 4: /* commands: INTERFACEVERSION EOL */ #line 187 "../gnubg/external_y.y" { extcmd->ct = COMMAND_VERSION; YYACCEPT; } #line 1835 "external_y.c" break; case 5: /* commands: HELP EOL */ #line 193 "../gnubg/external_y.y" { extcmd->ct = COMMAND_HELP; YYACCEPT; } #line 1844 "external_y.c" break; case 6: /* commands: EXIT EOL */ #line 199 "../gnubg/external_y.y" { extcmd->ct = COMMAND_EXIT; YYACCEPT; } #line 1853 "external_y.c" break; case 7: /* commands: command EOL */ #line 205 "../gnubg/external_y.y" { if ((yyvsp[-1].cmd)->cmdType == COMMAND_LIST) { g_value_unsetfree((yyvsp[-1].cmd)->pvData); extcmd->ct = (yyvsp[-1].cmd)->cmdType; YYACCEPT; } else { GMap *optionsmap = (GMap *)g_value_get_boxed((GValue *)g_list_nth_data(g_value_get_boxed((yyvsp[-1].cmd)->pvData), 1)); GList *boarddata = (GList *)g_value_get_boxed((GValue *)g_list_nth_data(g_value_get_boxed((yyvsp[-1].cmd)->pvData), 0)); extcmd->ct = (yyvsp[-1].cmd)->cmdType; extcmd->pCmdData = (yyvsp[-1].cmd)->pvData; if (g_list_length(boarddata) < MAX_RFBF_ELEMENTS) { GVALUE_CREATE(G_TYPE_INT, int, 0, gvfalse); GVALUE_CREATE(G_TYPE_INT, int, 1, gvtrue); GVALUE_CREATE(G_TYPE_FLOAT, float, 0.0, gvfloatzero); extcmd->bi.gsName = g_string_new(g_value_get_gstring_gchar(boarddata->data)); extcmd->bi.gsOpp = g_string_new(g_value_get_gstring_gchar(g_list_nth_data(boarddata, 1))); GList *curbrdpos = g_list_nth(boarddata, 2); int *curarraypos = extcmd->anList; while (curbrdpos != NULL) { *curarraypos++ = g_value_get_int(curbrdpos->data); curbrdpos = g_list_next(curbrdpos); } extcmd->nPlies = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_PLIES, gvfalse)); extcmd->fCrawfordRule = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_CRAWFORDRULE, gvfalse)); extcmd->fJacobyRule = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_JACOBYRULE, gvfalse)); extcmd->fUsePrune = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_PRUNE, gvfalse)); extcmd->fCubeful = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_CUBEFUL, gvfalse)); extcmd->rNoise = g_value_get_float(str2gv_map_get_key_value(optionsmap, KEY_STR_NOISE, gvfloatzero)); extcmd->fDeterministic = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_DETERMINISTIC, gvtrue)); extcmd->nResignation = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_RESIGNATION, gvfalse)); extcmd->fBeavers = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_BEAVERS, gvtrue)); g_value_unsetfree(gvtrue); g_value_unsetfree(gvfalse); g_value_unsetfree(gvfloatzero); g_free((yyvsp[-1].cmd)); YYACCEPT; } else { yyerror(scanner, "Invalid board. Maximum number of elements is 52"); g_value_unsetfree((yyvsp[-1].cmd)->pvData); g_free((yyvsp[-1].cmd)); YYERROR; } } } #line 1908 "external_y.c" break; case 8: /* setcommand: DEBUG boolean_type */ #line 259 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_DEBUG, (yyvsp[0].gv)); } #line 1916 "external_y.c" break; case 9: /* setcommand: E_INTERFACE NEW */ #line 264 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_INT, int, 1, gvint); (yyval.list) = create_str2gvalue_tuple (KEY_STR_NEWINTERFACE, gvint); } #line 1925 "external_y.c" break; case 10: /* setcommand: E_INTERFACE OLD */ #line 270 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_INT, int, 0, gvint); (yyval.list) = create_str2gvalue_tuple (KEY_STR_NEWINTERFACE, gvint); } #line 1934 "external_y.c" break; case 11: /* setcommand: PROMPT string_type */ #line 276 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_PROMPT, (yyvsp[0].gv)); } #line 1942 "external_y.c" break; case 12: /* command: boardcommand */ #line 283 "../gnubg/external_y.y" { commandinfo *cmdInfo = g_malloc0(sizeof(commandinfo)); cmdInfo->pvData = (yyvsp[0].gv); cmdInfo->cmdType = COMMAND_FIBSBOARD; (yyval.cmd) = cmdInfo; } #line 1953 "external_y.c" break; case 13: /* command: evalcommand */ #line 291 "../gnubg/external_y.y" { commandinfo *cmdInfo = g_malloc0(sizeof(commandinfo)); cmdInfo->pvData = (yyvsp[0].gv); cmdInfo->cmdType = COMMAND_EVALUATION; (yyval.cmd) = cmdInfo; } #line 1964 "external_y.c" break; case 14: /* command: DISABLED list */ #line 299 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, (yyvsp[0].list), gvptr); g_list_free((yyvsp[0].list)); commandinfo *cmdInfo = g_malloc0(sizeof(commandinfo)); cmdInfo->pvData = gvptr; cmdInfo->cmdType = COMMAND_LIST; (yyval.cmd) = cmdInfo; } #line 1977 "external_y.c" break; case 16: /* board_elements: board_element */ #line 315 "../gnubg/external_y.y" { (yyval.list) = g_list_prepend(NULL, (yyvsp[0].gv)); } #line 1985 "external_y.c" break; case 17: /* board_elements: board_elements ':' board_element */ #line 320 "../gnubg/external_y.y" { (yyval.list) = g_list_prepend((yyvsp[-2].list), (yyvsp[0].gv)); } #line 1993 "external_y.c" break; case 19: /* sessionoption: JACOBYRULE boolean_type */ #line 331 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_JACOBYRULE, (yyvsp[0].gv)); } #line 2001 "external_y.c" break; case 20: /* sessionoption: CRAWFORDRULE boolean_type */ #line 336 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_CRAWFORDRULE, (yyvsp[0].gv)); } #line 2009 "external_y.c" break; case 21: /* sessionoption: RESIGNATION integer_type */ #line 341 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_RESIGNATION, (yyvsp[0].gv)); } #line 2017 "external_y.c" break; case 22: /* sessionoption: BEAVERS boolean_type */ #line 346 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_BEAVERS, (yyvsp[0].gv)); } #line 2025 "external_y.c" break; case 23: /* evaloption: PLIES integer_type */ #line 353 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_PLIES, (yyvsp[0].gv)); } #line 2033 "external_y.c" break; case 24: /* evaloption: NOISE float_type */ #line 358 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_NOISE, (yyvsp[0].gv)); } #line 2041 "external_y.c" break; case 25: /* evaloption: NOISE integer_type */ #line 363 "../gnubg/external_y.y" { float floatval = (float) g_value_get_int((yyvsp[0].gv)) / 10000.0f; GVALUE_CREATE(G_TYPE_FLOAT, float, floatval, gvfloat); (yyval.list) = create_str2gvalue_tuple (KEY_STR_NOISE, gvfloat); g_value_unsetfree((yyvsp[0].gv)); } #line 2052 "external_y.c" break; case 26: /* evaloption: PRUNE */ #line 371 "../gnubg/external_y.y" { (yyval.list) = create_str2int_tuple (KEY_STR_PRUNE, TRUE); } #line 2060 "external_y.c" break; case 27: /* evaloption: PRUNE boolean_type */ #line 376 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_PRUNE, (yyvsp[0].gv)); } #line 2068 "external_y.c" break; case 28: /* evaloption: DETERMINISTIC */ #line 381 "../gnubg/external_y.y" { (yyval.list) = create_str2int_tuple (KEY_STR_DETERMINISTIC, TRUE); } #line 2076 "external_y.c" break; case 29: /* evaloption: DETERMINISTIC boolean_type */ #line 386 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_DETERMINISTIC, (yyvsp[0].gv)); } #line 2084 "external_y.c" break; case 30: /* evaloption: CUBE boolean_type */ #line 391 "../gnubg/external_y.y" { (yyval.list) = create_str2gvalue_tuple (KEY_STR_CUBEFUL, (yyvsp[0].gv)); } #line 2092 "external_y.c" break; case 31: /* evaloption: CUBEFUL */ #line 396 "../gnubg/external_y.y" { (yyval.list) = create_str2int_tuple (KEY_STR_CUBEFUL, TRUE); } #line 2100 "external_y.c" break; case 32: /* evaloption: CUBELESS */ #line 401 "../gnubg/external_y.y" { (yyval.list) = create_str2int_tuple (KEY_STR_CUBEFUL, FALSE); } #line 2108 "external_y.c" break; case 33: /* sessionoptions: %empty */ #line 408 "../gnubg/external_y.y" { /* Setup the defaults */ STR2GV_MAPENTRY_CREATE(KEY_STR_JACOBYRULE, fJacoby, G_TYPE_INT, int, jacobyentry); STR2GV_MAPENTRY_CREATE(KEY_STR_CRAWFORDRULE, TRUE, G_TYPE_INT, int, crawfordentry); STR2GV_MAPENTRY_CREATE(KEY_STR_RESIGNATION, FALSE, G_TYPE_INT, int, resignentry); STR2GV_MAPENTRY_CREATE(KEY_STR_BEAVERS, TRUE, G_TYPE_INT, int, beaversentry); GList *defaults = g_list_prepend(g_list_prepend(g_list_prepend(g_list_prepend(NULL, jacobyentry), crawfordentry), \ resignentry), beaversentry); (yyval.list) = defaults; } #line 2129 "external_y.c" break; case 34: /* sessionoptions: sessionoptions sessionoption */ #line 426 "../gnubg/external_y.y" { STR2GV_MAP_ADD_ENTRY((yyvsp[-1].list), (yyvsp[0].list), (yyval.list)); } #line 2137 "external_y.c" break; case 35: /* evaloptions: %empty */ #line 433 "../gnubg/external_y.y" { /* Setup the defaults */ STR2GV_MAPENTRY_CREATE(KEY_STR_JACOBYRULE, fJacoby, G_TYPE_INT, int, jacobyentry); STR2GV_MAPENTRY_CREATE(KEY_STR_CRAWFORDRULE, TRUE, G_TYPE_INT, int, crawfordentry); STR2GV_MAPENTRY_CREATE(KEY_STR_RESIGNATION, FALSE, G_TYPE_INT, int, resignentry); STR2GV_MAPENTRY_CREATE(KEY_STR_BEAVERS, TRUE, G_TYPE_INT, int, beaversentry); GList *defaults = g_list_prepend(g_list_prepend(g_list_prepend(g_list_prepend(NULL, jacobyentry), crawfordentry), \ resignentry), beaversentry); (yyval.list) = defaults; } #line 2158 "external_y.c" break; case 36: /* evaloptions: evaloptions evaloption */ #line 451 "../gnubg/external_y.y" { STR2GV_MAP_ADD_ENTRY((yyvsp[-1].list), (yyvsp[0].list), (yyval.list)); } #line 2166 "external_y.c" break; case 37: /* evaloptions: evaloptions sessionoption */ #line 456 "../gnubg/external_y.y" { STR2GV_MAP_ADD_ENTRY((yyvsp[-1].list), (yyvsp[0].list), (yyval.list)); } #line 2174 "external_y.c" break; case 38: /* boardcommand: board sessionoptions */ #line 463 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, (yyvsp[-1].list), gvptr1); GVALUE_CREATE(G_TYPE_BOXED_MAP_GV, boxed, (yyvsp[0].list), gvptr2); GList *newList = g_list_prepend(g_list_prepend(NULL, gvptr2), gvptr1); GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, newList, gvnewlist); (yyval.gv) = gvnewlist; g_list_free(newList); g_list_free((yyvsp[-1].list)); g_list_free((yyvsp[0].list)); } #line 2189 "external_y.c" break; case 39: /* evalcommand: EVALUATION FIBSBOARD board evaloptions */ #line 477 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, (yyvsp[-1].list), gvptr1); GVALUE_CREATE(G_TYPE_BOXED_MAP_GV, boxed, (yyvsp[0].list), gvptr2); GList *newList = g_list_prepend(g_list_prepend(NULL, gvptr2), gvptr1); GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, newList, gvnewlist); (yyval.gv) = gvnewlist; g_list_free(newList); g_list_free((yyvsp[-1].list)); g_list_free((yyvsp[0].list)); } #line 2205 "external_y.c" break; case 40: /* board: FIBSBOARD E_STRING ':' E_STRING ':' board_elements endboard */ #line 492 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_GSTRING, boxed, (yyvsp[-3].str), gvstr1); GVALUE_CREATE(G_TYPE_GSTRING, boxed, (yyvsp[-5].str), gvstr2); (yyvsp[-1].list) = g_list_reverse((yyvsp[-1].list)); (yyval.list) = g_list_prepend(g_list_prepend((yyvsp[-1].list), gvstr1), gvstr2); g_string_free((yyvsp[-3].str), TRUE); g_string_free((yyvsp[-5].str), TRUE); } #line 2218 "external_y.c" break; case 41: /* float_type: E_FLOAT */ #line 504 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_FLOAT, float, (yyvsp[0].floatnum), gvfloat); (yyval.gv) = gvfloat; } #line 2227 "external_y.c" break; case 42: /* string_type: E_STRING */ #line 512 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_GSTRING, boxed, (yyvsp[0].str), gvstr); g_string_free ((yyvsp[0].str), TRUE); (yyval.gv) = gvstr; } #line 2237 "external_y.c" break; case 43: /* integer_type: E_INTEGER */ #line 521 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_INT, int, (yyvsp[0].intnum), gvint); (yyval.gv) = gvint; } #line 2246 "external_y.c" break; case 44: /* boolean_type: E_BOOLEAN */ #line 529 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_INT, int, (yyvsp[0].boolean), gvint); (yyval.gv) = gvint; } #line 2255 "external_y.c" break; case 45: /* list_type: list */ #line 537 "../gnubg/external_y.y" { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, (yyvsp[0].list), gvptr); g_list_free((yyvsp[0].list)); (yyval.gv) = gvptr; } #line 2265 "external_y.c" break; case 50: /* list: '(' list_elements ')' */ #line 552 "../gnubg/external_y.y" { (yyval.list) = g_list_reverse((yyvsp[-1].list)); } #line 2273 "external_y.c" break; case 53: /* list_elements: %empty */ #line 563 "../gnubg/external_y.y" { (yyval.list) = NULL; } #line 2281 "external_y.c" break; case 54: /* list_elements: list_element */ #line 568 "../gnubg/external_y.y" { (yyval.list) = g_list_prepend(NULL, (yyvsp[0].gv)); } #line 2289 "external_y.c" break; case 55: /* list_elements: list_elements ',' list_element */ #line 573 "../gnubg/external_y.y" { (yyval.list) = g_list_prepend((yyvsp[-2].list), (yyvsp[0].gv)); } #line 2297 "external_y.c" break; #line 2301 "external_y.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; { yypcontext_t yyctx = {yyssp, yytoken}; char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == -1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); if (yymsg) { yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); yymsgp = yymsg; } else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = YYENOMEM; } } yyerror (scanner, yymsgp); if (yysyntax_error_status == YYENOMEM) YYNOMEM; } } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, scanner); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYSYMBOL_YYerror; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", YY_ACCESSING_SYMBOL (yystate), yyvsp, scanner); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturnlab; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturnlab; /*-----------------------------------------------------------. | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | `-----------------------------------------------------------*/ yyexhaustedlab: yyerror (scanner, YY_("memory exhausted")); yyresult = 2; goto yyreturnlab; /*----------------------------------------------------------. | yyreturnlab -- parsing is finished, clean up and return. | `----------------------------------------------------------*/ yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, scanner); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, scanner); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); return yyresult; } #line 577 "../gnubg/external_y.y" #ifdef EXTERNAL_TEST /* * Test code can be built by configuring GNUbg with --without-gtk option and doing the following: * * ./ylwrap external_l.l lex.yy.c external_l.c -- flex * ./ylwrap external_y.y y.tab.c external_y.c y.tab.h test1_y.h -- bison * gcc -Ilib -I. -Wall `pkg-config gobject-2.0 --cflags --libs` external_l.c external_y.c glib-ext.c -DEXTERNAL_TEST -o exttest * */ #define BUFFERSIZE 1024 int fJacoby = TRUE; int main() { char buffer[BUFFERSIZE]; scancontext scanctx; memset(&scanctx, 0, sizeof(scanctx)); g_type_init (); ExtInitParse((void **)&scanctx); while(fgets(buffer, BUFFERSIZE, stdin) != NULL) { ExtStartParse(scanctx.scanner, buffer); if(scanctx.ct == COMMAND_EXIT) return 0; if (scanctx.bi.gsName) g_string_free(scanctx.bi.gsName, TRUE); if (scanctx.bi.gsOpp) g_string_free(scanctx.bi.gsOpp, TRUE); scanctx.bi.gsName = NULL; scanctx.bi.gsOpp = NULL; } ExtDestroyParse(scanctx.scanner); return 0; } #endif gnubg-1.08.003/config.sub000755 001751 000024 00000105526 14600637122 014615 0ustar00pmstaff000000 000000 #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-05-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type IFS="-" read -r field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 os=$maybe_os ;; android-linux) basic_machine=$field1-unknown os=linux-android ;; *) basic_machine=$field1-$field2 os=$field3 ;; esac ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc532* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* | hitachi* \ | c[123]* | convex* | sun | crds | omron* | dg | ultra | tti* \ | harris | dolphin | highlevel | gould | cbm | ns | masscomp \ | apple | axis | knuth | cray | microblaze* \ | sim | cisco | oki | wec | wrs | winbond) basic_machine=$field1-$field2 os= ;; *) basic_machine=$field1 os=$field2 ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc os=bsd ;; a29khif) basic_machine=a29k-amd os=udi ;; adobe68k) basic_machine=m68010-adobe os=scout ;; am29k) basic_machine=a29k-none os=bsd ;; amdahl) basic_machine=580-amdahl os=sysv ;; amigaos | amigados) basic_machine=m68k-unknown os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=sysv4 ;; apollo68) basic_machine=m68k-apollo os=sysv ;; apollo68bsd) basic_machine=m68k-apollo os=bsd ;; aros) basic_machine=i386-pc os=aros ;; aux) basic_machine=m68k-apple os=aux ;; balance) basic_machine=ns32k-sequent os=dynix ;; blackfin) basic_machine=bfin-unknown os=linux ;; cegcc) basic_machine=arm-unknown os=cegcc ;; cray) basic_machine=j90-cray os=unicos ;; craynv) basic_machine=craynv-cray os=unicosmp ;; delta88) basic_machine=m88k-motorola os=sysv3 ;; dicos) basic_machine=i686-pc os=dicos ;; djgpp) basic_machine=i586-pc os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=ose ;; gmicro) basic_machine=tron-gmicro os=sysv ;; go32) basic_machine=i386-pc os=go32 ;; h8300hms) basic_machine=h8300-hitachi os=hms ;; h8300xray) basic_machine=h8300-hitachi os=xray ;; h8500hms) basic_machine=h8500-hitachi os=hms ;; harris) basic_machine=m88k-harris os=sysv3 ;; hp300bsd) basic_machine=m68k-hp os=bsd ;; hp300hpux) basic_machine=m68k-hp os=hpux ;; hppaosf) basic_machine=hppa1.1-hp os=osf ;; hppro) basic_machine=hppa1.1-hp os=proelf ;; i386mach) basic_machine=i386-mach os=mach ;; vsta) basic_machine=i386-unknown os=vsta ;; isi68 | isi) basic_machine=m68k-isi os=sysv ;; m68knommu) basic_machine=m68k-unknown os=linux ;; magnum | m3230) basic_machine=mips-mips os=sysv ;; merlin) basic_machine=ns32k-utek os=sysv ;; mingw64) basic_machine=x86_64-pc os=mingw64 ;; mingw32) basic_machine=i686-pc os=mingw32 ;; mingw32ce) basic_machine=arm-unknown os=mingw32ce ;; monitor) basic_machine=m68k-rom68k os=coff ;; morphos) basic_machine=powerpc-unknown os=morphos ;; moxiebox) basic_machine=moxie-unknown os=moxiebox ;; msdos) basic_machine=i386-pc os=msdos ;; msys) basic_machine=i686-pc os=msys ;; mvs) basic_machine=i370-ibm os=mvs ;; nacl) basic_machine=le32-unknown os=nacl ;; ncr3000) basic_machine=i486-ncr os=sysv4 ;; netbsd386) basic_machine=i386-unknown os=netbsd ;; netwinder) basic_machine=armv4l-rebel os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=newsos ;; news1000) basic_machine=m68030-sony os=newsos ;; necv70) basic_machine=v70-nec os=sysv ;; nh3000) basic_machine=m68k-harris os=cxux ;; nh[45]000) basic_machine=m88k-harris os=cxux ;; nindy960) basic_machine=i960-intel os=nindy ;; mon960) basic_machine=i960-intel os=mon960 ;; nonstopux) basic_machine=mips-compaq os=nonstopux ;; os400) basic_machine=powerpc-ibm os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=ose ;; os68k) basic_machine=m68k-none os=os68k ;; paragon) basic_machine=i860-intel os=osf ;; parisc) basic_machine=hppa-unknown os=linux ;; pw32) basic_machine=i586-unknown os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=rdos ;; rdos32) basic_machine=i386-pc os=rdos ;; rom68k) basic_machine=m68k-rom68k os=coff ;; sa29200) basic_machine=a29k-amd os=udi ;; sei) basic_machine=mips-sei os=seiux ;; sps7) basic_machine=m68k-bull os=sysv2 ;; stratus) basic_machine=i860-stratus os=sysv4 ;; sun2os3) basic_machine=m68000-sun os=sunos3 ;; sun2os4) basic_machine=m68000-sun os=sunos4 ;; sun3os3) basic_machine=m68k-sun os=sunos3 ;; sun3os4) basic_machine=m68k-sun os=sunos4 ;; sun4os3) basic_machine=sparc-sun os=sunos3 ;; sun4os4) basic_machine=sparc-sun os=sunos4 ;; sun4sol2) basic_machine=sparc-sun os=solaris2 ;; sv1) basic_machine=sv1-cray os=unicos ;; symmetry) basic_machine=i386-sequent os=dynix ;; t3e) basic_machine=alphaev5-cray os=unicos ;; t90) basic_machine=t90-cray os=unicos ;; toad1) basic_machine=pdp10-xkl os=tops20 ;; tpf) basic_machine=s390x-ibm os=tpf ;; udi29k) basic_machine=a29k-amd os=udi ;; ultra3) basic_machine=a29k-nyu os=sym1 ;; v810 | necv810) basic_machine=v810-nec os=none ;; vaxv) basic_machine=vax-dec os=sysv ;; vms) basic_machine=vax-dec os=vms ;; vxworks960) basic_machine=i960-wrs os=vxworks ;; vxworks68) basic_machine=m68k-wrs os=vxworks ;; vxworks29k) basic_machine=a29k-wrs os=vxworks ;; xbox) basic_machine=i686-pc os=mingw32 ;; ymp) basic_machine=ymp-cray os=unicos ;; *) basic_machine=$1 os= ;; esac ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv6m | armv[78][arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper | csky \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nfp \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=${os:-none} ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; m9s12z | m68hcs12z | hcs12z | s12z) basic_machine=s12z-unknown os=${os:-none} ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=${os:-none} ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | amd64-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | csky-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nfp-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | powerpcspe-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; abacus) basic_machine=abacus-unknown ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; amiga | amiga-*) basic_machine=m68k-unknown ;; asmjs) basic_machine=asmjs-unknown ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=linux ;; bluegene*) basic_machine=powerpc-ibm os=cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=${os:-unicos} ;; convex-c1) basic_machine=c1-convex os=bsd ;; convex-c2) basic_machine=c2-convex os=bsd ;; convex-c32) basic_machine=c32-convex os=bsd ;; convex-c34) basic_machine=c34-convex os=bsd ;; convex-c38) basic_machine=c38-convex os=bsd ;; cr16 | cr16-*) basic_machine=cr16-unknown os=${os:-elf} ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=${os:-elf} ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=${os:-bosx} ;; dpx2*) basic_machine=m68k-bull os=sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; encore | umax | mmax) basic_machine=ns32k-encore ;; elxsi) basic_machine=elxsi-elxsi os=${os:-bsd} ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=hiuxwe2 ;; hp300-*) basic_machine=m68k-hp ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=solaris2 ;; j90 | j90-cray) basic_machine=j90-cray os=${os:-unicos} ;; iris | iris4d) basic_machine=mips-sgi case $os in irix*) ;; *) os=irix4 ;; esac ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=linux ;; microblaze*) basic_machine=microblaze-xilinx ;; miniframe) basic_machine=m68000-convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; news-3600 | risc-news) basic_machine=mips-sony os=newsos ;; next | m*-next) basic_machine=m68k-next case $os in nextstep* ) ;; ns2*) os=nextstep2 ;; *) os=nextstep3 ;; esac ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=hiuxwe2 ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=${os:-elf} ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=vxworks ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; tile*) basic_machine=$basic_machine-unknown os=linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; w65*) basic_machine=w65-wdc os=none ;; w89k-*) basic_machine=hppa1.1-winbond os=proelf ;; x64) basic_machine=x86_64-pc ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; none) basic_machine=none-none os=${os:-none} ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x$os != x ] then case $os in # First match some system type aliases that might get confused # with valid system types. # solaris* is a basic system type, with this one exception. auroraux) os=auroraux ;; bluegene*) os=cnk ;; solaris1 | solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; solaris) os=solaris2 ;; unixware*) os=sysv4.2uw ;; gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) es1800*) os=ose ;; # Some version numbers need modification chorusos*) os=chorusos ;; isc) os=isc2.2 ;; sco6) os=sco5v6 ;; sco5) os=sco3.2v5 ;; sco4) os=sco3.2v4 ;; sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` ;; sco3.2v[4-9]* | sco5v6*) # Don't forget version if it is 3.2v4 or newer. ;; scout) # Don't match below ;; sco*) os=sco3.2v2 ;; psos*) os=psos ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # sysv* is not here because it comes later, after sysvr4. gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | kopensolaris* | plan9* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* \ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ | clix* | riscos* | uniplus* | iris* | rtu* | xenix* \ | knetbsd* | mirbsd* | netbsd* \ | bitrig* | openbsd* | solidbsd* | libertybsd* \ | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* \ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ | linux-newlib* | linux-musl* | linux-uclibc* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ | openstep* | oskit* | conix* | pw32* | nonstopux* \ | storm-chaos* | tops10* | tenex* | tops20* | its* \ | os2* | vos* | palmos* | uclinux* | nucleus* \ | morphos* | superux* | rtmk* | windiss* \ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=nto-$os ;; esac ;; hiux*) os=hiuxwe2 ;; nto-qnx*) ;; nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; sim | xray | os68k* | v88r* \ | windows* | osx | abug | netware* | os9* \ | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) ;; linux-dietlibc) os=linux-dietlibc ;; linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; lynx*178) os=lynxos178 ;; lynx*5) os=lynxos5 ;; lynx*) os=lynxos ;; mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; opened*) os=openedition ;; os400*) os=os400 ;; sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; wince*) os=wince ;; utek*) os=bsd ;; dynix*) os=bsd ;; acis*) os=aos ;; atheos*) os=atheos ;; syllable*) os=syllable ;; 386bsd) os=bsd ;; ctix* | uts*) os=sysv ;; nova*) os=rtmk-nova ;; ns2) os=nextstep2 ;; nsk*) os=nsk ;; # Preserve the version number of sinix5. sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; sinix*) os=sysv4 ;; tpf*) os=tpf ;; triton*) os=sysv3 ;; oss*) os=sysv3 ;; svr4*) os=sysv4 ;; svr3) os=sysv3 ;; sysvr4) os=sysv4 ;; # This must come after sysvr4. sysv*) ;; ose*) os=ose ;; *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) os=mint ;; zvmoe) os=zvmoe ;; dicos*) os=dicos ;; pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=eabi ;; *) os=elf ;; esac ;; nacl*) ;; ios) ;; none) ;; *-eabi) ;; *) echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=elf ;; spu-*) os=elf ;; *-acorn) os=riscix1.2 ;; arm*-rebel) os=linux ;; arm*-semi) os=aout ;; c4x-* | tic4x-*) os=coff ;; c8051-*) os=elf ;; clipper-intergraph) os=clix ;; hexagon-*) os=elf ;; tic54x-*) os=coff ;; tic55x-*) os=coff ;; tic6x-*) os=coff ;; # This must come before the *-dec entry. pdp10-*) os=tops20 ;; pdp11-*) os=none ;; *-dec | vax-*) os=ultrix4.2 ;; m68*-apollo) os=domain ;; i386-sun) os=sunos4.0.2 ;; m68000-sun) os=sunos3 ;; m68*-cisco) os=aout ;; mep-*) os=elf ;; mips*-cisco) os=elf ;; mips*-*) os=elf ;; or32-*) os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 ;; sparc-* | *-sun) os=sunos4.1.1 ;; pru-*) os=elf ;; *-be) os=beos ;; *-ibm) os=aix ;; *-knuth) os=mmixware ;; *-wec) os=proelf ;; *-winbond) os=proelf ;; *-oki) os=proelf ;; *-hp) os=hpux ;; *-hitachi) os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=sysv ;; *-cbm) os=amigaos ;; *-dg) os=dgux ;; *-dolphin) os=sysv3 ;; m68k-ccur) os=rtu ;; m88k-omron*) os=luna ;; *-next) os=nextstep ;; *-sequent) os=ptx ;; *-crds) os=unos ;; *-ns) os=genix ;; i370-*) os=mvs ;; *-gould) os=sysv ;; *-highlevel) os=bsd ;; *-encore) os=bsd ;; *-sgi) os=irix ;; *-siemens) os=sysv4 ;; *-masscomp) os=rtu ;; f30[01]-fujitsu | f700-fujitsu) os=uxpv ;; *-rom68k) os=coff ;; *-*bug) os=coff ;; *-apple) os=macos ;; *-atari*) os=mint ;; *-wrs) os=vxworks ;; *) os=none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in riscix*) vendor=acorn ;; sunos*) vendor=sun ;; cnk*|-aix*) vendor=ibm ;; beos*) vendor=be ;; hpux*) vendor=hp ;; mpeix*) vendor=hp ;; hiux*) vendor=hitachi ;; unos*) vendor=crds ;; dgux*) vendor=dg ;; luna*) vendor=omron ;; genix*) vendor=ns ;; clix*) vendor=intergraph ;; mvs* | opened*) vendor=ibm ;; os400*) vendor=ibm ;; ptx*) vendor=sequent ;; tpf*) vendor=ibm ;; vxsim* | vxworks* | windiss*) vendor=wrs ;; aux*) vendor=apple ;; hms*) vendor=hitachi ;; mpw* | macos*) vendor=apple ;; *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) vendor=atari ;; vos*) vendor=stratus ;; esac basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac echo "$basic_machine-$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gnubg-1.08.003/rollout.h000644 001751 000024 00000013634 14574155047 014514 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2001 Gary Wong * Copyright (C) 2000-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: rollout.h,v 1.45 2021/06/09 19:43:19 plm Exp $ */ #ifndef ROLLOUT_H #define ROLLOUT_H #define MAXHIT 50 /* for statistics */ #define STAT_MAXCUBE 10 typedef struct { /* Regular win statistics (dimension is cube turns) */ int acWin[STAT_MAXCUBE]; int acWinGammon[STAT_MAXCUBE]; int acWinBackgammon[STAT_MAXCUBE]; /* Cube statistics (dimension is cube turns) */ int acDoubleDrop[STAT_MAXCUBE]; /* # of Double, drop */ int acDoubleTake[STAT_MAXCUBE]; /* # of Double, takes */ /* Chequer hit statistics (dimension is move number) */ /* Opponent closed out */ int nOpponentHit; int rOpponentHitMove; /* Average loss of pips in bear-off */ int nBearoffMoves; /* number of moves with bearoff */ int nBearoffPipsLost; /* number of pips lost in these moves */ /* Opponent closed out */ int nOpponentClosedOut; int rOpponentClosedOutMove; /* FIXME: add more stuff */ } rolloutstat; typedef void (rolloutprogressfunc) (float arOutput[][NUM_ROLLOUT_OUTPUTS], float arStdDev[][NUM_ROLLOUT_OUTPUTS], const rolloutcontext * prc, const cubeinfo aci[], unsigned int initial_game_count, const int iGame, const int iAlternative, const int nRank, const float rJsd, const int fStopped, const int fShowRanks, int fCubeRollout, void *pUserData); extern int RolloutGeneral(ConstTanBoard * apBoard, float (*apOutput[])[NUM_ROLLOUT_OUTPUTS], float (*apStdDev[])[NUM_ROLLOUT_OUTPUTS], rolloutstat apStatistics[][2], evalsetup *apes[], const cubeinfo *apci[], int *apCubeDecTop[], int alternatives, int fInvert, int fCubeRollout, rolloutprogressfunc * pfRolloutProgress, void *pUserData); extern int GeneralEvaluation(float arOutput[NUM_ROLLOUT_OUTPUTS], float arStdDev[NUM_ROLLOUT_OUTPUTS], rolloutstat arsStatistics[2], TanBoard anBoard, cubeinfo * const pci, const evalsetup * pes, rolloutprogressfunc * pfRolloutProgress, void *pUserData); extern int GeneralEvaluationR(float arOutput[NUM_ROLLOUT_OUTPUTS], float arStdDev[NUM_ROLLOUT_OUTPUTS], rolloutstat arsStatistics[2], const TanBoard anBoard, const cubeinfo * pci, const rolloutcontext * prc, rolloutprogressfunc * pfRolloutProgress, void *pUserData); extern int GeneralCubeDecision(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], rolloutstat aarsStatistics[2][2], const TanBoard anBoard, cubeinfo * pci, evalsetup * pes, rolloutprogressfunc * pfRolloutProgress, void *pUserData); extern int GeneralCubeDecisionR(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], rolloutstat aarsStatistics[2][2], const TanBoard anBoard, cubeinfo * pci, rolloutcontext * prc, evalsetup * pes, rolloutprogressfunc * pfRolloutProgress, void *pUserData); /* operations on rolloutstat */ /* Resignations */ extern int getResignation(float arResign[NUM_ROLLOUT_OUTPUTS], TanBoard anBoard, cubeinfo * const pci, const evalsetup * pesResign); extern void getResignEquities(float arResign[NUM_ROLLOUT_OUTPUTS], cubeinfo * pci, int nResigned, float *prBefore, float *prAfter); extern int ScoreMoveRollout(move ** ppm, cubeinfo ** ppci, int cMoves, rolloutprogressfunc * pfRolloutProgress, void *pUserData); extern void RolloutLoopMT(void *unused); /* Quasi-random permutation array: the first index is the "generation" of the * permutation (0 permutes each set of 36 rolls, 1 permutes those sets of 36 * into 1296, etc.); the second is the roll within the game (limited to QRLEN, * so we use pseudo-random dice after that); the last is the permutation * itself. 6 generations are enough for 36^6 > 2^31 trials. */ #define QRLEN 128 typedef struct { unsigned char aaanPermutation[6][QRLEN][36]; int nPermutationSeed; } perArray; EXP_LOCK_FUN(int, BasicCubefulRollout, unsigned int aanBoard[][2][25], float aarOutput[][NUM_ROLLOUT_OUTPUTS], int iTurn, int iGame, const cubeinfo aci[], int afCubeDecTop[], unsigned int cci, rolloutcontext * prc, rolloutstat aarsStatistics[][2], int nBasisCube, perArray * dicePerms, rngcontext * rngctxRollout, FILE * logfp); extern void log_cube(FILE * logfp, const char *action, int side); extern void log_move(FILE * logfp, const int *anMove, int side, int die0, int die1); extern int RolloutDice(int iTurn, int iGame, int fInitial, unsigned int anDice[2], rng * rngx, void *rngctx, const int fRotate, const perArray * dicePerms); extern void ClosedBoard(int afClosedBoard[2], const TanBoard anBoard); extern void InvertStdDev(float ar[NUM_ROLLOUT_OUTPUTS]); #endif gnubg-1.08.003/gtkrace.h000644 001751 000024 00000001604 14574155047 014426 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * Copyright (C) 2007 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkrace.h,v 1.6 2013/06/16 02:16:16 mdpetch Exp $ */ #ifndef GTKRACE_H #define GTKRACE_H extern void GTKShowRace(TanBoard anBoard); #endif gnubg-1.08.003/sgf_y.y000644 001751 000024 00000013134 14574155047 014137 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2003 Gary Wong * Copyright (C) 2002-2017 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: sgf_y.y,v 1.16 2020/04/12 19:02:40 plm Exp $ */ %{ #include "common.h" #include "list.h" #include #include #include #include #include #include "sgf.h" /* Resolve a warning on older GLIBC/GNU systems that have stpcpy */ #if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE && !defined(__USE_XOPEN2K8) extern char *stpcpy(char *s1, const char *s2); #endif static listOLD *plCollection; extern int sgflex( void ); #define YYERROR_VERBOSE void ( *SGFErrorHandler )( const char *, int ) = NULL; static int sgferror( const char *s ) { if( SGFErrorHandler ) SGFErrorHandler( s, 1 ); else fprintf( stderr, "%s\n", s ); return 0; } static listOLD *NewList( void ) { listOLD *pl = g_malloc( sizeof( listOLD ) ); ListCreate( pl ); return pl; } static char *Concatenate( listOLD *pl ) { size_t cch = 0; char *sz, *pchDest, *pchSrc; for( pl = pl->plNext; pl->p; pl = pl->plNext ) cch += strlen( pl->p ); pchDest = sz = g_malloc0( cch + 1 ); while( pl->plNext != pl ) { for( pchSrc = pl->plNext->p; ( *pchDest++ = *pchSrc++ ); ) ; pchDest--; g_free( pl->plNext->p ); ListDelete( pl->plNext ); } g_free( pl ); return sz; } %} %name-prefix "sgf" /* There are 2 shift/reduce conflicts caused by ambiguities at which level error handling should be performed (GameTreeSeq, Sequence, and PropertySeq); the default shifting produces correct behaviour. */ %expect 2 %union { char ach[ 2 ]; /* property identifier */ char *pch; /* property value */ property *pp; /* complete property */ listOLD *pl; /* nodes, sequences, gametrees */ } %token PROPERTY VALUETEXT %type Property %type Value %type Collection GameTreeSeq GameTree Sequence Node PropertySeq ValueSeq %type ValueCharSeq %% /* The specification says empty collections are illegal, but we'll try to be accommodating. */ Collection: GameTreeSeq { $$ = plCollection = $1; } ; GameTreeSeq: /* empty */ { $$ = NewList(); } | GameTreeSeq GameTree { ListInsert( $1, $2 ); $$ = $1; } | GameTreeSeq error ; GameTree: '(' Sequence GameTreeSeq ')' { ListInsert( $3->plNext, $2 ); $$ = $3; } ; Sequence: Node { $$ = NewList(); ListInsert( $$, $1 ); } | Sequence Node { ListInsert( $1, $2 ); $$ = $1; } | Sequence error ; Node: ';' PropertySeq { $$ = $2; } ; PropertySeq: /* empty */ { $$ = NewList(); } | PropertySeq Property { ListInsert( $1, $2 ); $$ = $1; } /* FIXME if property already exists in node, augment existing list */ | PropertySeq error ; Property: PROPERTY ValueSeq Value { ListInsert( $2, $3 ); $$ = g_malloc( sizeof(property) ); $$->pl = $2; $$->ach[ 0 ] = $1[ 0 ]; $$->ach[ 1 ] = $1[ 1 ]; } ; ValueSeq: /* empty */ { $$ = NewList(); } | ValueSeq Value { ListInsert( $1, $2 ); $$ = $1; } ; Value: '[' ValueCharSeq ']' { $$ = Concatenate( $2 ); } ; ValueCharSeq: /* empty */ { $$ = NewList(); } | ValueCharSeq VALUETEXT { ListInsert( $1, $2 ); $$ = $1; } ; %% extern FILE *sgfin; extern listOLD *SGFParse( FILE *pf ) { sgfin = pf; plCollection = NULL; sgfparse(); return plCollection; } #ifdef SGFTEST #ifdef HAVE_MCHECK_H #include #endif static void Indent( int n ) { while( n-- ) putchar( ' ' ); } static void PrintProperty( property *pp, int n ) { listOLD *pl; Indent( n ); putchar( pp->ach[ 0 ] ); if ( pp->ach[ 1 ] ) putchar( pp->ach[ 1 ] ); for( pl = pp->pl->plNext; pl->p; pl = pl->plNext ) printf( "[%s]", (char *) pl->p ); putchar( '\n' ); } static void PrintNode( listOLD *pl, int n ) { for( pl = pl->plNext; pl->p; pl = pl->plNext ) PrintProperty( pl->p, n ); Indent( n ); puts( "-" ); } static void PrintSequence( listOLD *pl, int n ) { for( pl = pl->plNext; pl->p; pl = pl->plNext ) PrintNode( pl->p, n ); } static void PrintGameTreeSeq( listOLD *pl, int n ); static void PrintGameTree( listOLD *pl, int n ) { pl = pl->plNext; Indent( n ); puts( "<<<<<" ); PrintSequence( pl->p, n ); PrintGameTreeSeq( pl, n + 1 ); Indent( n ); puts( ">>>>>" ); } static void PrintGameTreeSeq( listOLD *pl, int n ) { for( pl = pl->plNext; pl->p; pl = pl->plNext ) PrintGameTree( pl->p, n ); } static void Error( char *s, int f ) { fprintf( stderr, _("sgf error: %s\n"), s ); } int main( int argc, char *argv[] ) { FILE *pf = NULL; listOLD *pl; #ifdef HAVE_MTRACE mtrace(); #endif SGFErrorHandler = Error; if( argc > 1 ) if( !( pf = fopen( argv[ 1 ], "r" ) ) ) { perror( argv[ 1 ] ); return 1; } if( ( pl = SGFParse( pf ? pf : stdin ) ) ) PrintGameTreeSeq( pl, 0 ); else { puts( _("Fatal error; can't print collection.") ); fclose( pf ); return 2; } fclose( pf ); return 0; } #endif gnubg-1.08.003/gnubg.c000644 001751 000024 00000447123 14611217426 014105 0ustar00pmstaff000000 000000 /* * Copyright (C) 1998-2003 Gary Wong * Copyright (C) 1999-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gnubg.c,v 1.1038 2024/01/04 21:10:49 plm Exp $ */ /* * 02/2023: Isaac Keslassy: introduced the "SmartSit" feature * that enables users to automatically sit at the bottom of * the board (i.e. as player1) in opened matches. * * It works as follows: * 1) In Settings > Options > Display, the user can enable this option * 2) The user can define "key player names" in two ways: * a) Manually: * In Settings > Options > Display, edit the list and add/delete names. * b) Automatically: * Each time te user swaps the player order to highlight some player * and set this player at the bottom of the board, we add this * player's name to the list. * 3) When opening a new file, SmartSit() automatically checks if player0 * is a key player while player1 is not. In such a case, it swaps * their places. */ #include "config.h" #include "gnubgmodule.h" #include "glib-ext.h" #include #include #if defined(HAVE_UNISTD_H) #include #endif #include #include #include #include #include #include #include #ifdef WIN32 #include #include #endif #if defined(HAVE_LIB_READLINE) static char *gnubg_histfile; #include #include static int fReadingOther; static char szCommandSeparators[] = " \t\n\r\v\f"; #endif #include "analysis.h" #include "backgammon.h" #include "dice.h" #include "drawboard.h" #include "eval.h" #include "sgf.h" #include "export.h" #include "matchequity.h" #include "matchid.h" #include "positionid.h" #include "render.h" #include "renderprefs.h" #include "rollout.h" #include "sound.h" #include "progress.h" #include "osr.h" #include "format.h" #include "relational.h" #include "credits.h" #include "external.h" #include "neuralnet.h" #include "util.h" #if defined(LIBCURL_PROTOCOL_HTTPS) #include #endif #if defined(HAVE_SOCKETS) #if defined(HAVE_SYS_SOCKET_H) #include #include #include #include #include #endif /* #if HAVE_SYS_SOCKET_H */ #ifdef WIN32 #include #include #define inet_aton(ip,addr) (addr)->s_addr = inet_addr(ip), 1 #define inet_pton(fam,ip,addr) (addr)->s_addr = inet_addr(ip), 1 #endif /* #ifdef WIN32 */ #endif /* #if HAVE_SOCKETS */ #if defined(USE_GTK) #include #include "gtkboard.h" #include "gtkgame.h" #include "gtkprefs.h" #include "gtksplash.h" #include "gtkchequer.h" #include "gtkwindows.h" #include "gtkscoremap.h" #endif #if defined(USE_BOARD3D) #include "inc3d.h" #endif #include "multithread.h" #include "openurl.h" #if defined(MSDOS) || defined(__MSDOS__) || defined(WIN32) #define NO_BACKSLASH_ESCAPES 1 #endif #if defined(USE_GTK) int fX = FALSE; /* use X display */ unsigned int nDelay = 300; int fNeedPrompt = FALSE; #if defined(HAVE_LIB_READLINE) int fReadingCommand; #endif #endif static int fNoRC = FALSE; static char *autosave = NULL; static int loading_rc = FALSE; const char *intro_string = N_("This program comes with ABSOLUTELY NO WARRANTY; for details type `show warranty'.\n" "This is free software, and you are welcome to redistribute it under certain conditions; type `show copying' for details.\n"); char *szLang = NULL; const char szDefaultPrompt[] = "(\\p) ", *szPrompt = szDefaultPrompt; int fInteractive; matchstate ms = { {{0}, {0}}, /* anBoard */ {0}, /* anDice */ -1, /* fTurn */ 0, /* fResigned */ 0, /* fResignationDeclined */ FALSE, /* fDoubled */ 0, /* cGames */ -1, /* fMove */ -1, /* fCubeOwner */ FALSE, /* fCrawford */ FALSE, /* fPostCrawford */ 0, /* nMatchTo */ {0, 0}, /* anScore */ 1, /* nCube */ 0, /* cBeavers */ VARIATION_STANDARD, /*bgv */ TRUE, /* fCubeUse */ TRUE, /* fJacoby */ GAME_NONE /* gs */ }; ConstTanBoard msBoard(void) { return (ConstTanBoard) ms.anBoard; } matchinfo mi; float rRatingOffset = 2050; int fAnalyseCube = TRUE; int fAnalyseDice = TRUE; int fAnalyseMove = TRUE; int fAutoBearoff = FALSE; int fAutoCrawford = 1; int fAutoDB = FALSE; int fAutoGame = TRUE; int fAutoMove = FALSE; int fAutoRoll = TRUE; int fCheat = FALSE; int fConfirmNew = TRUE; int fConfirmSave = TRUE; int nAutoSaveTime = 15; int fAutoSaveRollout = FALSE; int fAutoSaveAnalysis = FALSE; int fAutoSaveConfirmDelete = TRUE; /* FIXME: This is at best useless, at worst misleading, as a global flag. * It should be deduced from the rollout context when needed. * See for instance show.c:ShowRollout() around line 270 */ int fCubeEqualChequer = FALSE; int fCubeUse = TRUE; int fDisplay = TRUE; int fFullScreen = FALSE; int fGotoFirstGame = FALSE; int fInvertMET = FALSE; int fJacoby = TRUE; int fOutputRawboard = FALSE; int fPlayersAreSame = TRUE; int fRecord = TRUE; int fShowProgress; int fStyledGamelist = TRUE; int fTruncEqualPlayer0 = TRUE; int fTutorChequer = TRUE; int fTutorCube = TRUE; int fTutor = FALSE; int fEvalSameAsAnalysis = FALSE; int fJustSwappedPlayers = FALSE; int nConfirmDefault = -1; int nThreadPriority = 0; int nToolbarStyle = 2; unsigned int afCheatRoll[2] = { 0, 0 }; unsigned int cAutoDoubles = 0; unsigned int nBeavers = 3; unsigned int nDefaultLength = 7; /* * TRUE if analysis should run in the background * FALSE by default * can be chang edin menu */ int fBackgroundAnalysis = FALSE; /* * if we analyze in the background, we turn on the following global flag * to disable all sorts of buttons during the analysis (eval, rollout, etc.) * since we are not equipped for a second parallel analysis */ int fAnalysisRunning = FALSE; /* initialization */ char keyNames[MAX_KEY_NAMES][MAX_NAME_LEN] = { "" }; int keyNamesFirstEmpty = 0; int fUseKeyNames = TRUE; int fWithinSmartSit = FALSE; int fTriggeredByRecordList = FALSE; analyzeFileSetting AnalyzeFileSettingDef = AnalyzeFileBatch; const char *aszAnalyzeFileSetting[NUM_AnalyzeFileSettings] = { N_("Batch analysis"), N_("Single-File analysis"), N_("Smart analysis") }; const char *aszAnalyzeFileSettingCommands[NUM_AnalyzeFileSettings] = { "batch", "single", "smart" }; #if defined(USE_BOARD3D) int fSync = -1; /* Not set */ int fResetSync = FALSE; /* May need to wait for main window */ #endif skilltype TutorSkill = SKILL_DOUBTFUL; int nTutorSkillCurrent = 0; char *szCurrentFileName = NULL; char *szCurrentFolder = NULL; int fNextTurn = FALSE, fComputing = FALSE; float rEvalsPerSec = -1.0f; float arLuckLevel[] = { 0.6f, /* LUCK_VERYBAD */ 0.3f, /* LUCK_BAD */ 0, /* LUCK_NONE */ 0.3f, /* LUCK_GOOD */ 0.6f /* LUCK_VERYGOOD */ }, arSkillLevel[] = { 0.12f, /* SKILL_VERYBAD */ 0.06f, /* SKILL_BAD */ 0.03f, /* SKILL_DOUBTFUL */ 0 /* SKILL_NONE */ }; #include "movefilters.inc" rngcontext *rngctxRollout = NULL; rolloutcontext rcRollout = { { /* player 0/1 cube decision */ {TRUE, 2, TRUE, TRUE, 0.0}, {TRUE, 2, TRUE, TRUE, 0.0} }, { /* player 0/1 chequerplay */ {TRUE, 0, TRUE, TRUE, 0.0}, {TRUE, 0, TRUE, TRUE, 0.0} }, { /* player 0/1 late cube decision */ {TRUE, 2, TRUE, TRUE, 0.0}, {TRUE, 2, TRUE, TRUE, 0.0} }, { /* player 0/1 late chequerplay */ {TRUE, 0, TRUE, TRUE, 0.0}, {TRUE, 0, TRUE, TRUE, 0.0} }, /* truncation point cube and chequerplay */ {TRUE, 2, TRUE, TRUE, 0.0}, {TRUE, 2, TRUE, TRUE, 0.0}, /* move filters */ {MOVEFILTER_NORMAL, MOVEFILTER_NORMAL}, {MOVEFILTER_NORMAL, MOVEFILTER_NORMAL}, TRUE, /* cubeful */ TRUE, /* variance reduction */ FALSE, /* initial position */ TRUE, /* rotate */ TRUE, /* truncate at BEAROFF2 for cubeless rollouts */ TRUE, /* truncate at BEAROFF2_OS for cubeless rollouts */ FALSE, /* late evaluations */ FALSE, /* Truncation enabled */ FALSE, /* no stop on STD */ FALSE, /* no stop on JSD */ FALSE, /* no move stop on JSD */ 10, /* truncation */ 1296, /* number of trials */ 5, /* late evals start here */ RNG_MERSENNE, /* RNG */ 0, /* seed */ 324, /* minimum games */ 0.01f, /* stop when std's are lower than 0.01 */ 324, /* minimum games */ 2.33f, /* stop when best has j.s.d. for 99% confidence */ 0, /* nGamesDone */ 0.0, /* rStoppedOnJSD */ 0, /* nSkip */ }; /* parameters for `eval' and `hint' */ #define EVALSETUP_WORLDCLASS { \ /* evaltype */ \ EVAL_EVAL, \ /* evalcontext */ \ { TRUE, 2, TRUE, TRUE, 0.0 }, \ /* rolloutcontext */ \ { \ { \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* player 0 cube decision */ \ { FALSE, 2, TRUE, TRUE, 0.0 } /* player 1 cube decision */ \ }, \ { \ { FALSE, 0, TRUE, TRUE, 0.0 }, /* player 0 chequerplay */ \ { FALSE, 0, TRUE, TRUE, 0.0 } /* player 1 chequerplay */ \ }, \ { \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* p 0 late cube decision */ \ { FALSE, 2, TRUE, TRUE, 0.0 } /* p 1 late cube decision */ \ }, \ { \ { FALSE, 0, TRUE, TRUE, 0.0 }, /* p 0 late chequerplay */ \ { FALSE, 0, TRUE, TRUE, 0.0 } /* p 1 late chequerplay */ \ }, \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* truncate cube decision */ \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* truncate chequerplay */ \ { MOVEFILTER_NORMAL, MOVEFILTER_NORMAL }, \ { MOVEFILTER_NORMAL, MOVEFILTER_NORMAL }, \ FALSE, /* cubeful */ \ TRUE, /* variance reduction */ \ FALSE, /* initial position */ \ TRUE, /* rotate */ \ TRUE, /* truncate at BEAROFF2 for cubeless rollouts */ \ TRUE, /* truncate at BEAROFF2_OS for cubeless rollouts */ \ FALSE, /* late evaluations */ \ TRUE, /* Truncation enabled */ \ FALSE, /* no stop on STD */ \ FALSE, /* no stop on JSD */ \ FALSE, /* no move stop on JSD */ \ 10, /* truncation */ \ 1296, /* number of trials */ \ 5, /* late evals start here */ \ RNG_MERSENNE, /* RNG */ \ 0, /* seed */ \ 324, /* minimum games */ \ 0.01f, /* stop when std's are lower than 0.01 */ \ 324, /* minimum games */ \ 2.33f, /* stop when best has j.s.d. for 99% confidence */ \ 0, \ 0.0, \ 0 \ } \ } /* parameters for analysis */ #define EVALSETUP_SUPREMO { \ /* evaltype */ \ EVAL_EVAL, \ /* evalcontext */ \ { TRUE, 2, TRUE, TRUE, 0.0 }, \ /* rolloutcontext */ \ { \ { \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* player 0 cube decision */ \ { FALSE, 2, TRUE, TRUE, 0.0 } /* player 1 cube decision */ \ }, \ { \ { FALSE, 0, TRUE, TRUE, 0.0 }, /* player 0 chequerplay */ \ { FALSE, 0, TRUE, TRUE, 0.0 } /* player 1 chequerplay */ \ }, \ { \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* p 0 late cube decision */ \ { FALSE, 2, TRUE, TRUE, 0.0 } /* p 1 late cube decision */ \ }, \ { \ { FALSE, 0, TRUE, TRUE, 0.0 }, /* p 0 late chequerplay */ \ { FALSE, 0, TRUE, TRUE, 0.0 } /* p 1 late chequerplay */ \ }, \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* truncate cube decision */ \ { FALSE, 2, TRUE, TRUE, 0.0 }, /* truncate chequerplay */ \ { MOVEFILTER_NORMAL, MOVEFILTER_NORMAL }, \ { MOVEFILTER_NORMAL, MOVEFILTER_NORMAL }, \ FALSE, /* cubeful */ \ TRUE, /* variance reduction */ \ FALSE, /* initial position */ \ TRUE, /* rotate */ \ TRUE, /* truncate at BEAROFF2 for cubeless rollouts */ \ TRUE, /* truncate at BEAROFF2_OS for cubeless rollouts */ \ FALSE, /* late evaluations */ \ TRUE, /* Truncation enabled */ \ FALSE, /* no stop on STD */ \ FALSE, /* no stop on JSD */ \ FALSE, /* no move stop on JSD */ \ 10, /* truncation */ \ 1296, /* number of trials */ \ 5, /* late evals start here */ \ RNG_MERSENNE, /* RNG */ \ 0, /* seed */ \ 324, /* minimum games */ \ 0.01f, /* stop when std's are lower than 0.01 */ \ 324, /* minimum games */ \ 2.33f, /* stop when best has j.s.d. for 99% confidence */ \ 0, \ 0.0, \ 0 \ } \ } evalsetup esEvalChequer = EVALSETUP_WORLDCLASS; evalsetup esEvalCube = EVALSETUP_WORLDCLASS; evalsetup esAnalysisChequer = EVALSETUP_SUPREMO; evalsetup esAnalysisCube = EVALSETUP_SUPREMO; movefilter aamfEval[MAX_FILTER_PLIES][MAX_FILTER_PLIES] = MOVEFILTER_NORMAL; movefilter aamfAnalysis[MAX_FILTER_PLIES][MAX_FILTER_PLIES] = MOVEFILTER_LARGE; extern evalsetup * GetEvalChequer(void) { return fEvalSameAsAnalysis ? &esAnalysisChequer : &esEvalChequer; } extern evalsetup * GetEvalCube(void) { return fEvalSameAsAnalysis ? &esAnalysisCube : &esEvalCube; } extern TmoveFilter * GetEvalMoveFilter(void) { return fEvalSameAsAnalysis ? &aamfAnalysis : &aamfEval; } exportsetup exsExport = { TRUE, /* include annotations */ TRUE, /* include analysis */ TRUE, /* include statistics */ TRUE, /* include match information */ 1, /* display board for all moves */ -1, /* both players */ 5, /* display max 5 moves */ TRUE, /* show detailed probabilities */ /* do not show move parameters */ {FALSE, TRUE} , /* display all moves */ {TRUE, TRUE, TRUE, TRUE} , TRUE, /* show detailed prob. for cube decisions */ {FALSE, TRUE} , /* do not show move parameters */ /* display all cube decisions */ {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE} , NULL, /* HTML URL to pictures */ HTML_EXPORT_TYPE_GNU, NULL, /* HTML extension */ HTML_EXPORT_CSS_HEAD, /* write CSS stylesheet in */ 4, /* PNG size */ 4 /* HTML size */ }; player ap[2] = { {"gnubg", PLAYER_GNU, EVALSETUP_WORLDCLASS, EVALSETUP_WORLDCLASS, MOVEFILTER_NORMAL, 0, NULL} , {"user", PLAYER_HUMAN, EVALSETUP_WORLDCLASS, EVALSETUP_WORLDCLASS, MOVEFILTER_NORMAL, 0, NULL} }; char default_names[2][MAX_NAME_LEN] = { "gnubg", "user" }; /* Usage strings */ static char szDICE[] = N_(" "), szCOMMAND[] = N_(""), szCOMMENT[] = N_(""), szER[] = "evaluation|rollout", szFILENAME[] = N_(""), szKEYVALUE[] = N_("[= ...]"), szLENGTH[] = N_(""), szLIMIT[] = N_(""), szMILLISECONDS[] = N_(""), szMOVE[] = N_(" ..."), szFILTER[] = N_(" " "[ ]"), szNAME[] = N_(""), szQUIET[] = "[quiet]", szLANG[] = N_("system|"), szONOFF[] = "on|off", szOPTCOMMAND[] = N_("[command]"), szOPTDATE[] = N_("[yyyy-mm-dd]"), szOPTDEPTH[] = N_("[depth]"), szOPTFILENAME[] = N_("[filename]"), szOPTLENGTH[] = N_("[length]"), szOPTMODULUSOPTSEED[] = N_("[modulus |factors ] " "[seed]"), szOPTNAME[] = N_("[name]"), szOPTPOSITION[] = N_("[position]"), szOPTSEED[] = N_("[seed]"), szOPTVALUE[] = N_("[value]"), szPLAYER[] = N_(""), szPLAYEROPTRATING[] = N_(" [rating]"), szPLIES[] = N_(""), szPOSITION[] = N_(""), szPRIORITY[] = N_(""), szPROMPT[] = N_(""), szSCORE[] = N_(" [length]"), szSIZE[] = N_(""), szSTEP[] = N_("[game|roll|rolled|marked] "), szTRIALS[] = N_(""), szVALUE[] = N_(""), szMATCHID[] = N_(""), szGNUBGID[] = N_(""), szXGID[] = N_(""), szURL[] = "", szMAXERR[] = N_(""), szMINGAMES[] = N_(""), szFOLDER[] = N_(""), #if defined(USE_GTK) szWARN[] = N_("[]"), szWARNYN[] = N_(" on|off"), #endif szJSDS[] = N_(""), szSTDDEV[] = N_(""); /* Command defines moved into separate file */ #include "commands.inc" static int iProgressMax, iProgressValue, fInProgress; static char *pcProgress; static psighandler shInterruptOld; char *default_import_folder = NULL; char *default_export_folder = NULL; char *default_sgf_folder = NULL; const char *szHomeDirectory; static char const *aszBuildInfo[] = { #if defined(USE_PYTHON) #if (PY_MAJOR_VERSION == 2) N_("Python 2 supported."), #elif (PY_MAJOR_VERSION == 3) N_("Python 3 supported."), #else #error "Unsupported python version" #endif #endif #if defined(USE_SQLITE) N_("SQLite database supported."), #endif #if defined(USE_GTK) #if GTK_CHECK_VERSION(3,0,0) N_("GTK3 graphical interface supported."), #else N_("GTK2 graphical interface supported."), #endif #endif #if defined(HAVE_SOCKETS) N_("External players supported."), #endif #if defined(HAVE_LIBGMP) N_("Long RNG seeds supported."), #endif #if defined(USE_BOARD3D) N_("3D boards supported."), #endif #if defined(WIN32) N_("Windows sound system supported."), #elif defined(HAVE_APPLE_COREAUDIO) N_("Apple CoreAudio sound system supported."), #elif defined(HAVE_APPLE_QUICKTIME) N_("Apple QuickTime sound system supported."), #elif defined(HAVE_CANBERRA) N_("libcanberra sound system supported."), #endif #if defined(USE_MULTITHREAD) N_("Multiple threads supported."), #endif #if defined(USE_SIMD_INSTRUCTIONS) #if defined(USE_SSE2) N_("SSE/SSE2 supported."), #elif defined(USE_AVX) N_("AVX supported."), #elif defined(USE_SSE) N_("SSE supported."), #else N_("NEON supported."), #endif #endif NULL }; extern const char * GetBuildInfoString(void) { static const char **ppch = aszBuildInfo; if (!*ppch) { ppch = aszBuildInfo; return NULL; } return *ppch++; } /* * general token extraction input: ppch pointer to pointer to command szToekns - string of token separators output: NULL if no token found ptr to extracted token if found. Token is in original location in input string, but null terminated if not quoted, token will have been moved forward over quote character when quoted ie: input: ' abcd efgh' output ' abcd\0efgh' return value points to abcd, ppch points to efgh input ' "jklm" nopq' output ; jklm\0 nopq' return value points to jklm, ppch points to space before the 'n' ppch points past null terminator ignores leading whitespace, advances ppch over token and trailing whitespace matching single or double quotes are allowed, any character outside of quotes or in doubly quoted strings can be escaped with a backslash and will be taken as literal. Backslashes within single quoted strings are taken literally. Multiple quoted strings can be concatenated. For example: input ' abc\"d"e f\"g h i"jk'l m n \" o p q'rst uvwzyz' with the terminator list ' \t\r\n\v\f' The returned token will be the string ppch will point to the 'u' The \" between c and d is not in a single quoted string, so is reduced to a double quote and is *not* the start of a quoted string. The " before the 'd' begins a double quoted string, so spaces and tabs are not terminators. The \" between f and g is reduced to a double quote and does not terminate the quoted string. which ends with the double quote between i and j. The \" between n and o is taken as a pair of literal characters because they are within the single quoted string beginning before l and ending after q. It is not possible to put a single quote within a single quoted string. You can have single quotes unescaped within double quoted strings and double quotes unescaped within single quoted strings. */ /* Careful! It breaks the Windows file/directory names with spaces! */ extern char * NextTokenGeneral(char **ppch, const char *szTokens) { char *pch, *pchSave, chQuote = 0; int fEnd = FALSE; #if !defined(G_DISABLE_ASSERT) char *pchEnd; #endif if (!*ppch) return NULL; #if !defined(G_DISABLE_ASSERT) pchEnd = strchr(*ppch, 0); #endif //outputerrf("ppch=%s\n", (*ppch)); /* skip leading whitespace */ while (isspace(**ppch)) (*ppch)++; if (!*(pch = pchSave = *ppch)) /* nothing left */ return NULL; while (!fEnd) { if (**ppch && strchr(szTokens, **ppch)) { /* this character ends token */ if (!chQuote) { fEnd = TRUE; (*ppch)++; /* step over token */ } else *pchSave++ = **ppch; } else { switch (**ppch) { case '"': /* quote mark */ if (!chQuote) /* start quoting */ chQuote = **ppch; else if (chQuote == **ppch) /* end quoting */ chQuote = 0; else /* literal */ *pchSave++ = **ppch; break; #ifdef NO_BACKSLASH_ESCAPES case '%': #else case '\\': #endif /* backslash */ if (chQuote == '\'') /* literal */ *pchSave++ = **ppch; else { (*ppch)++; if (**ppch) /* next character is literal */ *pchSave++ = **ppch; else { /* end of string -- the backlash doesn't quote anything */ #ifdef NO_BACKSLASH_ESCAPES *pchSave++ = '%'; #else *pchSave++ = '\\'; #endif fEnd = TRUE; } } break; case 0: /* end of string -- always ends token */ fEnd = TRUE; break; default: *pchSave++ = **ppch; } } if (!fEnd) (*ppch)++; } while (isspace(**ppch)) (*ppch)++; *pchSave = 0; //outputerrf("pch=%s\n", pch); #if !defined(G_DISABLE_ASSERT) g_assert(pchSave <= pchEnd); g_assert(*ppch <= pchEnd); g_assert(pch <= pchEnd); #endif return pch; } /* extract a token from a string. Tokens are terminated by tab, newline, * carriage return, vertical tab or form feed. * Input: * * ppch = pointer to pointer to input string. This will be updated * to point past any token found. If the string is exhausetd, * the pointer at ppch will point to the terminating NULL, so it is * safe to call this function repeatedly after failure * * Output: * null terminated token if found or NULL if no tokens present. */ /* Careful! NextToken breaks the Windows file/directory names with spaces! */ extern char * NextToken(char **ppch) { return NextTokenGeneral(ppch, " \t\n\r\v\f"); } /* return a count of the number of separate runs of one or more * non-whitespace characters. This is the number of tokens that * NextToken() will return. It may not be the number of tokens * NextTokenGeneral() will return, as it does not count quoted strings * containing whitespace as single tokens */ static int CountTokens(char *pch) { int c = 0; do { while (isspace(*pch)) pch++; if (*pch) { c++; while (*pch && !isspace(*pch)) pch++; } } while (*pch); return c; } /* extract a token and convert to double. On error or no token, return * ERR_VAL (a very large negative double. */ extern float ParseReal(char **ppch) { char *pch, *pchOrig; float r; if (!ppch || !(pchOrig = NextToken(ppch))) return ERR_VAL; r = (float) g_ascii_strtod(pchOrig, &pch); return *pch ? ERR_VAL : r; } /* get the next token from the input and convert as an * integer. Returns INT_MIN on empty input or non-numerics found. Does * handle negative integers. On failure, one token (if any were available * will have been consumed, it is not pushed back into the input. */ extern int ParseNumber(char **ppch) { char *pch, *pchOrig; if (!ppch || !(pchOrig = NextToken(ppch))) return INT_MIN; for (pch = pchOrig; *pch; pch++) if (!isdigit(*pch) && *pch != '-') return INT_MIN; return atoi(pchOrig); } /* get a player either by name or as player 0 or 1 (indicated by the single * character '0' or '1'. Returns -1 on no input, 2 if not a recoginsed name * Note - this is not a token extracting routine, it expects to be handed * an already extracted token */ extern int ParsePlayer(char *sz) { int i; if (!sz) return -1; if ((*sz == '0' || *sz == '1') && !sz[1]) return *sz - '0'; for (i = 0; i < 2; i++) if (!CompareNames(sz, ap[i].szName)) return i; if (!StrNCaseCmp(sz, "both", strlen(sz))) return 2; return -1; } /* Convert a string to a board array. Currently allows the string to * be a position ID, a gnubg-nn position string, "=n" notation, * or empty (in which case the current board is used). * * The input string should be specified in *ppch; this string must be * modifiable, and the pointer will be updated to point to the token * following a board specification if possible (see NextToken()). The * board will be returned in an, and if pchDesc is non-NULL, then * descriptive text (the position ID, formatted move, or "Current * position", depending on the input) will be stored there. * * Returns -1 on failure, 0 on success, or 1 on success if the position * specified has the opponent on roll (e.g. because it used "=n" notation). */ extern int ParsePosition(TanBoard an, char **ppch, char *pchDesc) { int i; char *pch; /* FIXME allow more formats, e.g. FIBS "boardstyle 3" */ if (!ppch || !(pch = NextToken(ppch))) { memcpy(an, msBoard(), sizeof(TanBoard)); if (pchDesc) strcpy(pchDesc, _("Current position")); return 0; } if (!strcmp(pch, "simple")) { /* board given as 26 integers. * integer 1 : # of my chequers on the bar * integer 2-25: number of chequers on point 1-24 * positive ints: my chequers * negative ints: opp chequers * integer 26 : # of opp chequers on the bar */ for (i = 0; i < 26; i++) { int n; if ((n = ParseNumber(ppch)) == INT_MIN) { outputf(_("`simple' must be followed by 26 integers; " "found only %d\n"), i); return -1; } if (i == 0) { /* my chequers on the bar */ an[1][24] = abs(n); } else if (i == 25) { /* opp chequers on the bar */ an[0][24] = abs(n); } else { an[1][i - 1] = 0; an[0][24 - i] = 0; if (n < 0) an[0][24 - i] = -n; else if (n > 0) an[1][i - 1] = n; } } if (pchDesc) strcpy(pchDesc, *ppch); *ppch = NULL; return CheckPosition((ConstTanBoard) an) ? 0 : -1; } if (strlen(pch) == 20) { /* gnubg-nn position string */ static oldpositionkey key; for (i = 0; i < 10; ++i) { if (pch[2 * i + 0] >= 'A' && pch[2 * i + 0] <= 'P' && pch[2 * i + 1] >= 'A' && pch[2 * i + 1] <= 'P') key.auch[i] = (unsigned char) (((pch[2 * i + 0] - 'A') << 4) + (pch[2 * i + 1] - 'A')); else { outputl(_("Illegal position.")); return -1; } } oldPositionFromKey(an, &key); return 0; } if (!PositionFromID(an, pch)) { outputl(_("Illegal position.")); return -1; } if (pchDesc) strcpy(pchDesc, pch); return 0; } /* Parse "key=value" pairs on a command line. PPCH takes a pointer to * a command line on input, and returns a pointer to the next parameter. * The key is returned in apch[ 0 ], and the value in apch[ 1 ]. * The function return value is the number of parts successfully read * (0 = no key was found, 1 = key only, 2 = both key and value). */ extern int ParseKeyValue(char **ppch, char *apch[2]) { if (!ppch || !(apch[0] = NextToken(ppch))) return 0; if (!(apch[1] = strchr(apch[0], '='))) return 1; *apch[1] = 0; apch[1]++; return 2; } /* Compare player names. Performed case insensitively, and with all * whitespace characters and underscore considered identical. */ extern int CompareNames(char *sz0, char *sz1) { static char ach[] = " \t\r\n\f\v_"; for (; *sz0 || *sz1; sz0++, sz1++) if (toupper(*sz0) != toupper(*sz1) && (!strchr(ach, *sz0) || !strchr(ach, *sz1))) return toupper(*sz0) - toupper(*sz1); return 0; } extern void UpdateSetting(void *p) { #if defined(USE_GTK) if (fX) GTKSet(p); #else (void) p; /* suppress unused parameter compiler warning */ #endif } extern void UpdateSettings(void) { UpdateSetting(&ms.nCube); UpdateSetting(&ms.fCubeOwner); UpdateSetting(&ms.fTurn); UpdateSetting(&ms.nMatchTo); UpdateSetting(&ms.fCrawford); UpdateSetting(&ms.fJacoby); UpdateSetting(&ms.gs); ShowBoard(); } /* handle turning a setting on / off * inputs: szName - the setting being adjusted * pf = pointer to current on/off state (will be updated) * sz = pointer to command line - a token will be extracted, * but further calls to NextToken will return only the on/off * value, so you can't have commands in the form * set something on * szOn - text to output when turning setting on * szOff - text to output when turning setting off * output: -1 on error * 0 setting is now off * 1 setting is now on * acceptable tokens are on/off yes/no true/false */ extern int SetToggle(const char *szName, int *pf, char *sz, const char *szOn, const char *szOff) { char *pch = NextToken(&sz); size_t cch; if (!pch) { outputf(_("You must specify whether to set '%s' on or off.\n"), szName); return -1; } cch = strlen(pch); if (!StrCaseCmp("on", pch) || !StrNCaseCmp("yes", pch, cch) || !StrNCaseCmp("true", pch, cch)) { outputl(szOn); if (*pf != TRUE) { *pf = TRUE; UpdateSetting(pf); } return TRUE; } if (!StrCaseCmp("off", pch) || !StrNCaseCmp("no", pch, cch) || !StrNCaseCmp("false", pch, cch)) { outputl(szOff); if (*pf != FALSE) { *pf = FALSE; UpdateSetting(pf); } return FALSE; } outputf(_("Illegal keyword `%s'.\n"), pch); return -1; } /* FIXME? This is only used with fRestart == FALSE */ extern void PortableSignal(int nSignal, void (*p) (int), psighandler * pOld, int fRestart) { #if defined(HAVE_SIGACTION) struct sigaction sa; sa.sa_handler = p; sigemptyset(&sa.sa_mask); sa.sa_flags = #if SA_RESTART (fRestart ? SA_RESTART : 0) | #endif #if SA_NOCLDSTOP SA_NOCLDSTOP | #endif 0; sigaction(nSignal, p ? &sa : NULL, pOld); #elif defined(HAVE_SIGVEC) struct sigvec sv; sv.sv_handler = p; sigemptyset(&sv.sv_mask); sv.sv_flags = nSignal == SIGINT || nSignal == SIGIO ? SV_INTERRUPT : 0; sigvec(nSignal, p ? &sv : NULL, pOld); #else (void) fRestart; /* silence compiler warning */ if (pOld) *pOld = signal(nSignal, p); else if (p) signal(nSignal, p); #endif } extern void PortableSignalRestore(int nSignal, psighandler * p) { #if defined(HAVE_SIGACTION) sigaction(nSignal, p, NULL); #elif defined(HAVE_SIGVEC) sigvec(nSignal, p, NULL); #else signal(nSignal, *p); #endif } /* Reset the SIGINT handler, on return to the main command loop. Notify * the user if processing had been interrupted. */ extern void ResetInterrupt(void) { if (fInterrupt) { { outputf("(%s)", _("Interrupted")); outputx(); } fInterrupt = FALSE; /* if a batch was running signal a cancellation of current match */ fMatchCancelled = TRUE; #if defined(USE_GTK) if (nNextTurn) { g_source_remove(nNextTurn); nNextTurn = 0; } #endif } } extern void HandleCommand(char *sz, command * ac) { command *pc; char *pch; size_t cch; if (ac == acTop) { outputnew(); if (*sz == '#') /* Comment */ return; else if (*sz == ':') { return; } else if (*sz == '>') { while (*sz == '>') ++sz; /* leading white space confuses Python :-) */ while (isspace(*sz)) ++sz; #if defined(USE_PYTHON) PythonRun(sz); #else outputl(_("This installation of GNU Backgammon was compiled without Python support.")); outputx(); #endif return; } } if (!(pch = NextToken(&sz))) { if (ac != acTop) outputl(_("Incomplete command.")); outputx(); return; } cch = strlen(pch); if (ac == acTop && (isdigit(*pch) || !StrNCaseCmp(pch, "bar/", cch > 4 ? 4 : cch))) { if (pch + cch < sz) pch[cch] = ' '; CommandMove(pch); outputx(); return; } for (pc = ac; pc->sz; pc++) if (!StrNCaseCmp(pch, pc->sz, cch)) break; if (!pc->sz) { if (!loading_rc) outputerrf(_("Unknown keyword `%s'.\n"), pch); return; } if (pc->pf) { pc->pf(sz); outputx(); } else HandleCommand(sz, pc->pc); } extern void InitBoard(TanBoard anBoard, const bgvariation bgv) { switch (bgv) { case VARIATION_STANDARD: PositionFromID(anBoard, "4HPwATDgc/ABMA"); break; case VARIATION_NACKGAMMON: PositionFromID(anBoard, "4Dl4ADbgOXgANg"); break; case VARIATION_HYPERGAMMON_1: PositionFromID(anBoard, "AACAAAAAAgAAAA"); break; case VARIATION_HYPERGAMMON_2: PositionFromID(anBoard, "AABAAQAACgAAAA"); break; case VARIATION_HYPERGAMMON_3: PositionFromID(anBoard, "AACgAgAAKgAAAA"); break; default: g_assert_not_reached(); } } extern void GetMatchStateCubeInfo(cubeinfo * pci, const matchstate * pms) { SetCubeInfo(pci, pms->nCube, pms->fCubeOwner, pms->fMove, pms->nMatchTo, pms->anScore, pms->fCrawford, pms->fJacoby, nBeavers, pms->bgv); } static void DisplayCubeAnalysis(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], const evalsetup * pes) { cubeinfo ci; if (pes->et == EVAL_NONE) return; GetMatchStateCubeInfo(&ci, &ms); outputl(OutputCubeAnalysis(aarOutput, aarStdDev, pes, &ci, -1)); } extern char * GetLuckAnalysis(const matchstate * pms, float rLuck) { static char sz[16]; cubeinfo ci; if (fOutputMWC && pms->nMatchTo) { GetMatchStateCubeInfo(&ci, pms); sprintf(sz, "%+0.3f%%", 100.0f * (eq2mwc(rLuck, &ci) - eq2mwc(0.0f, &ci))); } else sprintf(sz, "%+0.3f", rLuck); return sz; } static void DisplayAnalysis(moverecord * pmr) { unsigned int i; char szBuf[1024]; switch (pmr->mt) { case MOVE_NORMAL: DisplayCubeAnalysis(pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble); outputf("%s %u%u", _("Rolled"), pmr->anDice[0], pmr->anDice[1]); if (pmr->rLuck != ERR_VAL) outputf(" (%s):\n", GetLuckAnalysis(&ms, pmr->rLuck)); else outputl(":"); for (i = 0; i < pmr->ml.cMoves; i++) { if (i >= 10 /* FIXME allow user to choose limit */ && i != pmr->n.iMove) continue; outputc(i == pmr->n.iMove ? '*' : ' '); output(FormatMoveHint(szBuf, &ms, &pmr->ml, i, i != pmr->n.iMove || i != pmr->ml.cMoves - 1 || pmr->ml.cMoves == 1 || i < exsExport.nMoves, TRUE, TRUE)); } break; case MOVE_DOUBLE: DisplayCubeAnalysis(pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble); break; case MOVE_TAKE: case MOVE_DROP: /* FIXME */ break; case MOVE_SETDICE: if (pmr->rLuck != ERR_VAL) outputf("%s %u%u (%s):\n", _("Rolled"), pmr->anDice[0], pmr->anDice[1], GetLuckAnalysis(&ms, pmr->rLuck)); break; default: break; } } extern void ShowBoard(void) { char sz[50], szCube[50], szPlayer0[MAX_NAME_LEN + 3], szPlayer1[MAX_NAME_LEN + 3], szScore0[50], szScore1[50], szMatch[50]; TanBoard an; if (cOutputDisabled || !foutput_on) return; if (ms.gs == GAME_NONE) { #if defined(USE_GTK) if (fX) { TanBoard anBoardTemp; InitBoard(anBoardTemp, ms.bgv); game_set(BOARD(pwBoard), anBoardTemp, 0, ap[1].szName, ap[0].szName, ms.nMatchTo, ms.anScore[1], ms.anScore[0], 0, 0, FALSE, anChequers[ms.bgv]); } else #endif outputl(_("No game in progress.")); return; } memcpy(an, msBoard(), sizeof(TanBoard)); if (!ms.fMove) SwapSides(an); #if defined(USE_GTK) if (!fX) #endif { char szBoard[2048]; char *apch[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; moverecord *pmr; if (fOutputRawboard) { outputl(FIBSBoard(szBoard, an, ms.fMove, ap[1].szName, ap[0].szName, ms.nMatchTo, ms.anScore[1], ms.anScore[0], ms.anDice[0], ms.anDice[1], ms.nCube, ms.fCubeOwner, ms.fDoubled, ms.fTurn, ms.fCrawford, anChequers[ms.bgv], ms.fPostCrawford)); return; } apch[0] = szPlayer0; apch[6] = szPlayer1; sprintf(apch[1] = szScore0, ngettext("%d point", "%d points", ms.anScore[0]), ms.anScore[0]); sprintf(apch[5] = szScore1, ngettext("%d point", "%d points", ms.anScore[1]), ms.anScore[1]); if (ms.fDoubled) { apch[ms.fTurn ? 4 : 2] = szCube; sprintf(szPlayer0, "O: %s", ap[0].szName); sprintf(szPlayer1, "X: %s", ap[1].szName); sprintf(szCube, _("Cube offered at %d"), ms.nCube << 1); } else { sprintf(szPlayer0, "O: %s", ap[0].szName); sprintf(szPlayer1, "X: %s", ap[1].szName); apch[ms.fMove ? 4 : 2] = sz; if (ms.anDice[0]) sprintf(sz, "%s %u%u", _("Rolled"), ms.anDice[0], ms.anDice[1]); else if (!GameStatus(msBoard(), ms.bgv)) strcpy(sz, _("On roll")); else sz[0] = 0; if (ms.fCubeOwner < 0) { apch[3] = szCube; if (ms.nMatchTo) if (ms.nMatchTo == 1) sprintf(szCube, ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); else if (ms.fCrawford) { sprintf(szCube, ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); strcat(szCube, " ("); strcat(szCube, _("Crawford game")); strcat(szCube, ")"); } else sprintf(szCube, ngettext("%d point match (Cube: %d)", "%d points match (Cube: %d)", ms.nMatchTo), ms.nMatchTo, ms.nCube); else sprintf(szCube, "(%s: %d)", _("Cube"), ms.nCube); } else { sprintf(szCube, "%c: %.20s (%s: %d)", ms.fCubeOwner ? 'X' : 'O', ap[ms.fCubeOwner].szName, _("Cube"), ms.nCube); apch[ms.fCubeOwner ? 6 : 0] = szCube; if (ms.nMatchTo) sprintf(apch[3] = szMatch, ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); } } if (ms.fResigned > 0) /* FIXME it's not necessarily the player on roll who resigned */ sprintf(strchr(sz, 0), ", %s %s", _("resigns"), gettext(aszGameResult[ms.fResigned - 1])); outputl(DrawBoard(szBoard, (ConstTanBoard) an, ms.fMove, apch, MatchIDFromMatchState(&ms), anChequers[ms.bgv])); if ( #if defined(USE_GTK) PanelShowing(WINDOW_ANALYSIS) && #endif plLastMove && (pmr = plLastMove->plNext->p)) { DisplayAnalysis(pmr); if (pmr->sz) outputl(pmr->sz); /* FIXME word wrap */ } } #if defined(USE_GTK) else { game_set(BOARD(pwBoard), an, ms.fMove, ap[1].szName, ap[0].szName, ms.nMatchTo, ms.anScore[1], ms.anScore[0], ms.anDice[0], ms.anDice[1], ap[ms.fTurn].pt != PLAYER_HUMAN && !fComputing && !nNextTurn, anChequers[ms.bgv]); } #endif #ifdef UNDEF { char *pc; printf("%s: %s\n", _("MatchID"), pc = MatchIDFromMatchState(&ms)); MatchStateFromID(&ms, pc); } #endif } extern char * FormatPrompt(void) { static char sz[128]; /* FIXME check for overflow in rest of function */ const char *pch = szPrompt; char *pchDest = sz; unsigned int anPips[2]; while (*pch) if (*pch == '\\') { pch++; switch (*pch) { case 0: goto done; case 'c': case 'C': /* Pip count */ if (ms.gs == GAME_NONE) strcpy(pchDest, _("No game")); else { PipCount(msBoard(), anPips); sprintf(pchDest, "%u:%u", anPips[1], anPips[0]); } break; case 'p': case 'P': /* Player on roll */ switch (ms.gs) { case GAME_NONE: strcpy(pchDest, _("No game")); break; case GAME_PLAYING: strcpy(pchDest, ap[ms.fTurn].szName); break; case GAME_OVER: case GAME_RESIGNED: case GAME_DROP: strcpy(pchDest, _("Game over")); break; } break; case 's': case 'S': /* Match score */ sprintf(pchDest, "%d:%d", ms.anScore[0], ms.anScore[1]); break; case 'v': case 'V': /* Version */ strcpy(pchDest, VERSION); break; default: *pchDest++ = *pch; *pchDest = 0; } pchDest = strchr(pchDest, 0); pch++; } else *pchDest++ = *pch++; done: *pchDest = 0; return sz; } extern void CommandEval(char *sz) { char szOutput[4096]; int n; TanBoard an; cubeinfo ci; decisionData dd; if (!*sz && ms.gs == GAME_NONE) { outputl(_("No position specified and no game in progress.")); return; } if ((n = ParsePosition(an, &sz, NULL)) < 0) return; if (n && ms.fMove) /* =n notation used; the opponent is on roll in the position given. */ SwapSides(an); if (ms.gs == GAME_NONE) memcpy(&ci, &ciCubeless, sizeof(ci)); else SetCubeInfo(&ci, ms.nCube, ms.fCubeOwner, n ? !ms.fMove : ms.fMove, ms.nMatchTo, ms.anScore, ms.fCrawford, ms.fJacoby, nBeavers, ms.bgv); /* Consider cube action */ dd.pboard = (ConstTanBoard) an; dd.pec = &GetEvalCube()->ec; dd.pci = &ci; dd.szOutput = szOutput; dd.n = n; if (RunAsyncProcess((AsyncFun) asyncDumpDecision, &dd, _("Evaluating position...")) == 0) { #if defined(USE_GTK) if (fX) GTKEval(szOutput); else #endif outputl(szOutput); } } extern command * FindHelpCommand(command * pcBase, char *sz, char *pchCommand, char *pchUsage) { command *pc; const char *pch; size_t cch; if (!(pch = NextToken(&sz))) return pcBase; cch = strlen(pch); for (pc = pcBase->pc; pc && pc->sz; pc++) if (!StrNCaseCmp(pch, pc->sz, cch)) break; if (!pc || !pc->sz) return NULL; pch = pc->sz; while (*pch) *pchCommand++ = *pchUsage++ = *pch++; *pchCommand++ = ' '; *pchCommand = 0; *pchUsage++ = ' '; *pchUsage = 0; if (pc->szUsage) { pch = gettext(pc->szUsage); while (*pch) *pchUsage++ = *pch++; *pchUsage++ = ' '; *pchUsage = 0; } if (pc->pc) /* subcommand */ return FindHelpCommand(pc, sz, pchCommand, pchUsage); else /* terminal command */ return pc; } extern char * CheckCommand(char *sz, command * ac) { command *pc; size_t cch; char *pch = NextToken(&sz); if (!pch) return 0; cch = strlen(pch); for (pc = ac; pc->sz; pc++) if (!StrNCaseCmp(pch, pc->sz, cch)) break; if (!pc->sz) return pch; if (pc->pf) { return 0; } else { return CheckCommand(sz, pc->pc); } } extern void CommandHelp(char *sz) { command *pc, *pcFull; char szCommand[128], szUsage[128], *szHelp; #if defined(USE_GTK) if (fX) { GTKHelp(sz); return; } #endif if (!(pc = FindHelpCommand(&cTop, sz, szCommand, szUsage))) { outputf(_("No help available for topic `%s'"), sz); output("\n"); return; } if (pc->szHelp) /* the command has its own help text */ szHelp = gettext(pc->szHelp); else if (pc == &cTop) /* top-level help isn't for any command */ szHelp = NULL; else { /* perhaps the command is an abbreviation; search for the full * version */ szHelp = NULL; for (pcFull = acTop; pcFull->sz; pcFull++) if (pcFull->pf == pc->pf && pcFull->szHelp) { szHelp = gettext(pcFull->szHelp); break; } } if (szHelp) { outputf("%s- %s\n\n%s %s", szCommand, szHelp, _("Usage:"), szUsage); if (pc->pc && pc->pc->sz) outputf("<%s>\n", _("subcommand")); else outputc('\n'); } if (pc->pc && pc->pc->sz) { outputl(pc == &cTop ? _("Available commands:") : _("Available subcommands:")); pc = pc->pc; for (; pc->sz; pc++) if (pc->szHelp) outputf("%-15s\t%s\n", pc->sz, Q_(pc->szHelp)); } } extern char * FormatMoveHint(char *sz, const matchstate * pms, movelist * pml, int i, int fRankKnown, int fDetailProb, int fShowParameters) { cubeinfo ci; char szTemp[2048], szMove[FORMATEDMOVESIZE]; float *ar, *arStdDev; float rEq, rEqTop; GetMatchStateCubeInfo(&ci, pms); strcpy(sz, ""); /* number */ if (i && !fRankKnown) strcat(sz, " ?? "); else sprintf(strchr(sz, 0), " %4i. ", i + 1); /* eval */ sprintf(strchr(sz, 0), "%-14s %-28s %s: ", FormatEval(szTemp, &pml->amMoves[i].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[i].anMove), (!pms->nMatchTo || !fOutputMWC) ? _("Eq.") : _("MWC")); /* equity or mwc for move */ ar = pml->amMoves[i].arEvalMove; arStdDev = pml->amMoves[i].arEvalStdDev; rEq = pml->amMoves[i].rScore; rEqTop = pml->amMoves[0].rScore; strcat(sz, OutputEquity(rEq, &ci, TRUE)); /* difference */ if (i) sprintf(strchr(sz, 0), " (%s)\n", OutputEquityDiff(rEq, rEqTop, &ci)); else strcat(sz, "\n"); /* percentages */ if (fDetailProb) { switch (pml->amMoves[i].esMove.et) { case EVAL_EVAL: /* FIXME: add cubeless and cubeful equities */ strcat(sz, " "); strcat(sz, OutputPercents(ar, TRUE)); strcat(sz, "\n"); break; case EVAL_ROLLOUT: strcat(sz, OutputRolloutResult(" ", NULL, (float (*)[NUM_ROLLOUT_OUTPUTS]) ar, (float (*)[NUM_ROLLOUT_OUTPUTS]) arStdDev, &ci, 0, 1, pml->amMoves[i].esMove.rc.fCubeful)); break; default: break; } } /* eval parameters */ if (fShowParameters) { switch (pml->amMoves[i].esMove.et) { case EVAL_EVAL: strcat(sz, " "); strcat(sz, OutputEvalContext(&pml->amMoves[i].esMove.ec, TRUE)); strcat(sz, "\n"); break; case EVAL_ROLLOUT: strcat(sz, OutputRolloutContext(" ", &pml->amMoves[i].esMove.rc)); break; default: break; } } return sz; #if 0 if (!pms->nMatchTo || (pms->nMatchTo && !fOutputMWC)) { /* output in equity */ float *ar, rEq, rEqTop; ar = pml->amMoves[0].arEvalMove; rEqTop = pml->amMoves[0].rScore; if (!i) { if (fOutputWinPC) sprintf(sz, " %4i. %-14s %-28s Eq.: %+6.3f\n" " %5.1f%% %5.1f%% %5.1f%% -" " %5.1f%% %5.1f%% %5.1f%%\n", 1, FormatEval(szTemp, &pml->amMoves[0].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[0].anMove), rEqTop, 100.0 * ar[0], 100.0 * ar[1], 100.0 * ar[2], 100.0 * (1.0 - ar[0]), 100.0 * ar[3], 100.0 * ar[4]); else sprintf(sz, " %4i. %-14s %-28s Eq.: %+6.3f\n" " %5.3f %5.3f %5.3f -" " %5.3f %5.3f %5.3f\n", 1, FormatEval(szTemp, &pml->amMoves[0].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[0].anMove), rEqTop, ar[0], ar[1], ar[2], (1.0 - ar[0]), ar[3], ar[4]); } else { ar = pml->amMoves[i].arEvalMove; rEq = pml->amMoves[i].rScore; if (fRankKnown) sprintf(sz, " %4i.", i + 1); else strcpy(sz, " ?? "); if (fOutputWinPC) sprintf(sz + 6, " %-14s %-28s Eq.: %+6.3f (%+6.3f)\n" " %5.1f%% %5.1f%% %5.1f%% -" " %5.1f%% %5.1f%% %5.1f%%\n", FormatEval(szTemp, &pml->amMoves[i].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[i].anMove), rEq, rEq - rEqTop, 100.0 * ar[0], 100.0 * ar[1], 100.0 * ar[2], 100.0 * (1.0 - ar[0]), 100.0 * ar[3], 100.0 * ar[4]); else sprintf(sz + 6, " %-14s %-28s Eq.: %+6.3f (%+6.3f)\n" " %5.3f %5.3f %5.3f -" " %5.3f %5.3f %5.3f\n", FormatEval(szTemp, &pml->amMoves[i].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[i].anMove), rEq, rEq - rEqTop, ar[0], ar[1], ar[2], (1.0 - ar[0]), ar[3], ar[4]); } } else { /* output in mwc */ float *ar, rMWC, rMWCTop; ar = pml->amMoves[0].arEvalMove; rMWCTop = 100.0 * eq2mwc(pml->amMoves[0].rScore, &ci); if (!i) { if (fOutputWinPC) sprintf(sz, " %4i. %-14s %-28s MWC: %7.3f%%\n" " %5.1f%% %5.1f%% %5.1f%% -" " %5.1f%% %5.1f%% %5.1f%%\n", 1, FormatEval(szTemp, &pml->amMoves[0].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[0].anMove), rMWCTop, 100.0 * ar[0], 100.0 * ar[1], 100.0 * ar[2], 100.0 * (1.0 - ar[0]), 100.0 * ar[3], 100.0 * ar[4]); else sprintf(sz, " %4i. %-14s %-28s MWC: %7.3f%%\n" " %5.3f %5.3f %5.3f -" " %5.3f %5.3f %5.3f\n", 1, FormatEval(szTemp, &pml->amMoves[0].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[0].anMove), rMWCTop, ar[0], ar[1], ar[2], (1.0 - ar[0]), ar[3], ar[4]); } else { ar = pml->amMoves[i].arEvalMove; rMWC = 100.0 * eq2mwc(pml->amMoves[i].rScore, &ci); if (fRankKnown) sprintf(sz, " %4i.", i + 1); else strcpy(sz, " ?? "); if (fOutputWinPC) sprintf(sz + 6, " %-14s %-28s MWC: %7.3f%% (%+7.3f%%)\n" " %5.1f%% %5.1f%% %5.1f%% -" " %5.1f%% %5.1f%% %5.1f%%\n", FormatEval(szTemp, &pml->amMoves[i].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[i].anMove), rMWC, rMWC - rMWCTop, 100.0 * ar[0], 100.0 * ar[1], 100.0 * ar[2], 100.0 * (1.0 - ar[0]), 100.0 * ar[3], 100.0 * ar[4]); else sprintf(sz + 6, " %-14s %-28s MWC: %7.3f%% (%+7.3f%%)\n" " %5.3f %5.3f %5.3f -" " %5.3f %5.3f %5.3f\n", FormatEval(szTemp, &pml->amMoves[i].esMove), FormatMove(szMove, pms->anBoard, pml->amMoves[i].anMove), rMWC, rMWC - rMWCTop, ar[0], ar[1], ar[2], (1.0 - ar[0]), ar[3], ar[4]); } } return sz; #endif } static void HintResigned(void) { float rEqBefore, rEqAfter; static cubeinfo ci; static decisionData dd; GetMatchStateCubeInfo(&ci, &ms); #if defined(USE_BOARD3D) if (fX) { /* Stop waving flag, otherwise hangs */ BoardData *bd = BOARD(pwBoard)->board_data; StopIdle3d(bd, bd->bd3d); } #endif /* evaluate current position */ dd.pboard = msBoard(); dd.pci = &ci; dd.pec = &GetEvalCube()->ec; if (RunAsyncProcess((AsyncFun) asyncMoveDecisionE, &dd, _("Considering resignation...")) != 0) return; getResignEquities(dd.aarOutput[0], &ci, ms.fResigned, &rEqBefore, &rEqAfter); #if defined(USE_GTK) if (fX) { GTKResignHint(dd.aarOutput[0], rEqBefore, rEqAfter, &ci, ms.nMatchTo && fOutputMWC); return; } #endif if (!ms.nMatchTo || !fOutputMWC) { outputf("%s : %+6.3f\n", _("Equity before resignation"), -rEqBefore); outputf("%s : %+6.3f (%+6.3f)\n\n", _("Equity after resignation"), -rEqAfter, rEqBefore - rEqAfter); outputf("%s : %s\n\n", _("Correct resign decision"), (rEqBefore - rEqAfter >= 0) ? _("Accept") : _("Reject")); } else { rEqBefore = eq2mwc(-rEqBefore, &ci); rEqAfter = eq2mwc(-rEqAfter, &ci); outputf("%s : %6.2f%%\n", _("Equity before resignation"), rEqBefore * 100.0f); outputf("%s : %6.2f%% (%6.2f%%)\n\n", _("Equity after resignation"), rEqAfter * 100.0f, 100.0f * (rEqAfter - rEqBefore)); outputf("%s : %s\n\n", _("Correct resign decision"), (rEqAfter - rEqBefore >= 0) ? _("Accept") : _("Reject")); } } static int hint_cube(moverecord * pmr, cubeinfo * pci) { static decisionData dd; if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) { /* no analysis performed yet */ dd.pboard = msBoard(); dd.pci = pci; dd.pes = GetEvalCube(); if (RunAsyncProcess((AsyncFun) asyncCubeDecision, &dd, _("Considering cube action...")) != 0) return -1; pmr_cubedata_set(pmr, dd.pes, dd.aarOutput, dd.aarStdDev); } return 0; } static skilltype no_double_skill(moverecord * pmr, cubeinfo * pci) { float arDouble[4]; float eq = 0.0f; cubedecision cd; if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return SKILL_NONE; cd = FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, pci); switch (cd) { case DOUBLE_TAKE: case DOUBLE_BEAVER: case REDOUBLE_TAKE: eq = arDouble[OUTPUT_NODOUBLE] - arDouble[OUTPUT_TAKE]; break; case DOUBLE_PASS: case REDOUBLE_PASS: eq = arDouble[OUTPUT_NODOUBLE] - arDouble[OUTPUT_DROP]; break; default: break; } return Skill(eq); } static skilltype double_skill(moverecord * pmr, cubeinfo * pci) { float arDouble[4]; float eq = 0.0f; cubedecision cd; if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return SKILL_NONE; cd = FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, pci); switch (cd) { case NODOUBLE_TAKE: case NODOUBLE_BEAVER: case NO_REDOUBLE_TAKE: case NO_REDOUBLE_BEAVER: case TOOGOOD_TAKE: case TOOGOODRE_TAKE: eq = arDouble[OUTPUT_TAKE] - arDouble[OUTPUT_NODOUBLE]; break; case TOOGOOD_PASS: case TOOGOODRE_PASS: eq = arDouble[OUTPUT_DROP] - arDouble[OUTPUT_NODOUBLE]; break; default: break; } return Skill(eq); } static skilltype drop_skill(moverecord * pmr, cubeinfo * pci) { float arDouble[4]; float eq = 0.0f; cubedecision cd; if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return SKILL_NONE; cd = FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, pci); switch (cd) { case DOUBLE_TAKE: case DOUBLE_BEAVER: case REDOUBLE_TAKE: case NODOUBLE_TAKE: case NODOUBLE_BEAVER: case NO_REDOUBLE_TAKE: case NO_REDOUBLE_BEAVER: case TOOGOOD_TAKE: case TOOGOODRE_TAKE: case OPTIONAL_DOUBLE_BEAVER: case OPTIONAL_DOUBLE_TAKE: case OPTIONAL_REDOUBLE_TAKE: /* equity is for doubling player, invert for response */ eq = arDouble[OUTPUT_TAKE] - arDouble[OUTPUT_DROP]; break; default: break; } return Skill(eq); } static skilltype take_skill(moverecord * pmr, cubeinfo * pci) { float arDouble[4]; float eq = 0.0f; cubedecision cd; if (pmr->CubeDecPtr->esDouble.et == EVAL_NONE) return SKILL_NONE; cd = FindCubeDecision(arDouble, pmr->CubeDecPtr->aarOutput, pci); switch (cd) { case DOUBLE_PASS: case REDOUBLE_PASS: case TOOGOOD_PASS: case TOOGOODRE_PASS: case OPTIONAL_DOUBLE_PASS: case OPTIONAL_REDOUBLE_PASS: /* equity is for doubling player, invert for response */ eq = arDouble[OUTPUT_DROP] - arDouble[OUTPUT_TAKE]; break; default: break; } return Skill(eq); } static skilltype move_skill(moverecord * pmr) { move *move_i; move *move_0; if (pmr->n.iMove >= pmr->ml.cMoves || !pmr->ml.amMoves) return SKILL_NONE; move_i = &pmr->ml.amMoves[pmr->n.iMove]; move_0 = &pmr->ml.amMoves[0]; if (move_i->esMove.et == EVAL_NONE || move_0->esMove.et == EVAL_NONE) return SKILL_NONE; else return Skill(move_i->rScore - move_0->rScore); } extern void find_skills(moverecord * pmr, const matchstate * pms, int did_double, int did_take) { cubeinfo ci; doubletype dt = DoubleType(pms->fDoubled, pms->fMove, pms->fTurn); taketype tt = (taketype) dt; GetMatchStateCubeInfo(&ci, pms); if (pmr->mt != MOVE_NORMAL && pmr->mt != MOVE_DOUBLE && pmr->mt != MOVE_TAKE && pmr->mt != MOVE_DROP) { pmr->n.stMove = SKILL_NONE; pmr->stCube = SKILL_NONE; return; } if (pmr->mt == MOVE_DOUBLE && dt != DT_NORMAL) { pmr->stCube = SKILL_NONE; return; } if (pmr->mt == MOVE_TAKE && tt > TT_NORMAL) { pmr->stCube = SKILL_NONE; return; } if (did_double == FALSE) pmr->stCube = no_double_skill(pmr, &ci); else if (did_double == TRUE) pmr->stCube = double_skill(pmr, &ci); else if (did_take == FALSE) pmr->stCube = drop_skill(pmr, &ci); else if (did_take == TRUE) pmr->stCube = take_skill(pmr, &ci); if (pmr->mt == MOVE_NORMAL && pmr->ml.cMoves > 0 && pmr->n.iMove < pmr->ml.cMoves) pmr->n.stMove = move_skill(pmr); } extern void hint_double(int show, int did_double) { static cubeinfo ci; moverecord *pmr; int hist; doubletype dt = DoubleType(ms.fDoubled, ms.fMove, ms.fTurn); if (dt != DT_NORMAL) { if (show) outputerrf(_("This decision is part of beaver/raccoon sequence and cannot be hinted")); return; } GetMatchStateCubeInfo(&ci, &ms); if (!GetDPEq(NULL, NULL, &ci)) { outputerrf(_("You cannot double.")); return; } pmr = get_current_moverecord(&hist); if (!pmr) return; if (hint_cube(pmr, &ci) < 0) return; if (hist && did_double == -1) did_double = (pmr->mt == MOVE_DOUBLE) ? TRUE : FALSE; find_skills(pmr, &ms, did_double, -1); #if defined(USE_GTK) if (fX) { if (hist && show) ChangeGame(NULL); if (show) GTKCubeHint(pmr, &ms, did_double, -1, hist); return; } #endif if (show) outputl(OutputCubeAnalysis (pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, &ci, -1)); } extern void hint_take(int show, int did_take) { static cubeinfo ci; moverecord *pmr; int hist; taketype tt = (taketype) DoubleType(ms.fDoubled, ms.fMove, ms.fTurn); if (tt > TT_NORMAL) { if (show) outputerrf(_("This decision is part of beaver/raccoon sequence and cannot be hinted")); return; } GetMatchStateCubeInfo(&ci, &ms); pmr = get_current_moverecord(&hist); if (!pmr) return; if (hint_cube(pmr, &ci) < 0) return; if (hist && did_take == -1) did_take = (pmr->mt == MOVE_TAKE) ? TRUE : FALSE; find_skills(pmr, &ms, -1, did_take); #if defined(USE_GTK) if (fX) { if (hist && show) ChangeGame(NULL); if (show) GTKCubeHint(pmr, &ms, -1, did_take, hist); return; } #endif if (show) outputl(OutputCubeAnalysis (pmr->CubeDecPtr->aarOutput, pmr->CubeDecPtr->aarStdDev, &pmr->CubeDecPtr->esDouble, &ci, 1)); } extern void hint_move(char *sz, gboolean show, procrecorddata * procdatarec) { unsigned int i; char szBuf[1024]; int parse_n = ParseNumber(&sz); unsigned int n = (parse_n <= 0) ? 10 : parse_n; moverecord *pmr; cubeinfo ci; int hist; movelist ml; findData fd; int fSaveShowProg = fShowProgress; if (!ms.anDice[0]) return; GetMatchStateCubeInfo(&ci, &ms); pmr = get_current_moverecord(&hist); if (!pmr) return; if (pmr->esChequer.et == EVAL_NONE) { fd.pml = &ml; fd.pboard = msBoard(); fd.keyMove = NULL; fd.rThr = arSkillLevel[SKILL_DOUBTFUL]; fd.pci = &ci; fd.pec = &GetEvalChequer()->ec; fd.aamf = *GetEvalMoveFilter(); if (procdatarec) { show = FALSE; fShowProgress = (procdatarec->avInputData[PROCREC_HINT_ARGIN_SHOWPROGRESS] != NULL); } if ((RunAsyncProcess((AsyncFun) asyncFindMove, &fd, _("Considering move...")) != 0) || fInterrupt) { fShowProgress = fSaveShowProg; return; } fShowProgress = fSaveShowProg; pmr_movelist_set(pmr, GetEvalChequer(), &ml); } #if defined(USE_GTK) if (!hist && fX) GTKGetMove(pmr->n.anMove); #endif if (pmr->n.anMove[0] == -1) { pmr->n.iMove = UINT_MAX; pmr->n.stMove = SKILL_NONE; } else { pmr->n.iMove = locateMove(msBoard(), pmr->n.anMove, &pmr->ml); /* Tutor mode may have called asyncFindMove() above before * n.iMove was known. Do it again, ensuring that the actual * move is evaluated at the best ply. */ fd.pml = &ml; fd.pboard = msBoard(); fd.keyMove = &(pmr->ml.amMoves[pmr->n.iMove].key); fd.rThr = arSkillLevel[SKILL_DOUBTFUL]; fd.pci = &ci; fd.pec = &GetEvalChequer()->ec; fd.aamf = *GetEvalMoveFilter(); asyncFindMove(&fd); pmr_movelist_set(pmr, GetEvalChequer(), &ml); find_skills(pmr, &ms, FALSE, -1); } /* resort the moves according to cubeful (if applicable), * cubeless equities and tie-breaking heuristics to avoid * suggesting some silly looking moves */ if (pmr->ml.cMoves > 0) { int *ai = (int *) malloc(pmr->ml.cMoves * sizeof(int)); RefreshMoveList(&pmr->ml, ai); free(ai); } #if defined(USE_GTK) if (!procdatarec && fX) { if (hist && show) ChangeGame(NULL); if (show) GTKHint(pmr, hist); return; } else #endif if (!procdatarec && !show) return; if (!procdatarec && show && !pmr->ml.cMoves) { outputl(_("There are no legal moves.")); return; } if (procdatarec) { procdatarec->avOutputData[PROCREC_HINT_ARGOUT_MATCHSTATE] = (void *) &ms; procdatarec->avOutputData[PROCREC_HINT_ARGOUT_CUBEINFO] = (void *) &ci; procdatarec->avOutputData[PROCREC_HINT_ARGOUT_MOVELIST] = (void *) &pmr->ml; procdatarec->avOutputData[PROCREC_HINT_ARGOUT_MOVERECORD] = (void *) &pmr; } n = MIN(pmr->ml.cMoves, n); for (i = 0; i < n; i++) { if (show) output(FormatMoveHint(szBuf, &ms, &pmr->ml, i, TRUE, TRUE, TRUE)); else if (procdatarec && procdatarec->pfProcessRecord) { procdatarec->avOutputData[PROCREC_HINT_ARGOUT_INDEX] = (void *) (ptrdiff_t) i; if (!procdatarec->pfProcessRecord(procdatarec)) break; } } } extern void CommandHint(char *sz) { listOLD *pl; moverecord *pmr; if (ms.gs != GAME_PLAYING) { outputl(_("You must set up a board first.")); return; } /* The code further below handles only the case of asking a hint * on a resignation by gnubg while playing against it. When * clicking on a "resign" entry in the moves panel while reviewing * a game, the match state ms is not up to date and we have to * look at the moves list */ pl = plLastMove->plNext; if ((pmr = pl->p) && pmr->mt == MOVE_RESIGN) { HintResigned(); return; } /* hint on cube decision */ if (!ms.anDice[0] && !ms.fDoubled && !ms.fResigned) { hint_double(TRUE, -1); return; } /* Give hint on resignation */ if (ms.fResigned) { HintResigned(); return; } /* Give hint on take decision */ if (ms.fDoubled) { hint_take(TRUE, -1); return; } /* Give hint on chequer play decision */ if (ms.anDice[0]) { hint_move(sz, TRUE, NULL); return; } } static void Shutdown(void) { RenderFinalise(); free_rngctx(rngctxCurrent); free_rngctx(rngctxRollout); FreeMatch(); ClearMatch(); #if defined(USE_GTK) MoveListDestroy(); #endif MT_Close(); EvalShutdown(); #if defined(USE_PYTHON) PythonShutdown(); #endif #if defined(LIBCURL_PROTOCOL_HTTPS) /* Cleanup curl */ curl_global_cleanup(); #endif #if defined(HAVE_SOCKETS) #ifdef WIN32 WSACleanup(); #endif #endif SoundWait(); } /* Called on various exit commands -- e.g. EOF on stdin, "quit" command, * etc. If stdin is not a TTY, this should always exit immediately (to * avoid enless loops on EOF). If stdin is a TTY, and fConfirmNew is set, * and a game is in progress, then we ask the user if they're sure. */ extern void PromptForExit(void) { static int fExiting = FALSE; #if defined(USE_GTK) BoardData *bd = NULL; if (fX) { bd = BOARD(pwBoard)->board_data; g_assert(bd); } #endif if (fExiting) return; fExiting = TRUE; if (fInteractive) { fInterrupt = FALSE; if (!get_input_discard()) { fInterrupt = FALSE; fExiting = FALSE; return; } } #if defined(USE_BOARD3D) if (fX && bd && (display_is_3d(bd->rd))) { /* Stop any 3d animations */ StopIdle3d(bd, bd->bd3d); } #endif #if defined(HAVE_SOCKETS) /* Close any open connections */ if (ap[0].pt == PLAYER_EXTERNAL) closesocket(ap[0].h); if (ap[1].pt == PLAYER_EXTERNAL) closesocket(ap[1].h); #endif playSound(SOUND_EXIT); ProcessEvents(); SoundWait(); /* Wait for sound to finish before final close */ if (fInteractive) PortableSignalRestore(SIGINT, &shInterruptOld); #if defined(USE_GTK) if (fX) { stop_board_expose(bd); board_free_pixmaps(bd); } #if defined(USE_BOARD3D) if (fX && bd) Tidy3dObjects(bd->bd3d, bd->rd); #endif #endif #if defined(HAVE_LIB_READLINE) write_history(gnubg_histfile); #endif /* HAVE_LIB_READLINE */ #if defined(USE_GTK) if (gtk_main_level() == 1) gtk_main_quit(); else #endif { Shutdown(); exit(EXIT_SUCCESS); } } extern void CommandNotImplemented(char *UNUSED(sz)) { outputl(_("That command is not yet implemented.")); } extern void CommandQuit(char *UNUSED(sz)) { PromptForExit(); } extern void CommandRollout(char *sz) { float arOutput[NUM_ROLLOUT_OUTPUTS]; float arStdDev[NUM_ROLLOUT_OUTPUTS]; rolloutstat arsStatistics[2]; TanBoard anBoard; cubeinfo ci; char asz[1][FORMATEDMOVESIZE]; void *p; if (CountTokens(sz) > 0) { outputerrf("%s", _("The rollout command takes no arguments and only rollouts the current position")); return; } if (ms.gs != GAME_PLAYING) { outputerrf("%s", _("No position specified and no game in progress.")); return; } #if defined(USE_GTK) if (fX) GTKShowWarning(WARN_ROLLOUT, NULL); #endif sprintf(asz[0], _("Current Position")); memcpy(anBoard, msBoard(), sizeof(TanBoard)); SetCubeInfo(&ci, ms.nCube, ms.fCubeOwner, ms.fMove, ms.nMatchTo, ms.anScore, ms.fCrawford, ms.fJacoby, nBeavers, ms.bgv); RolloutProgressStart(&ci, 1, NULL, &rcRollout, asz, FALSE, &p); GeneralEvaluationR(arOutput, arStdDev, arsStatistics, (ConstTanBoard) anBoard, &ci, &rcRollout, RolloutProgress, p); RolloutProgressEnd(&p, FALSE); } static void LoadCommands(FILE * pf, char *szFile) { char sz[2048]; outputpostpone(); /* FIXME shouldn't restart sys calls on signals during this fgets */ while (fgets(sz, sizeof(sz), pf) != NULL) { char *pch; if ((pch = strchr(sz, '\n'))) *pch = 0; if ((pch = strchr(sz, '\r'))) *pch = 0; if (fInterrupt) { outputresume(); return; } if (*sz == '#') /* Comment */ continue; #if defined(USE_PYTHON) if (!strcmp(sz, ">")) { /* Python escape. */ /* Ideally we should be able to handle both > print 1+1 sys.exit() and > print 1+1 * currently we only handle the latter... */ outputerrf("%s", _("Only Python commands supported, not multiline code")); continue; } #endif /* USE_PYTHON */ HandleCommand(sz, acTop); /* FIXME handle NextTurn events? */ } if (ferror(pf)) { outputerr(szFile); } outputresume(); } extern void CommandLoadPython(char *sz) { sz = NextToken(&sz); if (sz && *sz) #if defined(USE_PYTHON) LoadPythonFile(sz, FALSE); #else outputl(_("This build of GNU Backgammon does not support Python")); #endif else outputl(_("You must specify a file to load from.")); } extern void CommandLoadCommands(char *sz) { FILE *pf; #if defined(WIN32) /* Make sure unquoted filenames are quoted before processing * to allow proper support for filenames with spaces */ char *szQuoted = NULL; char *szQuotedTemp = NULL; if (sz[0] != '"') { szQuoted = szQuotedTemp = g_strdup_printf("\"%s\"", sz); sz = NextToken(&szQuoted); } else sz = NextToken(&sz); #else sz = NextToken(&sz); #endif if (!sz || !*sz) { outputl(_("You must specify a file to load from.")); return; } if ((pf = g_fopen(sz, "r"))) { LoadCommands(pf, sz); fclose(pf); } else outputerr(sz); #if defined(WIN32) if (szQuotedTemp) g_free(szQuotedTemp); #endif } extern void CommandCopy(char *UNUSED(sz)) { char *aps[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; char szOut[2048]; char szCube[40], szPlayer0[MAX_NAME_LEN + 3], szPlayer1[MAX_NAME_LEN + 3], szScore0[35], szScore1[35], szMatch[35]; char szRolled[32]; TanBoard anBoardTemp; aps[0] = szPlayer0; aps[6] = szPlayer1; sprintf(aps[1] = szScore0, ngettext("%d point", "%d points", ms.anScore[0]), ms.anScore[0]); sprintf(aps[5] = szScore1, ngettext("%d point", "%d points", ms.anScore[1]), ms.anScore[1]); if (ms.fDoubled) { aps[ms.fTurn ? 4 : 2] = szCube; sprintf(szPlayer0, "O: %s", ap[0].szName); sprintf(szPlayer1, "X: %s", ap[1].szName); sprintf(szCube, _("Cube offered at %d"), ms.nCube << 1); } else { sprintf(szPlayer0, "O: %s", ap[0].szName); sprintf(szPlayer1, "X: %s", ap[1].szName); aps[ms.fMove ? 4 : 2] = szRolled; if (ms.anDice[0]) sprintf(szRolled, "%s %u%u", _("Rolled"), ms.anDice[0], ms.anDice[1]); else if (!GameStatus(msBoard(), ms.bgv)) strcpy(szRolled, _("On roll")); else szRolled[0] = 0; if (ms.fCubeOwner < 0) { aps[3] = szCube; if (ms.nMatchTo) if (ms.nMatchTo == 1) sprintf(szCube, ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); else if (ms.fCrawford) { sprintf(szCube, ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); strcat(szCube, " ("); strcat(szCube, _("Crawford game")); strcat(szCube, ")"); } else sprintf(szCube, ngettext("%d point match (Cube: %d)", "%d points match (Cube: %d)", ms.nMatchTo), ms.nMatchTo, ms.nCube); else sprintf(szCube, "(%s: %d)", _("Cube"), ms.nCube); } else { sprintf(szCube, "%c: %.20s (%s: %d)", ms.fCubeOwner ? 'X' : 'O', ap[ms.fCubeOwner].szName, _("Cube"), ms.nCube); aps[ms.fCubeOwner ? 6 : 0] = szCube; if (ms.nMatchTo) sprintf(aps[3] = szMatch, ngettext("%d point match", "%d points match", ms.nMatchTo), ms.nMatchTo); } } memcpy(anBoardTemp, msBoard(), sizeof(TanBoard)); if (!ms.fMove) SwapSides(anBoardTemp); DrawBoard(szOut, (ConstTanBoard) anBoardTemp, ms.fMove, aps, MatchIDFromMatchState(&ms), anChequers[ms.bgv]); { unsigned int anPips[2]; char szPipCount[32]; PipCount((ConstTanBoard) anBoardTemp, anPips); sprintf(szPipCount, "%s O %u, X %u\n", _("Pip counts:"), anPips[0], anPips[1]); strcat(szOut, " "); strcat(szOut, szPipCount); } TextToClipboard(szOut); } static void LoadRCFiles(void) { char *sz, *szz; loading_rc = TRUE; outputoff(); sz = g_build_filename(szHomeDirectory, "gnubgautorc", NULL); szz = g_strdup_printf("\"%s\"", sz); if (g_file_test(sz, G_FILE_TEST_EXISTS)) CommandLoadCommands(szz); UpdateSettings(); g_free(sz); g_free(szz); sz = g_build_filename(szHomeDirectory, "gnubgrc", NULL); szz = g_strdup_printf("\"%s\"", sz); if (g_file_test(sz, G_FILE_TEST_EXISTS)) CommandLoadCommands(szz); g_free(sz); g_free(szz); outputon(); loading_rc = FALSE; } static void SaveRNGSettings(FILE * pf, const char *sz, rng rngCurrent, rngcontext * rngctx) { switch (rngCurrent) { case RNG_BBS: fprintf(pf, "%s rng bbs\n", sz); /* FIXME save modulus */ break; case RNG_ISAAC: fprintf(pf, "%s rng isaac\n", sz); break; case RNG_MANUAL: fprintf(pf, "%s rng manual\n", sz); break; case RNG_MD5: fprintf(pf, "%s rng md5\n", sz); break; case RNG_MERSENNE: fprintf(pf, "%s rng mersenne\n", sz); break; case RNG_RANDOM_DOT_ORG: fprintf(pf, "%s rng random.org\n", sz); break; case RNG_FILE: fprintf(pf, "%s rng file \"%s\"\n", sz, GetDiceFileName(rngctx)); break; default: break; } } static void SaveMoveFilterSettings(FILE * pf, const char *sz, movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]) { int i, j; gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; for (i = 0; i < MAX_FILTER_PLIES; ++i) for (j = 0; j <= i; ++j) { fprintf(pf, "%s %d %d %d %d %s\n", sz, i + 1, j, aamf[i][j].Accept, aamf[i][j].Extra, g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%0.3g", aamf[i][j].Threshold)); } } static void SaveEvalSettings(FILE * pf, const char *sz, evalcontext * pec) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar *szNoise = g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", pec->rNoise); fprintf(pf, "%s plies %u\n" "%s prune %s\n" "%s cubeful %s\n" "%s noise %s\n" "%s deterministic %s\n", sz, pec->nPlies, sz, pec->fUsePrune ? "on" : "off", sz, pec->fCubeful ? "on" : "off", sz, szNoise, sz, pec->fDeterministic ? "on" : "off"); } extern void SaveRolloutSettings(FILE * pf, const char *sz, rolloutcontext * prc) { char *pch; int i; /* flags and stuff */ gchar szTemp1[G_ASCII_DTOSTR_BUF_SIZE]; gchar szTemp2[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_formatd(szTemp1, G_ASCII_DTOSTR_BUF_SIZE, "%05.4f", prc->rStdLimit); g_ascii_formatd(szTemp2, G_ASCII_DTOSTR_BUF_SIZE, "%05.4f", prc->rJsdLimit); fprintf(pf, "%s cubeful %s\n" "%s varredn %s\n" "%s quasirandom %s\n" "%s initial %s\n" "%s truncation enable %s\n" "%s truncation plies %u\n" "%s bearofftruncation exact %s\n" "%s bearofftruncation onesided %s\n" "%s later enable %s\n" "%s later plies %u\n" "%s trials %u\n" "%s cube-equal-chequer %s\n" "%s players-are-same %s\n" "%s truncate-equal-player0 %s\n" "%s limit enable %s\n" "%s limit minimumgames %u\n" "%s limit maxerror %s\n" "%s jsd stop %s\n" "%s jsd minimumgames %u\n" "%s jsd limit %s\n", sz, prc->fCubeful ? "on" : "off", sz, prc->fVarRedn ? "on" : "off", sz, prc->fRotate ? "on" : "off", sz, prc->fInitial ? "on" : "off", sz, prc->fDoTruncate ? "on" : "off", sz, prc->nTruncate, sz, prc->fTruncBearoff2 ? "on" : "off", sz, prc->fTruncBearoffOS ? "on" : "off", sz, prc->fLateEvals ? "on" : "off", sz, prc->nLate, sz, prc->nTrials, sz, fCubeEqualChequer ? "on" : "off", sz, fPlayersAreSame ? "on" : "off", sz, fTruncEqualPlayer0 ? "on" : "off", sz, prc->fStopOnSTD ? "on" : "off", sz, prc->nMinimumGames, sz, szTemp1, sz, prc->fStopOnJsd ? "on" : "off", sz, prc->nMinimumJsdGames, sz, szTemp2); SaveRNGSettings(pf, sz, prc->rngRollout, rngctxRollout); /* chequer play and cube decision evalcontexts */ pch = g_malloc(strlen(sz) + 50); strcpy(pch, sz); for (i = 0; i < 2; i++) { sprintf(pch, "%s player %i chequerplay", sz, i); SaveEvalSettings(pf, pch, &prc->aecChequer[i]); sprintf(pch, "%s player %i cubedecision", sz, i); SaveEvalSettings(pf, pch, &prc->aecCube[i]); sprintf(pch, "%s player %i movefilter", sz, i); SaveMoveFilterSettings(pf, pch, prc->aaamfChequer[i]); } for (i = 0; i < 2; i++) { sprintf(pch, "%s later player %i chequerplay", sz, i); SaveEvalSettings(pf, pch, &prc->aecChequerLate[i]); sprintf(pch, "%s later player %i cubedecision", sz, i); SaveEvalSettings(pf, pch, &prc->aecCubeLate[i]); sprintf(pch, "%s later player %i movefilter", sz, i); SaveMoveFilterSettings(pf, pch, prc->aaamfLate[i]); } sprintf(pch, "%s truncation cubedecision", sz); SaveEvalSettings(pf, pch, &prc->aecCubeTrunc); sprintf(pch, "%s truncation chequerplay", sz); SaveEvalSettings(pf, pch, &prc->aecChequerTrunc); g_free(pch); } static void SaveEvalSetupSettings(FILE * pf, const char *sz, evalsetup * pes) { char szTemp[1024]; switch (pes->et) { case EVAL_EVAL: fprintf(pf, "%s type evaluation\n", sz); break; case EVAL_ROLLOUT: fprintf(pf, "%s type rollout\n", sz); break; default: break; } strcpy(szTemp, sz); SaveEvalSettings(pf, strcat(szTemp, " evaluation"), &pes->ec); strcpy(szTemp, sz); SaveRolloutSettings(pf, strcat(szTemp, " rollout"), &pes->rc); } static void SaveAnalysisSettings(FILE * pf) { gchar aszThr[7][G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_formatd(aszThr[0], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arSkillLevel[SKILL_BAD]); g_ascii_formatd(aszThr[1], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arSkillLevel[SKILL_DOUBTFUL]); g_ascii_formatd(aszThr[2], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arLuckLevel[LUCK_GOOD]); g_ascii_formatd(aszThr[3], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arLuckLevel[LUCK_BAD]); g_ascii_formatd(aszThr[4], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arSkillLevel[SKILL_VERYBAD]); g_ascii_formatd(aszThr[5], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arLuckLevel[LUCK_VERYGOOD]); g_ascii_formatd(aszThr[6], G_ASCII_DTOSTR_BUF_SIZE, "%0.3f", arLuckLevel[LUCK_VERYBAD]); SaveEvalSetupSettings(pf, "set analysis chequerplay", &esAnalysisChequer); SaveEvalSetupSettings(pf, "set analysis cubedecision", &esAnalysisCube); SaveMoveFilterSettings(pf, "set analysis movefilter", aamfAnalysis); SaveEvalSettings(pf, "set analysis luckanalysis", &ecLuck); fprintf(pf, "set analysis threshold bad %s\n", aszThr[0]); fprintf(pf, "set analysis threshold doubtful %s\n", aszThr[1]); fprintf(pf, "set analysis threshold lucky %s\n", aszThr[2]); fprintf(pf, "set analysis threshold unlucky %s\n", aszThr[3]); fprintf(pf, "set analysis threshold verybad %s\n", aszThr[4]); fprintf(pf, "set analysis threshold verylucky %s\n", aszThr[5]); fprintf(pf, "set analysis threshold veryunlucky %s\n", aszThr[6]); fprintf(pf, "set analysis cube %s\n", fAnalyseCube ? "on" : "off"); fprintf(pf, "set analysis luck %s\n", fAnalyseDice ? "on" : "off"); fprintf(pf, "set analysis moves %s\n", fAnalyseMove ? "on" : "off"); fprintf(pf, "set analysis player 0 analyse %s\n", afAnalysePlayers[0] ? "yes" : "no"); fprintf(pf, "set analysis player 1 analyse %s\n", afAnalysePlayers[1] ? "yes" : "no"); fprintf(pf, "set automatic db %s\n", fAutoDB ? "on" : "off"); fprintf(pf, "set analysis background %s\n", fBackgroundAnalysis ? "on" : "off"); fprintf(pf, "set analysis filesetting %s\n", aszAnalyzeFileSettingCommands[AnalyzeFileSettingDef]); } static void SaveImportExportSettings(FILE * pf) { int i; if (default_import_folder && *default_import_folder) fprintf(pf, "set import folder \"%s\"\n", default_import_folder); if (default_export_folder && *default_export_folder) fprintf(pf, "set export folder \"%s\"\n", default_export_folder); if (default_sgf_folder && *default_sgf_folder) fprintf(pf, "set sgf folder \"%s\"\n", default_sgf_folder); fprintf(pf, "set export include annotations %s\n", exsExport.fIncludeAnnotation ? "yes" : "no"); fprintf(pf, "set export include analysis %s\n", exsExport.fIncludeAnalysis ? "yes" : "no"); fprintf(pf, "set export include statistics %s\n", exsExport.fIncludeStatistics ? "yes" : "no"); fprintf(pf, "set export include matchinfo %s\n", exsExport.fIncludeMatchInfo ? "yes" : "no"); fprintf(pf, "set export show board %d\n", exsExport.fDisplayBoard); if (exsExport.fSide == 3) fprintf(pf, "set export show player both\n"); else if (exsExport.fSide) fprintf(pf, "set export show player %d\n", exsExport.fSide - 1); fprintf(pf, "set export move number %u\n", exsExport.nMoves); fprintf(pf, "set export moves parameters evaluation %s\n", exsExport.afMovesParameters[0] ? "yes" : "no"); fprintf(pf, "set export moves parameters rollout %s\n", exsExport.afMovesParameters[1] ? "yes" : "no"); fprintf(pf, "set export moves probabilities %s\n", exsExport.fMovesDetailProb ? "yes" : "no"); for (i = 0; i < N_SKILLS; i++) { if (i == SKILL_NONE) fprintf(pf, "set export moves display unmarked %s\n", exsExport.afMovesDisplay[i] ? "yes" : "no"); else fprintf(pf, "set export moves display %s %s\n", aszSkillTypeCommand[i], exsExport.afMovesDisplay[i] ? "yes" : "no"); } fprintf(pf, "set export cube parameters evaluation %s\n", exsExport.afCubeParameters[0] ? "yes" : "no"); fprintf(pf, "set export cube parameters rollout %s\n", exsExport.afCubeParameters[1] ? "yes" : "no"); fprintf(pf, "set export cube probabilities %s\n", exsExport.fCubeDetailProb ? "yes" : "no"); for (i = 0; i < N_SKILLS; i++) { if (i == SKILL_NONE) fprintf(pf, "set export cube display unmarked %s\n", exsExport.afCubeDisplay[i] ? "yes" : "no"); else fprintf(pf, "set export cube display %s %s\n", aszSkillTypeCommand[i], exsExport.afCubeDisplay[i] ? "yes" : "no"); } fprintf(pf, "set export cube display actual %s\n", exsExport.afCubeDisplay[EXPORT_CUBE_ACTUAL] ? "yes" : "no"); fprintf(pf, "set export cube display missed %s\n", exsExport.afCubeDisplay[EXPORT_CUBE_MISSED] ? "yes" : "no"); fprintf(pf, "set export cube display close %s\n", exsExport.afCubeDisplay[EXPORT_CUBE_CLOSE] ? "yes" : "no"); fprintf(pf, "set export html pictureurl \"%s\"\n", exsExport.szHTMLPictureURL); fprintf(pf, "set export html type \"%s\"\n", aszHTMLExportType[exsExport.het]); fprintf(pf, "set export html css %s\n", aszHTMLExportCSSCommand[exsExport.hecss]); fprintf(pf, "set export png size %d\n", exsExport.nPNGSize); fprintf(pf, "set export html size %d\n", exsExport.nHtmlSize); } #if defined(USE_GTK) static void SaveGUISettings(FILE * pf) { const char *aszAnimation[] = { "none", "blink", "slide" }; const char *aszShowPips[N_GUI_SHOW_PIPS] = { "none", "pips", "epc", "wastage" }; int dummy; SaveWindowSettings(pf); WriteWarnings(pf); if (fX) GTKSaveSettings(); fprintf(pf, "set fullscreen %s\n", fFullScreen ? "on" : "off"); if (fFullScreen) { GetFullscreenWindowSettings(&dummy, &fShowIDs, &dummy); fprintf(pf, "set gui showids %s\n", fShowIDs ? "on" : "off"); fShowIDs = FALSE; } else fprintf(pf, "set gui showids %s\n", fShowIDs ? "on" : "off"); fprintf(pf, "set gui animation %s\n", aszAnimation[animGUI]); fprintf(pf, "set gui animation speed %u\n", nGUIAnimSpeed); fprintf(pf, "set gui beep %s\n", fGUIBeep ? "on" : "off"); fprintf(pf, "set gui dicearea %s\n", GetMainAppearance()->fDiceArea ? "on" : "off"); fprintf(pf, "set gui highdiefirst %s\n", fGUIHighDieFirst ? "on" : "off"); fprintf(pf, "set gui illegal %s\n", fGUIIllegal ? "on" : "off"); fprintf(pf, "set gui showpips %s\n", aszShowPips[gui_show_pips]); fprintf(pf, "set gui dragtargethelp %s\n", fGUIDragTargetHelp ? "on" : "off"); fprintf(pf, "set gui usestatspanel %s\n", fGUIUseStatsPanel ? "on" : "off"); fprintf(pf, "set gui movelistdetail %s\n", showMoveListDetail ? "on" : "off"); fprintf(pf, "set gui grayedit %s\n", fGUIGrayEdit ? "on" : "off"); fprintf(pf, "set gui windowpositions %s\n", fGUISetWindowPos ? "on" : "off"); fprintf(pf, "set styledgamelist %s\n", fStyledGamelist ? "on" : "off"); fprintf(pf, "set delay %u\n", nDelay); fprintf(pf, "set toolbar %d\n", nToolbarStyle); fprintf(pf, "set toolbar %s\n", fToolbarShowing ? "on" : "off"); #if defined(USE_BOARD3D) if (fSync != -1) fprintf(pf, "set vsync3d %s\n", fSync ? "yes" : "no"); #endif } static void SaveScoreMapSettings(FILE * pf) { fprintf(pf, "set scoremapply %s\n", aszScoreMapPlyCommands[scoreMapPlyDefault]); fprintf(pf, "set scoremapmatchlength %s\n", aszScoreMapMatchLengthCommands[scoreMapMatchLengthDefIdx]); fprintf(pf, "set scoremaplabel %s\n", aszScoreMapLabelCommands[scoreMapLabelDef]); fprintf(pf, "set scoremapjacoby %s\n", aszScoreMapJacobyCommands[scoreMapJacobyDef]); fprintf(pf, "set scoremapcubeequitydisplay %s\n", aszScoreMapCubeEquityDisplayCommands[scoreMapCubeEquityDisplayDef]); fprintf(pf, "set scoremapmoveequitydisplay %s\n", aszScoreMapMoveEquityDisplayCommands[scoreMapMoveEquityDisplayDef]); fprintf(pf, "set scoremapcolour %s\n", aszScoreMapColourCommands[scoreMapColourDef]); fprintf(pf, "set scoremaplayout %s\n", aszScoreMapLayoutCommands[scoreMapLayoutDef]); } #endif static void SaveSoundSettings(FILE * pf) { gnubgsound i; fprintf(pf, "set sound enable %s\n", fSound ? "yes" : "no"); fprintf(pf, "set sound system command %s\n", sound_get_command()); for (i = (gnubgsound) 0; i < NUM_SOUNDS; ++i) { char *file = GetSoundFile(i); fprintf(pf, "set sound sound %s \"%s\"\n", sound_command[i], file); g_free(file); } } static void SavePlayerSettings(FILE * pf) { int i; char szTemp[4096]; fprintf(pf, "set defaultnames \"%s\" \"%s\"\n", default_names[0], default_names[1]); fprintf(pf, "set keynames"); for(i = 0; i < keyNamesFirstEmpty; i++) { fprintf(pf, "\t%s", keyNames[i]); } fprintf(pf, "\n"); for (i = 0; i < 2; i++) { fprintf(pf, "set player %d name %s\n", i, ap[i].szName); switch (ap[i].pt) { case PLAYER_GNU: fprintf(pf, "set player %d gnubg\n", i); sprintf(szTemp, "set player %d chequerplay", i); SaveEvalSetupSettings(pf, szTemp, &ap[i].esChequer); sprintf(szTemp, "set player %d cubedecision", i); SaveEvalSetupSettings(pf, szTemp, &ap[i].esCube); sprintf(szTemp, "set player %d movefilter", i); SaveMoveFilterSettings(pf, szTemp, ap[i].aamf); break; case PLAYER_HUMAN: fprintf(pf, "set player %d human\n", i); break; case PLAYER_EXTERNAL: /* don't save external players */ break; } } fprintf(pf, "set cheat enable %s\n", fCheat ? "on" : "off"); for (i = 0; i < 2; ++i) fprintf(pf, "set cheat player %d roll %u\n", i, afCheatRoll[i] + 1); } static void SavePlayingSettings(FILE * pf) { fprintf(pf, "set automatic bearoff %s\n", fAutoBearoff ? "on" : "off"); fprintf(pf, "set automatic crawford %s\n", fAutoCrawford ? "on" : "off"); fprintf(pf, "set automatic game %s\n", fAutoGame ? "on" : "off"); fprintf(pf, "set automatic move %s\n", fAutoMove ? "on" : "off"); fprintf(pf, "set automatic roll %s\n", fAutoRoll ? "on" : "off"); } static void SaveRuleSettings(FILE * pf) { fprintf(pf, "set automatic doubles %u\n", cAutoDoubles); fprintf(pf, "set beavers %u\n", nBeavers); fprintf(pf, "set jacoby %s\n", fJacoby ? "on" : "off"); fprintf(pf, "set matchlength %u\n", nDefaultLength); fprintf(pf, "set variation %s\n", aszVariationCommands[bgvDefault]); } static void SaveEvaluationSettings(FILE * pf) { fprintf(pf, "set eval sameasanalysis %s\n", fEvalSameAsAnalysis ? "on" : "off"); SaveEvalSetupSettings(pf, "set evaluation chequerplay", &esEvalChequer); SaveEvalSetupSettings(pf, "set evaluation cubedecision", &esEvalCube); SaveMoveFilterSettings(pf, "set evaluation movefilter", aamfEval); fprintf(pf, "set cache %u\n", GetEvalCacheEntries()); fprintf(pf, "set matchequitytable \"%s\"\n", miCurrent.szFileName); fprintf(pf, "set invert matchequitytable %s\n", fInvertMET ? "on" : "off"); #if defined(USE_MULTITHREAD) fprintf(pf, "set threads %u\n", MT_GetNumThreads()); #endif } static void SaveAutoSaveSettings(FILE * pf) { fprintf(pf, "set autosave time %d\n", nAutoSaveTime); fprintf(pf, "set autosave rollout %s\n", fAutoSaveRollout ? "on" : "off"); fprintf(pf, "set autosave analysis %s\n", fAutoSaveAnalysis ? "on" : "off"); fprintf(pf, "set autosave confirm %s\n", fAutoSaveConfirmDelete ? "on" : "off"); } static void SaveMiscSettings(FILE * pf) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; fprintf(pf, "set tutor mode %s\n", fTutor ? "on" : "off"); fprintf(pf, "set tutor cube %s\n", fTutorCube ? "on" : "off"); fprintf(pf, "set tutor chequer %s\n", fTutorChequer ? "on" : "off"); fprintf(pf, "set tutor skill "); if (TutorSkill == SKILL_VERYBAD) fprintf(pf, "very bad\n"); else if (TutorSkill == SKILL_BAD) fprintf(pf, "bad\n"); else fprintf(pf, "doubtful\n"); fprintf(pf, "set clockwise %s\n", fClockwise ? "on" : "off"); fprintf(pf, "set confirm new %s\n", fConfirmNew ? "on" : "off"); fprintf(pf, "set confirm save %s\n", fConfirmSave ? "on" : "off"); fprintf(pf, "set cube use %s\n", fCubeUse ? "on" : "off"); fprintf(pf, "set display %s\n", fDisplay ? "on" : "off"); fprintf(pf, "set confirm default "); if (nConfirmDefault == 1) fprintf(pf, "yes\n"); else if (nConfirmDefault == 0) fprintf(pf, "no\n"); else fprintf(pf, "ask\n"); fprintf(pf, "set gotofirstgame %s\n", fGotoFirstGame ? "on" : "off"); fprintf(pf, "set output matchpc %s\n", fOutputMatchPC ? "on" : "off"); fprintf(pf, "set output mwc %s\n", fOutputMWC ? "on" : "off"); fprintf(pf, "set output rawboard %s\n", fOutputRawboard ? "on" : "off"); fprintf(pf, "set output winpc %s\n", fOutputWinPC ? "on" : "off"); fprintf(pf, "set output digits %d\n", fOutputDigits); fprintf(pf, "set output errorratefactor %s\n", g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%f", rErrorRateFactor)); fprintf(pf, "set prompt %s\n", szPrompt); fprintf(pf, "set browser \"%s\"\n", get_web_browser()); fprintf(pf, "set priority nice %d\n", nThreadPriority); fprintf(pf, "set ratingoffset %s\n", g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%f", rRatingOffset)); fprintf(pf, "set usekeynames %s\n", fUseKeyNames ? "on" : "off"); } extern void CommandSaveSettings(char *szParam) { FILE *pf; char *szFile; szParam = NextToken(&szParam); /* If we were started without a configuration file, don't * save anything since this will overwrite an existing file * with defaults */ if (fNoRC) return; /* If we are still in the process of reading rc files, don't * try to save gnubgautorc or we may corrupt it */ if (loading_rc) return; if (!szParam || !*szParam) { /* no filename parameter given -- save to default location */ szFile = g_build_filename(szHomeDirectory, "gnubgautorc", NULL); } else szFile = g_strdup(szParam); if (!strcmp(szFile, "-")) pf = stdout; else pf = g_fopen(szFile, "w"); if (!pf) { outputerr(szFile); g_free(szFile); return; } #if defined(USE_GTK) /* the following may set errno because of a gtk bug so we do it * first and reset errno afterwards */ if (fX) RefreshGeometries(); #endif errno = 0; fprintf(pf, _("#\n" "# GNU Backgammon command file\n" "# generated by %s\n" "#\n" "# WARNING: The file 'gnubgautorc' is automatically " "generated the first time\n" "# settings are changed and will be overwritten with " "every subsequent change.\n" "#\n" "# If you want to override them with permanent settings, " "put these manually \n" "# in a 'gnubgrc' file in the same directory.\n"), VERSION_STRING); fprintf(pf, "\n"); /* language preference */ fprintf(pf, "set lang %s\n", szLang); #if defined(USE_GTK) SaveGUISettings(pf); SaveScoreMapSettings(pf); #endif SaveAnalysisSettings(pf); SaveRenderingSettings(pf); SavePlayingSettings(pf); SaveRuleSettings(pf); SaveEvaluationSettings(pf); SavePlayerSettings(pf); SaveRNGSettings(pf, "set", rngCurrent, rngctxCurrent); SaveRolloutSettings(pf, "set rollout", &rcRollout); SaveImportExportSettings(pf); SaveSoundSettings(pf); RelationalSaveSettings(pf); SaveMiscSettings(pf); SaveAutoSaveSettings(pf); if (pf != stdout) fclose(pf); if (errno) outputerr(szFile); else { outputf(_("Settings saved to %s."), (!strcmp(szFile, "-")) ? _("standard output stream") : szFile); output("\n"); if (cOutputPostponed) { outputresume(); outputx(); outputpostpone(); } } g_free(szFile); } #if defined(HAVE_LIB_READLINE) static command *pcCompleteContext; static char * NullGenerator(const char *UNUSED(sz), int UNUSED(nState)) { return NULL; } static char * GenerateKeywords(const char *sz, int nState) { static size_t cch; static command *pc; char *szDup; if (!nState) { cch = strlen(sz); pc = pcCompleteContext; } while (pc && pc->sz) { if (!StrNCaseCmp(sz, pc->sz, cch) && pc->szHelp) { szDup = strdup(pc->sz); pc++; return szDup; } pc++; } return NULL; } static char * ERCompletion(const char *sz, int nState) { static int i; static size_t cch; if (!nState) { cch = strlen(sz); i = 0; } while (i < 2) { const char *pch = i++ ? "rollout" : "evaluation"; if (!StrNCaseCmp(sz, pch, cch)) return strdup(pch); ++i; } return NULL; } static char * OnOffCompletion(const char *sz, int nState) { static unsigned int i; static size_t cch; static const char *asz[] = { "false", "no", "off", "on", "true", "yes" }; if (!nState) { cch = strlen(sz); i = 0; } while (i < sizeof(asz) / sizeof(asz[0])) { const char *pch = asz[i++]; if (!StrNCaseCmp(sz, pch, cch)) return strdup(pch); } return NULL; } static char * PlayerCompletionGen(const char *sz, int nState, int fBoth) { static int i; static size_t cch; const char *pch; if (!nState) { cch = strlen(sz); i = 0; } while (i < (fBoth ? 5 : 4)) { switch (i) { case 0: pch = "0"; break; case 1: pch = "1"; break; case 2: pch = ap[0].szName; break; case 3: pch = ap[1].szName; break; case 4: pch = "both"; break; default: abort(); } i++; if (!StrNCaseCmp(sz, pch, cch)) return strdup(pch); } return NULL; } static char * PlayerCompletion(const char *sz, int nState) { return PlayerCompletionGen(sz, nState, FALSE); } static char * PlayerCompletionBoth(const char *sz, int nState) { return PlayerCompletionGen(sz, nState, TRUE); } static command * FindContext(command * pc, char *szOrig, int ich) { char *sz = (char *) g_alloca(strlen(szOrig) * sizeof(char) + 1); char *pch; command *pcResume = NULL; pch = strcpy(sz, szOrig); pch[ich] = 0; do { char *pchCurrent; if (!(pchCurrent = NextToken(&pch))) /* no command */ return pc; if (!pch) /* incomplete command */ return pc; if (pcResume) { pc = pcResume; pcResume = NULL; continue; } while (pc && pc->sz) { if (!StrNCaseCmp(pchCurrent, pc->sz, strlen(pchCurrent))) { pc = pc->pc; if (pc == acSetPlayer || pc == acSetRolloutPlayer || pc == acSetRolloutLatePlayer || pc == acSetAnalysisPlayer || pc == acSetCheatPlayer) { pcResume = pc; pc = &cPlayerBoth; } break; } pc++; } } while (pcResume || (pc && pc->sz)); if (pc && pc->pc) { /* dummy command for parameter completion */ if (!NextToken(&pch)) return pc; } /* the command is already complete */ return NULL; } static char ** CompleteKeyword(const char *szText, int iStart, int UNUSED(iEnd)) { if (fReadingOther) return rl_completion_matches(szText, NullGenerator); pcCompleteContext = FindContext(acTop, rl_line_buffer, iStart); if (!pcCompleteContext) return NULL; if (pcCompleteContext == &cER) return rl_completion_matches(szText, ERCompletion); else if (pcCompleteContext == &cFilename) { rl_filename_completion_desired = TRUE; return rl_completion_matches(szText, rl_filename_completion_function); } else if (pcCompleteContext == &cOnOff) return rl_completion_matches(szText, OnOffCompletion); else if (pcCompleteContext == &cPlayer) return rl_completion_matches(szText, PlayerCompletion); else if (pcCompleteContext == &cPlayerBoth) return rl_completion_matches(szText, PlayerCompletionBoth); else return rl_completion_matches(szText, GenerateKeywords); } #endif extern void Prompt(void) { #if defined(HAVE_LIB_READLINE) if (!fInteractive || !isatty(STDIN_FILENO)) return; #endif g_print("%s", FormatPrompt()); fflush(stdout); } #if defined(HAVE_LIB_READLINE) static char * locale_from_utf8(const char *sz) { char *ret; GError *error = NULL; g_assert(sz); ret = g_locale_from_utf8(sz, strlen(sz), NULL, NULL, &error); if (error) { g_print("locale_from_utf8 failed: %s\n", error->message); g_error_free(error); ret = g_strdup(sz); } return ret; } #endif static char * locale_to_utf8(const char *sz) { char *ret; GError *error = NULL; g_assert(sz); ret = g_locale_to_utf8(sz, strlen(sz), NULL, NULL, &error); if (error) { g_print("locale_to_utf8 failed: %s\n", error->message); g_error_free(error); ret = g_strdup(sz); } return ret; } #if defined(USE_GTK) #if defined(HAVE_LIB_READLINE) extern void ProcessInput(char *sz) { char *pchExpanded; rl_callback_handler_remove(); fReadingCommand = FALSE; if (!sz) { outputc('\n'); PromptForExit(); } else { fInterrupt = FALSE; /* expand history */ history_expand(sz, &pchExpanded); if (*pchExpanded) add_history(pchExpanded); if (fX) GTKDisallowStdin(); HandleCommand(pchExpanded, acTop); free(pchExpanded); } if (fX) GTKAllowStdin(); ResetInterrupt(); /* Recalculate prompt -- if we call nothing, then readline will * redisplay the old prompt. This isn't what we want: we either * want no prompt at all, yet (if NextTurn is going to be called), * or if we do want to prompt immediately, we recalculate it in * case the information in the old one is out of date. */ if (nNextTurn) fNeedPrompt = TRUE; else { char *szp = locale_from_utf8(FormatPrompt()); rl_callback_handler_install(szp, ProcessInput); g_free(szp); fReadingCommand = TRUE; } } #endif extern gint NextTurnNotify(gpointer UNUSED(p)) { NextTurn(TRUE); ResetInterrupt(); if (fNeedPrompt) { #if defined(HAVE_LIB_READLINE) if (fInteractive) { char *sz = locale_from_utf8(FormatPrompt()); rl_callback_handler_install(sz, ProcessInput); g_free(sz); fReadingCommand = TRUE; } else #endif Prompt(); fNeedPrompt = FALSE; } return FALSE; /* remove idle handler, if GTK */ } #endif /* USE_GTK */ /* Handle a command as if it had been typed by the user. */ extern void UserCommand(const char *szCommand) #if defined (USE_GTK) { char *sz; g_return_if_fail(szCommand); g_return_if_fail(*szCommand); /* Unfortunately we need to copy the command, because it might be in * read-only storage and HandleCommand might want to modify it. */ sz = g_strdup(szCommand); #ifndef WIN32 if (!fTTY || !fInteractive) #endif { fInterrupt = FALSE; HandleCommand(sz, acTop); g_free(sz); ResetInterrupt(); return; } /* Note that the command is always echoed to stdout; the output*() * functions are bypassed. */ #if defined(HAVE_LIB_READLINE) rl_end = 0; /* crashes without this line */ rl_redisplay(); g_print("%s\n", sz); ProcessInput(sz); g_free(sz); return; #elif !defined(WIN32) g_print("\n"); Prompt(); g_print("%s\n", sz); fInterrupt = FALSE; HandleCommand(sz, acTop); g_free(sz); ResetInterrupt(); if (nNextTurn) Prompt(); else fNeedPrompt = TRUE; return; #endif } #else /* !USE_GTK */ { char *line = g_strdup(szCommand); HandleCommand(line, acTop); g_free(line); } #endif /* Read a line from stdin, and handle X and readline input if * appropriate. This function blocks until a line is ready, and does * not call HandleEvents(), and because fBusy will be set some X * commands will not work. Therefore, it should not be used for * reading top level commands. The line it returns has been allocated * with malloc (as with readline()). */ extern char * GetInput(char *szPrompt) { char *sz; char *pch; char *pchConverted; #if defined(USE_GTK) g_assert(fTTY && !fX); #endif #if defined(HAVE_LIB_READLINE) if (fInteractive) { char *prompt; /* Using readline, but not X. */ if (fInterrupt) return NULL; fReadingOther = TRUE; prompt = locale_from_utf8(szPrompt); while (!(sz = readline(prompt))) { outputc('\n'); PromptForExit(); } g_free(prompt); fReadingOther = FALSE; if (fInterrupt) return NULL; pchConverted = locale_to_utf8(sz); free(sz); return pchConverted; } #endif /* Not using readline or X. */ if (fInterrupt) return NULL; g_print("%s", szPrompt); fflush(stdout); sz = g_malloc(256); /* FIXME it would be nice to handle longer strings */ clearerr(stdin); pch = fgets(sz, 256, stdin); if (fInterrupt) { g_free(sz); return NULL; } if (!pch) { if (!isatty(STDIN_FILENO)) exit(EXIT_SUCCESS); outputc('\n'); PromptForExit(); } if ((pch = strchr(sz, '\n'))) *pch = 0; if ((pch = strchr(sz, '\r'))) *pch = 0; pchConverted = locale_to_utf8(sz); g_free(sz); return pchConverted; } /* Ask a yes/no question. Interrupting the question is considered a "no" * answer. */ extern int GetInputYN(char *szPrompt) { char *pch; if (nConfirmDefault != -1) { outputf("%s %s\n", szPrompt, nConfirmDefault ? _("yes") : _("no")); return nConfirmDefault; } if (!fInteractive) return TRUE; #if defined(USE_GTK) if (fX) return GTKGetInputYN(szPrompt); #endif if (fInterrupt) return FALSE; while ((pch = GetInput(szPrompt)) != NULL) { switch (*pch) { case 'y': case 'Y': g_free(pch); return TRUE; case 'n': case 'N': g_free(pch); return FALSE; default: g_free(pch); } outputl(_("Please answer `y' or `n'.")); } return FALSE; } extern void CommandSetOutputOutput(char *sz) { SetToggle("output", &foutput_on, sz, _("output will be shown"), _("output will not be shown")); return; } #if GLIB_CHECK_VERSION (2,28,0) static gint64 tvProgress; static int ProgressThrottle(void) { gint64 tv; tv = g_get_monotonic_time(); if (tv - tvProgress >= 100000) { /* sufficient time elapsed; record current time */ tvProgress = tv; return 0; } /* insufficient time elapsed */ return -1; } #else static GTimeVal tvProgress; static int ProgressThrottle(void) { GTimeVal tv, tvDiff; g_get_current_time(&tv); tvDiff.tv_sec = tv.tv_sec - tvProgress.tv_sec; if ((tvDiff.tv_usec = tv.tv_usec + 1000000 - tvProgress.tv_usec) >= 1000000) tvDiff.tv_usec -= 1000000; else tvDiff.tv_sec--; if (tvDiff.tv_sec || tvDiff.tv_usec >= 100000) { /* sufficient time elapsed; record current time */ tvProgress.tv_sec = tv.tv_sec; tvProgress.tv_usec = tv.tv_usec; return 0; } /* insufficient time elapsed */ return -1; } #endif extern void ProgressStart(const char *sz) { if (!fShowProgress) return; fInProgress = TRUE; #if defined(USE_GTK) if (fX) { GTKProgressStart(sz); return; } #endif if (sz) { fputs(sz, stdout); fflush(stdout); } } extern void ProgressStartValue(char *sz, int iMax) { if (!fShowProgress) return; iProgressMax = iMax; iProgressValue = 0; pcProgress = sz; fInProgress = TRUE; #if defined(USE_GTK) if (fX) { GTKProgressStartValue(sz, iMax); return; } #endif if (sz) { fputs(sz, stdout); fflush(stdout); } } extern void ProgressValue(int iValue) { if (!fShowProgress || iProgressValue == iValue) return; iProgressValue = iValue; if (ProgressThrottle()) return; #if defined(USE_GTK) if (fX) { GTKProgressValue(iValue, iProgressMax); return; } #endif outputf("\r%s %d/%d\r", pcProgress, iProgressValue, iProgressMax); fflush(stdout); } extern void ProgressValueAdd(int iValue) { ProgressValue(iProgressValue + iValue); } static gboolean Progress(gpointer UNUSED(unused)) { static int i = 0; static char ach[5] = "/-\\|"; if (!fShowProgress) return FALSE; if (ProgressThrottle()) return TRUE; #if defined(USE_GTK) if (fX) { GTKProgress(); return TRUE; } #endif putchar(ach[i++]); i &= 0x03; putchar('\b'); fflush(stdout); return TRUE; } #if !defined(USE_MULTITHREAD) extern void CallbackProgress(void) { #if defined(USE_GTK) if (fX) { GTKDisallowStdin(); if (fInProgress) GTKSuspendInput(); while (gtk_events_pending()) gtk_main_iteration(); if (fInProgress) GTKResumeInput(); GTKAllowStdin(); } #endif if (fInProgress && !iProgressMax) Progress(NULL); } #endif extern void ProgressEnd(void) { int i; if (!fShowProgress) return; fInProgress = FALSE; iProgressMax = 0; iProgressValue = 0; pcProgress = NULL; #if defined(USE_GTK) if (fX) { GTKProgressEnd(); return; } #endif putchar('\r'); for (i = 0; i < 79; i++) putchar(' '); putchar('\r'); fflush(stdout); } static void move_rc_files(void) { /* Move files to the new location. Remove this part when all users have had * their files moved.*/ char *olddir, *oldfile, *newfile; #ifdef WIN32 olddir = g_strdup(getDataDir()); #else olddir = g_build_filename(szHomeDirectory, "..", NULL); #endif newfile = g_build_filename(szHomeDirectory, "gnubgautorc", NULL); oldfile = g_build_filename(olddir, ".gnubgautorc", NULL); if (g_file_test(oldfile, G_FILE_TEST_IS_REGULAR) && !g_file_test(newfile, G_FILE_TEST_EXISTS)) g_rename(oldfile, newfile); g_free(oldfile); g_free(newfile); newfile = g_build_filename(szHomeDirectory, "gnubgrc", NULL); oldfile = g_build_filename(olddir, ".gnubgrc", NULL); if (g_file_test(oldfile, G_FILE_TEST_IS_REGULAR) && !g_file_test(newfile, G_FILE_TEST_EXISTS)) g_rename(oldfile, newfile); g_free(oldfile); g_free(newfile); g_free(olddir); } /* * Create $HOME/.gnubg if not existing * */ static int CreateGnubgDirectory(void) { char *newfile; if (!g_file_test(szHomeDirectory, G_FILE_TEST_IS_DIR)) { if (g_mkdir(szHomeDirectory, 0700) < 0) { outputerr(szHomeDirectory); return -1; } } newfile = g_build_filename(szHomeDirectory, "gnubgautorc", NULL); if (!g_file_test(newfile, G_FILE_TEST_IS_REGULAR)) move_rc_files(); g_free(newfile); return 0; } extern void HandleInterrupt(int UNUSED(idSignal)) { /* NB: It is safe to write to fInterrupt even if it cannot be read * atomically, because it is only used to hold a binary value. */ fInterrupt = TRUE; } static void BearoffProgress(unsigned int i) { #if defined(USE_GTK) if (fX) { GTKBearoffProgress(i); return; } #endif putchar("\\|/-"[(i / 1000) % 4]); putchar('\r'); fflush(stdout); } static void VersionMessage(void) { g_print("%s\n\n%s\n\n", _(VERSION_STRING), _(aszCOPYRIGHT)); g_print("%s\n", _(intro_string)); } #if defined(HAVE_LIB_READLINE) static char * get_readline(void) { char *pchExpanded; char *szInput; char *sz; char *prompt = locale_from_utf8(FormatPrompt()); while (!(szInput = readline(prompt))) { outputc('\n'); PromptForExit(); } g_free(prompt); sz = locale_to_utf8(szInput); free(szInput); fInterrupt = FALSE; history_expand(sz, &pchExpanded); g_free(sz); if (*pchExpanded) add_history(pchExpanded); return pchExpanded; } #endif static char * get_stdin_line(void) { char sz[2048], *pch; sz[0] = 0; Prompt(); clearerr(stdin); /* FIXME shouldn't restart sys calls on signals during this * fgets */ if (fgets(sz, sizeof(sz), stdin) == NULL) { if (ferror(stdin)) { outputerr("stdin"); exit(EXIT_FAILURE); } else { Shutdown(); exit(EXIT_SUCCESS); } } if ((pch = strchr(sz, '\n'))) *pch = 0; if (feof(stdin)) { if (!isatty(STDIN_FILENO)) { Shutdown(); exit(EXIT_SUCCESS); } outputc('\n'); if (!sz[0]) PromptForExit(); return NULL; } fInterrupt = FALSE; return strdup(sz); } static void run_cl(void) { char *line; for (;;) { #if defined(HAVE_LIB_READLINE) if (fInteractive) { line = get_readline(); HandleCommand(line, acTop); free(line); } else #endif { line = get_stdin_line(); HandleCommand(line, acTop); free(line); } while (fNextTurn) NextTurn(TRUE); ResetInterrupt(); } } static void init_language(char **lang) { char *szFile; FILE *pf; outputoff(); szFile = g_build_filename(szHomeDirectory, "gnubgautorc", NULL); if (!*lang && (pf = g_fopen(szFile, "r"))) { char szTemp[4096]; while (fgets(szTemp, sizeof(szTemp), pf) != NULL) { char *pch; if ((pch = strchr(szTemp, '\n'))) *pch = 0; if ((pch = strchr(szTemp, '\r'))) *pch = 0; if (!strncmp("set lang", szTemp, 8)) { *lang = g_strdup(szTemp + 9); break; } } if (ferror(pf)) outputerr(szFile); fclose(pf); } g_free(szFile); CommandSetLang(*lang); g_free(*lang); outputon(); } static void setup_readline(void) { #if defined(HAVE_LIB_READLINE) char *pch; int i; gnubg_histfile = g_build_filename(szHomeDirectory, "history", NULL); rl_readline_name = "gnubg"; rl_basic_word_break_characters = rl_filename_quote_characters = szCommandSeparators; rl_completer_quote_characters = "\""; /* assume readline 4.2 or later */ rl_completion_entry_function = NullGenerator; rl_attempted_completion_function = CompleteKeyword; /* setup history */ read_history(gnubg_histfile); using_history(); if ((pch = getenv("HISTSIZE")) && ((i = atoi(pch)) > 0)) stifle_history(i); #endif } #if !defined(USE_GTK) static void PushSplash(char *UNUSED(unused), char *UNUSED(heading), char *UNUSED(message)) { } #endif static void init_nets(int fNoBearoff) { char *gnubg_weights = BuildFilename("gnubg.weights"); char *gnubg_weights_binary = BuildFilename("gnubg.wd"); EvalInitialise(gnubg_weights, gnubg_weights_binary, fNoBearoff, fShowProgress ? BearoffProgress : NULL); g_free(gnubg_weights); g_free(gnubg_weights_binary); } extern int GetManualDice(unsigned int anDice[2]) { char *pz; char *sz = NULL; int i; #if defined(USE_GTK) if (fX) { if (GTKGetManualDice(anDice)) { fInterrupt = 1; return -1; } else return 0; } #endif for (;;) { TryAgain: if (fInterrupt) { anDice[0] = anDice[1] = 0; return -1; } sz = GetInput(_("Enter dice: ")); if (fInterrupt) { g_free(sz); anDice[0] = anDice[1] = 0; return -1; } /* parse input and read a couple of dice */ /* any string with two numbers is allowed */ pz = sz; for (i = 0; i < 2; i++) { while (*pz && ((*pz < '1') || (*pz > '6'))) pz++; if (!*pz) { outputl(_("You must enter two numbers between 1 and 6.")); goto TryAgain; } anDice[i] = (int) (*pz - '0'); pz++; } g_free(sz); return 0; } } static void init_rng(void) { if (!(rngctxCurrent = InitRNG(NULL, NULL, TRUE, rngCurrent))) { printf("%s\n", _("Failure setting up RNG")); exit(EXIT_FAILURE); } if (!(rngctxRollout = InitRNG(&rcRollout.nSeed, NULL, TRUE, rcRollout.rngRollout))) { printf("%s\n", _("Failure setting up RNG for rollout.")); exit(EXIT_FAILURE); } /* we don't want rollouts to use the same seed as normal dice (which * could happen if InitRNG had to use the current time as a seed) -- mix * it up a little bit */ rcRollout.nSeed ^= 0x792A584B; } #if defined(WIN32) && defined(HAVE_SOCKETS) static void init_winsock() { short wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(1, 1); if (WSAStartup(wVersionRequested, &wsaData) != 0) { outputerr(_("Windows sockets initialisation error")); } } #endif static char * matchfile_from_argv(char *sz) { char *pchMatch; #ifdef WIN32 gsize br, bw; gchar *utf8fn; if (g_path_is_absolute(sz)) pchMatch = g_strdup_printf("\"%s\"", sz); else { char *tmp = g_build_filename(g_get_current_dir(), sz, NULL); pchMatch = g_strdup_printf("\"%s\"", tmp); g_free(tmp); } utf8fn = g_locale_to_utf8(pchMatch, -1, &br, &bw, NULL); g_free(pchMatch); pchMatch = utf8fn; #else pchMatch = g_strdup_printf("\"%s\"", sz); #endif return pchMatch; } static void init_defaults(void) { /* init some HTML export options */ exsExport.szHTMLPictureURL = g_strdup("html-images/"); exsExport.szHTMLExtension = g_strdup("png"); SetMatchDate(&mi); strcpy(ap[1].szName, g_get_user_name()); strcpy(default_names[1], g_get_user_name()); ListCreate(&lMatch); IniStatcontext(&scMatch); szHomeDirectory = g_build_filename(g_get_home_dir(), ".gnubg", NULL); } static void init_autosave(void) { char *backupdir; backupdir = g_build_filename(szHomeDirectory, "backup", NULL); g_mkdir(backupdir, 0700); g_free(backupdir); } static void null_debug(const gchar * UNUSED(dom), GLogLevelFlags UNUSED(logflags), const gchar * UNUSED(message), gpointer UNUSED(unused)) { } static char *pchPythonScript = NULL; static int fPython = FALSE; static gboolean callback_parse_python_option(const gchar *UNUSED(name), const gchar *value, gpointer UNUSED(data), GError **UNUSED(error)) { if (value) pchPythonScript = g_strdup(value); else pchPythonScript = NULL; fPython = TRUE; return TRUE; } int main(int argc, char *argv[]) { #if defined(USE_GTK) GtkWidget *pwSplash = NULL; #else char *pwSplash = NULL; #endif char *pchMatch = NULL; char *met = NULL; static char *pchCommands = NULL, *lang = NULL; static int fNoBearoff = FALSE, fNoX = FALSE, fSplash = FALSE, fNoTTY = FALSE, show_version = FALSE, debug = FALSE; GOptionEntry ao[] = { {"no-bearoff", 'b', 0, G_OPTION_ARG_NONE, &fNoBearoff, N_("Do not use bearoff database"), NULL}, {"commands", 'c', 0, G_OPTION_ARG_FILENAME, &pchCommands, N_("Evaluate commands in FILE and exit"), "FILE"}, {"lang", 'l', 0, G_OPTION_ARG_STRING, &lang, N_("Set language to LANG"), "LANG"}, {"python", 'p', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, callback_parse_python_option, N_("Start in Python mode or evaluate code in FILE and exit"), "FILE"}, {"quiet", 'q', 0, G_OPTION_ARG_NONE, &fQuiet, N_("Disable sound effects"), NULL}, {"no-rc", 'r', 0, G_OPTION_ARG_NONE, &fNoRC, N_("Do not read .gnubgrc and .gnubgautorc commands"), NULL}, {"splash", 'S', 0, G_OPTION_ARG_NONE, &fSplash, N_("Show gtk splash screen"), NULL}, {"tty", 't', 0, G_OPTION_ARG_NONE, &fNoX, N_("Start the command-line instead of using the graphical interface"), NULL}, {"version", 'v', 0, G_OPTION_ARG_NONE, &show_version, N_("Show version information and exit"), NULL}, {"window-system-only", 'w', 0, G_OPTION_ARG_NONE, &fNoTTY, N_("Ignore tty input when using the graphical interface"), NULL}, {"debug", 'd', 0, G_OPTION_ARG_NONE, &debug, N_("Turn on debug"), NULL}, {"datadir", 'D', 0, G_OPTION_ARG_STRING, &datadir, N_("Specify location of general data"), NULL}, {"pkgdatadir", 'P', 0, G_OPTION_ARG_STRING, &pkg_datadir, N_("Specify location of program specific data"), NULL}, {"docdir", 'O', 0, G_OPTION_ARG_STRING, &docdir, N_("Specify location of program documentation"), NULL}, {"prefsdir", 's', 0, G_OPTION_ARG_STRING, &prefsdir, N_("Specify location of user's preferences directory"), NULL}, {NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL} }; GError *error = NULL; GOptionContext *context; #if ! GLIB_CHECK_VERSION(2,36,0) g_type_init(); #endif #if defined(LIBCURL_PROTOCOL_HTTPS) curl_global_init(CURL_GLOBAL_ALL); #endif default_import_folder = g_strdup("."); default_export_folder = g_strdup("."); default_sgf_folder = g_strdup("."); output_initialize(); init_defaults(); DefaultDBSettings(); /* set language */ #if defined(USE_GTK) gtk_disable_setlocale(); #endif init_language(&lang); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); bind_textdomain_codeset(PACKAGE, GNUBG_CHARSET); g_set_print_handler(print_utf8_to_locale); g_set_printerr_handler(print_utf8_to_locale); /* parse command-line options */ context = g_option_context_new("[file.sgf]"); g_option_context_add_main_entries(context, ao, PACKAGE); #if defined(USE_GTK) g_option_context_add_group(context, gtk_get_option_group(FALSE)); #endif g_option_context_parse(context, &argc, &argv, &error); g_option_context_free(context); if (error) { outputerrf("%s\n", error->message); exit(EXIT_FAILURE); } if (argc > 1 && *argv[1]) pchMatch = matchfile_from_argv(argv[1]); if (!debug) g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, &null_debug, NULL); if (prefsdir) { szHomeDirectory = prefsdir; } #ifdef WIN32 /* data directory: initialise to the path where gnubg is installed */ { const char *szDataDirectory = getDataDir(); _chdir(szDataDirectory); } /* Create a mutex so install can check if it's running */ CreateMutex(NULL, FALSE, "GNU Backgammon Mutex"); #endif /* print version and exit if -v option given */ /* FIXME? rc files not read yet, lang is still the default */ VersionMessage(); if (show_version) exit(EXIT_SUCCESS); if (CreateGnubgDirectory()) exit(EXIT_FAILURE); init_autosave(); RenderInitialise(); #ifdef WIN32 fNoTTY = TRUE; #endif #if defined(USE_GTK) /* -t option not given */ if (!fNoX) InitGTK(&argc, &argv); if (fX) { fTTY = !fNoTTY && isatty(STDIN_FILENO) && isatty(STDOUT_FILENO); fInteractive = fShowProgress = TRUE; if (fSplash) pwSplash = CreateSplash(); } else #endif { fInteractive = isatty(STDIN_FILENO); fShowProgress = isatty(STDOUT_FILENO); } if (fInteractive) { PortableSignal(SIGINT, HandleInterrupt, &shInterruptOld, FALSE); setup_readline(); } PushSplash(pwSplash, _("Initialising"), _("Random number generator")); init_rng(); PushSplash(pwSplash, _("Initialising"), _("match equity table")); met = BuildFilename2("met", "Kazaross-XG2.xml"); InitMatchEquity(met); g_free(met); PushSplash(pwSplash, _("Initialising"), _("neural nets")); init_nets(fNoBearoff); PushSplash(pwSplash, _("Initialising"), _("initialising thread data")); glib_ext_init(); MT_InitThreads(); #if defined(WIN32) && defined(HAVE_SOCKETS) PushSplash(pwSplash, _("Initialising"), _("Windows sockets")); init_winsock(); #endif #if defined(USE_PYTHON) PushSplash(pwSplash, _("Initialising"), "Python"); PythonInitialise(argv[0]); #endif SetExitSoundOff(); /* -r option given */ if (!fNoRC) { PushSplash(pwSplash, _("Loading"), _("User Settings")); LoadRCFiles(); } strcpy(ap[0].szName, default_names[0]); strcpy(ap[1].szName, default_names[1]); fflush(stdout); fflush(stderr); #if defined(USE_MULTITHREAD) /* Make sure threads started */ MT_StartThreads(); #endif /* start-up sound */ playSound(SOUND_START); #if defined(USE_GTK) if (fX) { if (!fTTY) { g_set_print_handler(>KOutput); g_set_printerr_handler(>KOutputErr); } RunGTK(pwSplash, pchCommands, pchPythonScript, pchMatch); Shutdown(); exit(EXIT_SUCCESS); } #endif if (pchMatch) CommandImportAuto(pchMatch); /* -c option given */ if (pchCommands) { fInteractive = FALSE; CommandLoadCommands(pchCommands); Shutdown(); exit(EXIT_SUCCESS); } /* -p option given */ if (fPython) { #if defined(USE_PYTHON) if (pchPythonScript) { fInteractive = FALSE; LoadPythonFile(pchPythonScript, FALSE); Shutdown(); exit(EXIT_SUCCESS); } else { PythonRun(NULL); exit(EXIT_SUCCESS); } #else outputerrf(_("GNU Backgammon build without Python.")); exit(EXIT_FAILURE); #endif } run_cl(); return (EXIT_FAILURE); } /* * Command: convert normalised money equity to match winning chance. * * The result is written to stdout. * FIXME: implement GTK version. * FIXME: allow more parameters (match score, match length) * * Input: * sz: string with equity * * Output: * none. * */ extern void CommandEq2MWC(char *sz) { float rEq; cubeinfo ci; if (!ms.nMatchTo) { outputl(_("Command only valid in match play")); return; } rEq = ParseReal(&sz); if (rEq == ERR_VAL) rEq = 0.0; GetMatchStateCubeInfo(&ci, &ms); outputf("%s = %+6.3f: %6.2f%%\n", _("MWC for equity"), -1.0, 100.0f * eq2mwc(-1.0, &ci)); outputf("%s = %+6.3f: %6.2f%%\n", _("MWC for equity"), +1.0, 100.0f * eq2mwc(+1.0, &ci)); outputf("%s:\n", _("By linear interpolation")); outputf("%s = %+6.3f: %6.2f%%\n", _("MWC for equity"), rEq, 100.0f * eq2mwc(rEq, &ci)); } /* * Command: convert match winning chance to normalised money equity. * * The result is written to stdout. * FIXME: implement GTK version. * FIXME: allow more parameters (match score, match length) * * Input: * sz: string with match winning chance * * Output: * none. * */ extern void CommandMWC2Eq(char *sz) { float rMwc; cubeinfo ci; if (!ms.nMatchTo) { outputl(_("Command only valid in match play")); return; } GetMatchStateCubeInfo(&ci, &ms); rMwc = ParseReal(&sz); if (rMwc == ERR_VAL) rMwc = eq2mwc(0.0, &ci); if (rMwc > 1.0f) rMwc /= 100.0f; outputf("%s = %6.2f%%: %+6.3f\n", _("Equity for MWC"), 100.0f * eq2mwc(-1.0, &ci), -1.0); outputf("%s = %6.2f%%: %+6.3f\n", _("Equity for MWC"), 100.0f * eq2mwc(+1.0, &ci), +1.0); outputf("%s:\n", _("By linear interpolation")); outputf("%s = %6.2f%%: %+6.3f\n", _("Equity for MWC"), 100.0f * rMwc, mwc2eq(rMwc, &ci)); } static void swapGame(listOLD * plGame) { listOLD *pl; moverecord *pmr; int n; TanBoard anBoard; for (pl = plGame->plNext; pl != plGame; pl = pl->plNext) { pmr = pl->p; switch (pmr->mt) { case MOVE_GAMEINFO: /* swap score */ n = pmr->g.anScore[0]; pmr->g.anScore[0] = pmr->g.anScore[1]; pmr->g.anScore[1] = n; /* swap winner */ if (pmr->g.fWinner > -1) pmr->g.fWinner = !pmr->g.fWinner; /* swap statcontext */ /* recalculate statcontext later ... */ break; case MOVE_DOUBLE: case MOVE_TAKE: case MOVE_DROP: case MOVE_NORMAL: case MOVE_RESIGN: case MOVE_SETDICE: case MOVE_SETCUBEVAL: pmr->fPlayer = !pmr->fPlayer; break; case MOVE_SETBOARD: PositionFromKey(anBoard, &pmr->sb.key); SwapSides(anBoard); PositionKey((ConstTanBoard) anBoard, &pmr->sb.key); pmr->fPlayer = !pmr->fPlayer; break; case MOVE_SETCUBEPOS: if (pmr->scp.fCubeOwner > -1) pmr->scp.fCubeOwner = !pmr->scp.fCubeOwner; pmr->fPlayer = !pmr->fPlayer; break; } } } extern void DisplayKeyNames(void) { for(int i=0;i < keyNamesFirstEmpty; i++) { g_message("in DisplayKeyNames: %d->%s", i,keyNames[i]); } } static int NameIsKey (const char sz[]) { for(int i=0;i < keyNamesFirstEmpty; i++) { if (!strcmp(sz, keyNames[i])) { // g_message("NameIsKey: EXISTS! %s=%s at i=%d", sz,keyNames[i],i); return 1; } } return 0; } /* delete a key name from the keyNames array */ extern int DeleteKeyName(const char sz[]) { // g_message("in DeleteKeyName: %s, length=%zu", sz, strlen(sz)); for(int i=0;i < keyNamesFirstEmpty; i++) { if (!strcmp(sz, keyNames[i])) { // g_message("EXISTS! %s=%s, i=%d, keyNamesFirstEmpty=%d", sz,keyNames[i],i,keyNamesFirstEmpty); if (keyNamesFirstEmpty==(i+1)) { keyNamesFirstEmpty--; UserCommand("save settings"); return 1; } else { strcpy(keyNames[i],keyNames[keyNamesFirstEmpty-1]); keyNamesFirstEmpty--; // DisplayKeyNames(); UserCommand("save settings"); return 1; } } } return 0; } /* add a new key name to the keyNames array return 1 if success, 0 if problem */ extern int AddKeyName(const char sz[]) { // g_message("in AddKeyName: %s, length=%zu", sz, strlen(sz)); /* check that the name doesn't contain "\t", "\n" */ if (strstr(sz, "\t") != NULL || strstr(sz, "\n") != NULL) { // for(unsigned int j=0;j < strlen(sz); j++) { // g_message("%c", sz[j]); // } outputerrf(_("Player name contains unallowed character")); return 0; } /* check that the name is not too long*/ if(strlen(sz) > MAX_NAME_LEN) { outputerrf(_("Player name is too long")); return 0; } /* check that the keyNames array is not full */ if (keyNamesFirstEmptyplNext) { swapGame(pl->p); } /* swap player names */ pc = g_strdup(ap[0].szName); strcpy(ap[0].szName, ap[1].szName); strcpy(ap[1].szName, pc); g_free(pc); /* swap player ratings */ pc = mi.pchRating[0]; mi.pchRating[0] = mi.pchRating[1]; mi.pchRating[1] = pc; /* swap current matchstate */ if (ms.fTurn > -1) ms.fTurn = !ms.fTurn; if (ms.fMove > -1) ms.fMove = !ms.fMove; if (ms.fCubeOwner > -1) ms.fCubeOwner = !ms.fCubeOwner; n = ms.anScore[0]; ms.anScore[1] = ms.anScore[0]; ms.anScore[0] = n; SwapSides(ms.anBoard); #if defined(USE_GTK) if (fX) { fJustSwappedPlayers = TRUE; GTKSet(ap); /* GTKSet(ap) already does this. This just adds flicker. * GTKRegenerateGames(); */ } #endif ChangeGame(NULL); ShowBoard(); } /* The following function looks at a list of priority players, and makes sure to set the priority player as player 1, i.e. the player that moves towards the bottom of the screen. */ extern void SmartSit(void) { // g_message("O: %s", ap[0].szName); // g_message("X: %s", ap[1].szName); if (NameIsKey(ap[0].szName) && !NameIsKey(ap[1].szName)) { fWithinSmartSit=TRUE; CommandSwapPlayers(NULL); fWithinSmartSit=FALSE; } // g_message("O: %s", ap[0].szName); // g_message("X: %s", ap[1].szName); } extern int confirmOverwrite(const char *sz, const int f) { /* check for existing file */ if (f && !access(sz, F_OK)) { gchar *szp; int i; szp = g_strdup_printf(_("File \"%s\" exists. Overwrite? "), sz); i = GetInputYN(szp); g_free(szp); return i; } else return TRUE; } extern void setDefaultFileName(char *path) { g_free(szCurrentFolder); g_free(szCurrentFileName); DisectPath(path, NULL, &szCurrentFileName, &szCurrentFolder); #if defined(USE_GTK) if (fX) { gchar *title = g_strdup_printf("%s (%s)", _("GNU Backgammon"), szCurrentFileName); gtk_window_set_title(GTK_WINDOW(pwMain), title); g_free(title); } #endif } extern void DisectPath(const char *path, const char *extension, char **name, char **folder) { char *fnn, *pc; if (!path) { *folder = NULL; *name = NULL; return; } *folder = g_path_get_dirname(path); fnn = g_path_get_basename(path); pc = strrchr(fnn, '.'); if (pc) *pc = '\0'; *name = g_strconcat(fnn, extension, NULL); g_free(fnn); } /* ask for confirmation if this is a sub-optimal play * returns TRUE if player wants to re-think the move */ static int GetAdviceAnswer(char *sz) { char *pch; #if defined(USE_GTK) if (fX) return GtkTutor(sz); #endif if (fInterrupt) return FALSE; while ((pch = GetInput(sz)) != NULL) { switch (*pch) { case 'y': case 'Y': free(pch); return TRUE; case 'n': case 'N': free(pch); return FALSE; default: free(pch); } outputl(_("Please answer `y' or `n'.")); } return FALSE; } extern int GiveAdvice(skilltype Skill) { char *sz; /* should never happen */ if (!fTutor) return FALSE; switch (Skill) { case SKILL_VERYBAD: sz = _("You may be about to make a very bad play"); break; case SKILL_BAD: sz = _("You may be about to make a bad play"); break; case SKILL_DOUBTFUL: sz = _("You may be about to make a doubtful play"); break; default: return (TRUE); } if (Skill > TutorSkill) return (TRUE); { int ret; char *buf = g_strdup_printf("%s. %s", sz, _("Are you sure?")); ret = GetAdviceAnswer(buf); g_free(buf); return ret; } } extern void TextToClipboard(const char *sz) { #if defined(USE_GTK) if (fX) GTKTextToClipboard(sz); #else /* no clipboard: just write string */ outputl(sz); #endif } void CommandDiceRolls(char *sz) { char *pch; if ((pch = NextToken(&sz))) { int n = ParseNumber(&pch); while (n-- > 0) { unsigned int anDice[2]; RollDice(anDice, &rngCurrent, rngctxCurrent); printf("%u %u\n", anDice[0], anDice[1]); } } } #if defined(HAVE_LIB_READLINE) extern void CommandHistory(char *UNUSED(sz)) { int i; for (i = 0; i < history_length; ++i) { HIST_ENTRY *phe = history_get(i + history_base); outputf("%6d %s\n", i + history_base, phe->line); } } #endif /* HAVE_LIB_READLINE */ extern void CommandClearHint(char *UNUSED(sz)) { pmr_hint_destroy(); outputl(_("Analysis used for `hint' has been cleared")); } /* * Description: Calculate Effective Pip Counts (EPC), either * by lookup in one-sided databases or by doing a * one-sided rollout. * Parameters : * Input anBoard (the board) * fOnlyRace: only calculate EPCs for race positions * Output arEPC (the calculate EPCs) * pfSource (source of EPC; 0 = database, 1 = OSR) * * Returns: 0 on success, non-zero otherwise * */ extern int EPC(const TanBoard anBoard, float *arEPC, float *arMu, float *arSigma, int *pfSource, const int fOnlyBearoff) { const float x = (2 * 3 + 3 * 4 + 4 * 5 + 4 * 6 + 6 * 7 + 5 * 8 + 4 * 9 + 2 * 10 + 2 * 11 + 1 * 12 + 1 * 16 + 1 * 20 + 1 * 24) / 36.0f; if (isBearoff(pbc1, anBoard)) { /* one sided in-memory database */ float ar[4]; int i; for (i = 0; i < 2; ++i) { unsigned int n = PositionBearoff(anBoard[i], pbc1->nPoints, pbc1->nChequers); if (BearoffDist(pbc1, n, NULL, NULL, ar, NULL, NULL)) return -1; if (arEPC) arEPC[i] = x * ar[0]; if (arMu) arMu[i] = ar[0]; if (arSigma) arSigma[i] = ar[1]; } if (pfSource) *pfSource = 0; return 0; } else if (isBearoff(pbcOS, anBoard)) { /* one sided in-memory database */ float ar[4]; int i; for (i = 0; i < 2; ++i) { unsigned int n = PositionBearoff(anBoard[i], pbcOS->nPoints, pbcOS->nChequers); if (BearoffDist(pbcOS, n, NULL, NULL, ar, NULL, NULL)) return -1; if (arEPC) arEPC[i] = x * ar[0]; if (arMu) arMu[i] = ar[0]; if (arSigma) arSigma[i] = ar[1]; } if (pfSource) *pfSource = 0; return 0; } else if (!fOnlyBearoff) { /* one-sided rollout */ int nTrials = 5760; float arMux[2]; float ar[5]; int i; raceProbs(anBoard, nTrials, ar, arMux); for (i = 0; i < 2; ++i) { if (arEPC) arEPC[i] = x * arMux[i]; if (arMu) arMu[i] = arMux[i]; if (arSigma) arSigma[i] = -1.0f; /* raceProbs cannot calculate sigma! */ } if (pfSource) *pfSource = 1; return 0; } /* code not reachable */ return -1; } #ifdef WIN32 /* WIN32 setlocale must be manipulated through putenv to be gettext compatible */ char * SetupLanguage(const char *newLangCode) { static char *org_lang = NULL; char *lang; if (!org_lang) org_lang = g_win32_getlocale(); if (!newLangCode || !strcmp(newLangCode, "system") || !strcmp(newLangCode, "")) lang = g_strdup_printf("LANG=%s", org_lang); else lang = g_strdup_printf("LANG=%s", newLangCode); putenv(lang); g_free(lang); return (setlocale(LC_ALL, "")); } #else char * SetupLanguage(const char *newLangCode) { static char *org_lang = NULL; char *result = NULL; if (!org_lang) { org_lang = g_strdup(setlocale(LC_ALL, "")); if (!org_lang) { outputerrf(_("Locale in your environment not supported by " "C library. Falling back to C locale.\n")); org_lang = g_strdup("C"); } } if (newLangCode && *newLangCode && strcmp(newLangCode, "system") != 0) { g_setenv("LC_ALL", newLangCode, TRUE); result = setlocale(LC_ALL, newLangCode); return (result); } g_setenv("LC_ALL", org_lang, TRUE); result = setlocale(LC_ALL, org_lang); return (result); } #endif void asyncFindBestMoves(findData * pfd) { if (FindnSaveBestMoves(pfd->pml, pfd->anDice[0], pfd->anDice[1], pfd->pboard, pfd->keyMove, pfd->rThr, pfd->pci, pfd->pec, pfd->aamf) < 0) MT_SetResultFailed(); RefreshMoveList(pfd->pml, NULL); } void asyncFindMove(findData * pfd) { if (FindnSaveBestMoves(pfd->pml, ms.anDice[0], ms.anDice[1], pfd->pboard, pfd->keyMove, pfd->rThr, pfd->pci, pfd->pec, pfd->aamf) < 0) MT_SetResultFailed(); } void asyncDumpDecision(decisionData * pdd) { if (DumpPosition(pdd->pboard, pdd->szOutput, pdd->pec, pdd->pci, fOutputMWC, fOutputWinPC, pdd->n, MatchIDFromMatchState(&ms)) != 0) MT_SetResultFailed(); } void asyncScoreMove(scoreData * psd) { if (ScoreMove(NULL, psd->pm, psd->pci, psd->pec, psd->pec->nPlies) < 0) MT_SetResultFailed(); } void asyncEvalRoll(decisionData * pdd) { EvaluateRoll(pdd->aarOutput[0], ms.anDice[0], ms.anDice[1], pdd->pboard, pdd->pci, pdd->pec); } void asyncAnalyzeMove(moveData * pmd) { if (AnalyzeMove(pmd->pmr, pmd->pms, plGame, NULL, pmd->pesChequer, pmd->pesCube, pmd->aamf, NULL, NULL) < 0) MT_SetResultFailed(); } void asyncGammonRates(decisionData * pdd) { if (getCurrentGammonRates(pdd->aarRates, pdd->aarOutput[0], pdd->pboard, pdd->pci, pdd->pec) < 0) MT_SetResultFailed(); } void asyncMoveDecisionE(decisionData * pdd) { if (GeneralEvaluationE(pdd->aarOutput[0], pdd->pboard, pdd->pci, pdd->pec) < 0) MT_SetResultFailed(); } void asyncCubeDecisionE(decisionData * pdd) { if (GeneralCubeDecisionE(pdd->aarOutput, pdd->pboard, pdd->pci, pdd->pec, pdd->pes) < 0) MT_SetResultFailed(); } void asyncCubeDecision(decisionData * pdd) { if (GeneralCubeDecision(pdd->aarOutput, pdd->aarStdDev, pdd->aarsStatistics, pdd->pboard, pdd->pci, pdd->pes, NULL, NULL) < 0) MT_SetResultFailed(); } extern int RunAsyncProcess(AsyncFun fun, void *data, const char *msg) { int ret; #if defined(USE_MULTITHREAD) Task *pt = (Task *) g_malloc(sizeof(Task)); pt->pLinkedTask = NULL; pt->fun = fun; pt->data = data; MT_AddTask(pt, TRUE); #endif ProgressStart(msg); #if defined(USE_MULTITHREAD) ret = MT_WaitForTasks(Progress, 100, FALSE); #else asyncRet = 0; fun(data); /* Just call function in single threaded build */ ret = asyncRet; #endif ProgressEnd(); return ret; } extern void ProcessEvents(void) { #if defined(USE_GTK) if (fX) { while (gtk_events_pending()) gtk_main_iteration(); } else #endif { while (g_main_context_pending(NULL)) g_main_context_iteration(NULL, TRUE); } } extern int CheckGameExists(void) { if (plGame) { return TRUE; } else { outputl(_("No game in progress.")); return FALSE; } } extern gboolean save_autosave(gpointer UNUSED(unused)) { int fd; FILE *pf; listOLD *pl; g_return_val_if_fail(plGame, FALSE); MT_Exclusive(); if (autosave) g_unlink(autosave); autosave = g_build_filename(szHomeDirectory, "backup", "XXXXXX.sgf", NULL); fd = g_mkstemp(autosave); if (fd < 0) { g_free(autosave); autosave = NULL; MT_Release(); return FALSE; } close(fd); g_unlink(autosave); pf = g_fopen(autosave, "w"); if (!pf) { autosave = NULL; MT_Release(); return FALSE; } for (pl = lMatch.plNext; pl != &lMatch; pl = pl->plNext) SaveGame(pf, pl->p); fclose(pf); MT_Release(); return TRUE; } extern void delete_autosave(void) { if (autosave) { g_unlink(autosave); g_free(autosave); autosave = NULL; } } extern int get_input_discard(void) { if (fInterrupt) return FALSE; if (autosave && fAutoSaveConfirmDelete) { if (!GetInputYN(_("Are you sure you want to discard the current match and your existing autosave? "))) return FALSE; g_unlink(autosave); g_free(autosave); autosave = NULL; return TRUE; } if (ms.gs == GAME_PLAYING && fConfirmNew) return GetInputYN(_("Are you sure you want to discard the current match? ")); return TRUE; } gnubg-1.08.003/external_y.y000644 001751 000024 00000042500 14574155047 015201 0ustar00pmstaff000000 000000 %{ /* * Copyright (C) 2014-2015 Michael Petch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: external_y.y,v 1.36 2020/02/20 21:19:52 plm Exp $ */ #ifndef EXTERNAL_Y_H #define EXTERNAL_Y_H #define MERGE_(a,b) a##b #define LABEL_(a,b) MERGE_(a, b) #define YY_PREFIX(variable) MERGE_(ext_,variable) #define yymaxdepth YY_PREFIX(maxdepth) #define yyparse YY_PREFIX(parse) #define yylex YY_PREFIX(lex) #define yyerror YY_PREFIX(error) #define yylval YY_PREFIX(lval) #define yychar YY_PREFIX(char) #define yydebug YY_PREFIX(debug) #define yypact YY_PREFIX(pact) #define yyr1 YY_PREFIX(r1) #define yyr2 YY_PREFIX(r2) #define yydef YY_PREFIX(def) #define yychk YY_PREFIX(chk) #define yypgo YY_PREFIX(pgo) #define yyact YY_PREFIX(act) #define yyexca YY_PREFIX(exca) #define yyerrflag YY_PREFIX(errflag) #define yynerrs YY_PREFIX(nerrs) #define yyps YY_PREFIX(ps) #define yypv YY_PREFIX(pv) #define yys YY_PREFIX(s) #define yy_yys YY_PREFIX(yys) #define yystate YY_PREFIX(state) #define yytmp YY_PREFIX(tmp) #define yyv YY_PREFIX(v) #define yy_yyv YY_PREFIX(yyv) #define yyval YY_PREFIX(val) #define yylloc YY_PREFIX(lloc) #define yyreds YY_PREFIX(reds) #define yytoks YY_PREFIX(toks) #define yylhs YY_PREFIX(yylhs) #define yylen YY_PREFIX(yylen) #define yydefred YY_PREFIX(yydefred) #define yydgoto YY_PREFIX(yydgoto) #define yysindex YY_PREFIX(yysindex) #define yyrindex YY_PREFIX(yyrindex) #define yygindex YY_PREFIX(yygindex) #define yytable YY_PREFIX(yytable) #define yycheck YY_PREFIX(yycheck) #define yyname YY_PREFIX(yyname) #define yyrule YY_PREFIX(yyrule) #include #include #include #include "common.h" #include "glib-ext.h" #include "external.h" #include "backgammon.h" #include "external_y.h" /* Resolve a warning on older GLIBC/GNU systems that have stpcpy */ #if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE && !defined(__USE_XOPEN2K8) extern char *stpcpy(char *s1, const char *s2); #endif #define extcmd ext_get_extra(scanner) int YY_PREFIX(get_column) (void * yyscanner ); void YY_PREFIX(set_column) (int column_no, void * yyscanner ); extern int YY_PREFIX(lex) (YYSTYPE * yylval_param, scancontext *scanner); extern scancontext *YY_PREFIX(get_extra) (void *yyscanner ); extern void StartParse(void *scancontext); extern void yyerror(scancontext *scanner, const char *str); void yyerror(scancontext *scanner, const char *str) { if (extcmd->ExtErrorHandler) extcmd->ExtErrorHandler(extcmd, str); else fprintf(stderr,"Error: %s\n",str); } #endif %} %define api.pure %file-prefix "y" %lex-param {void *scanner} %parse-param {scancontext *scanner} %defines %error-verbose %token-table %union { gboolean boolean; gchar character; gfloat floatnum; gint intnum; GString *str; GValue *gv; GList *list; commandinfo *cmd; } %{ %} %token EOL EXIT DISABLED INTERFACEVERSION %token DEBUG SET NEW OLD OUTPUT E_INTERFACE HELP PROMPT %token E_STRING E_CHARACTER E_INTEGER E_FLOAT E_BOOLEAN %token FIBSBOARD FIBSBOARDEND EVALUATION %token CRAWFORDRULE JACOBYRULE RESIGNATION BEAVERS %token CUBE CUBEFUL CUBELESS DETERMINISTIC NOISE PLIES PRUNE %type E_BOOLEAN %type E_STRING %type E_CHARACTER %type E_INTEGER %type E_FLOAT %type float_type %type integer_type %type string_type %type boolean_type %type basic_types %type list_type %type list_element %type board_element %type list %type list_elements %type board %type board_elements %type evaloptions %type evaloption %type sessionoption %type sessionoptions %type setcommand %type evalcommand %type boardcommand %type command %destructor { if ($$) g_string_free($$, TRUE); } %destructor { if ($$) g_list_free($$); } %destructor { if ($$) { g_value_unsetfree($$); }} %destructor { if ($$) { g_free($$); }} %% commands: EOL { extcmd->ct = COMMAND_NONE; YYACCEPT; } | SET setcommand EOL { extcmd->pCmdData = $2; extcmd->ct = COMMAND_SET; YYACCEPT; } | INTERFACEVERSION EOL { extcmd->ct = COMMAND_VERSION; YYACCEPT; } | HELP EOL { extcmd->ct = COMMAND_HELP; YYACCEPT; } | EXIT EOL { extcmd->ct = COMMAND_EXIT; YYACCEPT; } | command EOL { if ($1->cmdType == COMMAND_LIST) { g_value_unsetfree($1->pvData); extcmd->ct = $1->cmdType; YYACCEPT; } else { GMap *optionsmap = (GMap *)g_value_get_boxed((GValue *)g_list_nth_data(g_value_get_boxed($1->pvData), 1)); GList *boarddata = (GList *)g_value_get_boxed((GValue *)g_list_nth_data(g_value_get_boxed($1->pvData), 0)); extcmd->ct = $1->cmdType; extcmd->pCmdData = $1->pvData; if (g_list_length(boarddata) < MAX_RFBF_ELEMENTS) { GVALUE_CREATE(G_TYPE_INT, int, 0, gvfalse); GVALUE_CREATE(G_TYPE_INT, int, 1, gvtrue); GVALUE_CREATE(G_TYPE_FLOAT, float, 0.0, gvfloatzero); extcmd->bi.gsName = g_string_new(g_value_get_gstring_gchar(boarddata->data)); extcmd->bi.gsOpp = g_string_new(g_value_get_gstring_gchar(g_list_nth_data(boarddata, 1))); GList *curbrdpos = g_list_nth(boarddata, 2); int *curarraypos = extcmd->anList; while (curbrdpos != NULL) { *curarraypos++ = g_value_get_int(curbrdpos->data); curbrdpos = g_list_next(curbrdpos); } extcmd->nPlies = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_PLIES, gvfalse)); extcmd->fCrawfordRule = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_CRAWFORDRULE, gvfalse)); extcmd->fJacobyRule = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_JACOBYRULE, gvfalse)); extcmd->fUsePrune = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_PRUNE, gvfalse)); extcmd->fCubeful = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_CUBEFUL, gvfalse)); extcmd->rNoise = g_value_get_float(str2gv_map_get_key_value(optionsmap, KEY_STR_NOISE, gvfloatzero)); extcmd->fDeterministic = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_DETERMINISTIC, gvtrue)); extcmd->nResignation = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_RESIGNATION, gvfalse)); extcmd->fBeavers = g_value_get_int(str2gv_map_get_key_value(optionsmap, KEY_STR_BEAVERS, gvtrue)); g_value_unsetfree(gvtrue); g_value_unsetfree(gvfalse); g_value_unsetfree(gvfloatzero); g_free($1); YYACCEPT; } else { yyerror(scanner, "Invalid board. Maximum number of elements is 52"); g_value_unsetfree($1->pvData); g_free($1); YYERROR; } } } ; setcommand: DEBUG boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_DEBUG, $2); } | E_INTERFACE NEW { GVALUE_CREATE(G_TYPE_INT, int, 1, gvint); $$ = create_str2gvalue_tuple (KEY_STR_NEWINTERFACE, gvint); } | E_INTERFACE OLD { GVALUE_CREATE(G_TYPE_INT, int, 0, gvint); $$ = create_str2gvalue_tuple (KEY_STR_NEWINTERFACE, gvint); } | PROMPT string_type { $$ = create_str2gvalue_tuple (KEY_STR_PROMPT, $2); } ; command: boardcommand { commandinfo *cmdInfo = g_malloc0(sizeof(commandinfo)); cmdInfo->pvData = $1; cmdInfo->cmdType = COMMAND_FIBSBOARD; $$ = cmdInfo; } | evalcommand { commandinfo *cmdInfo = g_malloc0(sizeof(commandinfo)); cmdInfo->pvData = $1; cmdInfo->cmdType = COMMAND_EVALUATION; $$ = cmdInfo; } | DISABLED list { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, $2, gvptr); g_list_free($2); commandinfo *cmdInfo = g_malloc0(sizeof(commandinfo)); cmdInfo->pvData = gvptr; cmdInfo->cmdType = COMMAND_LIST; $$ = cmdInfo; } ; board_element: integer_type ; board_elements: board_element { $$ = g_list_prepend(NULL, $1); } | board_elements ':' board_element { $$ = g_list_prepend($1, $3); } ; endboard: FIBSBOARDEND ; sessionoption: JACOBYRULE boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_JACOBYRULE, $2); } | CRAWFORDRULE boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_CRAWFORDRULE, $2); } | RESIGNATION integer_type { $$ = create_str2gvalue_tuple (KEY_STR_RESIGNATION, $2); } | BEAVERS boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_BEAVERS, $2); } ; evaloption: PLIES integer_type { $$ = create_str2gvalue_tuple (KEY_STR_PLIES, $2); } | NOISE float_type { $$ = create_str2gvalue_tuple (KEY_STR_NOISE, $2); } | NOISE integer_type { float floatval = (float) g_value_get_int($2) / 10000.0f; GVALUE_CREATE(G_TYPE_FLOAT, float, floatval, gvfloat); $$ = create_str2gvalue_tuple (KEY_STR_NOISE, gvfloat); g_value_unsetfree($2); } | PRUNE { $$ = create_str2int_tuple (KEY_STR_PRUNE, TRUE); } | PRUNE boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_PRUNE, $2); } | DETERMINISTIC { $$ = create_str2int_tuple (KEY_STR_DETERMINISTIC, TRUE); } | DETERMINISTIC boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_DETERMINISTIC, $2); } | CUBE boolean_type { $$ = create_str2gvalue_tuple (KEY_STR_CUBEFUL, $2); } | CUBEFUL { $$ = create_str2int_tuple (KEY_STR_CUBEFUL, TRUE); } | CUBELESS { $$ = create_str2int_tuple (KEY_STR_CUBEFUL, FALSE); } ; sessionoptions: /* Empty */ { /* Setup the defaults */ STR2GV_MAPENTRY_CREATE(KEY_STR_JACOBYRULE, fJacoby, G_TYPE_INT, int, jacobyentry); STR2GV_MAPENTRY_CREATE(KEY_STR_CRAWFORDRULE, TRUE, G_TYPE_INT, int, crawfordentry); STR2GV_MAPENTRY_CREATE(KEY_STR_RESIGNATION, FALSE, G_TYPE_INT, int, resignentry); STR2GV_MAPENTRY_CREATE(KEY_STR_BEAVERS, TRUE, G_TYPE_INT, int, beaversentry); GList *defaults = g_list_prepend(g_list_prepend(g_list_prepend(g_list_prepend(NULL, jacobyentry), crawfordentry), \ resignentry), beaversentry); $$ = defaults; } | sessionoptions sessionoption { STR2GV_MAP_ADD_ENTRY($1, $2, $$); } ; evaloptions: /* Empty */ { /* Setup the defaults */ STR2GV_MAPENTRY_CREATE(KEY_STR_JACOBYRULE, fJacoby, G_TYPE_INT, int, jacobyentry); STR2GV_MAPENTRY_CREATE(KEY_STR_CRAWFORDRULE, TRUE, G_TYPE_INT, int, crawfordentry); STR2GV_MAPENTRY_CREATE(KEY_STR_RESIGNATION, FALSE, G_TYPE_INT, int, resignentry); STR2GV_MAPENTRY_CREATE(KEY_STR_BEAVERS, TRUE, G_TYPE_INT, int, beaversentry); GList *defaults = g_list_prepend(g_list_prepend(g_list_prepend(g_list_prepend(NULL, jacobyentry), crawfordentry), \ resignentry), beaversentry); $$ = defaults; } | evaloptions evaloption { STR2GV_MAP_ADD_ENTRY($1, $2, $$); } | evaloptions sessionoption { STR2GV_MAP_ADD_ENTRY($1, $2, $$); } ; boardcommand: board sessionoptions { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, $1, gvptr1); GVALUE_CREATE(G_TYPE_BOXED_MAP_GV, boxed, $2, gvptr2); GList *newList = g_list_prepend(g_list_prepend(NULL, gvptr2), gvptr1); GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, newList, gvnewlist); $$ = gvnewlist; g_list_free(newList); g_list_free($1); g_list_free($2); } ; evalcommand: EVALUATION FIBSBOARD board evaloptions { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, $3, gvptr1); GVALUE_CREATE(G_TYPE_BOXED_MAP_GV, boxed, $4, gvptr2); GList *newList = g_list_prepend(g_list_prepend(NULL, gvptr2), gvptr1); GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, newList, gvnewlist); $$ = gvnewlist; g_list_free(newList); g_list_free($3); g_list_free($4); } ; board: FIBSBOARD E_STRING ':' E_STRING ':' board_elements endboard { GVALUE_CREATE(G_TYPE_GSTRING, boxed, $4, gvstr1); GVALUE_CREATE(G_TYPE_GSTRING, boxed, $2, gvstr2); $6 = g_list_reverse($6); $$ = g_list_prepend(g_list_prepend($6, gvstr1), gvstr2); g_string_free($4, TRUE); g_string_free($2, TRUE); } ; float_type: E_FLOAT { GVALUE_CREATE(G_TYPE_FLOAT, float, $1, gvfloat); $$ = gvfloat; } ; string_type: E_STRING { GVALUE_CREATE(G_TYPE_GSTRING, boxed, $1, gvstr); g_string_free ($1, TRUE); $$ = gvstr; } ; integer_type: E_INTEGER { GVALUE_CREATE(G_TYPE_INT, int, $1, gvint); $$ = gvint; } ; boolean_type: E_BOOLEAN { GVALUE_CREATE(G_TYPE_INT, int, $1, gvint); $$ = gvint; } ; list_type: list { GVALUE_CREATE(G_TYPE_BOXED_GLIST_GV, boxed, $1, gvptr); g_list_free($1); $$ = gvptr; } ; basic_types: boolean_type | string_type | float_type | integer_type ; list: '(' list_elements ')' { $$ = g_list_reverse($2); } ; list_element: basic_types | list_type ; list_elements: /* Empty */ { $$ = NULL; } | list_element { $$ = g_list_prepend(NULL, $1); } | list_elements ',' list_element { $$ = g_list_prepend($1, $3); } ; %% #ifdef EXTERNAL_TEST /* * Test code can be built by configuring GNUbg with --without-gtk option and doing the following: * * ./ylwrap external_l.l lex.yy.c external_l.c -- flex * ./ylwrap external_y.y y.tab.c external_y.c y.tab.h test1_y.h -- bison * gcc -Ilib -I. -Wall `pkg-config gobject-2.0 --cflags --libs` external_l.c external_y.c glib-ext.c -DEXTERNAL_TEST -o exttest * */ #define BUFFERSIZE 1024 int fJacoby = TRUE; int main() { char buffer[BUFFERSIZE]; scancontext scanctx; memset(&scanctx, 0, sizeof(scanctx)); g_type_init (); ExtInitParse((void **)&scanctx); while(fgets(buffer, BUFFERSIZE, stdin) != NULL) { ExtStartParse(scanctx.scanner, buffer); if(scanctx.ct == COMMAND_EXIT) return 0; if (scanctx.bi.gsName) g_string_free(scanctx.bi.gsName, TRUE); if (scanctx.bi.gsOpp) g_string_free(scanctx.bi.gsOpp, TRUE); scanctx.bi.gsName = NULL; scanctx.bi.gsOpp = NULL; } ExtDestroyParse(scanctx.scanner); return 0; } #endif gnubg-1.08.003/makeweights.c000644 001751 000024 00000006712 14574155047 015316 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2001 Gary Wong * Copyright (C) 2002-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: makeweights.c,v 1.31 2022/02/02 22:04:12 plm Exp $ */ #include "config.h" #include #include #include #include #include #include "eval.h" /* for WEIGHTS_VERSION */ #include "output.h" static void usage(char *prog) { g_printerr(_("Usage: %s [[-f] outputfile [inputfile]]\n" " outputfile: Output to file instead of stdout\n" " inputfile: Input from file instead of stdin\n"), prog); exit(1); } extern int main(int argc, /*lint -e{818} */ char *argv[]) { neuralnet nn; char szFileVersion[16]; static float ar[2] = { WEIGHTS_MAGIC_BINARY, WEIGHTS_VERSION_BINARY }; int c; FILE *in = stdin, *out = stdout; if (!setlocale(LC_ALL, "C") || !bindtextdomain(PACKAGE, LOCALEDIR) || !textdomain(PACKAGE)) { perror("setting locale failed"); exit(1); } g_set_printerr_handler(print_utf8_to_locale); if (argc > 1) { int arg = 1; if (!StrCaseCmp(argv[1], "-f")) arg++; /* Skip */ if (argc > arg + 2) usage(argv[0]); if ((out = g_fopen(argv[arg], "wb")) == 0) { g_printerr(_("Can't open output file")); exit(1); } if (argc == arg + 2) { if ((in = g_fopen(argv[arg + 1], "r")) == 0) { g_printerr(_("Can't open input file")); exit(1); } } } /* generate weights */ if (fscanf(in, "GNU Backgammon %15s\n", szFileVersion) != 1) { g_printerr(_("%s: invalid weights file\n"), argv[0]); fclose(in); fclose(out); return EXIT_FAILURE; } if (StrCaseCmp(szFileVersion, WEIGHTS_VERSION)) { g_printerr(_("%s: incorrect weights version\n" "(version %s is required, " "but these weights are %s)\n"), argv[0], WEIGHTS_VERSION, szFileVersion); fclose(in); fclose(out); return EXIT_FAILURE; } if (fwrite(ar, sizeof(ar[0]), 2, out) != 2) { g_printerr(_("Failed to write neural net!")); fclose(in); fclose(out); return EXIT_FAILURE; } for (c = 0; !feof(in); c++) { if (NeuralNetLoad(&nn, in) == -1) { g_printerr(_("Failed to load neural net!")); fclose(in); fclose(out); return EXIT_FAILURE; } if (NeuralNetSaveBinary(&nn, out) == -1) { g_printerr(_("Failed to save neural net!")); fclose(in); fclose(out); return EXIT_FAILURE; } NeuralNetDestroy(&nn); } g_printerr(_("%d nets converted\n"), c); fclose(in); fclose(out); return EXIT_SUCCESS; } gnubg-1.08.003/speed.c000644 001751 000024 00000010564 14574155047 014106 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Gary Wong * Copyright (C) 2004-2018 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: speed.c,v 1.37 2021/11/26 22:58:10 plm Exp $ */ #include "config.h" #if defined(USE_GTK) #include "gtkgame.h" #else #include "backgammon.h" #endif #if defined(USE_MULTITHREAD) #include "multithread.h" #endif #ifndef WIN32 #include #endif #include "lib/isaac.h" #include "lib/simd.h" #define EVALS_PER_ITERATION 1024 static randctx rc; static double timeTaken; static void RunEvals(void *UNUSED(notused)) { int aanBoard[EVALS_PER_ITERATION][2][25]; int i, j, k; double t; SSE_ALIGN(float ar[NUM_OUTPUTS]); #if defined(USE_MULTITHREAD) MT_Exclusive(); #endif for (i = 0; i < EVALS_PER_ITERATION; i++) { /* Generate a random board. Don't allow chequers on the bar * or borne off, so we can trivially guarantee the position * is legal. */ for (j = 0; j < 25; j++) aanBoard[i][0][j] = aanBoard[i][1][j] = 0; for (j = 0; j < 15; j++) { do { k = irand(&rc) % 24; } while (aanBoard[i][1][23 - k]); aanBoard[i][0][k]++; do { k = irand(&rc) % 24; } while (aanBoard[i][0][23 - k]); aanBoard[i][1][k]++; } } #if defined(USE_MULTITHREAD) MT_Release(); MT_SyncStart(); #else t = get_time(); #endif for (i = 0; i < EVALS_PER_ITERATION; i++) { (void) EvaluatePosition(NULL, (ConstTanBoard) aanBoard[i], ar, &ciCubeless, NULL); } #if defined(USE_MULTITHREAD) if ((t = MT_SyncEnd()) > 0) timeTaken += t; #else timeTaken += (get_time() - t); #endif } extern void CommandCalibrate(char *sz) { int n = -1; unsigned int i, iIter, iCacheSize; #if defined(USE_GTK) void *pcc = NULL; #endif iCacheSize = GetEvalCacheEntries(); EvalCacheResize(0); #if defined(USE_MULTITHREAD) MT_SyncInit(); #endif if (sz && *sz) { n = ParseNumber(&sz); if (n < 1) { outputl(_("If you specify a parameter to `calibrate', " "it must be a number of iterations to run.")); return; } } if (clock() == (clock_t) - 1) { outputl(_("Calibration not available.")); return; } rc.randrsl[0] = (ub4) time(NULL); for (i = 0; i < RANDSIZ; i++) rc.randrsl[i] = rc.randrsl[0]; irandinit(&rc, TRUE); #if defined(USE_GTK) if (fX) pcc = GTKCalibrationStart(); #endif timeTaken = 0.0; for (iIter = 0; n < 0 || iIter < (unsigned int) n;) { double spd; if (fInterrupt) break; #if defined(USE_MULTITHREAD) mt_add_tasks(MT_GetNumThreads(), RunEvals, NULL, NULL); (void) MT_WaitForTasks(NULL, 0, FALSE); iIter += MT_GetNumThreads(); #else RunEvals(NULL); iIter++; #endif if (timeTaken <= 0.0) spd = 0.0; else spd = iIter * (EVALS_PER_ITERATION * 1000 / timeTaken); #if defined(USE_GTK) if (fX) GTKCalibrationUpdate(pcc, (float) spd); else #endif if (fShowProgress) { outputf(" \r"); outputf(_("Calibrating: ")); outputf(_("%.0f static evaluations/second"), spd); fflush(stdout); } } EvalCacheResize(iCacheSize); #if defined(USE_GTK) if (fX) GTKCalibrationEnd(pcc); #endif if (timeTaken > 0.0) { rEvalsPerSec = (float) iIter * (float) (EVALS_PER_ITERATION * 1000 / timeTaken); outputf("\r"); outputf(_("Calibration result: ")); outputf(_("%.0f static evaluations/second"), rEvalsPerSec); outputf(".\n"); } else { outputf("\r"); outputl(_("Calibration incomplete.")); } } gnubg-1.08.003/gtkexport.h000644 001751 000024 00000001601 14574155047 015032 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkexport.h,v 1.4 2013/06/16 02:16:14 mdpetch Exp $ */ #ifndef GTKEXPORT_H #define GTKEXPORT_H #include "export.h" extern void GTKShowExport(exportsetup * pexs); #endif gnubg-1.08.003/ABOUT-NLS000644 001751 000024 00000233340 14570454011 014055 0ustar00pmstaff000000 000000 1 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of October 2006. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ GNUnet | [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] [] [] | batchelor | [] | bfd | | bibshelf | [] | binutils | [] | bison | [] [] | bison-runtime | | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | [] [] | coreutils | [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | darkstat | [] () [] | dialog | [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] | findutils | [] [] [] | flex | [] [] [] | fslint | [] | gas | | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] | gip | [] | gliv | [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | () () [] | gnucash-glossary | [] () | gnuedu | | gnulib | [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () | gramadoir | [] [] | grep | [] [] [] [] [] [] | gretl | | gsasl | | gss | | gst-plugins | [] [] [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] [] | iso_3166 | [] [] | iso_3166_2 | | iso_4217 | [] | iso_639 | [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | | keytouch-editor | | keytouch-keyboa... | | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] | make | [] [] | man-db | [] () [] [] | minicom | [] [] [] | mysecretdiary | [] [] | nano | [] [] [] | nano_1_0 | [] () [] [] | opcodes | [] | parted | | pilot-qof | [] | psmisc | [] | pwdutils | | python | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | silky | | skencil | [] () | sketch | [] () | solfege | | soundtracker | [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] | texinfo | [] [] [] | textutils | [] [] [] | tin | () () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] | xchat | [] [] [] [] [] [] | xkeyboard-config | | xpad | [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ GNUnet | | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] [] [] | batchelor | [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | darkstat | [] () [] [] [] | dialog | [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | error | [] [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnucash-glossary | [] [] | gnuedu | [] | gnulib | [] [] [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | () () [] () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] [] | gsasl | [] [] | gss | [] | gst-plugins | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] [] | impost | [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] [] | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] | libidn | [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] [] | lynx | [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | () | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] [] [] [] [] | nano_1_0 | [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | | silky | [] | skencil | [] [] | sketch | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] | textutils | [] [] [] [] [] | tin | [] () | tp-robot | [] [] [] [] | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | vorbis-tools | [] [] | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52 ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no +-------------------------------------------------+ GNUnet | | a2ps | () [] [] () | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | | cpplib | [] | cryptonit | [] | darkstat | [] [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | error | [] | fetchmail | [] [] | fileutils | [] [] | findutils | [] | flex | [] [] | fslint | [] [] | gas | | gawk | [] [] | gbiff | [] | gcal | | gcc | | gettext-examples | [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gimp-print | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] | gnubiff | | gnucash | () () | gnucash-glossary | [] | gnuedu | | gnulib | [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | | gpsdrive | () () () | gramadoir | () | grep | [] [] [] [] | gretl | | gsasl | [] | gss | | gst-plugins | [] | gst-plugins-base | | gst-plugins-good | [] | gstreamer | [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | | hello | [] [] [] [] [] [] | id-utils | [] | impost | | indent | [] [] | iso_3166 | [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] | jpilot | () () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | | libidn | [] [] | lifelines | [] | lilypond | | lingoteach | [] | lynx | [] [] | m4 | [] [] | mailutils | | make | [] [] [] | man-db | () | minicom | [] | mysecretdiary | [] | nano | [] [] [] | nano_1_0 | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] | shishi | | silky | [] | skencil | | sketch | | solfege | | soundtracker | | sp | () | stardict | [] [] | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | vorbis-tools | [] | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +-------------------------------------------------+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1 nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +------------------------------------------------------+ GNUnet | | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] | bash | [] [] [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | darkstat | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] [] [] [] | gas | | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gimp-print | [] [] | gip | [] [] [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () | gnucash | () [] | gnucash-glossary | [] [] [] | gnuedu | | gnulib | [] [] [] [] [] | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] | gretl | [] | gsasl | [] [] [] | gss | [] [] [] | gst-plugins | [] [] [] [] | gst-plugins-base | [] | gst-plugins-good | [] [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | impost | [] | indent | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] [] | make | [] [] [] [] | man-db | [] [] | minicom | [] [] [] [] [] | mysecretdiary | [] [] [] [] | nano | [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | [] | psmisc | [] [] | pwdutils | [] [] | python | | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | silky | [] | skencil | [] [] [] | sketch | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | stardict | [] [] [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] | tin | () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] | xpad | [] [] [] | +------------------------------------------------------+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ GNUnet | [] | 2 a2ps | [] [] [] | 19 aegis | | 0 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 15 bash | [] | 11 batchelor | [] [] | 9 bfd | | 1 bibshelf | [] | 7 binutils | [] [] [] | 9 bison | [] [] [] | 19 bison-runtime | [] [] [] | 15 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 6 console-tools | [] [] | 5 coreutils | [] [] | 16 cpio | [] [] [] | 9 cpplib | [] [] [] [] | 11 cryptonit | | 5 darkstat | [] () () | 15 dialog | [] [] [] [] [] | 30 diffutils | [] [] [] [] | 28 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 error | [] [] [] [] | 18 fetchmail | [] [] | 12 fileutils | [] [] [] | 18 findutils | [] [] [] | 17 flex | [] [] | 15 fslint | [] | 9 gas | [] | 3 gawk | [] [] | 15 gbiff | [] | 5 gcal | [] | 5 gcc | [] [] [] | 6 gettext-examples | [] [] [] [] [] [] | 27 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 19 gimp-print | [] [] | 12 gip | [] [] | 12 gliv | [] [] | 8 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 15 gnubiff | [] | 1 gnucash | () | 2 gnucash-glossary | [] [] | 9 gnuedu | [] | 2 gnulib | [] [] [] [] [] | 28 gnunet-gtk | | 1 gnutls | | 2 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] | 3 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] | 14 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] | 20 gpe-filemanager | [] | 6 gpe-go | [] [] | 15 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] | 20 gpe-taskmanager | [] [] [] | 20 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] | 7 gphoto2 | [] [] [] [] | 20 gprof | [] [] | 11 gpsdrive | | 4 gramadoir | [] | 7 grep | [] [] [] [] | 34 gretl | | 4 gsasl | [] [] | 8 gss | [] | 5 gst-plugins | [] [] [] | 15 gst-plugins-base | [] [] [] | 9 gst-plugins-good | [] [] [] [] [] | 20 gstreamer | [] [] [] | 17 gtick | [] | 3 gtkam | [] | 13 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 26 gutenprint | | 3 hello | [] [] [] [] [] | 37 id-utils | [] [] | 14 impost | [] | 4 indent | [] [] [] [] | 25 iso_3166 | [] [] [] [] | 16 iso_3166_2 | | 2 iso_4217 | [] [] | 14 iso_639 | [] | 14 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] | 12 keytouch | [] | 4 keytouch-editor | | 2 keytouch-keyboa... | [] | 3 latrine | [] [] | 8 ld | [] [] [] [] | 8 leafpad | [] [] [] [] | 23 libc | [] [] [] | 23 libexif | [] | 4 libextractor | [] | 5 libgpewidget | [] [] [] | 19 libgpg-error | [] | 4 libgphoto2 | [] | 8 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] | 7 libidn | [] [] | 10 lifelines | | 4 lilypond | | 2 lingoteach | [] | 6 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailutils | [] | 8 make | [] [] [] | 20 man-db | [] | 6 minicom | [] | 14 mysecretdiary | [] [] | 12 nano | [] [] | 17 nano_1_0 | [] [] [] | 18 opcodes | [] [] | 10 parted | [] [] [] | 10 pilot-qof | [] | 3 psmisc | [] | 10 pwdutils | [] | 3 python | | 0 qof | [] | 4 radius | [] | 6 recode | [] [] [] | 25 rpm | [] [] [] [] | 14 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] | 22 sh-utils | [] | 15 shared-mime-info | [] [] [] [] | 24 sharutils | [] [] [] | 23 shishi | | 1 silky | [] | 4 skencil | [] | 7 sketch | | 6 solfege | | 2 soundtracker | [] [] | 9 sp | [] | 3 stardict | [] [] [] [] | 11 system-tools-ba... | [] [] [] [] [] [] [] | 37 tar | [] [] [] [] | 20 texinfo | [] [] [] | 15 textutils | [] [] [] | 17 tin | | 1 tp-robot | [] [] [] | 10 tuxpaint | [] [] [] | 16 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 vorbis-tools | [] [] | 11 wastesedge | | 1 wdiff | [] [] | 22 wget | [] [] [] | 19 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] [] | 11 xpad | [] [] [] | 14 +---------------------------------------------------+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If October 2006 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. gnubg-1.08.003/mec.c000644 001751 000024 00000035312 14574155047 013550 0ustar00pmstaff000000 000000 /* * mec - match equity calculator for backgammon. calculate equity table * given match length, gammon rate and winning probabilities. * * Copyright (C) 1996 Claes Tornberg * Copyright (C) 2004-2013 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * Modified for usage with GNUbg by Joern Thyssen : * * (1) make external entry for usage in GNUbg * (2) change "double" to "metentry", and typedef metentry to float * or double depending on MEC_STANDALONE * (3) Compile with MEC_STANDALONE to get Tornberg's original program, e.g., * * gcc -DMEC_STANDALONE mec.c -o mec * * $Id: mec.c,v 1.11 2019/04/27 17:24:56 plm Exp $ */ #include "config.h" #include #include #ifndef MEC_STANDALONE #include "mec.h" #endif struct dp { double e; double w; }; typedef struct dp dp; static void post_crawford(double, double, int, double **, double, double); static void crawford(double, double, int, double **); static void pre_crawford(double, double, int, double **); static dp dpt(int, int, int, double, double, double **); /* * Arguments are (in this order): * match length * gammon rate * winning percentage (favorite) */ #ifdef MEC_STANDALONE int main(int argc, char **argv) { /* match length */ int ml = argc > 1 ? atoi(argv[1]) : 9; /* gammon rate, i.e. how many of games won/lost will be gammons */ double gr = argc > 2 ? atof(argv[2]) : 0; /* Here one could argue for different approaches. Does the underdog * in match (current score) have different gammon rate. Or does the * underdog in match (equity at current score) have different gammon * rate. This could be solved, but for now, we assume same rates. */ /* winning percentage for favorite in one game. NB: when one player * is favorite, there is no symmetry in the equity table! I.e. * E[i][1] = 1 - E[1][i] doesn't necessarily hold. This figure must * be higher than or equal to .5, i.e. 50% */ double wpf = argc > 3 ? atof(argv[3]) : 0.5; /* Equity chart, E[p][o] = equity for p when p is p away, and o is o away. * If there is a game favorite, i.e. wpf > 0.5, p above is considered * to be the favorite in each game. For now we also assume no free drop * vigourish. This will only affect the computation of post-Crawford * equities, and is quite easy to correct. */ double **E = (double **) malloc((ml + 1) * sizeof(double *)); double *ec = (double *) calloc((ml + 1) * (ml + 1), sizeof(double)); { int i; /* Initialize E to point to correct positions */ for (i = 0; i <= ml; i++) { E[i] = &ec[i * (ml + 1)]; } /* Initialize E for 0-away scores */ for (i = 1; i <= ml; i++) { E[0][i] = 1; E[i][0] = 0; } } /* Compute post-Crawford equities, given gammon rate, winning percentage * for favorite (game), match length. Fill in the equity table. */ post_crawford(gr, wpf, ml, E, 0.0, 0.0); { int i; printf("Post-Crawford:\n"); for (i = 1; i < ml; ++i) printf("%6.3f", E[i][1]); printf("\n"); for (i = 1; i < ml; ++i) printf("%6.3f", E[1][i]); printf("\n"); } /* Compute Crawford equities, given gammon rate, winning percentage * for favorite (game), match length, and post-Crawford equities. * Fill in the table. */ crawford(gr, wpf, ml, E); /* Compute pre-Crawford equities, given gammon rate, winning percentage * for favorite (game), match length, and Crawford equities. * Fill in the table. */ pre_crawford(gr, wpf, ml, E); /* Print the equity table. Nothing fancy. */ { int i, j; printf("Gammon rate %5.4f\n" "Winning %% %5.4f\n\n", gr, wpf); printf("%3s", ""); for (i = 1; i <= ml; i++) { printf("%6d", i); } printf("\n"); for (i = 1; i <= ml; i++) { printf("%3d", i); for (j = 1; j <= ml; j++) printf("%6.3f", E[i][j]); printf("\n"); } } free(ec); free(E); } #else /* MEC_STANDALONE */ extern void mec_pc(const float rGammonRate, const float rFreeDrop2Away, const float rFreeDrop4Away, const float rWinRate, float arMetPC[MAXSCORE]) { unsigned int i; /* match length */ const unsigned int ml = 64; /* gammon rate, i.e. how many of games won/lost will be gammons */ double gr = rGammonRate; /* Here one could argue for different approaches. Does the underdog * in match (current score) have different gammon rate. Or does the * underdog in match (equity at current score) have different gammon * rate. This could be solved, but for now, we assume same rates. */ /* winning percentage for favorite in one game. NB: when one player * is favorite, there is no symmetry in the equity table! I.e. * E[i][1] = 1 - E[1][i] doesn't necessarily hold. This figure must * be higher than or equal to .5, i.e. 50% */ double wpf = rWinRate; /* Equity chart, E[p][o] = equity for p when p is p away, and o is o away. * If there is a game favorite, i.e. wpf > 0.5, p above is considered * to be the favorite in each game. For now we also assume no free drop * vigourish. This will only affect the computation of post-Crawford * equities, and is quite easy to correct. */ double **E = (double **) malloc((ml + 1) * sizeof(double *)); double *ec = (double *) calloc((ml + 1) * (ml + 1), sizeof(double)); if (!E || !ec) exit(-1); /* We're in trouble... */ { /* Initialize E to point to correct positions */ for (i = 0; i <= ml; i++) { E[i] = &ec[i * (ml + 1)]; } /* Initialize E for 0-away scores */ for (i = 1; i <= ml; i++) { E[0][i] = 1; E[i][0] = 0; } } /* Compute post-Crawford equities, given gammon rate, winning percentage * for favorite (game), match length. Fill in the equity table. */ post_crawford(gr, wpf, ml, E, (double) rFreeDrop2Away, (double) rFreeDrop4Away); /* save post Crawford equities */ for (i = 0; i < ml; ++i) arMetPC[i] = (float) E[i + 1][1]; /* garbage collect */ free(ec); free(E); } extern void mec(const float rGammonRate, const float rWinRate, /* const *//*lint -e{818} */ float aarMetPC[2][MAXSCORE], float aarMet[MAXSCORE][MAXSCORE]) { unsigned int i, j; /* match length */ const unsigned int ml = 64; /* gammon rate, i.e. how many of games won/lost will be gammons */ double gr = rGammonRate; /* Here one could argue for different approaches. Does the underdog * in match (current score) have different gammon rate. Or does the * underdog in match (equity at current score) have different gammon * rate. This could be solved, but for now, we assume same rates. */ /* winning percentage for favorite in one game. NB: when one player * is favorite, there is no symmetry in the equity table! I.e. * E[i][1] = 1 - E[1][i] doesn't necessarily hold. This figure must * be higher than or equal to .5, i.e. 50% */ double wpf = rWinRate; /* Equity chart, E[p][o] = equity for p when p is p away, and o is o away. * If there is a game favorite, i.e. wpf > 0.5, p above is considered * to be the favorite in each game. For now we also assume no free drop * vigourish. This will only affect the computation of post-Crawford * equities, and is quite easy to correct. */ double **E = (double **) malloc((ml + 1) * sizeof(double *)); double *ec = (double *) calloc((ml + 1) * (ml + 1), sizeof(double)); if (!E || !ec) exit(-1); /* We're in trouble... */ { /* Initialize E to point to correct positions */ for (i = 0; i <= ml; i++) { E[i] = &ec[i * (ml + 1)]; } /* Initialize E for 0-away scores */ for (i = 1; i <= ml; i++) { E[0][i] = 1; E[i][0] = 0; } } /* Compute post-Crawford equities, given gammon rate, winning percentage * for favorite (game), match length. Fill in the equity table. */ for (i = 0; i < ml; ++i) E[i + 1][1] = aarMetPC[0][i]; for (i = 0; i < ml; ++i) E[1][i + 1] = 1.0 - (double)aarMetPC[1][i]; /* Compute Crawford equities, given gammon rate, winning percentage * for favorite (game), match length, and post-Crawford equities. * Fill in the table. */ crawford(gr, wpf, ml, E); /* Compute pre-Crawford equities, given gammon rate, winning percentage * for favorite (game), match length, and Crawford equities. * Fill in the table. */ pre_crawford(gr, wpf, ml, E); /* save the match equiy table */ for (i = 0; i < ml; ++i) for (j = 0; j < ml; ++j) aarMet[i][j] = (float) E[i + 1][j + 1]; /* garbage collect */ free(ec); free(E); } #endif /* ! MEC_STANDALONE */ /* If last bit is zero, then x is even. */ #define even(x) (((x)&0x1)==0) /* sq returns x if x is greater than zero, else it returns zero. */ #define sq(x) ((x)>0?(x):0) static void post_crawford(double gr, double wpf, int ml, /*lint -e{818} */ double **E, double fd2, double fd4) { int i; E[1][1] = wpf; for (i = 2; i <= ml; i++) { if (even(i)) { /* Free drop condition exists */ E[1][i] = E[1][i - 1]; E[i][1] = E[i - 1][1]; /* jth: add empirical values for free drop */ if (i == 2) { /* 2-away */ E[1][i] += fd2; E[i][1] -= fd2; } else if (i == 4) { /* 4-away */ E[1][i] += fd4; E[i][1] += fd4; } } else { E[1][i] = /* Equity for favorite when 1-away, i-away */ E[0][i] * wpf /* Favorite wins */ + E[1][sq(i - 2)] * (1 - wpf) * (1 - gr) /* Favorite loses single */ +E[1][sq(i - 4)] * (1 - wpf) * gr; /* Favorite loses gammon */ E[i][1] = /* Equity for favorite when i-away, 1-away */ E[i][0] * (1 - wpf) /* Favorite loses */ +E[sq(i - 2)][1] * wpf * (1 - gr) /* Favorite wins single */ +E[sq(i - 4)][1] * wpf * gr; /* Favorite wins gammon */ } } } static void crawford(double gr, double wpf, int ml, /*lint -e{818} */ double **E) { int i; /* Compute Crawford equities. Do this backwards, since * we overwrite post-Crawford equities with Crawford equities. * In this way we only overwrite equities no longer needed. */ for (i = ml; i >= 2; i--) { E[1][i] = /* Equity for favorite when 1-away,i-away */ E[0][i] * wpf /* Favorite wins */ + E[1][i - 1] * (1 - wpf) * (1 - gr) /* Favorite loses single */ +E[1][i - 2] * (1 - wpf) * gr; /* Favorite loses gammon */ E[i][1] = /* Equity for favorite when i-away, 1-away */ E[i][0] * (1 - wpf) /* Favorite loses */ +E[i - 1][1] * wpf * (1 - gr) /* Favorite wins single */ +E[i - 2][1] * wpf * gr; /* Favorite wins gammon */ } } static void pre_crawford(double gr, double wpf, int ml, double **E) { int i, j; dp dpf, dpu; double eq; for (i = 2; i <= ml; i++) for (j = i; j <= ml; j++) { dpf = dpt(i, j, 2, gr, wpf, E); dpu = dpt(j, i, 2, gr, 1 - wpf, E); dpu.e = 1 - dpu.e; dpu.w = 1 - dpu.w; eq = dpu.e + (dpf.e - dpu.e) * (wpf - dpu.w) / (dpf.w - dpu.w); E[i][j] = eq; if (i != j) { dpf = dpt(j, i, 2, gr, wpf, E); dpu = dpt(i, j, 2, gr, 1 - wpf, E); dpu.e = 1 - dpu.e; dpu.w = 1 - dpu.w; eq = dpu.e + (dpf.e - dpu.e) * (wpf - dpu.w) / (dpf.w - dpu.w); E[j][i] = eq; } } } /* Compute point when p doubles o to c, assuming gammon rate gr, * p wins wpp % of games, and equities E for favorite. At this * point o does equally well passing the double as taking it. */ static dp dpt(int p, int o, int c, double gr, double wpp, double **E) { dp dpo, dpp; double e0, edp, wdp; if (p <= c / 2) { /* No reason for p to double o, since a single win * is enough to win the match. */ dpp.e = 1; dpp.w = 1; return dpp; } /* p might double o to c since he needs more than a single * game to win the match. */ /* Find out when o (re)doubles p to 2*c */ dpo = dpt(o, p, 2 * c, gr, 1 - wpp, E); /* Find out equity for o if p does well and wins * all games here (assuming no recube from o), i.e. * o loses all games sitting on a c-cube. */ if (wpp > 0.5) { /* o isn't game favorite, equity for o at o-away x-away is 1 - E[x][o]. */ e0 = (1 - E[sq(p - c)][o]) * (1 - gr) + (1 - E[sq(p - 2 * c)][o]) * gr; } else { /* o is game favorite, equity for o at o-away x-away is E[o][x]. */ e0 = E[o][sq(p - c)] * (1 - gr) + E[o][sq(p - 2 * c)] * gr; } /* Find out o:s equity if o passes the double to c, i.e. loses c / 2 points. */ if (wpp > 0.5) { /* o isn't game favorite, equity for o at o-away x-away is 1 - E[x][o]. */ edp = 1 - E[sq(p - c / 2)][o]; } else { /* o is game favorite, equity for o at o-away x-away is E[o][x]. */ edp = E[o][sq(p - c / 2)]; } /* Find the winning percentage, which on the line from * (w0?,e0) to (dpo.w,dpo.e) gives o an equity equal to O's * equity passing the double to c (i.e. losing c / 2 pts) */ wdp = (edp - e0) * dpo.w / (dpo.e - e0); /* Now we know when p should double o, expressed as * winning percentage and equity for o. Return this * expressed in figures for p */ dpp.e = 1 - edp; dpp.w = 1 - wdp; return dpp; } gnubg-1.08.003/gtkmovelistctrl.c000644 001751 000024 00000046306 14574155047 016246 0ustar00pmstaff000000 000000 /*lint -e818 */ /* * Copyright (C) 2005-2009 Jon Kinsey * Copyright (C) 2009-2018 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkmovelistctrl.c,v 1.32 2022/02/06 16:22:01 plm Exp $ */ #include "config.h" #include "gtklocdefs.h" #include "gtkgame.h" #include "gtkmovelistctrl.h" #include "format.h" #include "drawboard.h" GdkColor wlCol; static void custom_cell_renderer_movelist_init(CustomCellRendererMovelist * cellprogress, gpointer g_class); static void custom_cell_renderer_movelist_class_init(CustomCellRendererMovelistClass * klass, gpointer class_data); static void custom_cell_renderer_movelist_set_property(GObject * object, guint param_id, const GValue * value, GParamSpec * pspec); static void custom_cell_renderer_movelist_finalize(GObject * gobject); /* These functions are the heart of our custom cell renderer: */ static void custom_cell_renderer_movelist_get_size(GtkCellRenderer * cell, GtkWidget * widget, gtk_locdef_cell_area * cell_area, gint * x_offset, gint * y_offset, gint * width, gint * height); static void custom_cell_renderer_movelist_render(GtkCellRenderer * cell, cairo_t * cr, GtkWidget * widget, const GdkRectangle * background_area, const GdkRectangle * cell_area, GtkCellRendererState flags); #if ! GTK_CHECK_VERSION(3,0,0) static void custom_cell_renderer_movelist_render_window(GtkCellRenderer * cell, GdkWindow * window, GtkWidget * widget, GdkRectangle * background_area, GdkRectangle * cell_area, GdkRectangle * expose_area, GtkCellRendererState flags); #endif static gpointer parent_class; /*************************************************************************** * * custom_cell_renderer_movelist_get_type: here we register our type with * the GObject type system if we * haven't done so yet. Everything * else is done in the callbacks. * ***************************************************************************/ static GType custom_cell_renderer_movelist_get_type(void) { static GType cell_progress_type = 0; if (cell_progress_type) return cell_progress_type; { static const GTypeInfo cell_progress_info = { sizeof(CustomCellRendererMovelistClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) custom_cell_renderer_movelist_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CustomCellRendererMovelist), 0, /* n_preallocs */ (GInstanceInitFunc) custom_cell_renderer_movelist_init, NULL }; /* Derive from GtkCellRenderer */ cell_progress_type = g_type_register_static(GTK_TYPE_CELL_RENDERER, "CustomCellRendererMovelist", &cell_progress_info, (GTypeFlags) 0); } return cell_progress_type; } /*************************************************************************** * * custom_cell_renderer_movelist_init: set some default properties of the * parent (GtkCellRenderer). * ***************************************************************************/ static void custom_cell_renderer_movelist_init(CustomCellRendererMovelist * cellrendererprogress, gpointer UNUSED(g_class)) { gtk_cell_renderer_set_padding(GTK_CELL_RENDERER(cellrendererprogress), 2, 2); g_object_set(GTK_CELL_RENDERER(cellrendererprogress), "mode", (int) GTK_CELL_RENDERER_MODE_INERT, NULL); } /*************************************************************************** * * custom_cell_renderer_movelist_class_init: * * set up our own get_property and set_property functions, and * override the parent's functions that we need to implement. * And make our new "percentage" property known to the type system. * If you want cells that can be activated on their own (ie. not * just the whole row selected) or cells that are editable, you * will need to override 'activate' and 'start_editing' as well. * ***************************************************************************/ static void custom_cell_renderer_movelist_class_init(CustomCellRendererMovelistClass * klass, gpointer UNUSED(class_data)) { GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(klass); GObjectClass *object_class = G_OBJECT_CLASS(klass); parent_class = g_type_class_peek_parent(klass); object_class->finalize = custom_cell_renderer_movelist_finalize; /* Hook up functions to set and get our * custom cell renderer properties */ object_class->get_property = NULL; object_class->set_property = custom_cell_renderer_movelist_set_property; /* Override the two crucial functions that are the heart * of a cell renderer in the parent class */ cell_class->get_size = custom_cell_renderer_movelist_get_size; #if GTK_CHECK_VERSION(3,0,0) cell_class->render = custom_cell_renderer_movelist_render; #else cell_class->render = custom_cell_renderer_movelist_render_window; #endif /* Install our very own properties */ g_object_class_install_property(object_class, 1, g_param_spec_pointer("movelist", (_("Move List")), (_("The move list entry")), G_PARAM_WRITABLE)); g_object_class_install_property(object_class, 2, g_param_spec_int("rank", (_("Rank")), (_("The moves rank")), -1, 1000000, 0, G_PARAM_WRITABLE)); } /*************************************************************************** * * custom_cell_renderer_movelist_finalize: free any resources here * ***************************************************************************/ static void custom_cell_renderer_movelist_finalize(GObject * object) { /* * CustomCellRendererMovelist *cellrendererprogress = CUSTOM_CELL_RENDERER_MOVELIST(object); */ /* Free any dynamically allocated resources here */ (*G_OBJECT_CLASS(parent_class)->finalize) (object); } /* Not needed * static void * custom_cell_renderer_movelist_get_property (GObject *object, * guint param_id, * GValue *value, * GParamSpec *pspec) * { * CustomCellRendererMovelist *cellprogress = CUSTOM_CELL_RENDERER_MOVELIST(object); * g_assert(param_id == 1); * * g_value_set_pointer(value, cellprogress->pml); * } */ static void custom_cell_renderer_movelist_set_property(GObject * object, guint param_id, const GValue * value, GParamSpec * UNUSED(notused)) { CustomCellRendererMovelist *cellprogress = CUSTOM_CELL_RENDERER_MOVELIST(object); if (param_id == 1) cellprogress->pml = g_value_get_pointer(value); else cellprogress->rank = (unsigned) g_value_get_int(value); } /*************************************************************************** * * custom_cell_renderer_movelist_new: return a new cell renderer instance * ***************************************************************************/ GtkCellRenderer * custom_cell_renderer_movelist_new(void) { return g_object_new(CUSTOM_TYPE_CELL_RENDERER_MOVELIST, NULL); } /*************************************************************************** * * custom_cell_renderer_movelist_get_size: calculate the size of our cell * Padding and alignment properties * of parent are largely ignored... * ***************************************************************************/ static int fontheight = -1, minWidth; extern void custom_cell_renderer_invalidate_size(void) { fontheight = -1; } /* The layout of the control has many size variable (declard below - starting _s_) * The diagram here tries to help specify what each size means. (note the _s_ has been left out) * B * A a b c c d E * C * A2 Z Z Z s Z Z Z E * D * * (Y - space) * (m - minus) */ static int _s_A, _s_A2, _s_B, _s_C, _s_D, _s_E, _s_Y, _s_Z, _s_ZP, _s_a, _s_b, _s_c, _s_cP, _s_d, _s_s, _s_m; static void custom_cell_renderer_movelist_get_size(GtkCellRenderer * cell, GtkWidget * widget, gtk_locdef_cell_area * cell_area, gint * x_offset, gint * y_offset, gint * width, gint * height) { gint calc_width; gint calc_height; gfloat xalign, yalign; gtk_cell_renderer_get_alignment(cell, &xalign, &yalign); if (fontheight == -1) { /* Calculate sizes (if not known) */ int l1Width, l2Width; PangoRectangle logical_rect; PangoLayout *layout; char buf[100]; g_assert(fOutputDigits <= MAX_OUTPUT_DIGITS); sprintf(buf, "%.*f", fOutputDigits, 0.888888); layout = gtk_widget_create_pango_layout(widget, buf); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); fontheight = logical_rect.height; _s_A = _s_E = _s_C = _s_D = fontheight / 5; _s_B = 0; /* Pack lines quite closely */ _s_Z = logical_rect.width; sprintf(buf, "%.*f%%", fOutputDigits > 1 ? MIN(fOutputDigits, MAX_OUTPUT_DIGITS) - 1 : 0, 0.888888); layout = gtk_widget_create_pango_layout(widget, buf); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_ZP = logical_rect.width; layout = gtk_widget_create_pango_layout(widget, " "); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_Y = logical_rect.width; layout = gtk_widget_create_pango_layout(widget, "-"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_m = logical_rect.width; _s_s = 6 * _s_Y; _s_A2 = _s_A + _s_Y * 4; l2Width = _s_A2 + 6 * _s_Z + 5 * _s_Y * 2 + _s_s; layout = gtk_widget_create_pango_layout(widget, "1000"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_a = logical_rect.width; sprintf(buf, "%s %s", _("Cubeless"), _("3-ply")); layout = gtk_widget_create_pango_layout(widget, buf); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_b = logical_rect.width; sprintf(buf, "+%.*f", fOutputDigits, 0.888888); layout = gtk_widget_create_pango_layout(widget, buf); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_c = logical_rect.width; sprintf(buf, "0%.*f%%", fOutputDigits > 1 ? MIN(fOutputDigits, MAX_OUTPUT_DIGITS) - 1 : 0, 0.888888); layout = gtk_widget_create_pango_layout(widget, buf); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_cP = logical_rect.width; layout = gtk_widget_create_pango_layout(widget, "bar/22* 23/21* 20/18* 19/17*????"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); g_object_unref(layout); _s_d = logical_rect.width; l1Width = _s_A + _s_a + _s_b + 2 * _s_c + _s_d + 4 * _s_Y; minWidth = (l1Width > l2Width) ? l1Width : l2Width; } calc_width = (gint) minWidth + _s_A + _s_E; calc_height = (gint) fontheight *2 + _s_B + _s_C + _s_D; if (width) *width = calc_width; if (height) *height = calc_height; if (cell_area) { if (x_offset) { *x_offset = (int) (xalign * (gfloat) (cell_area->width - calc_width)); *x_offset = MAX(*x_offset, 0); } if (y_offset) { *y_offset = (int) (yalign * (gfloat) (cell_area->height - calc_height)); *y_offset = MAX(*y_offset, 0); } } } /*************************************************************************** * * custom_cell_renderer_movelist_render: crucial - do the rendering. * ***************************************************************************/ static void custom_cell_renderer_movelist_render(GtkCellRenderer * cell, cairo_t * cr, GtkWidget * widget, const GdkRectangle * background_area, const GdkRectangle * cell_area, GtkCellRendererState flags) { CustomCellRendererMovelist *cellprogress = CUSTOM_CELL_RENDERER_MOVELIST(cell); PangoLayout *layout = gtk_widget_create_pango_layout(widget, NULL); hintdata *phd = g_object_get_data(G_OBJECT(widget), "hintdata"); int i, x, y, selected; char buf[100]; float *ar; GdkColor *pFontCol; PangoRectangle logical_rect; const char *cmark_sz; const char *highlight_sz; cubeinfo ci; GetMatchStateCubeInfo(&ci, &ms); /*lint --e(641) */ selected = (flags & GTK_CELL_RENDERER_SELECTED) && gtk_widget_has_focus(widget); if (phd->piHighlight && cellprogress->rank - 1 == *phd->piHighlight) pFontCol = &psHighlight->fg[GTK_STATE_SELECTED]; else pFontCol = NULL; if (!(flags & GTK_CELL_RENDERER_SELECTED)) { gdk_cairo_set_source_color(cr, >k_widget_get_style(widget)->base[GTK_STATE_NORMAL]); cairo_rectangle(cr, background_area->x, background_area->y, background_area->width, background_area->height); cairo_fill(cr); gdk_cairo_set_source_color(cr, >k_widget_get_style(widget)->fg[GTK_STATE_NORMAL]); } else { /* Draw text in reverse colours for highlight cell */ if (!pFontCol && selected) pFontCol = >k_widget_get_style(widget)->base[GTK_STATE_NORMAL]; } if (pFontCol) gdk_cairo_set_source_color(cr, pFontCol); /* First line of control */ cmark_sz = cellprogress->pml->cmark ? "+" : ""; highlight_sz = (phd->piHighlight && cellprogress->rank - 1 == *phd->piHighlight) ? "*" : ""; if (cellprogress->rank > 0) sprintf(buf, "%u%s%s", cellprogress->rank, cmark_sz, highlight_sz); else sprintf(buf, "??%s%s", cmark_sz, highlight_sz); pango_layout_set_text(layout, buf, -1); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); x = _s_A + _s_a - logical_rect.width; y = _s_B; cairo_move_to(cr, cell_area->x + x, cell_area->y + y); pango_cairo_show_layout(cr, layout); x = _s_A + _s_a + _s_Y * 3; (void) FormatEval(buf, &cellprogress->pml->esMove); pango_layout_set_text(layout, buf, -1); cairo_move_to(cr, cell_area->x + x, cell_area->y + y); pango_cairo_show_layout(cr, layout); x += _s_b + _s_Y; pango_layout_set_text(layout, OutputEquity(cellprogress->pml->rScore, &ci, TRUE), -1); cairo_move_to(cr, cell_area->x + x, cell_area->y + y); pango_cairo_show_layout(cr, layout); if (fOutputMWC) x += _s_cP + _s_Y * 2; else x += _s_c + _s_Y * 2; if (cellprogress->rank != 1) { pango_layout_set_text(layout, OutputEquityDiff(cellprogress->pml->rScore, rBest, &ci), -1); cairo_move_to(cr, cell_area->x + x, cell_area->y + y); pango_cairo_show_layout(cr, layout); } if (fOutputMWC) x += _s_cP + _s_Y * 2; else x += _s_c + _s_Y * 2; { /* Move text - in bold */ PangoFontDescription *pfd = pango_context_get_font_description(pango_layout_get_context(layout)); pango_font_description_set_weight(pfd, PANGO_WEIGHT_BOLD); pango_layout_set_font_description(layout, pfd); pango_layout_set_text(layout, FormatMove(buf, msBoard(), cellprogress->pml->anMove), -1); cairo_move_to(cr, cell_area->x + x, cell_area->y + y); pango_cairo_show_layout(cr, layout); pango_font_description_set_weight(pfd, PANGO_WEIGHT_NORMAL); pango_layout_set_font_description(layout, pfd); } /* Second line w/l stats */ x = _s_A2; y += fontheight + _s_C; ar = cellprogress->pml->arEvalMove; if (selected) gdk_cairo_set_source_color(cr, >k_widget_get_style(widget)->base[GTK_STATE_NORMAL]); else gdk_cairo_set_source_color(cr, &wlCol); for (i = 0; i < 6; i++) { char *str; if (i < 3) str = OutputPercent(ar[i]); else if (i == 3) str = OutputPercent(1.0f - ar[OUTPUT_WIN]); else str = OutputPercent(ar[i - 1]); while (*str == ' ') str++; pango_layout_set_text(layout, str, -1); cairo_move_to(cr, cell_area->x + x, cell_area->y + y); pango_cairo_show_layout(cr, layout); if (fOutputWinPC) x += _s_ZP; else x += _s_Z; if (i == 2) { int minOff = (_s_s - _s_m) / 2; if (fOutputWinPC) minOff -= _s_Y; pango_layout_set_text(layout, "-", -1); cairo_move_to(cr, cell_area->x + x + minOff, cell_area->y + y); pango_cairo_show_layout(cr, layout); x += _s_s; } else x += _s_Y * 2; } g_object_unref(layout); } #if ! GTK_CHECK_VERSION(3,0,0) static void custom_cell_renderer_movelist_render_window(GtkCellRenderer * cell, GdkWindow * window, GtkWidget * widget, GdkRectangle * background_area, GdkRectangle * cell_area, GdkRectangle * expose_area, GtkCellRendererState flags) { cairo_t *cr; cr = gdk_cairo_create(window); if (expose_area) { cairo_rectangle(cr, expose_area->x, expose_area->y, expose_area->width, expose_area->height); cairo_clip(cr); } custom_cell_renderer_movelist_render(cell, cr, widget, background_area, cell_area, flags); cairo_destroy(cr); } #endif gnubg-1.08.003/progress.h000644 001751 000024 00000003260 14574155047 014652 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2003-2009 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: progress.h,v 1.13 2019/12/16 22:21:25 plm Exp $ */ #ifndef PROGRESS_H #define PROGRESS_H #include "eval.h" #include "rollout.h" #include "drawboard.h" extern void RolloutProgressStart(const cubeinfo * pci, const int n, rolloutstat aars[2][2], rolloutcontext * pes, char asz[][FORMATEDMOVESIZE], gboolean multiple, void **pp); extern void RolloutProgress(float aarOutput[][NUM_ROLLOUT_OUTPUTS], float aarStdDev[][NUM_ROLLOUT_OUTPUTS], const rolloutcontext * prc, const cubeinfo aci[], unsigned int initial_game_count, const int iGame, const int iAlternative, const int nRank, const float rJsd, const int fStopped, const int fShowRanks, int fCubeRollout, void *pUserData); extern int RolloutProgressEnd(void **pp, gboolean destroy); #endif /* PROGRESS_H */ gnubg-1.08.003/boardpos.h000644 001751 000024 00000003260 14574155047 014617 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2007-2008 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: boardpos.h,v 1.10 2018/04/21 16:14:51 plm Exp $ */ #ifndef BOARDPOS_H #define BOARDPOS_H #define POINT_UNUSED0 28 /* the top unused bearoff tray */ #define POINT_UNUSED1 29 /* the bottom unused bearoff tray */ #define POINT_DICE 30 #define POINT_CUBE 31 #define POINT_RIGHT 32 #define POINT_LEFT 33 #define POINT_RESIGN 34 extern int positions[2][30][3]; extern void ChequerPosition(const int clockwise, const int point, const int chequer, int *px, int *py); extern void PointArea(const int fClockwise, const int nSize, const int n, int *px, int *py, int *pcx, int *pcy); extern void CubePosition(const int crawford_game, const int cube_use, const int doubled, const int cube_owner, int fClockwise, int *px, int *py, int *porient); extern void ArrowPosition(const int clockwise, int turn, const int nSize, int *px, int *py); extern void ResignPosition(const int resigned, int *px, int *py, int *porient); #endif gnubg-1.08.003/TODO000644 001751 000024 00000044424 14570454011 013321 0ustar00pmstaff000000 000000 $Id: TODO,v 1.302 2009/06/13 00:05:41 c_anthon Exp $ People's names next to entries in this file mean they intend to work on that item soon. Please contact them before working on related areas, to avoid duplication of effort and to make sure our changes merge easily. * Evaluations: ** Allow different settings (e.g. search ply, candidates, tolerance) for each position class. ** Add more evaluation classes. *** Add a neural net to correct errors in BEAROFF1 class. *** Classes for bearing off against contact, back games, containment positions, prime-vs-prime... *** Consider meta-pi scheme for using output from multiple nets. ** Add another "eval"-like command that show the distribution of equities n rolls ahead. SW does bar graphs of this stuff; Cam Trenor suggests alternative output. ** Create multiple threads to parallelise rollouts (and evaluations?) on multiprocessors. Perhaps start remote processes? (Olivier Baur) ** Add more statistics for rollouts, e.g. number of turns on the bar, average number of forced moves ** Add Michael Zehr's method for cube variance reduction in money games. ** Add a cache for cubeful evaluations. ** Joseph has weights for small (5 hidden nodes) nets, which could be used for the internal evaluations of deep searches for a significant speed increase. See FindBestMoveInEval() in eval.c from fibs2html. ** Consider making EvalEfficiency() more sophisticated. ** Save rollouts and evaluations in moverecords, e.g., a cubeless rollout for a position. ** Movefilters: *** accept=0, extra=0 is an illegal value! *** Improve dialog ** Cube filters *** similar to move filters (jth) * Commands: ** Add interactive rollouts. ** Analyse games and matches. *** Allow re-evaluating analysis with different settings, and rollouts. *** Make sure cube analysis works for beavers. *** Use the fComputed field in statcontext (make "show statistics ..." complain if not computed, disable the GTK menu items if not available). *** Make sure analysis works with resignations. *** Consider a way for analysis to mark _good_ moves (e.g. moves which are flagged as errors at 0-ply but turn out to be correct at higher plies). *** Option "[X] update annotations if re-evaluated or rolled out", and update annotations if option is selected. Alternatively, update annotation if it's different from good/very good. *** fix logic for determining whether a double is around too-good or double point. *** Calculate "advantage" (i.e. luck-adjusted result): ppg in game stats for money; MWC in match stats for matches. Save the results in pairwise player records. (gary) ** Finish saving positions and evaluations to databases. ** Finish supervised training, and allow people to submit training data via web. ** Allow resuming interrupted rollouts, and extending completed rollouts. *** Allow saving rollouts -- see Jim Segrave's message at for details. *** An option to stop a rollout once the stderr error has reached some arbitrary threshold *** Report equivalent number of games when using variance reduction *** Aborted rollouts show the full number of games in outputs *** Implement for rollouts the same heuristics used by ComputerTurn for cube decisions *** Predefined rollout settings ** Extend ParsePosition() to handle some sort of syntax like [8/5 6/5] (meaning the position after that move). FIBS boardstyle 3 output might be nice, too. ** When rolling out multiple decisions, add p-values (a la the equity difference). ** Importing and exporting: *** Add missing export formats (FIBS oldmoves, .sgg, .pos). *** Make the .mat format identical to Jellyfish (things to check: beavers, resignations, "and the match"...) *** Check drops, beavers, resignations, implement Crawford and Jacoby etc. in SGG importing. *** Make option to output board only for, say, very bad moves. *** Consider rewriting export engine into one XML exporter combined with a number of XSL stylesheets. HTML/XHTML and text is a normal XSL stylesheet, and PDF/PS/TeX export is XSL-FO. *** Improve the LaTeX, PS and PDF output: **** Add commands to change paper size, board magnification, and number of move candidates listed in analysis. (gary) **** Show game and match statistics (if available) at end of game/match. **** Allow some option for selecting which boards to print (see the "FG" SGF property). ** Tutor mode *** save evaluation into pmr for doubles *** Warn about erroneous resignations. ** Make the command functions return an int, instead of void; that way commands which use other commands can provide sensible error handling. (gary) ** Kit Woolsey suggests adding an option for truncated rollouts: when truncating at n plies, take the mean of the (n-1) and n ply results. ** The "play" command is broken in "load command" scripts. Add subcommands like "play game", "play match" for finer control. (gary) * TTY interface: ** Handle "list game" and "list match". (oysteijo) ** Allow setting/editing commentary. ** Show take/drop analysis. ** Make DumpStatcontext work for money sessions. ** Make output*() functions wrap words, and pause before scrolling (as in gdb). * X interface: ** Does anybody still use the old Xlib (Ext) interface any more? If so, perhaps they are interested in maintaining it. If not, maybe it should be deprecated and eventually removed (all the recent GUI effort has concentrated on the GTK interface anyway). * GTK interface: ** Allow copy/paste and drag & drop of the board ID in the board window. ** Add a prompt and entry field to allow commands to be entered (replacing stdin). ** Disable the "stop" button when nothing is happening. ** Add option to exchange the dice after a single click move has been made. ** Make sure we apply GTK styles correctly: create a GtkRcStyle; set the background colour in the style and the flag indicating the background is set; call gtk_widget_modify_style; unref the style. This makes sure the style will survive across theme changes. ** Make usage() show the GDK and GTK options, if appropriate. ** Allow the cube text colour and the border specular/shiny parameters to be changed. ** Use a file selection widget for the socket in the player dialog. ** Would ShowList() look better if it used a text widget? (Wait for GTK+ 2.0.) ** Enable and disable the take/drop/redouble/agree/decline etc. buttons and menu items when appropriate. ** Make some of the information below the board optional (suggested by Jeremie Petit). This might be possible with a vertical pane widget, but it would be nice if there was a way to forbid children from being given _more_ than their requested size. This might require a subclass which overrides gtk_vpaned_motion and sets paned->min_position. ** Optionally merge the game record and annotation windows into one big paned window (suggested by Jeremie Petit). ** When a long string is displayed in the status bar, the main window grows to accommodate it -- not very pretty. A Layout or Viewport widget might be able to fix this. (Fixed under GTK+ 2.0.) ** Make GTKDumpStatcontext check psc->fMoves, psc->fDice and psc->fCube, and only output the relevant statistics. ** Make sure copy/paste works correctly everywhere. See . (Wait for GTK+ 2.0.) ** The edges of the board should cast shadows. Getting shadows on the board surface is fairly easy... getting shadows on the chequers is not. ** chequer movement *** right-blick bearoff tray for bearing off 4 men Also, if "allow dragging to illegal points" is disabled right clicking on the bearoff tray will hit the chequer in the home board. *** Problems with movement with dice 63, 42, or 21. See ** Annotations: it's not possible to write to the annotation window while playing ** Redesign some of the GUI. See mails from Albert Silver and others. ** The "take" hint-widget is not used. Either use it, or alter the current "double"-widget. ** Allow some way to specify long RNG seeds, and RNG parameters besides the seed (e.g. BBS modulus, user .so file) in the GUI. ** Make sure all the buttons in the game record window are also available as main menu commands. ** The sound setting options page isn't complete yet. ** Show player on roll on board, e.g., dice cup, arrow, or whatever ** Optionally show numbers based on who's on roll ** Show resignations on board. Currently we show a white cube with a number. Change this to showing, e.g., R1, or change to a white flag. ** the Race Theory window is way too large. Where does all that white space come from? ** Extend the Race Theory window with the output from "eval" for bearoff databases. ** Temperatur maps: *** save window geometry *** add Eval button/eval settings button (like in hint-dialog) *** show difference histogram *** export to html *** show eval settings (i.e., remember eval settings) ** Dialogs: *** Add buttons to the "help" window to look up the command in the manual, or execute it. Also use gtk_label_set_markup style markup in the help window. *** Make open/save/import/export dialogs larger to accommodate very long filenames *and* save the geometry) ** Deprecated functions: Once GTK+ 2.0 is released, remove references to the following deprecated functions: *** gdk_style_get_font *** gdk_style_set_font *** gdk_image_new_bitmap *** GtkText *** Save geometry for other windows: match statistics, hint, etc. * Bugs: ** The erroneous commands "set player both" and "set player both evaluation" give poor error messages. szSetCommand is not always set correctly, which leads to other bad errors (e.g. "set player 0 cubedecision rollout"). ** "help load sfdkljsdlf" gives a poor error message. ** Check that calls to GTKUpdateAnnotations() are made where necessary (e.g. the "annotate" commands probably should, and "set output ..."). ** The SGF loading (saving?) routines and CommandLoadCommands use stdio, which restarts system calls on signals. This means TTY interrupts and the GTK `stop' button don't work. (gary) ** There's no way to see the annotation on the opening move using the TTY interface. Changing ShowBoard() to display the starting position and then the annotation might work. ** The SGF lexer and parser are robust against illegal input, but the game reading functions in sgf.c are very fragile. They need to be fixed to detect invalid saved games. ** CommandCopy() should complain (or copy a board initialised to the starting position) if no game is being played. ** If "set turn" has been used during a game (so a player has two consecutive moves), then export to .mat format saves it incorrectly. ** Analysis with rollouts crashes under GTK. (There are problems with the rollout window -- do we really want a window in this case?) ** FIBS oldmoves format doesn't record how many points a resignation is for -- we should calculate it based on the score. ** "help next" (and "next ") are incomplete. ** GtkTexi should try to load images from the same directory as the XML file. ** It is possible to give some commands (e.g. "roll", "play") while in edit mode, which messes things up. ** make rollout as initial position work correctly. Currently, you have to perform two rollouts (one with player 0 on roll, and another with player 1 on roll) and average the two results. Instead gnubg should automagically perform both rollouts and do the averaging. ** the move number shown when exporting positions to text or html is -1 ** the rollout window is a bit to small ** try to eliminate dependency on pstopng and friends ** settings analysis thresholds doesn't seem to work (see http://mail.gnu.org/pipermail/bug-gnubg/2002-October/001313.html) (This is working as designed. The navigation commands are based on the annotations, which are not necessarily related to the analysis at all, e.g. if they were marked by a human. Perhaps we could add more navigation commands which are derived directly from the analysis, which would give the behaviour the user seems to want, and allow us to implement David Montgomery's suggestion of allowing negative error thresholds.) ** ShowBoard always shows "resigns" message as the player on roll, but it might have been the opponent. ** There is an extra column in the GTK+ player record list. I can't see anything wrong with the code -- perhaps it is a GTK+ bug? (That list widget is obselete, so presumably the problem will go away when we move to GTK+ 2.0.) ** it's not possible to drag the opponents chequers back if the player regret the hit; e.g., play one chequer to but the opponent on the bar. After this it's neither possible to drag the opponent's chequer back nor to drag your own chequer back. [2003-04-05: it's now possible to drag your own chequer back] ** when there is both a missed double and a chequer play error, gnubg skips the chequer play error when browsing for marked decisions only * Documentation: ** Complete the Texinfo manual. Perhaps for now, only things that are unlikely to change should be documented. ** The GNU coding standards say: "Don't just tell the reader what each feature can do -- say what jobs it is good for, and show how to use it for those jobs. Explain what is recommended usage, and what kinds of usage users should avoid." * Miscellaneous: ** Add more to http://www.gnu.org/software/gnubg/... -- perhaps pages to submit training data, an online evaluator like Monte Carlo, maybe even an entire game like Motif. ** Submit something to . ** Allow loading and saving weights to specify binary or ASCII format (perhaps load and save use binary, import and export use ASCII). ** Think about generating huge databases for CD-ROMs (we can get 1-sided databases for all chequers up to the 11 point, or 2-sided databases where both players have up to 11 chequers in the home board onto a CD-ROM). ** Add optional time rules, for tournament play when clocks are used. ** Add more optional feature tests to "make check" -- databases, X? ** Add import/export tests. ** Change the fConfirm ("are you sure you want to abort the game in progress") checks so that they _do_ ask when the game is over but the match is still in progress, and they _don't_ ask if a game has not been modified since it was last loaded/saved. ** Handle SGF variations. ** Allow loading/saving of compressed games/matches with zlib. ** Make the external player handle resignation decisions. ** Allow an option for illegal moves to be entered. ** Allow ~ and $ escapes in filenames (use wordexp()). ** Allow printing positions/games/matches/etc. (More or less the same as exporting to PostScript, but piped to a printing process.) (gary) *** Consider adding optional Ghostscript support -- Ghostscript can be built as a shared library/DLL (see doc/API.htm in the Ghostscript distribution). This would allow us to print to any device that Ghostscript supports, although the user would still have to figure out the Ghostscript configuration. Under MS Windows, the "mswinpr2" device (see doc/Devices.htm) outputs to MS Windows printer drivers, which could be useful. ** Add statistics of won/lost games/matches to the player records. (gary) ** Make sure the Nackgammon option works properly: record when loading/saving, make sure that InitBoard during analysis gets it right, etc. Similarly for Egyptian and Jacoby. ** If a MOVE_NORMAL is marked bad, it's not clear whether that means a bad move, or a costly missed double. ** Consider some kind of interface for recording live matches as quickly as possible. David Montgomery suggests showing a list of legal moves, ordered by equity, as soon as the dice roll is entered; hopefully the user will usually be able to select the top move and enter most of them very quickly. Entry of illegal moves should be possible, and it should be easy to move back to correct mistakes. ** Think about adding features which attempt to predict the time and standard error of rollouts in advance (see Chuck's work). (gary) ** Investigate more sophisticated training techniques, e.g. real simulated annealing (see the GNU Scientific Library, at ). ** It would be nice if you could mark positions and moves for "Rollout later". One could then look through a game and mark all positions of interest, set the rollouts off and come back later. ** Consider a Mozilla plug-in so that boards in generated HTML can be displayed efficiently. (gary) ** We provide access to non-deterministic dice from random.org. Add completely deterministic dice from noentropy.net as well. * Bugs believed fixed: ** Save the results of rollouts/evaluations performed with hint during playing * Obselete or problematic ideas (probably better not to implement these): ** Save partial input when TTY input is overwritten by an X command. The best way would be to unify what GetInput does and ProcessInput, with push/pop semantics for readline state. ** Nothing handles running out of memory gracefully. A solution could be to write a malloc() wrapper that (if malloc fails) first tries to free memory (e.g. flush the eval cache); if malloc still doesn't succeed, then print an error message and longjmp() to the main loop. When using the GNU C library, __malloc_hook can be used too (so we can intercept calls coming from Xlib, for instance). We shouldn't longjmp() out of the hook, though (it might confuse library functions). ** When using mmap()ed bearoff databases, add a signal handler for SIGBUS/SIGSEGV to trap I/O errors. Unfortunately, the semantics of errors on mmap()ed regions are the most unportable that can be imagined... ** Think about ways to improve event handling while "busy". We could save them somewhere and then use gdk_event_put() when we're ready. (gary) ** The following two items are probably redundant once ParsePosition is extended (see above). *** Add a command "show moves" which shows a list of legal moves, like hint does, but without evaluating them. *** Also "add move", to add a specific move to the list (e.g. "add move 8/5 6/5"). ** When 'Allow dragging to illegal input' is selected, Two consecutive Button 1 click will both use the 'first' dice. (This is working as intended -- to implement the opposite behaviour, see the item about exchanging dice under "GTK interface".) Local Variables: mode: outline End: gnubg-1.08.003/gtkprefs.c000644 001751 000024 00000371170 14610037046 014623 0ustar00pmstaff000000 000000 /* * Copyright (C) 2001-2003 Gary Wong * Copyright (C) 2002-2022 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "gtklocdefs.h" #include "backgammon.h" #include #include #include #include #include #include #include #include #include "drawboard.h" #include "gtkboard.h" #include "gtkgame.h" #include "gtkfile.h" #include "gtkprefs.h" #include "render.h" #include "renderprefs.h" #include "boarddim.h" #include "gtkwindows.h" #include "util.h" #if defined(USE_BOARD3D) #include "inc3d.h" #define NUM_NONPREVIEW_PAGES 2 #else #define NUM_NONPREVIEW_PAGES 1 #endif typedef enum { PI_DESIGN, PI_CHEQUERS0, PI_CHEQUERS1, PI_BOARD, PI_BORDER, PI_DICE0, PI_DICE1, PI_CUBE, NUM_PIXMAPS } pixmapindex; static GtkAdjustment *apadj[2], *paAzimuth, *paElevation, *apadjCoefficient[2], *apadjExponent[2], *apadjBoard[4], *padjRound; static GtkAdjustment *apadjDiceExponent[2], *apadjDiceCoefficient[2]; static GtkWidget *apwColour[2], *apwBoard[4], *pwWood, *pwWoodType, *pwHinges, *pwMoveIndicator, *pwWoodF, *pwNotebook, *pwLabels, *pwDynamicLabels; #if GTK_CHECK_VERSION(3,0,0) static GtkWidget *pwLightGrid; #else static GtkWidget *pwLightTable; #endif static GList *plBoardDesigns = NULL; #if defined(USE_BOARD3D) static GtkWidget *pwBoardType, *pwShowShadows, *pwAnimateRoll, *pwAnimateFlag, *pwDarkness, *lightLab, *darkLab, *pwLightSource, *pwDirectionalSource, *pwTestPerformance, *pmHingeCol, *frame3dOptions, *dtTextureTypeFrame, *pwPlanView, *pwBoardAngle, *pwSkewFactor, *skewLab, *anglelab, *pwBgTrays, *pwRoundPoints, *dtLightPositionFrame, *dtLightLevelsFrame, *pwRoundedEdges, *pwRoundedPiece, *pwFlatPiece, *pwTextureTopPiece, *pwTextureAllPiece; static GtkAdjustment *padjDarkness, *padjAccuracy, *padjBoardAngle, *padjSkewFactor, *padjLightPosX, *padjLightLevelAmbient, *padjLightLevelDiffuse, *padjLightLevelSpecular, *padjLightPosY, *padjLightPosZ, *padjDiceSize; static int redrawChange; static int pc3dDiceId[2], pcChequer2; #endif GtkWidget *pwPrevBoard; static renderdata rdPrefs; static GtkWidget *pwDesignAdd, *pwDesignRemove, *pwDesignUpdate; static GtkWidget *pwDesignImport, *pwDesignExport; static GtkWidget *pwDesignList; static GtkWidget *pwDesignAddAuthor; static GtkWidget *pwDesignAddTitle; static GtkListStore *designListStore; enum { NAME_COL = 0, DATA_COL = 1 }; static GtkWidget *apwDiceColour[2]; static GtkWidget *pwCubeColour; static GtkWidget *apwDiceDotColour[2]; static GtkWidget *apwDieColour[2]; static GtkWidget *apwDiceColourBox[2]; static int /*fWood, */ fUpdate; static void GetPrefs(renderdata * prd); static void AddPages(BoardData * bd, GtkWidget * pwNotebook, GList * plBoardDesigns); static void AddDesignRow(gpointer data, gpointer user_data); static void AddDesignRowIfNew(gpointer data, gpointer user_data); static GList *ParseBoardDesigns(const char *szFile, const int fDeletable); typedef struct { gchar *szTitle; /* Title of board design */ gchar *szAuthor; /* Name of author */ gchar *szBoardDesign; /* Command for setting board */ int fDeletable; /* is the board design deletable */ } boarddesign; static boarddesign *pbdeSelected = NULL, *pbdeModified; static int FindDesgin(GtkTreeModel * model, boarddesign * const pbde, GtkTreeIter * pIter) { if (gtk_tree_model_get_iter_first(model, pIter)) { do { boarddesign *testPtr; gtk_tree_model_get(model, pIter, DATA_COL, &testPtr, -1); if (testPtr == pbde) return TRUE; } while (gtk_tree_model_iter_next(model, pIter)); } return FALSE; } static void SelectRow(boarddesign * pbde) { GtkTreeIter iter; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(pwDesignList)); if (FindDesgin(model, pbde, &iter)) { /* Select row */ GtkTreePath *start, *end; GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pwDesignList)); gtk_tree_selection_select_iter(sel, &iter); /* Make sure selection is visible */ if (gtk_notebook_get_current_page(GTK_NOTEBOOK(pwNotebook)) == NUM_NONPREVIEW_PAGES && gtk_tree_view_get_visible_range(GTK_TREE_VIEW(pwDesignList), &start, &end)) { do { boarddesign *testPtr; GtkTreeIter testIter; gtk_tree_model_get_iter(model, &testIter, start); gtk_tree_model_get(model, &testIter, DATA_COL, &testPtr, -1); if (testPtr == pbde) return; /* Visible */ gtk_tree_path_next(start); } while (gtk_tree_path_compare(start, end) != 0); /* Scroll list so item is visible */ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(pwDesignList), gtk_tree_model_get_path(model, &iter), NULL, TRUE, 1, 0); } } } static void RemoveListDesign(boarddesign * pbdeSelected) { GtkTreeIter iter; if (FindDesgin(gtk_tree_view_get_model(GTK_TREE_VIEW(pwDesignList)), pbdeSelected, &iter)) gtk_list_store_remove(designListStore, &iter); } static GList * read_board_designs(void) { GList *plUser, *plSystem, *plFinal; gchar *sz; sz = BuildFilename("boards.xml"); plSystem = ParseBoardDesigns(sz, FALSE); g_free(sz); sz = g_build_filename(szHomeDirectory, "boards.xml", NULL); plUser = ParseBoardDesigns(sz, TRUE); g_free(sz); /* Add user list to system list (doesn't copy the user list) */ plFinal = g_list_concat(plSystem, plUser); return plFinal; } static void free_board_design(boarddesign * pbde, void *UNUSED(dummy)) { if (pbde == NULL) return; g_free(pbde->szTitle); g_free(pbde->szAuthor); g_free(pbde->szBoardDesign); g_free(pbde); } static void free_board_designs(GList * pl) { g_list_foreach(pl, (GFunc) free_board_design, NULL); g_list_free(pl); } static void ParsePreferences(boarddesign * pbde, renderdata * prdNew) { char *apch[2]; gchar *sz, *pch; *prdNew = rdPrefs; pch = sz = g_strdup(pbde->szBoardDesign); while (ParseKeyValue(&sz, apch)) RenderPreferencesParam(prdNew, apch[0], apch[1]); g_free(pch); } static boarddesign * FindDesign(GList * plBoardDesigns, renderdata * prdDesign) { int i; renderdata rdTest; for (i = 0; i < (int) g_list_length(plBoardDesigns); i++) { boarddesign *pbde = g_list_nth_data(plBoardDesigns, i); if (pbde) { ParsePreferences(pbde, &rdTest); if (PreferenceCompare(&rdTest, prdDesign)) return pbde; } } return NULL; } static void SetTitle(void) { /* Update dialog title to include design name + author */ boarddesign *pbde; char title[1024]; GtkWidget *pwDialog = gtk_widget_get_toplevel(pwPrevBoard); strcpy(title, _("GNU Backgammon - Appearance")); /* Search for current settings in designs */ strcat(title, ": "); pbde = FindDesign(plBoardDesigns, &rdPrefs); if (pbde) { char design[1024]; SelectRow(pbde); gtk_widget_set_sensitive(GTK_WIDGET(pwDesignRemove), pbde->fDeletable); sprintf(design, "%s by %s (%s)", pbde->szTitle, pbde->szAuthor, pbde->fDeletable ? _("user defined") : _("predefined")); strcat(title, design); pbdeSelected = pbde; gtk_widget_set_sensitive(GTK_WIDGET(pwDesignAdd), FALSE); gtk_widget_set_sensitive(pwDesignUpdate, FALSE); } else { strcat(title, _("Custom design")); gtk_widget_set_sensitive(GTK_WIDGET(pwDesignAdd), TRUE); if (gtk_widget_is_sensitive(pwDesignRemove)) { gtk_widget_set_sensitive(pwDesignUpdate, TRUE); gtk_widget_set_sensitive(pwDesignRemove, FALSE); pbdeModified = pbdeSelected; } pbdeSelected = 0; } gtk_window_set_title(GTK_WINDOW(pwDialog), title); } extern void UpdatePreview(void) { if (!fUpdate) return; { BoardData *bd = BOARD(pwPrevBoard)->board_data; #if defined(USE_BOARD3D) BoardData3d *bd3d = bd->bd3d; renderdata *prd = bd->rd; if (display_is_3d(prd)) { /* Sort out chequer and dice special settings */ if (prd->ChequerMat[0].textureInfo != prd->ChequerMat[1].textureInfo) { /* Make both chequers have the same texture */ prd->ChequerMat[1].textureInfo = prd->ChequerMat[0].textureInfo; prd->ChequerMat[1].pTexture = prd->ChequerMat[0].pTexture; UpdateColPreview(pcChequer2); /* Change to main area and recreate piece display lists */ MakeCurrent3d(bd3d); preDraw3d(bd, bd3d, prd); } if (prd->afDieColour3d[0] && !MaterialCompare(&prd->DiceMat[0], &prd->ChequerMat[0])) { memcpy(&prd->DiceMat[0], &prd->ChequerMat[0], sizeof(Material)); prd->DiceMat[0].textureInfo = 0; prd->DiceMat[0].pTexture = 0; UpdateColPreview(pc3dDiceId[0]); } if (prd->afDieColour3d[1] && !MaterialCompare(&prd->DiceMat[1], &prd->ChequerMat[1])) { memcpy(&prd->DiceMat[1], &prd->ChequerMat[1], sizeof(Material)); prd->DiceMat[1].textureInfo = 0; prd->DiceMat[1].pTexture = 0; UpdateColPreview(pc3dDiceId[1]); } gtk_widget_set_sensitive(GTK_WIDGET(dtTextureTypeFrame), (prd->ChequerMat[0].textureInfo != NULL)); } else #endif { /* Create new 2d pixmaps */ board_free_pixmaps(bd); GetPrefs(&rdPrefs); board_create_pixmaps(pwPrevBoard, bd); } } SetTitle(); gtk_widget_queue_draw(pwPrevBoard); } static void DieColourChanged(GtkWidget * pw, gpointer pf) { int f = GPOINTER_TO_INT(pf); int set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw)); gtk_widget_set_sensitive(apwDiceColourBox[f], !set); if (!fUpdate) return; #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; bd->rd->afDieColour3d[f] = set; memcpy(&bd->rd->DiceMat[f], bd->rd->afDieColour3d[f] ? &bd->rd->ChequerMat[f] : &bd->rd->DiceMat[f], sizeof(Material)); bd->rd->DiceMat[f].textureInfo = 0; bd->rd->DiceMat[f].pTexture = 0; UpdateColPreview(pc3dDiceId[f]); } #endif UpdatePreview(); } static void option_changed(GtkWidget * UNUSED(widget), GtkWidget * UNUSED(pw)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; if (!fUpdate) return; { #if defined(USE_BOARD3D) BoardData3d *bd3d = bd->bd3d; renderdata *prd = bd->rd; if (display_is_3d(prd)) { ClearTextures(bd3d); GetPrefs(&rdPrefs); GetTextures(bd3d, prd); preDraw3d(bd, bd3d, prd); } else #endif { board_free_pixmaps(bd); board_create_pixmaps(pwPrevBoard, bd); } } UpdatePreview(); } #if defined(USE_BOARD3D) static void redraw_changed(GtkWidget * UNUSED(widget), GtkWidget ** UNUSED(ppw)) { /* Update 3D colour previews */ if (!fUpdate) return; GetPrefs(&rdPrefs); SetPreviewLightLevel(rdPrefs.lightLevels); UpdateColPreviews(); } static void DiceSizeChanged(GtkWidget * UNUSED(pw)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; bd->rd->diceSize = (float) gtk_adjustment_get_value(padjDiceSize); if (DiceTooClose(bd->bd3d, bd->rd)) setDicePos(bd, bd->bd3d); option_changed(0, 0); } static void HingeChanged(GtkWidget * UNUSED(pw)) { gtk_widget_set_sensitive(pmHingeCol, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwHinges))); option_changed(0, 0); } static GtkWidget * ChequerPrefs3d(BoardData * bd) { GtkWidget *pw, *pwx, *vbox, *pwhbox, *dtPieceTypeFrame; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 4); pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Chequer 0:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->ChequerMat[0], DF_VARIABLE_OPACITY, TT_PIECE), FALSE, FALSE, TT_PIECE); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Chequer 1:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->ChequerMat[1], DF_VARIABLE_OPACITY, TT_PIECE | TT_DISABLED), FALSE, FALSE, TT_PIECE); pcChequer2 = GetPreviewId(); dtPieceTypeFrame = gtk_frame_new(_("Piece type")); gtk_container_set_border_width(GTK_CONTAINER(dtPieceTypeFrame), 4); gtk_box_pack_start(GTK_BOX(pw), dtPieceTypeFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(dtPieceTypeFrame), vbox); pwRoundedPiece = gtk_radio_button_new_with_label(NULL, _("Rounded disc")); gtk_widget_set_tooltip_text(pwRoundedPiece, _("Piece will be a rounded disc")); gtk_box_pack_start(GTK_BOX(vbox), pwRoundedPiece, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwRoundedPiece), (bd->rd->pieceType == PT_ROUNDED)); pwFlatPiece = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwRoundedPiece), _("Flat edged disc")); gtk_widget_set_tooltip_text(pwFlatPiece, _("Piece will be a flat sided disc")); gtk_box_pack_start(GTK_BOX(vbox), pwFlatPiece, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwFlatPiece), (bd->rd->pieceType == PT_FLAT)); g_signal_connect(G_OBJECT(pwFlatPiece), "toggled", G_CALLBACK(option_changed), bd); dtTextureTypeFrame = gtk_frame_new(_("Texture type")); gtk_container_set_border_width(GTK_CONTAINER(dtTextureTypeFrame), 4); gtk_box_pack_start(GTK_BOX(pw), dtTextureTypeFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(dtTextureTypeFrame), vbox); gtk_widget_set_sensitive(GTK_WIDGET(dtTextureTypeFrame), (bd->rd->ChequerMat[0].textureInfo != NULL)); pwTextureAllPiece = gtk_radio_button_new_with_label(NULL, _("All of piece")); gtk_widget_set_tooltip_text(pwTextureAllPiece, _("All of piece will be textured")); gtk_box_pack_start(GTK_BOX(vbox), pwTextureAllPiece, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwTextureAllPiece), (bd->rd->pieceTextureType == PTT_ALL)); pwTextureTopPiece = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwTextureAllPiece), _("Top Only")); gtk_widget_set_tooltip_text(pwTextureTopPiece, _("Only top of piece will be textured")); gtk_box_pack_start(GTK_BOX(vbox), pwTextureTopPiece, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwTextureTopPiece), (bd->rd->pieceTextureType == PTT_TOP)); g_signal_connect(G_OBJECT(pwTextureTopPiece), "toggled", G_CALLBACK(option_changed), bd); return pwx; } static GtkWidget * DicePrefs3d(BoardData * bd, int f) { GtkWidget *pw, *pwhbox; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 4); pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); apwDieColour[f] = gtk_check_button_new_with_label(_("Die colour same " "as chequer colour")); gtk_box_pack_start(GTK_BOX(pw), apwDieColour[f], FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apwDieColour[f]), bd->rd->afDieColour3d[f]); gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Die colour:")), FALSE, FALSE, 4); apwDiceColourBox[f] = gtk_colour_picker_new3d(&bd->rd->DiceMat[f], DF_VARIABLE_OPACITY, TT_NONE); pc3dDiceId[f] = GetPreviewId(); gtk_widget_set_sensitive(GTK_WIDGET(apwDiceColourBox[f]), !bd->rd->afDieColour3d[f]); gtk_box_pack_start(GTK_BOX(pwhbox), apwDiceColourBox[f], FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Pip colour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->DiceDotMat[f], DF_FULL_ALPHA, TT_NONE), FALSE, FALSE, TT_PIECE); g_signal_connect(G_OBJECT(apwDieColour[f]), "toggled", G_CALLBACK(DieColourChanged), GINT_TO_POINTER(f)); return pwx; } static GtkWidget * CubePrefs3d(BoardData * bd) { GtkWidget *pw, *pwhbox; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 4); pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Cube colour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->CubeMat, DF_NO_ALPHA, TT_NONE), FALSE, FALSE, TT_PIECE); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Text colour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->CubeNumberMat, DF_FULL_ALPHA, TT_NONE), FALSE, FALSE, TT_PIECE); return pwx; } static GtkWidget * BoardPage3d(BoardData * bd) { GtkWidget *pw, *pwhbox; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 4); pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Background\ncolour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->BaseMat, DF_NO_ALPHA, TT_GENERAL), FALSE, FALSE, TT_PIECE); pwBgTrays = gtk_check_button_new_with_label(_("Show background in bear-off trays")); gtk_widget_set_tooltip_text(pwBgTrays, _("If unset the bear-off trays will be drawn with the board colour")); gtk_box_pack_start(GTK_BOX(pw), pwBgTrays, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwBgTrays), bd->rd->bgInTrays); g_signal_connect(G_OBJECT(pwBgTrays), "toggled", G_CALLBACK(option_changed), 0); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("First\npoint colour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->PointMat[0], DF_FULL_ALPHA, TT_GENERAL), FALSE, FALSE, TT_PIECE); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Second\npoint colour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->PointMat[1], DF_FULL_ALPHA, TT_GENERAL), FALSE, FALSE, TT_PIECE); pwRoundPoints = gtk_check_button_new_with_label(_("Rounded points")); gtk_widget_set_tooltip_text(pwRoundPoints, _("Display the points with a rounded end")); gtk_box_pack_start(GTK_BOX(pw), pwRoundPoints, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwRoundPoints), bd->rd->roundedPoints); g_signal_connect(G_OBJECT(pwRoundPoints), "toggled", G_CALLBACK(option_changed), 0); return pwx; } static GtkWidget * BorderPage3d(BoardData * bd) { GtkWidget *pw, *pwhbox; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 4); pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Border colour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->BoxMat, DF_FULL_ALPHA, TT_GENERAL), FALSE, FALSE, TT_PIECE); pwRoundedEdges = gtk_check_button_new_with_label(_("Rounded board edges")); gtk_widget_set_tooltip_text(pwRoundedEdges, _("Toggle rounded or square edges to the board")); gtk_box_pack_start(GTK_BOX(pw), pwRoundedEdges, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwRoundedEdges), bd->rd->roundedEdges); g_signal_connect(G_OBJECT(pwRoundedEdges), "toggled", G_CALLBACK(option_changed), 0); pwHinges = gtk_check_button_new_with_label(_("Show hinges")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwHinges), bd->rd->fHinges3d); gtk_box_pack_start(GTK_BOX(pw), pwHinges, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pwHinges), "toggled", G_CALLBACK(HingeChanged), NULL); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Hinge colour:")), FALSE, FALSE, 4); pmHingeCol = gtk_colour_picker_new3d(&bd->rd->HingeMat, DF_NO_ALPHA, TT_HINGE); gtk_widget_set_sensitive(pmHingeCol, bd->rd->fHinges3d); gtk_box_pack_start(GTK_BOX(pwhbox), pmHingeCol, FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Point number\ncolour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->PointNumberMat, DF_FULL_ALPHA, TT_NONE), FALSE, FALSE, TT_PIECE); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Background\ncolour:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_colour_picker_new3d(&bd->rd->BackGroundMat, DF_NO_ALPHA, TT_GENERAL), FALSE, FALSE, TT_PIECE); return pwx; } #endif extern void gtk_color_button_get_array(GtkColorButton * button, float array[4]) { #if GTK_CHECK_VERSION(3,4,0) GdkRGBA color; gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(button), &color); array[0] = (float) color.red; array[1] = (float) color.green; array[2] = (float) color.blue; array[3] = (float) color.alpha; #else GdkColor color; guint16 alpha; gtk_color_button_get_color(button, &color); alpha = gtk_color_button_get_alpha(button); array[0] = (float) color.red / 65535.0f; array[1] = (float) color.green / 65535.0f; array[2] = (float) color.blue / 65535.0f; array[3] = (float) alpha / 65535.0f; #endif } extern void gtk_color_button_set_from_array(GtkColorButton * button, float const colarray[4]) { #if GTK_CHECK_VERSION(3,4,0) GdkRGBA color; color.red = (gdouble) colarray[0]; color.green = (gdouble) colarray[1]; color.blue = (gdouble) colarray[2]; color.alpha = (gdouble) colarray[3]; gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(button), &color); #else GdkColor color; guint16 alpha; color.red = (colarray[0] == 1.0f) ? 0xffff : (guint16) (colarray[0] * 65536); color.green = (colarray[1] == 1.0f) ? 0xffff : (guint16) (colarray[1] * 65536); color.blue = (colarray[2] == 1.0f) ? 0xffff : (guint16) (colarray[2] * 65536); alpha = (colarray[3] == 1.0f) ? 0xffff : (guint16) (colarray[3] * 65536); gtk_color_button_set_color(button, &color); gtk_color_button_set_alpha(button, alpha); #endif } static GtkWidget * ChequerPrefs(BoardData * bd, int f) { GtkWidget *pw, *pwhbox, *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 0); pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); apadj[f] = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->arRefraction[f], 1.0, 3.5, 0.1, 1.0, 0.0)); apadjCoefficient[f] = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->arCoefficient[f], 0.0, 1.0, 0.1, 0.1, 0.0)); apadjExponent[f] = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->arExponent[f], 1.0, 100.0, 1.0, 10.0, 0.0)); gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Colour:")), FALSE, FALSE, 4); apwColour[f] = gtk_color_button_new(); g_object_set(G_OBJECT(apwColour[f]), "use-alpha", TRUE, NULL); g_signal_connect(G_OBJECT(apwColour[f]), "color-set", UpdatePreview, NULL); gtk_box_pack_start(GTK_BOX(pwhbox), apwColour[f], TRUE, TRUE, 4); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwColour[f]), bd->rd->aarColour[f]); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Refractive Index:")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_end(GTK_BOX(pwhbox), gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, apadj[f]), TRUE, TRUE, 4); #else gtk_box_pack_end(GTK_BOX(pwhbox), gtk_hscale_new(apadj[f]), TRUE, TRUE, 4); #endif g_signal_connect(G_OBJECT(apadj[f]), "value-changed", G_CALLBACK(UpdatePreview), NULL); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Dull")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwhbox), gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, apadjCoefficient[f]), TRUE, TRUE, 4); #else gtk_box_pack_start(GTK_BOX(pwhbox), gtk_hscale_new(apadjCoefficient[f]), TRUE, TRUE, 4); #endif gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Shiny")), FALSE, FALSE, 4); g_signal_connect(G_OBJECT(apadjCoefficient[f]), "value-changed", G_CALLBACK(UpdatePreview), NULL); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Diffuse")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwhbox), gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, apadjExponent[f]), TRUE, TRUE, 4); #else gtk_box_pack_start(GTK_BOX(pwhbox), gtk_hscale_new(apadjExponent[f]), TRUE, TRUE, 4); #endif gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Specular")), FALSE, FALSE, 4); g_signal_connect(G_OBJECT(apadjExponent[f]), "value-changed", G_CALLBACK(UpdatePreview), NULL); if (f == 0) { GtkWidget *pwScale, *pwBox; padjRound = GTK_ADJUSTMENT(gtk_adjustment_new(1.0f - bd->rd->rRound, 0, 1, 0.1, 0.1, 0)); g_signal_connect(G_OBJECT(padjRound), "value-changed", G_CALLBACK(UpdatePreview), NULL); #if GTK_CHECK_VERSION(3,0,0) pwScale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjRound); #else pwScale = gtk_hscale_new(padjRound); #endif gtk_widget_set_size_request(pwScale, 100, -1); gtk_scale_set_draw_value(GTK_SCALE(pwScale), FALSE); gtk_scale_set_digits(GTK_SCALE(pwScale), 2); #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Chequer shape:")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pw), pwBox, FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) pwBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Flat")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwBox), pwScale, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwBox), gtk_label_new(_("Rounded")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pw), pwBox, FALSE, FALSE, 4); } return pwx; } static GtkWidget * DicePrefs(BoardData * bd, int f) { GtkWidget *pw, *pwhbox; GtkWidget *pwvbox; GtkWidget *pwFrame; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 4); pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); /* frame with colour selections for the dice */ pwFrame = gtk_frame_new(_("Die colour")); gtk_box_pack_start(GTK_BOX(pw), pwFrame, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(pwFrame), pwvbox); apwDieColour[f] = gtk_check_button_new_with_label(_("Die colour same " "as chequer colour")); gtk_box_pack_start(GTK_BOX(pwvbox), apwDieColour[f], FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apwDieColour[f]), bd->rd->afDieColour[f]); #if GTK_CHECK_VERSION(3,0,0) apwDiceColourBox[f] = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else apwDiceColourBox[f] = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), apwDiceColourBox[f], FALSE, FALSE, 0); apadjDiceCoefficient[f] = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->arDiceCoefficient[f], 0.0, 1.0, 0.1, 0.1, 0.0)); apadjDiceExponent[f] = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->arDiceExponent[f], 1.0, 100.0, 1.0, 10.0, 0.0)); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(apwDiceColourBox[f]), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Die colour:")), FALSE, FALSE, 4); apwDiceColour[f] = gtk_color_button_new(); g_signal_connect(G_OBJECT(apwDiceColour[f]), "color-set", UpdatePreview, NULL); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwDiceColour[f]), bd->rd->aarDiceColour[f]); gtk_box_pack_start(GTK_BOX(pwhbox), apwDiceColour[f], TRUE, TRUE, 4); /* Vertical space */ #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(apwDiceColourBox[f]), pwhbox, FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(apwDiceColourBox[f]), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Dull")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwhbox), gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, apadjDiceCoefficient[f]), TRUE, TRUE, 4); #else gtk_box_pack_start(GTK_BOX(pwhbox), gtk_hscale_new(apadjDiceCoefficient[f]), TRUE, TRUE, 4); #endif gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Shiny")), FALSE, FALSE, 4); g_signal_connect(G_OBJECT(apadjDiceCoefficient[f]), "value-changed", G_CALLBACK(UpdatePreview), NULL); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(apwDiceColourBox[f]), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Diffuse")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwhbox), gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, apadjDiceExponent[f]), TRUE, TRUE, 4); #else gtk_box_pack_start(GTK_BOX(pwhbox), gtk_hscale_new(apadjDiceExponent[f]), TRUE, TRUE, 4); #endif gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Specular")), FALSE, FALSE, 4); g_signal_connect(G_OBJECT(apadjDiceExponent[f]), "value-changed", G_CALLBACK(UpdatePreview), NULL); gtk_widget_set_sensitive(GTK_WIDGET(apwDiceColourBox[f]), !bd->rd->afDieColour[f]); /* colour of dot on dice */ #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Pip colour:")), FALSE, FALSE, 4); apwDiceDotColour[f] = gtk_color_button_new(); g_signal_connect(G_OBJECT(apwDiceDotColour[f]), "color-set", UpdatePreview, NULL); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwDiceDotColour[f]), bd->rd->aarDiceDotColour[f]); gtk_box_pack_start(GTK_BOX(pwhbox), apwDiceDotColour[f], TRUE, TRUE, 4); g_signal_connect(G_OBJECT(apwDieColour[f]), "toggled", G_CALLBACK(DieColourChanged), GINT_TO_POINTER(f)); return pwx; } static GtkWidget * CubePrefs(BoardData * bd) { GtkWidget *pw; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); #else pwx = gtk_hbox_new(FALSE, 4); pw = gtk_vbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pw), pwx, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwx), gtk_label_new(_("Cube colour:")), FALSE, FALSE, 0); pwCubeColour = gtk_color_button_new(); g_signal_connect(G_OBJECT(pwCubeColour), "color-set", UpdatePreview, NULL); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(pwCubeColour), bd->rd->arCubeColour); gtk_box_pack_start(GTK_BOX(pwx), pwCubeColour, TRUE, TRUE, 0); /* FIXME add cube text colour settings */ return pw; } static GtkWidget * BoardPage(BoardData * bd) { GtkWidget *pw, *pwhbox; float ar[4]; int i, j; GtkWidget *pwx; static const char *asz[4] = { N_("Background colour:"), NULL, N_("First point colour:"), N_("Second point colour:"), }; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); for (j = 0; j < 4; j++) { if (j == 1) continue; /* colour 1 unused */ apadjBoard[j] = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->aSpeckle[j] / 128.0, 0, 1, 0.1, 0.1, 0)); for (i = 0; i < 4; i++) ar[i] = bd->rd->aanBoardColour[j][i] / 255.0f; #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(gettext(asz[j])), FALSE, FALSE, 4); apwBoard[j] = gtk_color_button_new(); g_signal_connect(G_OBJECT(apwBoard[j]), "color-set", UpdatePreview, NULL); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwBoard[j]), ar); gtk_box_pack_start(GTK_BOX(pwhbox), apwBoard[j], TRUE, TRUE, 4); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Smooth")), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwhbox), gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, apadjBoard[j]), TRUE, TRUE, 4); #else gtk_box_pack_start(GTK_BOX(pwhbox), gtk_hscale_new(apadjBoard[j]), TRUE, TRUE, 4); #endif gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Speckled")), FALSE, FALSE, 4); g_signal_connect(G_OBJECT(apadjBoard[j]), "value-changed", G_CALLBACK(UpdatePreview), NULL); } return pwx; } static void ToggleWood(GtkWidget * pw, BoardData * UNUSED(bd)) { int fWood; fWood = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw)); gtk_widget_set_sensitive(pwWoodType, fWood); gtk_widget_set_sensitive(apwBoard[1], !fWood); } static GtkWidget * BorderPage(BoardData * bd) { GtkWidget *pw; float ar[4]; int i; static const char *aszWood[] = { N_("Alder"), N_("Ash"), N_("Basswood"), N_("Beech"), N_("Cedar"), N_("Ebony"), N_("Fir"), N_("Maple"), N_("Oak"), N_("Pine"), N_("Redwood"), N_("Walnut"), N_("Willow") }; woodtype bw; GtkWidget *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(pw), pwWood = gtk_radio_button_new_with_label(NULL, _("Wooden")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pw), pwWoodType = gtk_combo_box_text_new(), FALSE, FALSE, 4); for (bw = 0; bw < WOOD_PAINT; bw++) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pwWoodType), gettext(aszWood[bw])); if (bd->rd->wt == WOOD_PAINT) gtk_combo_box_set_active(GTK_COMBO_BOX(pwWoodType), 0); else gtk_combo_box_set_active(GTK_COMBO_BOX(pwWoodType), bd->rd->wt); g_signal_connect(G_OBJECT(pwWoodType), "changed", G_CALLBACK(UpdatePreview), NULL); gtk_box_pack_start(GTK_BOX(pw), pwWoodF = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwWood), _("Painted")), FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->rd->wt != WOOD_PAINT ? pwWood : pwWoodF), TRUE); for (i = 0; i < 3; i++) ar[i] = bd->rd->aanBoardColour[1][i] / 255.0f; ar[3] = 0.0f; apwBoard[1] = gtk_color_button_new(); g_signal_connect(G_OBJECT(apwBoard[1]), "color-set", UpdatePreview, NULL); gtk_box_pack_start(GTK_BOX(pw), apwBoard[1], FALSE, FALSE, 0); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwBoard[1]), ar); pwHinges = gtk_check_button_new_with_label(_("Show hinges")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwHinges), bd->rd->fHinges); gtk_box_pack_start(GTK_BOX(pw), pwHinges, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pwHinges), "toggled", G_CALLBACK(UpdatePreview), NULL); g_signal_connect(G_OBJECT(pwWood), "toggled", G_CALLBACK(ToggleWood), bd); g_signal_connect(G_OBJECT(pwWood), "toggled", G_CALLBACK(UpdatePreview), NULL); gtk_widget_set_sensitive(pwWoodType, bd->rd->wt != WOOD_PAINT); gtk_widget_set_sensitive(apwBoard[1], bd->rd->wt == WOOD_PAINT); return pwx; } static void BoardPrefsOK(GtkWidget * pw, GtkWidget * mainBoard) { BoardData *bd = BOARD(mainBoard)->board_data; GetPrefs(&rdPrefs); #if defined(USE_BOARD3D) if (widget3dValid) { redrawChange = FALSE; } if (display_is_3d(&rdPrefs)) { /* Delete old objects */ ClearTextures(bd->bd3d); } else #endif { if (bd->diceShown == DICE_ON_BOARD && bd->x_dice[0] <= 0) { /* Make sure dice are visible */ RollDice2d(bd); } } board_free_pixmaps(bd); rdPrefs.fDiceArea = bd->rd->fDiceArea; rdPrefs.fShowGameInfo = bd->rd->fShowGameInfo; rdPrefs.nSize = bd->rd->nSize; /* Copy new settings to main board */ *bd->rd = rdPrefs; #if defined(USE_BOARD3D) { BoardData3d *bd3d = bd->bd3d; renderdata *prd = bd->rd; DisplayCorrectBoardType(bd, bd3d, prd); SetSwitchModeMenuText(); if (display_is_3d(prd)) { MakeCurrent3d(bd3d); GetTextures(bd3d, prd); preDraw3d(bd, bd3d, prd); ShowFlag3d(bd, bd3d, prd); if (bd->diceShown == DICE_ON_BOARD) setDicePos(bd, bd3d); /* Make sure dice appear ok */ } } #endif board_create_pixmaps(mainBoard, bd); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); /* Make sure chequers correct below board */ gtk_widget_queue_draw(bd->table); UserCommand("save settings"); } static void WorkOut2dLight(renderdata * prd) { prd->arLight[2] = sinf((float)gtk_adjustment_get_value(paElevation) / 180.f * F_PI); prd->arLight[0] = cosf((float)gtk_adjustment_get_value(paAzimuth) / 180.f * F_PI) * sqrtf(1.0f - prd->arLight[2] * prd->arLight[2]); prd->arLight[1] = sinf((float)gtk_adjustment_get_value(paAzimuth) / 180.f * F_PI) * sqrtf(1.0f - prd->arLight[2] * prd->arLight[2]); } static void LightChanged2d(GtkWidget * UNUSED(pwWidget), void *UNUSED(data)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; if (!fUpdate) return; WorkOut2dLight(bd->rd); board_free_pixmaps(bd); board_create_pixmaps(pwPrevBoard, bd); UpdatePreview(); } static void LabelsToggled(GtkWidget * UNUSED(pwWidget), void *UNUSED(data)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; int showLabels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwLabels)); gtk_widget_set_sensitive(GTK_WIDGET(pwDynamicLabels), showLabels); /* Update preview */ if (!fUpdate) return; bd->rd->fLabels = showLabels; bd->rd->fDynamicLabels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwDynamicLabels)); #if defined(USE_BOARD3D) if (display_is_2d(bd->rd)) #endif { board_free_pixmaps(bd); board_create_pixmaps(pwPrevBoard, bd); } option_changed(0, 0); } static void MoveIndicatorToggled(GtkWidget * UNUSED(pwWidget), void *UNUSED(data)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; /* Update preview */ if (!fUpdate) return; bd->rd->showMoveIndicator = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwMoveIndicator)); #if defined(USE_BOARD3D) if (display_is_2d(bd->rd)) #endif { board_free_pixmaps(bd); board_create_pixmaps(pwPrevBoard, bd); } UpdatePreview(); } #if defined(USE_BOARD3D) static void toggle_display_type(GtkWidget * widget, BoardData * bd) { GList *pl; int i; int state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); int numPages; numPages = g_list_length(pl = gtk_container_get_children(GTK_CONTAINER(GTK_NOTEBOOK(pwNotebook)))); g_list_free(pl); /* Show pages with correct 2D/3D settings */ for (i = numPages - 1; i >= NUM_NONPREVIEW_PAGES; i--) gtk_notebook_remove_page(GTK_NOTEBOOK(pwNotebook), i); gtk_notebook_remove_page(GTK_NOTEBOOK(pwNotebook), 1); rdPrefs.fDisplayType = state ? DT_3D : DT_2D; if (display_is_3d(&rdPrefs)) { updateDiceOccPos(bd, bd->bd3d); } else { board_free_pixmaps(bd); board_create_pixmaps(pwPrevBoard, bd); } AddPages(bd, pwNotebook, plBoardDesigns); gtk_widget_set_sensitive(pwTestPerformance, (display_is_3d(&rdPrefs))); #if defined(USE_BOARD3D) DisplayCorrectBoardType(bd, bd->bd3d, bd->rd); #endif /* Make sure everything is correctly sized */ gtk_widget_queue_resize(gtk_widget_get_toplevel(pwNotebook)); SetTitle(); } static void toggle_show_shadows(GtkWidget * widget, int init) { int set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(lightLab, set); gtk_widget_set_sensitive(pwDarkness, set); gtk_widget_set_sensitive(darkLab, set); if (set && init != -1) GTKShowWarning(WARN_SET_SHADOWS, widget); option_changed(0, 0); } static void toggle_planview(GtkWidget * widget, GtkWidget * UNUSED(pw)) { int set = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(pwSkewFactor, !set); gtk_widget_set_sensitive(pwBoardAngle, !set); gtk_widget_set_sensitive(skewLab, !set); gtk_widget_set_sensitive(anglelab, !set); option_changed(0, 0); } static void DoTestPerformance(GtkWidget * pw, GtkWidget * board) { BoardData *bd = BOARD(board)->board_data; char str[255]; char *msg; float fps; GTKSetCurrentParent(pw); if (!GetInputYN(_("Save settings and test 3D performance for 3 seconds?"))) return; BoardPrefsOK(pw, board); ProcessEvents(); fps = TestPerformance3d(bd); if (fps >= 120) msg = _("3D performance is very good.\n"); else if (fps >= 60) msg = _("3D performance is good.\n"); else if (fps >= 30) msg = _("3D performance is ok.\n"); else if (fps >= 15) msg = _("3D performance is poor.\n"); else msg = _("3D performance is very poor.\n"); sprintf(str, _("%s\n(%.1f frames per second)\n"), msg, fps); outputl(str); if (fps <= 20) { /* Give some advice, hopefully to speed things up */ if (bd->rd->showShadows) outputl(_("Disable shadows to improve performance")); } outputx(); } #endif static void Add2dLightOptions(GtkWidget * pwx, renderdata * prd) { float rAzimuth, rElevation; GtkWidget *pScale; #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pw; pwLightGrid = gtk_grid_new(); gtk_box_pack_start(GTK_BOX(pwx), pwLightGrid, FALSE, FALSE, 4); gtk_grid_attach(GTK_GRID(pwLightGrid), pw = gtk_label_new(_("Light azimuth")), 0, 0, 1, 1); gtk_widget_set_halign(pw, GTK_ALIGN_START); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 2); gtk_widget_set_margin_bottom(pw, 2); gtk_grid_attach(GTK_GRID(pwLightGrid), pw = gtk_label_new(_("Light elevation")), 0, 1, 1, 1); gtk_widget_set_halign(pw, GTK_ALIGN_START); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 2); gtk_widget_set_margin_bottom(pw, 2); #else pwLightTable = gtk_table_new(2, 2, FALSE); gtk_box_pack_start(GTK_BOX(pwx), pwLightTable, FALSE, FALSE, 4); gtk_table_attach(GTK_TABLE(pwLightTable), gtk_label_new(_("Light azimuth")), 0, 1, 0, 1, 0, 0, 4, 2); gtk_table_attach(GTK_TABLE(pwLightTable), gtk_label_new(_("Light elevation")), 0, 1, 1, 2, 0, 0, 4, 2); #endif rElevation = asinf(prd->arLight[2]) * 180.0f / F_PI; { float s = sqrtf(1.0f - prd->arLight[2] * prd->arLight[2]); if (s == 0) rAzimuth = 0; else { float ac = acosf(prd->arLight[0] / s); if (ac == 0) rAzimuth = 0; else rAzimuth = ac * 180.0f / F_PI; } } if (prd->arLight[1] < 0) rAzimuth = 360 - rAzimuth; paAzimuth = GTK_ADJUSTMENT(gtk_adjustment_new(rAzimuth, 0.0, 360.0, 1.0, 30.0, 0.0)); #if GTK_CHECK_VERSION(3,0,0) pScale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, paAzimuth); #else pScale = gtk_hscale_new(paAzimuth); #endif gtk_widget_set_size_request(pScale, 150, -1); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwLightGrid), pScale, 1, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pScale, 4); gtk_widget_set_margin_end(pScale, 4); #else gtk_widget_set_margin_left(pScale, 4); gtk_widget_set_margin_right(pScale, 4); #endif gtk_widget_set_margin_top(pScale, 2); gtk_widget_set_margin_bottom(pScale, 2); #else gtk_table_attach(GTK_TABLE(pwLightTable), pScale, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 4, 2); #endif g_signal_connect(G_OBJECT(paAzimuth), "value-changed", G_CALLBACK(LightChanged2d), NULL); paElevation = GTK_ADJUSTMENT(gtk_adjustment_new(rElevation, 0.0, 90.0, 1.0, 10.0, 0.0)); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwLightGrid), pw = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, paElevation), 1, 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 2); gtk_widget_set_margin_bottom(pw, 2); #else gtk_table_attach(GTK_TABLE(pwLightTable), gtk_hscale_new(paElevation), 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 4, 2); #endif g_signal_connect(G_OBJECT(paElevation), "value-changed", G_CALLBACK(LightChanged2d), NULL); /* FIXME add settings for ambient light */ } #if defined(USE_BOARD3D) static GtkWidget * LightingPage(BoardData * bd) { GtkWidget *dtBox, *pwx; #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); dtBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); #else pwx = gtk_hbox_new(FALSE, 0); dtBox = gtk_vbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwx), dtBox, FALSE, FALSE, 0); if (display_is_3d(&rdPrefs)) { GtkWidget *vbox, *vbox2, *frameBox, *hBox, *lab; GtkWidget *pwLightPosX, *pwLightLevelAmbient, *pwLightLevelDiffuse, *pwLightLevelSpecular; GtkWidget *pwLightPosY, *pwLightPosZ, *dtLightSourceFrame; #if GTK_CHECK_VERSION(3,0,0) dtBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else dtBox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), dtBox, FALSE, FALSE, 0); dtLightSourceFrame = gtk_frame_new(_("Light Source Type")); gtk_container_set_border_width(GTK_CONTAINER(dtLightSourceFrame), 4); gtk_box_pack_start(GTK_BOX(dtBox), dtLightSourceFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(dtLightSourceFrame), vbox); pwLightSource = gtk_radio_button_new_with_label(NULL, _("Positional")); gtk_widget_set_tooltip_text(pwLightSource, _("This is a fixed light source, like a lamp")); gtk_box_pack_start(GTK_BOX(vbox), pwLightSource, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwLightSource), (bd->rd->lightType == LT_POSITIONAL)); pwDirectionalSource = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwLightSource), _("Directional")); gtk_widget_set_tooltip_text(pwDirectionalSource, _("This is a light direction, like the sun")); gtk_box_pack_start(GTK_BOX(vbox), pwDirectionalSource, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwDirectionalSource), (bd->rd->lightType == LT_DIRECTIONAL)); g_signal_connect(G_OBJECT(pwDirectionalSource), "toggled", G_CALLBACK(option_changed), bd); dtLightPositionFrame = gtk_frame_new(_("Light Position")); gtk_container_set_border_width(GTK_CONTAINER(dtLightPositionFrame), 4); gtk_box_pack_start(GTK_BOX(dtBox), dtLightPositionFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) frameBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else frameBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(dtLightPositionFrame), frameBox); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(frameBox), hBox, FALSE, FALSE, 0); lab = gtk_label_new(_("Left")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); padjLightPosX = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->lightPos[0], -1.5, 4, .1, 1, 0)); g_signal_connect(G_OBJECT(padjLightPosX), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwLightPosX = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjLightPosX); #else pwLightPosX = gtk_hscale_new(padjLightPosX); #endif gtk_scale_set_draw_value(GTK_SCALE(pwLightPosX), FALSE); gtk_widget_set_size_request(pwLightPosX, 150, -1); gtk_box_pack_start(GTK_BOX(hBox), pwLightPosX, TRUE, TRUE, 0); lab = gtk_label_new(_("Right")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(frameBox), hBox, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hBox), vbox2, FALSE, FALSE, 0); lab = gtk_label_new(_("Bottom")); gtk_box_pack_start(GTK_BOX(vbox2), lab, FALSE, FALSE, 0); padjLightPosY = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->lightPos[1], -1.5, 4, .1, 1, 0)); g_signal_connect(G_OBJECT(padjLightPosY), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwLightPosY = gtk_scale_new(GTK_ORIENTATION_VERTICAL, padjLightPosY); #else pwLightPosY = gtk_vscale_new(padjLightPosY); #endif gtk_scale_set_draw_value(GTK_SCALE(pwLightPosY), FALSE); gtk_widget_set_size_request(pwLightPosY, -1, 70); gtk_box_pack_start(GTK_BOX(vbox2), pwLightPosY, TRUE, TRUE, 0); lab = gtk_label_new(_("Top")); gtk_box_pack_start(GTK_BOX(vbox2), lab, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox2 = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hBox), vbox2, FALSE, FALSE, 0); lab = gtk_label_new(_("Low")); gtk_box_pack_start(GTK_BOX(vbox2), lab, FALSE, FALSE, 0); padjLightPosZ = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->lightPos[2], .5, 5, .1, 1, 0)); g_signal_connect(G_OBJECT(padjLightPosZ), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwLightPosZ = gtk_scale_new(GTK_ORIENTATION_VERTICAL, padjLightPosZ); #else pwLightPosZ = gtk_vscale_new(padjLightPosZ); #endif gtk_scale_set_draw_value(GTK_SCALE(pwLightPosZ), FALSE); gtk_box_pack_start(GTK_BOX(vbox2), pwLightPosZ, TRUE, TRUE, 0); lab = gtk_label_new(_("High")); gtk_box_pack_start(GTK_BOX(vbox2), lab, FALSE, FALSE, 0); dtLightLevelsFrame = gtk_frame_new(_("Light Levels")); gtk_container_set_border_width(GTK_CONTAINER(dtLightLevelsFrame), 4); gtk_box_pack_start(GTK_BOX(dtBox), dtLightLevelsFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) frameBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else frameBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(dtLightLevelsFrame), frameBox); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(frameBox), hBox, FALSE, FALSE, 0); lab = gtk_label_new(_("Ambient")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); padjLightLevelAmbient = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->lightLevels[0], 0, 100, 1, 10, 0)); g_signal_connect(G_OBJECT(padjLightLevelAmbient), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwLightLevelAmbient = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjLightLevelAmbient); #else pwLightLevelAmbient = gtk_hscale_new(padjLightLevelAmbient); #endif gtk_widget_set_tooltip_text(pwLightLevelAmbient, _("Ambient light specifies the general light level")); gtk_box_pack_start(GTK_BOX(hBox), pwLightLevelAmbient, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(frameBox), hBox, FALSE, FALSE, 0); lab = gtk_label_new(_("Diffuse")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); padjLightLevelDiffuse = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->lightLevels[1], 0, 100, 1, 10, 0)); g_signal_connect(G_OBJECT(padjLightLevelDiffuse), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwLightLevelDiffuse = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjLightLevelDiffuse); #else pwLightLevelDiffuse = gtk_hscale_new(padjLightLevelDiffuse); #endif gtk_widget_set_tooltip_text(pwLightLevelDiffuse, _("Diffuse light specifies light from the light source")); gtk_box_pack_start(GTK_BOX(hBox), pwLightLevelDiffuse, TRUE, TRUE, 0); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(frameBox), hBox, FALSE, FALSE, 0); lab = gtk_label_new(_("Specular")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); padjLightLevelSpecular = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->lightLevels[2], 0, 100, 1, 10, 0)); g_signal_connect(G_OBJECT(padjLightLevelSpecular), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwLightLevelSpecular = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjLightLevelSpecular); #else pwLightLevelSpecular = gtk_hscale_new(padjLightLevelSpecular); #endif gtk_widget_set_tooltip_text(pwLightLevelSpecular, _("Specular light is reflected light off shiny surfaces")); gtk_box_pack_start(GTK_BOX(hBox), pwLightLevelSpecular, TRUE, TRUE, 0); } else Add2dLightOptions(dtBox, bd->rd); gtk_widget_show_all(pwx); return pwx; } #endif #if defined(USE_BOARD3D) static GtkWidget * GeneralPage(BoardData * bd, GtkWidget * bdMain) { #else static GtkWidget * GeneralPage(BoardData * bd, GtkWidget * UNUSED(bdMain)) { #endif GtkWidget *pw, *pwx; #if defined(USE_BOARD3D) GtkWidget *dtBox, *button, *dtFrame, *hBox, *lab, *pwev, *pwhbox, *pwvbox, *pwAccuracy, *pwDiceSize; #endif #if GTK_CHECK_VERSION(3,0,0) pwx = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwx = gtk_hbox_new(FALSE, 0); pw = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pw, FALSE, FALSE, 0); #if defined(USE_BOARD3D) dtFrame = gtk_frame_new(_("Display Type")); gtk_container_set_border_width(GTK_CONTAINER(dtFrame), 4); gtk_box_pack_start(GTK_BOX(pw), dtFrame, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) dtBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else dtBox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(dtFrame), dtBox); pwBoardType = gtk_radio_button_new_with_label(NULL, _("2D board")); gtk_box_pack_start(GTK_BOX(dtBox), pwBoardType, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwBoardType), (display_is_2d(bd->rd))); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pwBoardType), _("3D board")); if (!widget3dValid) gtk_widget_set_sensitive(button, FALSE); gtk_box_pack_start(GTK_BOX(dtBox), button, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), (display_is_3d(bd->rd))); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggle_display_type), bd); #endif pwLabels = gtk_check_button_new_with_label(_("Numbered point labels")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwLabels), bd->rd->fLabels); gtk_box_pack_start(GTK_BOX(pw), pwLabels, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(pwLabels, _("Show or hide point numbers")); pwDynamicLabels = gtk_check_button_new_with_label(_("Dynamic labels")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwDynamicLabels), bd->rd->fDynamicLabels); gtk_box_pack_start(GTK_BOX(pw), pwDynamicLabels, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pwDynamicLabels), "toggled", G_CALLBACK(LabelsToggled), 0); g_signal_connect(G_OBJECT(pwLabels), "toggled", G_CALLBACK(LabelsToggled), 0); LabelsToggled(0, 0); gtk_widget_set_tooltip_text(pwDynamicLabels, _("Update the labels so they are correct " "for the player on roll")); pwMoveIndicator = gtk_check_button_new_with_label(_("Show move indicator")); gtk_widget_set_tooltip_text(pwMoveIndicator, _("Show or hide arrow indicating who is moving")); gtk_box_pack_start(GTK_BOX(pw), pwMoveIndicator, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwMoveIndicator), bd->rd->showMoveIndicator); g_signal_connect(G_OBJECT(pwMoveIndicator), "toggled", G_CALLBACK(MoveIndicatorToggled), 0); #if defined(USE_BOARD3D) #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwx), pwvbox, FALSE, FALSE, 0); frame3dOptions = gtk_frame_new(_("3D options")); gtk_container_set_border_width(GTK_CONTAINER(frame3dOptions), 4); gtk_box_pack_start(GTK_BOX(pwvbox), frame3dOptions, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pw = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(frame3dOptions), pw); pwShowShadows = gtk_check_button_new_with_label(_("Show shadows")); gtk_widget_set_tooltip_text(pwShowShadows, _("Display shadows, this option requires a fast graphics card")); gtk_box_pack_start(GTK_BOX(pw), pwShowShadows, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwShowShadows), bd->rd->showShadows); g_signal_connect(G_OBJECT(pwShowShadows), "toggled", G_CALLBACK(toggle_show_shadows), NULL); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), hBox, FALSE, FALSE, 0); lightLab = gtk_label_new(_("light")); gtk_box_pack_start(GTK_BOX(hBox), lightLab, FALSE, FALSE, 0); padjDarkness = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->shadowDarkness, 3, 100, 1, 10, 0)); g_signal_connect(G_OBJECT(padjDarkness), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwDarkness = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjDarkness); #else pwDarkness = gtk_hscale_new(padjDarkness); #endif gtk_widget_set_tooltip_text(pwDarkness, _("Vary the darkness of the shadows")); gtk_scale_set_draw_value(GTK_SCALE(pwDarkness), FALSE); gtk_box_pack_start(GTK_BOX(hBox), pwDarkness, TRUE, TRUE, 0); darkLab = gtk_label_new(_("dark")); gtk_box_pack_start(GTK_BOX(hBox), darkLab, FALSE, FALSE, 0); toggle_show_shadows(pwShowShadows, -1); pwAnimateRoll = gtk_check_button_new_with_label(_("Animate dice rolls")); gtk_widget_set_tooltip_text(pwAnimateRoll, _("Dice rolls will shake across board")); gtk_box_pack_start(GTK_BOX(pw), pwAnimateRoll, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwAnimateRoll), bd->rd->animateRoll); pwAnimateFlag = gtk_check_button_new_with_label(_("Animate resignation flag")); gtk_widget_set_tooltip_text(pwAnimateFlag, _("Waves resignation flag")); gtk_box_pack_start(GTK_BOX(pw), pwAnimateFlag, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwAnimateFlag), bd->rd->animateFlag); pwev = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwev), FALSE); gtk_box_pack_start(GTK_BOX(pw), pwev, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #else pwhbox = gtk_hbox_new(FALSE, 4); #endif gtk_container_add(GTK_CONTAINER(pwev), pwhbox); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), hBox, FALSE, FALSE, 0); anglelab = gtk_label_new(_("Board angle: ")); gtk_box_pack_start(GTK_BOX(hBox), anglelab, FALSE, FALSE, 0); padjBoardAngle = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->boardAngle, 0, 60, 1, 10, 0)); g_signal_connect(G_OBJECT(padjBoardAngle), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwBoardAngle = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjBoardAngle); #else pwBoardAngle = gtk_hscale_new(padjBoardAngle); #endif gtk_widget_set_tooltip_text(pwBoardAngle, _("Vary the angle the board is tilted at")); gtk_scale_set_digits(GTK_SCALE(pwBoardAngle), 0); gtk_widget_set_size_request(pwBoardAngle, 100, -1); gtk_box_pack_start(GTK_BOX(hBox), pwBoardAngle, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), hBox, FALSE, FALSE, 0); skewLab = gtk_label_new(_("FOV skew: ")); gtk_box_pack_start(GTK_BOX(hBox), skewLab, FALSE, FALSE, 0); padjSkewFactor = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->skewFactor, 0, 100, 1, 10, 0)); g_signal_connect(G_OBJECT(padjSkewFactor), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwSkewFactor = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjSkewFactor); #else pwSkewFactor = gtk_hscale_new(padjSkewFactor); #endif gtk_widget_set_size_request(pwSkewFactor, 100, -1); gtk_widget_set_tooltip_text(pwSkewFactor, _("Vary the field-of-view of the 3D display")); gtk_scale_set_digits(GTK_SCALE(pwSkewFactor), 0); gtk_box_pack_start(GTK_BOX(hBox), pwSkewFactor, FALSE, FALSE, 0); pwPlanView = gtk_check_button_new_with_label(_("Plan view")); gtk_widget_set_tooltip_text(pwPlanView, _("Display the 3D board with a 2D overhead view")); gtk_box_pack_start(GTK_BOX(pw), pwPlanView, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwPlanView), bd->rd->planView); g_signal_connect(G_OBJECT(pwPlanView), "toggled", G_CALLBACK(toggle_planview), NULL); toggle_planview(pwPlanView, 0); lab = gtk_label_new(_("Curve accuracy")); gtk_box_pack_start(GTK_BOX(pw), lab, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), hBox, FALSE, FALSE, 0); lab = gtk_label_new(_("low")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); padjAccuracy = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->curveAccuracy, 8, 60, 4, 12, 0)); g_signal_connect(G_OBJECT(padjAccuracy), "value-changed", G_CALLBACK(option_changed), NULL); #if GTK_CHECK_VERSION(3,0,0) pwAccuracy = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjAccuracy); #else pwAccuracy = gtk_hscale_new(padjAccuracy); #endif gtk_widget_set_tooltip_text(pwAccuracy, _("Change how accurately curves are drawn." " If performance is slow try lowering this value." " Increasing this value will only have an effect on large displays")); gtk_scale_set_draw_value(GTK_SCALE(pwAccuracy), FALSE); gtk_box_pack_start(GTK_BOX(hBox), pwAccuracy, TRUE, TRUE, 0); lab = gtk_label_new(_("high")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); lab = gtk_label_new(_("Dice size")); gtk_box_pack_start(GTK_BOX(pw), lab, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) hBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hBox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pw), hBox, FALSE, FALSE, 0); lab = gtk_label_new(_("small")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); padjDiceSize = GTK_ADJUSTMENT(gtk_adjustment_new(bd->rd->diceSize, 1.5, 4, .1, 1, 0)); g_signal_connect(G_OBJECT(padjDiceSize), "value-changed", G_CALLBACK(DiceSizeChanged), NULL); #if GTK_CHECK_VERSION(3,0,0) pwDiceSize = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, padjDiceSize); #else pwDiceSize = gtk_hscale_new(padjDiceSize); #endif gtk_widget_set_tooltip_text(pwDiceSize, _("Vary the size of the dice")); gtk_scale_set_draw_value(GTK_SCALE(pwDiceSize), FALSE); gtk_box_pack_start(GTK_BOX(hBox), pwDiceSize, TRUE, TRUE, 0); lab = gtk_label_new(_("large")); gtk_box_pack_start(GTK_BOX(hBox), lab, FALSE, FALSE, 0); pwTestPerformance = gtk_button_new_with_label(_("Test performance")); gtk_widget_set_sensitive(pwTestPerformance, (display_is_3d(bd->rd))); gtk_box_pack_start(GTK_BOX(pwvbox), pwTestPerformance, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwTestPerformance), "clicked", G_CALLBACK(DoTestPerformance), bdMain); #else Add2dLightOptions(pw, bd->rd); #endif return pwx; } /* functions for board design */ static void UseDesign(void) { gfloat rAzimuth, rElevation; renderdata newPrefs; #if defined(USE_BOARD3D) BoardData *bd = BOARD(pwPrevBoard)->board_data; #endif fUpdate = FALSE; #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) ClearTextures(bd->bd3d); #endif ParsePreferences(pbdeSelected, &newPrefs); #if defined(USE_BOARD3D) /* Set only 2D or 3D options */ if (display_is_3d(&rdPrefs)) { Set3dSettings(&rdPrefs, &newPrefs); GetTextures(bd->bd3d, bd->rd); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwLightSource), (newPrefs.lightType == LT_POSITIONAL)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwDirectionalSource), (newPrefs.lightType == LT_DIRECTIONAL)); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjLightPosX), newPrefs.lightPos[0]); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjLightPosY), newPrefs.lightPos[1]); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjLightPosZ), newPrefs.lightPos[2]); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjLightLevelAmbient), newPrefs.lightLevels[0]); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjLightLevelDiffuse), newPrefs.lightLevels[1]); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjLightLevelSpecular), newPrefs.lightLevels[2]); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjBoardAngle), newPrefs.boardAngle); gtk_adjustment_set_value(GTK_ADJUSTMENT(padjSkewFactor), newPrefs.skewFactor); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwTextureAllPiece), (newPrefs.pieceTextureType == PTT_ALL)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwTextureTopPiece), (newPrefs.pieceTextureType == PTT_TOP)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwRoundedPiece), (newPrefs.pieceType == PT_ROUNDED)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwFlatPiece), (newPrefs.pieceType == PT_FLAT)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwRoundedEdges), newPrefs.roundedEdges); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwBgTrays), newPrefs.bgInTrays); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwRoundPoints), newPrefs.roundedPoints); for (int i = 0; i < 2; i++) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apwDieColour[i]), newPrefs.afDieColour3d[i]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwHinges), newPrefs.fHinges3d); redrawChange = TRUE; } else #endif { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwMoveIndicator), newPrefs.showMoveIndicator); /* chequers */ for (int i = 0; i < 2; ++i) { gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwColour[i]), newPrefs.aarColour[i]); gtk_adjustment_set_value(GTK_ADJUSTMENT(apadj[i]), newPrefs.arRefraction[i]); gtk_adjustment_set_value(GTK_ADJUSTMENT(apadjCoefficient[i]), newPrefs.arCoefficient[i]); gtk_adjustment_set_value(GTK_ADJUSTMENT(apadjExponent[i]), newPrefs.arExponent[i]); } /* dice + dice dot */ for (int i = 0; i < 2; ++i) { gtk_widget_set_sensitive(GTK_WIDGET(apwDiceColourBox[i]), !newPrefs.afDieColour[i]); gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwDiceColour[i]), newPrefs.afDieColour[i] ? newPrefs.aarColour[i] : newPrefs.aarDiceColour[i]); gtk_adjustment_set_value(GTK_ADJUSTMENT(apadjDiceExponent[i]), newPrefs.afDieColour[i] ? newPrefs.arExponent[i] : newPrefs.arDiceExponent[i]); gtk_adjustment_set_value(GTK_ADJUSTMENT(apadjDiceCoefficient[i]), newPrefs.afDieColour[i] ? newPrefs.arCoefficient[i] : newPrefs.arDiceCoefficient[i]); /* die dot */ gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwDiceDotColour[i]), newPrefs.aarDiceDotColour[i]); } /* cube colour */ gtk_color_button_set_from_array(GTK_COLOR_BUTTON(pwCubeColour), newPrefs.arCubeColour); /* board + points */ for (int i = 0; i < 4; ++i) { float ar[4]; if (i != 1) gtk_adjustment_set_value(GTK_ADJUSTMENT(apadjBoard[i]), newPrefs.aSpeckle[i] / 128.0); for (int j = 0; j < 4; j++) ar[j] = newPrefs.aanBoardColour[i][j] / 255.0f; gtk_color_button_set_from_array(GTK_COLOR_BUTTON(apwBoard[i]), ar); } /* board, border, and points */ gtk_combo_box_set_active(GTK_COMBO_BOX(pwWoodType), newPrefs.wt != WOOD_PAINT ? newPrefs.wt : 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(newPrefs.wt != WOOD_PAINT ? pwWood : pwWoodF), TRUE); gtk_widget_set_sensitive(pwWoodType, newPrefs.wt != WOOD_PAINT); gtk_widget_set_sensitive(apwBoard[1], newPrefs.wt == WOOD_PAINT); /* round */ gtk_adjustment_set_value(GTK_ADJUSTMENT(padjRound), 1.0f - newPrefs.rRound); /* light */ rElevation = asinf(newPrefs.arLight[2]) * 180.0f / F_PI; if (fabs(newPrefs.arLight[2] - 1.0f) < 1e-5) rAzimuth = 0.0; else rAzimuth = acosf(newPrefs.arLight[0] / sqrtf(1.0f - newPrefs.arLight[2] * newPrefs.arLight[2])) * 180.0f / F_PI; if (newPrefs.arLight[1] < 0) rAzimuth = 360 - rAzimuth; gtk_adjustment_set_value(GTK_ADJUSTMENT(paAzimuth), rAzimuth); gtk_adjustment_set_value(GTK_ADJUSTMENT(paElevation), rElevation); for (int i = 0; i < 2; i++) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apwDieColour[i]), newPrefs.afDieColour[i]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pwHinges), newPrefs.fHinges); GetPrefs(&rdPrefs); } fUpdate = TRUE; option_changed(0, 0); } static void WriteTheDesign(boarddesign * pbde, FILE * pf) { gchar *title, *author; if (pbde->szTitle) { title = g_markup_escape_text(pbde->szTitle, -1); } else title = _("unknown title"); if (pbde->szAuthor) { author = g_markup_escape_text(pbde->szAuthor, -1); } else author = _("unknown author"); fputs(" \n\n", pf); /* */ fprintf(pf, " \n" " %s\n" " %s\n" " \n\n" " %s \n\n", title, author, pbde->szBoardDesign ? pbde->szBoardDesign : "\n"); fputs(" \n\n\n", pf); if (pbde->szTitle) g_free(title); if (pbde->szAuthor) g_free(author); } static void WriteDesignOnlyDeletables(gpointer data, gpointer user_data) { boarddesign *pbde = data; FILE *pf = user_data; if (!pbde) return; if (!pbde->fDeletable) /* predefined board design */ return; WriteTheDesign(pbde, pf); } static void WriteDesign(gpointer data, gpointer user_data) { boarddesign *pbde = data; FILE *pf = user_data; if (!pbde) return; WriteTheDesign(pbde, pf); } static void WriteDesignHeader(const char *szFile, FILE * pf) { time_t t; char tstr[11]; /* ISO 8601 date format: YYYY-MM-DD\0 */ time(&t); strftime(tstr, 11, "%Y-%m-%d", localtime(&t)); fprintf(pf, "\n" "\n" "\n" "\n" "\n" "\n", pf); } static void WriteDesignFooter(FILE * pf) { fputs("\n", pf); } static void DesignSave(GtkWidget * UNUSED(pw), gpointer data) { gchar *szFile; FILE *pf; GList *plBDs = (GList *) data; szFile = g_build_filename(szHomeDirectory, "boards.xml", NULL); if ((pf = g_fopen(szFile, "w+")) == 0) { outputerr(szFile); g_free(szFile); return; } WriteDesignHeader(szFile, pf); g_list_foreach(plBDs, WriteDesignOnlyDeletables, pf); WriteDesignFooter(pf); fclose(pf); g_free(szFile); } static void DesignAddOK(GtkWidget * pw, boarddesign * pbde) { pbde->szAuthor = gtk_editable_get_chars(GTK_EDITABLE(pwDesignAddAuthor), 0, -1); pbde->szTitle = gtk_editable_get_chars(GTK_EDITABLE(pwDesignAddTitle), 0, -1); gtk_widget_destroy(gtk_widget_get_toplevel(pw)); } static void DesignAddChanged(GtkWidget * UNUSED(pw), GtkWidget * pwDialog) { char *szAuthor = gtk_editable_get_chars(GTK_EDITABLE(pwDesignAddAuthor), 0, -1); char *szTitle = gtk_editable_get_chars(GTK_EDITABLE(pwDesignAddTitle), 0, -1); GtkWidget *pwOK = DialogArea(GTK_WIDGET(pwDialog), DA_OK); gtk_widget_set_sensitive(GTK_WIDGET(pwOK), szAuthor && szTitle && *szAuthor && *szTitle); } static void DesignAddTitle(boarddesign * pbde) { GtkWidget *pwDialog; GtkWidget *pwvbox; GtkWidget *pwhbox; pwDialog = GTKCreateDialog(_("GNU Backgammon - Add current board design"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(DesignAddOK), pbde); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); #else pwvbox = gtk_vbox_new(FALSE, 4); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwvbox); /* title */ #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #else pwhbox = gtk_hbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Title of new design:")), FALSE, FALSE, 4); pwDesignAddTitle = gtk_entry_new(); gtk_entry_set_activates_default(GTK_ENTRY(pwDesignAddTitle), TRUE); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignAddTitle, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignAddTitle), "changed", G_CALLBACK(DesignAddChanged), pwDialog); /* author */ #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #else pwhbox = gtk_hbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pwhbox, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pwhbox), gtk_label_new(_("Author of new design:")), FALSE, FALSE, 4); pwDesignAddAuthor = gtk_entry_new(); gtk_entry_set_activates_default(GTK_ENTRY(pwDesignAddAuthor), TRUE); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignAddAuthor, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignAddAuthor), "changed", G_CALLBACK(DesignAddChanged), pwDialog); /* show dialog */ gtk_widget_grab_focus(pwDesignAddTitle); DesignAddChanged(NULL, pwDialog); GTKRunDialog(pwDialog); } static void WriteDesignString(boarddesign * pbde, renderdata * prd) { char szTemp[2048], *pTemp; gchar buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE], buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; float rElevation = asinf(prd->arLight[2]) * 180.0f / F_PI; float rAzimuth = (fabs(prd->arLight[2] - 1.0f) < 1e-5) ? 0.0f : acosf(prd->arLight[0] / sqrtf(1.0f - prd->arLight[2] * prd->arLight[2])) * 180.0f / F_PI; if (prd->arLight[1] < 0) rAzimuth = 360 - rAzimuth; pTemp = szTemp; pTemp += sprintf(pTemp, "\n" " board=#%02X%02X%02X;%s\n" " border=#%02X%02X%02X\n", /* board */ prd->aanBoardColour[0][0], prd->aanBoardColour[0][1], prd->aanBoardColour[0][2], g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", (float) prd->aSpeckle[0] / 128.0f), /* border */ prd->aanBoardColour[1][0], prd->aanBoardColour[1][1], prd->aanBoardColour[1][2]); pTemp += sprintf(pTemp, " wood=%s\n" " hinges=%c\n" " light=%s;%s\n" " shape=%s\n", /* wood ... */ aszWoodName[prd->wt], prd->fHinges ? 'y' : 'n', g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.0f", rAzimuth), g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%0.0f", rElevation), g_ascii_formatd(buf3, G_ASCII_DTOSTR_BUF_SIZE, "%0.1f", 1.0f - prd->rRound)); pTemp += sprintf(pTemp, " chequers0=#%02X%02X%02X;%s;%s;%s;%s\n", /* chequers0 */ (int) (prd->aarColour[0][0] * 0xFF), (int) (prd->aarColour[0][1] * 0xFF), (int) (prd->aarColour[0][2] * 0xFF), g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->aarColour[0][3]), g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arRefraction[0]), g_ascii_formatd(buf3, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arCoefficient[0]), g_ascii_formatd(buf4, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arExponent[0])); pTemp += sprintf(pTemp, " chequers1=#%02X%02X%02X;%s;%s;%s;%s\n", /* chequers1 */ (int) (prd->aarColour[1][0] * 0xFF), (int) (prd->aarColour[1][1] * 0xFF), (int) (prd->aarColour[1][2] * 0xFF), g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->aarColour[1][3]), g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arRefraction[1]), g_ascii_formatd(buf3, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arCoefficient[1]), g_ascii_formatd(buf4, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arExponent[1])); pTemp += sprintf(pTemp, " dice0=#%02X%02X%02X;%s;%s;%c\n", /* dice0 */ (int) (prd->aarDiceColour[0][0] * 0xFF), (int) (prd->aarDiceColour[0][1] * 0xFF), (int) (prd->aarDiceColour[0][2] * 0xFF), g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arDiceCoefficient[0]), g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arDiceExponent[0]), prd->afDieColour[0] ? 'y' : 'n'); pTemp += sprintf(pTemp, " dice1=#%02X%02X%02X;%s;%s;%c\n", /* dice1 */ (int) (prd->aarDiceColour[1][0] * 0xFF), (int) (prd->aarDiceColour[1][1] * 0xFF), (int) (prd->aarDiceColour[1][2] * 0xFF), g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arDiceCoefficient[1]), g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", prd->arDiceExponent[1]), prd->afDieColour[1] ? 'y' : 'n'); pTemp += sprintf(pTemp, " dot0=#%02X%02X%02X\n" " dot1=#%02X%02X%02X\n" " cube=#%02X%02X%02X\n", /* dot0 */ (int) (prd->aarDiceDotColour[0][0] * 0xFF), (int) (prd->aarDiceDotColour[0][1] * 0xFF), (int) (prd->aarDiceDotColour[0][2] * 0xFF), /* dot1 */ (int) (prd->aarDiceDotColour[1][0] * 0xFF), (int) (prd->aarDiceDotColour[1][1] * 0xFF), (int) (prd->aarDiceDotColour[1][2] * 0xFF), /* cube */ (int) (prd->arCubeColour[0] * 0xFF), (int) (prd->arCubeColour[1] * 0xFF), (int) (prd->arCubeColour[2] * 0xFF)); #if defined(USE_BOARD3D) pTemp += #endif sprintf(pTemp, " points0=#%02X%02X%02X;%s\n" " points1=#%02X%02X%02X;%s\n", /* points0 */ prd->aanBoardColour[2][0], prd->aanBoardColour[2][1], prd->aanBoardColour[2][2], g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", (float) prd->aSpeckle[2] / 128.0f), /* points1 */ prd->aanBoardColour[3][0], prd->aanBoardColour[3][1], prd->aanBoardColour[3][2], g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%0.2f", (float) prd->aSpeckle[3] / 128.0f)); #if defined(USE_BOARD3D) sprintf(pTemp, " hinges3d=%c\n" " piecetype=%d\n" " piecetexturetype=%d\n" " roundededges=%c\n" " bgintrays=%c\n" " roundedpoints=%c\n" " lighttype=%c\n" " lightposx=%s lightposy=%s lightposz=%s\n" " lightambient=%d lightdiffuse=%d lightspecular=%d\n" " chequers3d0=%s\n" " chequers3d1=%s\n" " dice3d0=%s\n" " dice3d1=%s\n" " dot3d0=%s\n" " dot3d1=%s\n" " cube3d=%s\n" " cubetext3d=%s\n" " base3d=%s\n" " points3d0=%s\n" " points3d1=%s\n" " border3d=%s\n" " hinge3d=%s\n" " numbers3d=%s\n" " background3d=%s\n", prd->fHinges3d ? 'y' : 'n', prd->pieceType, prd->pieceTextureType, prd->roundedEdges ? 'y' : 'n', prd->bgInTrays ? 'y' : 'n', prd->roundedPoints ? 'y' : 'n', prd->lightType == LT_POSITIONAL ? 'p' : 'd', g_ascii_formatd(buf1, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->lightPos[0]), g_ascii_formatd(buf2, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->lightPos[1]), g_ascii_formatd(buf3, G_ASCII_DTOSTR_BUF_SIZE, "%.2f", prd->lightPos[2]), prd->lightLevels[0], prd->lightLevels[1], prd->lightLevels[2], WriteMaterial(&prd->ChequerMat[0]), WriteMaterial(&prd->ChequerMat[1]), WriteMaterialDice(prd, 0), WriteMaterialDice(prd, 1), WriteMaterial(&prd->DiceDotMat[0]), WriteMaterial(&prd->DiceDotMat[1]), WriteMaterial(&prd->CubeMat), WriteMaterial(&prd->CubeNumberMat), WriteMaterial(&prd->BaseMat), WriteMaterial(&prd->PointMat[0]), WriteMaterial(&prd->PointMat[1]), WriteMaterial(&prd->BoxMat), WriteMaterial(&prd->HingeMat), WriteMaterial(&prd->PointNumberMat), WriteMaterial(&prd->BackGroundMat)); #endif pbde->szBoardDesign = strdup(szTemp); } #if defined(USE_BOARD3D) static void Set2dColour(float newcol[4], Material * pMat) { newcol[0] = (pMat->ambientColour[0] + pMat->diffuseColour[0]) / 2; newcol[1] = (pMat->ambientColour[1] + pMat->diffuseColour[1]) / 2; newcol[2] = (pMat->ambientColour[2] + pMat->diffuseColour[2]) / 2; newcol[3] = (pMat->ambientColour[3] + pMat->diffuseColour[3]) / 2; } static void Set2dColourChar(unsigned char newcol[4], Material * pMat) { newcol[0] = (unsigned char) (((pMat->ambientColour[0] + pMat->diffuseColour[0]) / 2) * 255); newcol[1] = (unsigned char) (((pMat->ambientColour[1] + pMat->diffuseColour[1]) / 2) * 255); newcol[2] = (unsigned char) (((pMat->ambientColour[2] + pMat->diffuseColour[2]) / 2) * 255); newcol[3] = (unsigned char) (((pMat->ambientColour[3] + pMat->diffuseColour[3]) / 2) * 255); } static void Set3dColour(Material * pMat, float const col[4]) { pMat->ambientColour[0] = pMat->diffuseColour[0] = col[0]; pMat->ambientColour[1] = pMat->diffuseColour[1] = col[1]; pMat->ambientColour[2] = pMat->diffuseColour[2] = col[2]; pMat->ambientColour[3] = pMat->diffuseColour[3] = 1; } static void Set3dColourChar(Material * pMat, unsigned char col[4]) { pMat->ambientColour[0] = pMat->diffuseColour[0] = ((float) col[0]) / 255; pMat->ambientColour[1] = pMat->diffuseColour[1] = ((float) col[1]) / 255; pMat->ambientColour[2] = pMat->diffuseColour[2] = ((float) col[2]) / 255; pMat->ambientColour[3] = pMat->diffuseColour[3] = 1; } static void CopyNewSettingsToOtherDimension(renderdata * prd) { if (display_is_3d(prd)) { /* Create rough 2D settings based on new 3D settings */ prd->wt = WOOD_PAINT; Set2dColour(prd->aarColour[0], &prd->ChequerMat[0]); Set2dColour(prd->aarColour[1], &prd->ChequerMat[1]); Set2dColour(prd->aarDiceColour[0], &prd->DiceMat[0]); Set2dColour(prd->aarDiceColour[1], &prd->DiceMat[1]); Set2dColour(prd->aarDiceDotColour[0], &prd->DiceDotMat[0]); Set2dColour(prd->aarDiceDotColour[1], &prd->DiceDotMat[1]); prd->afDieColour[0] = prd->afDieColour3d[0]; prd->afDieColour[1] = prd->afDieColour3d[1]; prd->fHinges = prd->fHinges3d; Set2dColour(prd->arCubeColour, &prd->CubeMat); Set2dColourChar(prd->aanBoardColour[0], &prd->BaseMat); Set2dColourChar(prd->aanBoardColour[1], &prd->BoxMat); Set2dColourChar(prd->aanBoardColour[2], &prd->PointMat[0]); Set2dColourChar(prd->aanBoardColour[3], &prd->PointMat[1]); } else { /* Create rough 3D settings based on new 2D settings */ Set3dColour(&prd->ChequerMat[0], prd->aarColour[0]); Set3dColour(&prd->ChequerMat[1], prd->aarColour[1]); Set3dColour(&prd->DiceMat[0], prd->aarDiceColour[0]); Set3dColour(&prd->DiceMat[1], prd->aarDiceColour[1]); Set3dColour(&prd->DiceDotMat[0], prd->aarDiceDotColour[0]); Set3dColour(&prd->DiceDotMat[1], prd->aarDiceDotColour[1]); prd->afDieColour3d[0] = prd->afDieColour[0]; prd->afDieColour3d[1] = prd->afDieColour[1]; prd->fHinges3d = prd->fHinges; Set3dColour(&prd->CubeMat, prd->arCubeColour); Set3dColourChar(&prd->BaseMat, prd->aanBoardColour[0]); Set3dColourChar(&prd->BoxMat, prd->aanBoardColour[1]); Set3dColourChar(&prd->PointMat[0], prd->aanBoardColour[2]); Set3dColourChar(&prd->PointMat[1], prd->aanBoardColour[3]); } } #endif static void DesignAdd(GtkWidget * pw, gpointer data) { boarddesign *pbde; GList *plBDs = data; renderdata rdNew; pbde = (boarddesign *) g_malloc(sizeof(boarddesign)); /* name and author of board */ pbde->szTitle = pbde->szAuthor = pbde->szBoardDesign = NULL; GTKSetCurrentParent(pw); DesignAddTitle(pbde); if (!pbde->szTitle || !pbde->szAuthor) { g_free(pbde); return; } /* get board design */ GetPrefs(&rdPrefs); rdNew = rdPrefs; #if defined(USE_BOARD3D) CopyNewSettingsToOtherDimension(&rdNew); #endif WriteDesignString(pbde, &rdNew); pbde->fDeletable = TRUE; plBDs = g_list_append(plBDs, (gpointer) pbde); AddDesignRow(pbde, pwDesignList); DesignSave(pw, plBDs); pbdeSelected = pbde; SetTitle(); } static void ExportDesign(GtkWidget * UNUSED(pw), gpointer UNUSED(data)) { GList *designs; gchar *pch; gchar *szFile; FILE *pf; boarddesign *pbde; renderdata rdNew; if ((pch = szFile = GTKFileSelect(_("Export Design"), NULL, NULL, NULL, GTK_FILE_CHOOSER_ACTION_SAVE)) == 0) return; #if !defined(WIN32) szFile = NextToken(&szFile); #endif /* * Copy current design */ pbde = (boarddesign *) g_malloc(sizeof(boarddesign)); if (pbdeSelected) { /* Exporting current design so just get settings */ pbde->szTitle = g_strdup(pbdeSelected->szTitle); pbde->szAuthor = g_strdup(pbdeSelected->szAuthor); ParsePreferences(pbdeSelected, &rdNew); } else { /* new design, so get settings and copy to other dimension */ pbde->szTitle = g_strdup(_("User defined")); pbde->szAuthor = g_strdup(_("User")); GetPrefs(&rdPrefs); rdNew = rdPrefs; #if defined(USE_BOARD3D) CopyNewSettingsToOtherDimension(&rdNew); #endif } WriteDesignString(pbde, &rdNew); pbde->fDeletable = TRUE; /* if file exists, read in any designs */ if ((designs = ParseBoardDesigns(szFile, TRUE)) == 0) { /* None found so create empty list */ designs = g_list_alloc(); } designs = g_list_append(designs, (gpointer) pbde); /* write designs to file */ if ((pf = g_fopen(szFile, "w+")) == 0) { outputerr(szFile); free_board_design(pbde, NULL); g_free(pch); return; } WriteDesignHeader(szFile, pf); g_list_foreach(designs, WriteDesign, pf); WriteDesignFooter(pf); fclose(pf); free_board_design(pbde, NULL); g_free(pch); } static void ImportDesign(GtkWidget * pw, gpointer data) { gchar *pch; gchar *szFile; GList *new_designs; gint old_length; gint num_added; GList *plBDs = (GList *) data; if ((pch = szFile = GTKFileSelect(_("Import Design"), NULL, NULL, NULL, GTK_FILE_CHOOSER_ACTION_OPEN)) == 0) return; #if !defined(WIN32) szFile = NextToken(&szFile); #endif if ((new_designs = ParseBoardDesigns(szFile, TRUE)) == 0) { /* no designs found */ outputl(_("File not found or no designs in file.")); outputx(); g_free(pch); return; } g_free(pch); /* add designs to current list */ /* FIXME: show dialog instead */ outputl(_("Adding new designs:")); old_length = g_list_length(plBDs); g_list_foreach(new_designs, AddDesignRowIfNew, pwDesignList); num_added = g_list_length(plBDs) - old_length; outputf(ngettext("%d design added.\n", "%d designs added.\n", num_added), num_added); outputx(); if (num_added > 0) { DesignSave(pw, plBDs); pbdeSelected = g_list_nth_data(plBDs, old_length); UseDesign(); } } static void RemoveDesign(GtkWidget * pw, gpointer data) { GList *plBDs = (GList *) data; char prompt[200]; sprintf(prompt, _("Permanently remove design %s?"), pbdeSelected->szTitle); if (!GetInputYN(prompt)) return; gtk_widget_set_sensitive(GTK_WIDGET(pwDesignRemove), FALSE); plBDs = g_list_remove(plBDs, pbdeSelected); RemoveListDesign(pbdeSelected); DesignSave(pw, plBDs); SetTitle(); } static void UpdateDesign(GtkWidget * pw, gpointer data) { renderdata newPrefs; char prompt[200]; #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) sprintf(prompt, _("Permanently overwrite 3D settings for design %s?"), pbdeModified->szTitle); else sprintf(prompt, _("Permanently overwrite 2D settings for design %s?"), pbdeModified->szTitle); #else sprintf(prompt, _("Permanently overwrite settings for design %s?"), pbdeModified->szTitle); #endif if (!GetInputYN(prompt)) return; gtk_widget_set_sensitive(GTK_WIDGET(pwDesignUpdate), FALSE); #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) { /* Get current (2d) settings for design */ ParsePreferences(pbdeModified, &newPrefs); /* Overwrite 3D settings with current values */ Set3dSettings(&newPrefs, &rdPrefs); } else #endif { #if defined(USE_BOARD3D) /* Get current (3d) design settings */ renderdata designPrefs; ParsePreferences(pbdeModified, &designPrefs); #endif /* Copy current (2d) settings */ GetPrefs(&rdPrefs); newPrefs = rdPrefs; #if defined(USE_BOARD3D) /* Overwrite 3D design settings */ Set3dSettings(&newPrefs, &designPrefs); #endif } /* Save updated design */ WriteDesignString(pbdeModified, &newPrefs); DesignSave(pw, data); rdPrefs = newPrefs; SetTitle(); } static void AddDesignRow(gpointer data, gpointer UNUSED(user_data)) { boarddesign *pbde = data; GtkTreeIter iter; if (pbde == NULL) return; gtk_list_store_append(designListStore, &iter); gtk_list_store_set(designListStore, &iter, NAME_COL, pbde->szTitle, DATA_COL, pbde, -1); } static void AddDesignRowIfNew(gpointer data, gpointer user_data) { renderdata rdNew; boarddesign *pbde = data; if (pbde == NULL) return; ParsePreferences(pbde, &rdNew); if (FindDesign(plBoardDesigns, &rdNew)) { outputf(_("Design %s already present\n"), pbde->szTitle); return; } AddDesignRow(data, user_data); plBoardDesigns = g_list_append(plBoardDesigns, (gpointer) pbde); outputf(_("Design %s added\n"), pbde->szTitle); } static void DesignSelectNew(GtkTreeView * treeview, gpointer UNUSED(userdata)) { GtkTreeIter selected_iter; GtkTreeModel *model; boarddesign *pbde; gtk_tree_selection_get_selected(gtk_tree_view_get_selection(treeview), &model, &selected_iter); gtk_tree_model_get(model, &selected_iter, DATA_COL, &pbde, -1); if (gtk_widget_is_sensitive(pwDesignAdd)) { GTKSetCurrentParent(pwDesignList); if (!fUpdate || !GetInputYN(_("Select new design and lose current changes?"))) { pbdeModified = pbde; gtk_widget_set_sensitive(GTK_WIDGET(pwDesignUpdate), pbdeModified->fDeletable); return; } } pbdeSelected = pbde; UseDesign(); } static GtkWidget * DesignPage(GList * plBoardDesigns, BoardData * UNUSED(bd)) { GtkWidget *pwhbox; GtkWidget *pwScrolled; GtkWidget *pwPage; GtkCellRenderer *renderer; #if GTK_CHECK_VERSION(3,0,0) pwPage = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); #else pwPage = gtk_vbox_new(FALSE, 4); #endif /* List with board designs */ renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "ypad", 0, NULL); designListStore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); g_list_foreach(plBoardDesigns, AddDesignRow, pwDesignList); pwDesignList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(designListStore)); g_object_unref(G_OBJECT(designListStore)); /* The view now holds a reference. We can get rid of our own reference */ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(pwDesignList)), GTK_SELECTION_BROWSE); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pwDesignList), -1, _("Design"), renderer, "text", NAME_COL, NULL); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pwDesignList), FALSE); g_signal_connect(pwDesignList, "cursor-changed", G_CALLBACK(DesignSelectNew), NULL); pwScrolled = gtk_scrolled_window_new(NULL, NULL); #if GTK_CHECK_VERSION(3,0,0) g_object_set(G_OBJECT(pwScrolled), "expand", TRUE, NULL); #endif gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(pwScrolled), pwDesignList); gtk_container_add(GTK_CONTAINER(pwPage), pwScrolled); /* button: use design */ #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwPage), pwhbox, FALSE, FALSE, 4); /* * buttons */ /* add current design */ pwDesignAdd = gtk_button_new_with_label(_("Add current design")); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignAdd, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignAdd), "clicked", G_CALLBACK(DesignAdd), plBoardDesigns); /* remove design */ pwDesignRemove = gtk_button_new_with_label(_("Remove design")); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignRemove, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignRemove), "clicked", G_CALLBACK(RemoveDesign), plBoardDesigns); gtk_widget_set_sensitive(GTK_WIDGET(pwDesignRemove), FALSE); /* update design */ pwDesignUpdate = gtk_button_new_with_label(_("Update design")); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignUpdate, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignUpdate), "clicked", G_CALLBACK(UpdateDesign), plBoardDesigns); gtk_widget_set_sensitive(GTK_WIDGET(pwDesignUpdate), FALSE); /* export design */ #if GTK_CHECK_VERSION(3,0,0) pwhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwhbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwPage), pwhbox, FALSE, FALSE, 4); pwDesignExport = gtk_button_new_with_label(_("Export design")); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignExport, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignExport), "clicked", G_CALLBACK(ExportDesign), NULL); /* import design */ pwDesignImport = gtk_button_new_with_label(_("Import design")); gtk_box_pack_start(GTK_BOX(pwhbox), pwDesignImport, FALSE, FALSE, 4); g_signal_connect(G_OBJECT(pwDesignImport), "clicked", G_CALLBACK(ImportDesign), plBoardDesigns); gtk_widget_show_all(pwPage); return pwPage; } static void BoardPrefsDestroy(GtkWidget * UNUSED(pw), GList * plBoardDesigns) { fUpdate = FALSE; GTKSetCurrentParent(NULL); free_board_designs(plBoardDesigns); } static void GetPrefs(renderdata * prd) { float ar[4]; #if defined(USE_BOARD3D) prd->fDisplayType = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwBoardType)) ? DT_2D : DT_3D; if (display_is_3d(&rdPrefs)) { int newCurveAccuracy; /* dice colour same as chequer colour */ for (int i = 0; i < 2; ++i) { prd->afDieColour3d[i] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(apwDieColour[i])); } prd->showShadows = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwShowShadows)); prd->shadowDarkness = (int) gtk_adjustment_get_value(padjDarkness); /* Darkness as percentage of ambient light */ prd->dimness = (((float) prd->lightLevels[1] / 100.0f) * (float) (100 - prd->shadowDarkness)) / 100.0f; prd->animateRoll = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwAnimateRoll)); prd->animateFlag = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwAnimateFlag)); newCurveAccuracy = (int) gtk_adjustment_get_value(padjAccuracy); newCurveAccuracy -= (newCurveAccuracy % 4); prd->curveAccuracy = newCurveAccuracy; prd->lightType = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwLightSource)) ? LT_POSITIONAL : LT_DIRECTIONAL; prd->lightPos[0] = (float) gtk_adjustment_get_value(padjLightPosX); prd->lightPos[1] = (float) gtk_adjustment_get_value(padjLightPosY); prd->lightPos[2] = (float) gtk_adjustment_get_value(padjLightPosZ); prd->lightLevels[0] = (int) gtk_adjustment_get_value(padjLightLevelAmbient); prd->lightLevels[1] = (int) gtk_adjustment_get_value(padjLightLevelDiffuse); prd->lightLevels[2] = (int) gtk_adjustment_get_value(padjLightLevelSpecular); prd->boardAngle = (float) gtk_adjustment_get_value(padjBoardAngle); prd->skewFactor = (float) gtk_adjustment_get_value(padjSkewFactor); prd->pieceType = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwRoundedPiece)) ? PT_ROUNDED : PT_FLAT; prd->pieceTextureType = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwTextureAllPiece)) ? PTT_ALL : PTT_TOP; prd->diceSize = (float) gtk_adjustment_get_value(padjDiceSize); prd->roundedEdges = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwRoundedEdges)); prd->bgInTrays = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwBgTrays)); prd->roundedPoints = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwRoundPoints)); prd->planView = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwPlanView)); prd->fHinges3d = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwHinges)); } else #endif { /* dice colour same as chequer colour */ for (int i = 0; i < 2; ++i) { prd->afDieColour[i] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(apwDieColour[i])); } for (int i = 0; i < 2; i++) { prd->arRefraction[i] = (float) gtk_adjustment_get_value(apadj[i]); prd->arCoefficient[i] = (float) gtk_adjustment_get_value(apadjCoefficient[i]); prd->arExponent[i] = (float) gtk_adjustment_get_value(apadjExponent[i]); prd->arDiceCoefficient[i] = (float) gtk_adjustment_get_value(apadjDiceCoefficient[i]); prd->arDiceExponent[i] = (float) gtk_adjustment_get_value(apadjDiceExponent[i]); } gtk_color_button_get_array(GTK_COLOR_BUTTON(apwColour[0]), ar); for (int i = 0; i < 4; i++) prd->aarColour[0][i] = ar[i]; gtk_color_button_get_array(GTK_COLOR_BUTTON(apwColour[1]), ar); for (int i = 0; i < 4; i++) prd->aarColour[1][i] = ar[i]; gtk_color_button_get_array(GTK_COLOR_BUTTON(apwDiceColour[0]), ar); for (int i = 0; i < 3; i++) prd->aarDiceColour[0][i] = ar[i]; gtk_color_button_get_array(GTK_COLOR_BUTTON(apwDiceColour[1]), ar); for (int i = 0; i < 3; i++) prd->aarDiceColour[1][i] = ar[i]; for (int j = 0; j < 2; ++j) { gtk_color_button_get_array(GTK_COLOR_BUTTON(apwDiceDotColour[j]), ar); for (int i = 0; i < 3; i++) prd->aarDiceDotColour[j][i] = ar[i]; } /* cube colour */ gtk_color_button_get_array(GTK_COLOR_BUTTON(pwCubeColour), ar); for (int i = 0; i < 3; i++) prd->arCubeColour[i] = ar[i]; /* board colour */ for (int j = 0; j < 4; j++) { gtk_color_button_get_array(GTK_COLOR_BUTTON(apwBoard[j]), ar); for (int i = 0; i < 3; i++) prd->aanBoardColour[j][i] = (ar[i] == 1) ? 0xff : (unsigned char) (ar[i] * 0x100); } prd->aSpeckle[0] = (int) (gtk_adjustment_get_value(apadjBoard[0]) * 0x80); /* prd->aSpeckle[ 1 ] = (int)(gtk_adjustment_get_value( apadjBoard[ 1 ] ) * 0x80); */ prd->aSpeckle[2] = (int) (gtk_adjustment_get_value(apadjBoard[2]) * 0x80); prd->aSpeckle[3] = (int) (gtk_adjustment_get_value(apadjBoard[3]) * 0x80); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwWood))) prd->wt = gtk_combo_box_get_active(GTK_COMBO_BOX(pwWoodType)); else prd->wt = WOOD_PAINT; prd->rRound = 1.0f - (float) gtk_adjustment_get_value(padjRound); prd->fHinges = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwHinges)); WorkOut2dLight(prd); } prd->fDynamicLabels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwDynamicLabels)); prd->fLabels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwLabels)); prd->showMoveIndicator = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pwMoveIndicator)); prd->fClockwise = fClockwise; /* yuck */ } static void append_preview_page(GtkWidget * pwNotebook, GtkWidget * pwPage, char *szLabel, pixmapindex UNUSED(pi)) { GtkWidget *pw; #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #else pw = gtk_hbox_new(FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pw), pwPage, TRUE, TRUE, 0); gtk_widget_show_all(pw); gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), pw, gtk_label_new(szLabel)); } void AddPages(BoardData * bd, GtkWidget * pwNotebook, GList * plBoardDesigns) { #if defined(USE_BOARD3D) gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), LightingPage(bd), gtk_label_new(_("Lighting"))); gtk_widget_set_sensitive(frame3dOptions, display_is_3d(&rdPrefs)); #endif gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), DesignPage(plBoardDesigns, bd), gtk_label_new(_("Designs"))); #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) { ResetPreviews(); append_preview_page(pwNotebook, ChequerPrefs3d(bd), _("Chequers"), PI_CHEQUERS0); append_preview_page(pwNotebook, BoardPage3d(bd), _("Board"), PI_BOARD); append_preview_page(pwNotebook, BorderPage3d(bd), _("Border"), PI_BORDER); append_preview_page(pwNotebook, DicePrefs3d(bd, 0), _("Dice (0)"), PI_DICE0); append_preview_page(pwNotebook, DicePrefs3d(bd, 1), _("Dice (1)"), PI_DICE1); append_preview_page(pwNotebook, CubePrefs3d(bd), _("Cube"), PI_CUBE); } else #endif { append_preview_page(pwNotebook, ChequerPrefs(bd, 0), _("Chequers (0)"), PI_CHEQUERS0); append_preview_page(pwNotebook, ChequerPrefs(bd, 1), _("Chequers (1)"), PI_CHEQUERS1); append_preview_page(pwNotebook, BoardPage(bd), _("Board"), PI_BOARD); append_preview_page(pwNotebook, BorderPage(bd), _("Border"), PI_BORDER); append_preview_page(pwNotebook, DicePrefs(bd, 0), _("Dice (0)"), PI_DICE0); append_preview_page(pwNotebook, DicePrefs(bd, 1), _("Dice (1)"), PI_DICE1); append_preview_page(pwNotebook, CubePrefs(bd), _("Cube"), PI_CUBE); } } static void ChangePage(GtkNotebook * UNUSED(notebook), GtkNotebook * UNUSED(page), guint page_num, gpointer UNUSED(user_data)) { BoardData *bd = BOARD(pwPrevBoard)->board_data; unsigned int dicePage = NUM_NONPREVIEW_PAGES + PI_DICE0; if (!fUpdate) return; #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) dicePage -= 1; #endif /* Make sure correct dice preview visible */ if ((page_num == dicePage && bd->turn == 1) || (page_num == dicePage + 1 && bd->turn == -1)) { bd->turn = -bd->turn; #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs)) setDicePos(bd, bd->bd3d); else #endif RollDice2d(bd); option_changed(0, 0); } #if defined(USE_BOARD3D) if (display_is_3d(&rdPrefs) && redrawChange) { redraw_changed(NULL, NULL); redrawChange = FALSE; } #endif } static void pref_dialog_map(GtkWidget * UNUSED(window), BoardData * bd) { #if defined(USE_BOARD3D) DisplayCorrectBoardType(bd, bd->bd3d, bd->rd); redrawChange = FALSE; #else (void) bd; /* suppress unused parameter compiler warning */ #endif SetTitle(); /* Make sure title selected properly */ gtk_widget_grab_focus(pwDesignList); /* Select this to stop "change" message after something is changed */ fUpdate = TRUE; } extern void BoardPreferences(GtkWidget * pwBoard) { GtkWidget *pwDialog, *pwHbox; BoardData *bd; /* Set up board with current preferences, hide unwanted elements */ CopyAppearance(&rdPrefs); rdPrefs.fDiceArea = FALSE; rdPrefs.fShowGameInfo = FALSE; /* Create preview board */ pwPrevBoard = board_new(&rdPrefs, TRUE); bd = BOARD(pwPrevBoard)->board_data; #if defined(USE_BOARD3D) InitColourSelectionDialog(); #endif InitBoardPreview(bd); RollDice2d(bd); pwDialog = GTKCreateDialog(_("GNU Backgammon - Appearance"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_MINMAXBUTTONS, G_CALLBACK(BoardPrefsOK), pwBoard); #if defined(USE_BOARD3D) if (widget3dValid) { SetPreviewLightLevel(bd->rd->lightLevels); setDicePos(bd, bd->bd3d); } #endif #if GTK_CHECK_VERSION(3,0,0) pwHbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pwHbox = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwHbox); pwNotebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(pwNotebook), TRUE); gtk_notebook_popup_enable(GTK_NOTEBOOK(pwNotebook)); gtk_container_set_border_width(GTK_CONTAINER(pwNotebook), 4); #if !defined(USE_BOARD3D) /* Make sure preview is big enough in 2d mode */ gtk_widget_set_size_request(GTK_WIDGET(pwNotebook), -1, 360); #endif gtk_box_pack_start(GTK_BOX(pwHbox), pwNotebook, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwHbox), pwPrevBoard, TRUE, TRUE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), GeneralPage(bd, pwBoard), gtk_label_new(_("General"))); plBoardDesigns = read_board_designs(); AddPages(bd, pwNotebook, plBoardDesigns); g_signal_connect(G_OBJECT(pwNotebook), "switch-page", G_CALLBACK(ChangePage), 0); g_signal_connect(G_OBJECT(pwDialog), "destroy", G_CALLBACK(BoardPrefsDestroy), plBoardDesigns); gtk_notebook_set_current_page(GTK_NOTEBOOK(pwNotebook), NUM_NONPREVIEW_PAGES); g_signal_connect(pwDialog, "map", G_CALLBACK(pref_dialog_map), bd); GTKRunDialog(pwDialog); } /* External board preference helper functions */ extern void SetBoardPreferences(GtkWidget * pwBoard, char *sz) { char *apch[2]; while (ParseKeyValue(&sz, apch)) RenderPreferencesParam(GetMainAppearance(), apch[0], apch[1]); if (fX) { BoardData *bd = BOARD(pwBoard)->board_data; if (gtk_widget_get_realized(pwBoard)) { board_free_pixmaps(bd); board_create_pixmaps(pwBoard, bd); #if defined(USE_BOARD3D) DisplayCorrectBoardType(bd, bd->bd3d, bd->rd); if (display_is_3d(bd->rd)) UpdateShadows(bd->bd3d); else StopIdle3d(bd, bd->bd3d); if (display_is_2d(bd->rd)) #endif { gtk_widget_queue_draw(bd->drawing_area); gtk_widget_queue_draw(bd->dice_area); } gtk_widget_queue_draw(bd->table); } } } #if defined(USE_BOARD3D) static int IsWhiteColour3d(Material * pMat) { return (pMat->ambientColour[0] == 1) && (pMat->ambientColour[1] == 1) && (pMat->ambientColour[2] == 1) && (pMat->diffuseColour[0] == 1) && (pMat->diffuseColour[1] == 1) && (pMat->diffuseColour[2] == 1) && (pMat->specularColour[0] == 1) && (pMat->specularColour[1] == 1) && (pMat->specularColour[2] == 1); } static int IsBlackColour3d(Material * pMat) { return (pMat->ambientColour[0] == 0) && (pMat->ambientColour[1] == 0) && (pMat->ambientColour[2] == 0) && (pMat->diffuseColour[0] == 0) && (pMat->diffuseColour[1] == 0) && (pMat->diffuseColour[2] == 0) && (pMat->specularColour[0] == 0) && (pMat->specularColour[1] == 0) && (pMat->specularColour[2] == 0); } extern void Default3dSettings(BoardData * bd) { /* If no 3D settings loaded, set 3D appearance to first design */ /* Check if colours are set to default values */ if (IsWhiteColour3d(&bd->rd->ChequerMat[0]) && IsBlackColour3d(&bd->rd->ChequerMat[1]) && IsWhiteColour3d(&bd->rd->DiceMat[0]) && IsBlackColour3d(&bd->rd->DiceMat[1]) && IsBlackColour3d(&bd->rd->DiceDotMat[0]) && IsWhiteColour3d(&bd->rd->DiceDotMat[1]) && IsWhiteColour3d(&bd->rd->CubeMat) && IsBlackColour3d(&bd->rd->CubeNumberMat) && IsWhiteColour3d(&bd->rd->PointMat[0]) && IsBlackColour3d(&bd->rd->PointMat[1]) && IsBlackColour3d(&bd->rd->BoxMat) && IsWhiteColour3d(&bd->rd->PointNumberMat) && IsWhiteColour3d(&bd->rd->BackGroundMat)) { GList *plDesigns; /* Use new appearance settings to preserve current 2d settings */ renderdata rdNew; CopyAppearance(&rdNew); plDesigns = read_board_designs(); if (plDesigns && g_list_length(plDesigns) > 0) { boarddesign *pbde = g_list_nth_data(plDesigns, 0); if (pbde->szBoardDesign) { char *apch[2]; gchar *sz, *pch; pch = sz = g_strdup(pbde->szBoardDesign); while (ParseKeyValue(&sz, apch)) RenderPreferencesParam(&rdNew, apch[0], apch[1]); g_free(pch); /* Copy 3D settings from rdNew to main appearance settings */ bd->rd->pieceType = rdNew.pieceType; bd->rd->pieceTextureType = rdNew.pieceTextureType; bd->rd->fHinges3d = rdNew.fHinges3d; bd->rd->showMoveIndicator = rdNew.showMoveIndicator; bd->rd->showShadows = rdNew.showShadows; bd->rd->roundedEdges = rdNew.roundedEdges; bd->rd->bgInTrays = rdNew.bgInTrays; bd->rd->roundedPoints = rdNew.roundedPoints; bd->rd->shadowDarkness = rdNew.shadowDarkness; bd->rd->curveAccuracy = rdNew.curveAccuracy; bd->rd->skewFactor = rdNew.skewFactor; bd->rd->boardAngle = rdNew.boardAngle; bd->rd->diceSize = rdNew.diceSize; bd->rd->planView = rdNew.planView; memcpy(bd->rd->ChequerMat, rdNew.ChequerMat, sizeof(Material[2])); memcpy(bd->rd->DiceMat, rdNew.DiceMat, sizeof(Material[2])); bd->rd->DiceMat[0].textureInfo = bd->rd->DiceMat[1].textureInfo = 0; bd->rd->DiceMat[0].pTexture = bd->rd->DiceMat[1].pTexture = 0; memcpy(bd->rd->DiceDotMat, rdNew.DiceDotMat, sizeof(Material[2])); memcpy(&bd->rd->CubeMat, &rdNew.CubeMat, sizeof(Material)); memcpy(&bd->rd->CubeNumberMat, &rdNew.CubeNumberMat, sizeof(Material)); memcpy(&bd->rd->BaseMat, &rdNew.BaseMat, sizeof(Material)); memcpy(bd->rd->PointMat, rdNew.PointMat, sizeof(Material[2])); memcpy(&bd->rd->BoxMat, &rdNew.BoxMat, sizeof(Material)); memcpy(&bd->rd->HingeMat, &rdNew.HingeMat, sizeof(Material)); memcpy(&bd->rd->PointNumberMat, &rdNew.PointNumberMat, sizeof(Material)); memcpy(&bd->rd->BackGroundMat, &rdNew.BackGroundMat, sizeof(Material)); memset(&bd->rd->lightPos, 0, sizeof(rdNew.lightPos)); memset(&bd->rd->lightLevels, 0, sizeof(rdNew.lightLevels)); memcpy(&bd->rd->lightPos, &rdNew.lightPos, sizeof(rdNew.lightPos)); memcpy(&bd->rd->lightLevels, &rdNew.lightLevels, sizeof(rdNew.lightLevels)); memcpy(&bd->rd->afDieColour3d, &rdNew.afDieColour3d, sizeof(rdNew.afDieColour3d)); } } free_board_designs(plDesigns); } } #endif /* Xml board parsing code */ typedef enum { STATE_NONE, STATE_BOARD_DESIGNS, STATE_BOARD_DESIGN, STATE_ABOUT, STATE_TITLE, STATE_AUTHOR, STATE_DESIGN } parserstate; typedef struct { gchar *filename; parserstate state; boarddesign *current_design; GList *designs; gboolean deletable; } DesignParser; static void design_parser_start_element(GMarkupParseContext * UNUSED(context), const gchar * element_name, const gchar ** UNUSED(attribute_names), const gchar ** UNUSED(attribute_values), gpointer user_data, GError ** UNUSED(error)) { DesignParser *parser = (DesignParser *) user_data; switch (parser->state) { case STATE_NONE: if (strcmp(element_name, "board-designs") == 0) parser->state = STATE_BOARD_DESIGNS; break; case STATE_BOARD_DESIGNS: if (strcmp(element_name, "board-design") == 0) { parser->state = STATE_BOARD_DESIGN; parser->current_design = g_new0(boarddesign, 1); } break; case STATE_BOARD_DESIGN: if (strcmp(element_name, "about") == 0) parser->state = STATE_ABOUT; if (strcmp(element_name, "design") == 0) parser->state = STATE_DESIGN; break; case STATE_ABOUT: if (strcmp(element_name, "title") == 0) parser->state = STATE_TITLE; if (strcmp(element_name, "author") == 0) parser->state = STATE_AUTHOR; break; case STATE_TITLE: case STATE_AUTHOR: case STATE_DESIGN: default: break; } } static void design_parser_end_element(GMarkupParseContext * UNUSED(context), const gchar * UNUSED(element_name), gpointer user_data, GError ** UNUSED(error)) { DesignParser *parser = (DesignParser *) user_data; switch (parser->state) { case STATE_NONE: g_assert_not_reached(); break; case STATE_BOARD_DESIGNS: parser->state = STATE_NONE; break; case STATE_BOARD_DESIGN: parser->current_design->fDeletable = parser->deletable; parser->designs = g_list_prepend(parser->designs, parser->current_design); parser->current_design = NULL; parser->state = STATE_BOARD_DESIGNS; break; case STATE_ABOUT: parser->state = STATE_BOARD_DESIGN; break; case STATE_TITLE: parser->state = STATE_ABOUT; break; case STATE_AUTHOR: parser->state = STATE_ABOUT; break; case STATE_DESIGN: parser->state = STATE_BOARD_DESIGN; break; default: g_assert_not_reached(); } } static void design_parser_characters(GMarkupParseContext * UNUSED(context), const gchar * text, gsize UNUSED(text_len), gpointer user_data, GError ** UNUSED(error)) { DesignParser *parser = (DesignParser *) user_data; switch (parser->state) { case STATE_TITLE: parser->current_design->szTitle = g_strdup(text); break; case STATE_AUTHOR: parser->current_design->szAuthor = g_strdup(text); break; case STATE_DESIGN: parser->current_design->szBoardDesign = g_strdup(text); break; default: break; } } static void design_parser_error(GMarkupParseContext * UNUSED(context), GError * UNUSED(error), gpointer user_data) { DesignParser *parser = (DesignParser *) user_data; g_warning(_("An error occurred while parsing file: %s\n"), parser->filename); } static GList * ParseBoardDesigns(const char *szFile, const int fDeletable) { GMarkupParser markup_parser = { design_parser_start_element, design_parser_end_element, design_parser_characters, NULL, design_parser_error }; GList *returnlist; GMarkupParseContext *context; DesignParser *parser; char *contents; gsize size; GError *error = NULL; parser = g_new0(DesignParser, 1); parser->filename = g_strdup(szFile); parser->designs = NULL; parser->deletable = fDeletable; /* create parser context */ if (!g_file_get_contents(szFile, &contents, &size, NULL)) { g_free(parser->filename); g_free(parser); return NULL; } context = g_markup_parse_context_new(&markup_parser, (GMarkupParseFlags) 0, parser, NULL); if (!context) { g_free(contents); g_free(parser->filename); g_free(parser); return NULL; } /* parse document */ if (!g_markup_parse_context_parse(context, contents, size, &error)) { g_warning(_("Error parsing XML: %s\n"), error->message); g_error_free(error); free_board_designs(parser->designs); g_markup_parse_context_free(context); g_free(contents); g_free(parser->filename); g_free(parser); return NULL; } g_markup_parse_context_free(context); returnlist = parser->designs; g_free(contents); g_free(parser->filename); free_board_design(parser->current_design, NULL); g_free(parser); return g_list_reverse(returnlist); } gnubg-1.08.003/glib-ext.h000644 001751 000024 00000013300 14574155047 014515 0ustar00pmstaff000000 000000 /* * Copyright (C) 2014-2015 Michael Petch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: glib-ext.h,v 1.16 2021/08/22 15:20:33 plm Exp $ */ /* Map/GList extensions and utility functions for GLIB */ #ifndef GLIB_EXT_H #define GLIB_EXT_H #include #include #define GLIBEXT_MERGE(a,b) a##b #define GLIBEXT_LABEL_(a,b) GLIBEXT_MERGE(a, b) #if ! GLIB_CHECK_VERSION(2,28,0) extern void g_list_free_full(GList * list, GDestroyNotify free_func); #endif typedef GList GMap; typedef GList GMapEntry; extern void glib_ext_init(void); extern GType g_list_boxed_get_type(void); extern GType g_map_boxed_get_type(void); extern GType g_mapentry_boxed_get_type(void); extern void g_value_unsetfree(GValue * gv); extern void g_value_print(GValue * gv, int depth); extern GMapEntry *str2gv_map_has_key(GMap * map, GString * key); extern GValue *str2gv_map_get_key_value(GMap * map, gchar * key, GValue * defaultgv); extern void g_list_gv_boxed_free(GList * list); extern void g_list_gv_free_full(gpointer data); extern GList *create_str2int_tuple(char *str, int value); extern GList *create_str2gvalue_tuple(char *str, GValue * gv); extern void g_value_list_tostring(GString * str, GList * list, int depth); extern void g_value_tostring(GString * str, GValue * gv, int depth); #define G_TYPE_BOXED_GLIST_GV (g_list_boxed_get_type ()) #define G_VALUE_HOLDS_BOXED_GLIST_GV(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED_GLIST_GV)) #define G_TYPE_BOXED_MAP_GV (g_map_boxed_get_type ()) #define G_VALUE_HOLDS_BOXED_MAP_GV(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED_MAP_GV)) #define G_TYPE_BOXED_MAPENTRY_GV (g_mapentry_boxed_get_type ()) #define G_VALUE_HOLDS_BOXED_MAPENTRY_GV(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED_MAPENTRY_GV)) #define G_VALUE_HOLDS_GSTRING(gvalue) G_TYPE_CHECK_VALUE_TYPE ((gvalue), G_TYPE_GSTRING) #define g_value_get_gstring_gchar(gvalue) ((GString *)g_value_get_boxed(gvalue))->str #define g_value_get_gstring(gvalue) ((GString *)g_value_get_boxed(gvalue)) #if ! GLIB_CHECK_VERSION(2,67,1) #define GLIBEXT_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func) \ GType \ type_name##_get_type (void) \ { \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) { \ GType g_define_type_id = \ g_boxed_type_register_static (g_intern_static_string (#TypeName), \ (GBoxedCopyFunc) copy_func, \ (GBoxedFreeFunc) free_func); \ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ } \ return g_define_type_id__volatile; \ } #else #define GLIBEXT_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func) \ GType \ type_name##_get_type (void) \ { \ static gsize static_g_define_type_id = 0; \ if (g_once_init_enter (&static_g_define_type_id)) { \ GType g_define_type_id = \ g_boxed_type_register_static (g_intern_static_string (#TypeName), \ (GBoxedCopyFunc) copy_func, \ (GBoxedFreeFunc) free_func); \ g_once_init_leave (&static_g_define_type_id, g_define_type_id); \ } \ return static_g_define_type_id; \ } #endif #define GVALUE_CREATE(typeval,typename,value,gvobject) \ GValue * gvobject = (GValue *)g_malloc0(sizeof(GValue)); \ g_value_init(gvobject, typeval); \ g_value_set_##typename(gvobject, value); #define STR2GV_MAPENTRY_CREATE(str,value,typeval,typename,gvmap) \ GString *GLIBEXT_LABEL_(tmpStr,__LINE__) = g_string_new(str); \ GVALUE_CREATE(typeval, typename, value, gvmap##_value); \ GVALUE_CREATE(G_TYPE_GSTRING, boxed, \ GLIBEXT_LABEL_(tmpStr,__LINE__), gvmap##_string); \ GMap *GLIBEXT_LABEL_(tmpMap,__LINE__) = \ g_list_prepend(g_list_prepend(NULL, gvmap##_value), \ gvmap##_string); \ GVALUE_CREATE(G_TYPE_BOXED_MAPENTRY_GV, boxed, GLIBEXT_LABEL_(tmpMap,__LINE__), gvmap); \ g_string_free (GLIBEXT_LABEL_(tmpStr,__LINE__), TRUE); \ g_list_free(GLIBEXT_LABEL_(tmpMap,__LINE__)); #define STR2GV_MAP_ADD_ENTRY(map,mapentry,outmap) \ GMapEntry *GLIBEXT_LABEL_(tmpMap,__LINE__) = str2gv_map_has_key(map, g_value_get_gstring(g_list_nth_data(mapentry, 0))); \ if (GLIBEXT_LABEL_(tmpMap,__LINE__)) { \ /* If key exists delete option */ \ map = g_list_remove_link (map, GLIBEXT_LABEL_(tmpMap,__LINE__)); \ g_list_gv_boxed_free(GLIBEXT_LABEL_(tmpMap,__LINE__)); \ } \ /* Add the entry */ \ GVALUE_CREATE(G_TYPE_BOXED_MAPENTRY_GV, boxed, mapentry, gvptr); \ g_list_free(mapentry);\ outmap = g_list_prepend(map, gvptr); \ #endif gnubg-1.08.003/COPYING000644 001751 000024 00000104515 14570454011 013662 0ustar00pmstaff000000 000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gnubg-1.08.003/gtkpanels.h000644 001751 000024 00000003001 14574155047 014767 0ustar00pmstaff000000 000000 /* * Copyright (C) 2006 Jon Kinsey * Copyright (C) 2008 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkpanels.h,v 1.8 2020/02/23 21:00:47 plm Exp $ */ /* position of windows: main window, game list, and annotation */ #ifndef GTKPANELS_H #define GTKPANELS_H typedef enum { WINDOW_MAIN = 0, WINDOW_GAME, WINDOW_ANALYSIS, WINDOW_ANNOTATION, WINDOW_HINT, WINDOW_MESSAGE, WINDOW_COMMAND, WINDOW_THEORY, NUM_WINDOWS } gnubgwindow; typedef struct { int nWidth, nHeight; int nPosX, nPosY, max; } windowgeometry; extern void SaveWindowSettings(FILE * pf); extern void HidePanel(gnubgwindow window); extern void getWindowGeometry(gnubgwindow window); extern int PanelShowing(gnubgwindow window); extern void ClosePanels(void); extern int GetPanelSize(void); extern void SetPanelWidth(int size); extern void GTKGameSelectDestroy(void); #endif gnubg-1.08.003/gnubg.weights000644 001751 000024 00004140104 14574155047 015336 0ustar00pmstaff000000 000000 GNU Backgammon 1.01 250 128 5 0 0.1000000 1.0000000 -3.2630785 -2.5951145 1.2166669 3.9571550 -0.6251975 -0.9514757 6.7359786 0.1843251 -2.2232103 -2.6085324 0.5113356 0.5699041 -0.4588919 -3.5076666 -0.5302894 -0.1171034 3.0299737 -2.6685348 -1.2139442 -7.5429077 -1.5058811 -2.5029807 -1.7715229 -0.1214760 -0.8260607 -1.8209642 -2.7298121 -4.4525237 1.2649674 -2.5277421 0.4372739 24.0655594 -0.0538021 -0.5263628 -0.1272734 0.7758872 -3.0779676 0.5612360 -0.9533053 -7.2029672 0.0523563 7.1035948 1.8091669 -0.4401488 -3.1030889 0.2037937 4.7141414 -6.3457141 -0.2667190 1.8956021 -2.9971378 1.0577508 -1.7704699 0.4918472 1.4956863 -1.6156567 1.1246160 0.4308738 1.6801161 -1.5325040 2.3667657 -2.0572004 -1.2046926 -0.3633396 -2.3653119 -3.4910989 2.7990646 -0.2579477 -1.6445107 -1.8153435 -1.4301842 -2.3514256 -2.5402114 0.0302004 -6.3121862 0.2676840 -1.1553664 -7.1764264 -4.1949697 2.1605790 15.0099831 -1.2176555 -3.7875445 -0.6525487 1.7469025 -5.1358514 -2.2538991 5.9926271 0.8604234 0.5465414 10.2534781 2.0343356 -0.8529384 -2.3475235 -2.2634652 -1.7471613 -2.6538734 -0.3545569 -1.3986638 0.0446277 -0.5583611 -1.7118865 -7.9818878 1.2890155 -0.7898102 0.0497389 0.0953465 -0.0486736 -0.6482612 1.7374216 -0.0174016 0.5086141 1.5396509 0.6532667 0.3555358 -0.4300672 12.7855902 -5.8876638 0.5931880 -2.1604097 -2.4369991 0.4011405 2.3036582 -6.3999891 1.6628745 1.6463131 0.1707394 -2.0337164 -3.1058383 -6.3096876 -2.5100851 8.0499144 -1.3482034 1.2425112 10.5055542 -1.1845516 -2.5500426 -3.8983185 1.6287246 -0.7536786 -4.4073005 -5.2089429 5.1754742 -5.4377875 1.2492975 -2.6778760 -4.8266559 -12.3614492 -6.8107138 -7.3189025 -2.8740058 -3.9860218 -7.6302476 -15.4823313 0.6710127 3.0451810 3.4049799 -1.8168724 2.8310425 42.1161690 -0.0395632 -4.5432930 -0.6340613 1.0366423 -4.5067611 -2.4498670 -2.2900300 0.9284374 -1.7677927 11.6659088 2.9213586 -4.3220992 -5.3598018 -6.0912819 7.5946040 -15.4589834 0.5073658 2.3336170 -4.5381570 4.4572787 -3.4337077 1.2284665 3.0709970 -6.2781539 0.0838783 -2.1259453 2.3516777 -1.3189969 5.6256533 -1.3297201 -4.3402395 -1.3851031 -4.2918329 -7.5131836 3.6709931 0.1062456 -0.8351016 -31.3088512 -3.3755195 -2.4120088 1.8324236 -0.6262449 -13.1985493 -0.3824441 -1.0558372 -16.2764168 -9.4082432 2.8565741 26.5271606 -2.2241261 -2.1969337 -2.0563855 2.9330664 -2.6047828 -9.0618668 10.9698467 3.2951052 2.7795208 11.7952118 2.6313212 -1.9856031 -4.3031573 -3.3352208 -2.8693008 -5.6561165 0.6025390 -2.3317952 -3.6431081 4.7899857 -8.2875891 4.4635215 1.8374455 4.6022029 -2.0385535 -0.4321131 0.3360066 -2.9743879 2.4040616 0.4208915 0.2709796 3.6448236 2.4359546 -1.1119783 -3.5614297 18.6617222 -10.5862255 2.5573199 -3.2791615 -2.5862656 -0.3052702 1.6269001 -5.4542656 -0.4094180 2.8937776 0.5152699 -2.7423477 -5.0878468 -6.8499322 -1.6971900 8.6603813 -1.7650293 -0.4747723 14.8105650 -1.6418247 -4.4642572 -7.9011884 0.5447897 -1.9128567 -6.2489843 -12.4232244 5.8086238 -5.9435930 3.2702150 -5.6314664 -7.7710838 -23.0926208 -7.0152597 -10.7889557 -5.2382989 -5.8727946 -8.7192383 -22.0594120 -1.5548539 -0.8294895 3.9576449 -3.7161765 3.0952578 59.0419540 -0.3323484 -7.5450006 -0.8469557 1.5791932 -7.1431527 -2.6942887 -4.0689030 -3.9524148 -2.4430149 13.6612701 -2.6168084 -5.7734971 -8.5375252 -10.3404055 11.0774517 -20.1372070 0.5623002 4.2363162 -6.7209606 5.1430221 -6.3066878 1.9797844 3.5543795 -9.8203344 0.3879169 -2.3241653 3.8682206 -2.0226176 7.9044962 -3.5998201 -6.0741992 -2.7376642 -6.7065444 -12.3165426 2.1409819 -0.6809424 -2.4449131 -20.5031319 -5.7468371 -4.4607601 -0.6125760 -1.8577477 -22.0466423 -0.2468694 -3.1413484 -25.6338329 -16.2756901 5.0019822 38.8889999 -3.9704494 -8.3524342 -2.6086750 5.1589279 -3.6595118 -7.9090681 15.8941593 5.2237401 1.2552146 19.2969074 3.7291994 -2.7689617 -7.1009879 -5.4128013 -5.6142273 -8.6701689 0.0584597 -4.0482116 -4.3158994 6.5374980 -7.5714965 3.3788040 3.4952204 5.9575973 -2.8278754 -0.7237384 0.7058963 -2.8662474 2.8751163 -0.7646383 -0.4315735 3.9433653 0.2613437 -2.2470028 -7.0392361 30.7644882 -19.3716850 3.7650948 -6.2408452 -5.4633589 -0.9318150 0.3158310 -14.6941957 -0.0449143 4.3314404 1.4705060 -3.9919667 -4.6459689 -4.0942254 1.1397423 1.6416653 -0.6922868 -2.9235933 8.4803190 -2.5300605 -3.9472506 -7.6773767 -0.8747015 -1.6674008 0.6309687 -15.0074139 2.0123539 -0.7204044 3.3367209 -7.5401001 -8.7539253 -6.1119204 0.7945973 -8.9433565 -3.6900184 -2.4723642 -3.3535130 2.1885962 -4.2780032 -7.2003694 1.1259183 -6.8492599 0.8129429 31.0650291 0.0459426 -6.0336552 -0.4819881 -0.2601428 -3.6533270 0.9873478 -2.5192959 -11.6411810 -2.1175542 3.7186193 -8.1632929 -1.8914746 -7.6849136 -13.8308687 6.4993782 -5.4332304 0.1099890 2.4559636 -2.6654952 2.1432886 -2.6160412 1.7895638 0.1262171 -4.9476628 0.2370670 -0.4088812 1.9959936 -2.1919758 5.0637975 -3.3674047 -2.3388391 -2.8112092 -3.4248948 -8.9591637 -0.0469778 -1.5939610 -3.3097262 -1.3017056 4.7461748 -3.8278151 -4.5620975 -3.3333013 -18.6857948 0.7996172 -4.3583612 -11.2459249 -13.9668989 3.9767509 22.7412319 -3.7854567 -13.2272139 -0.2647592 2.5308738 -2.4053526 -1.2433414 10.0447960 2.3923366 -2.4904082 18.4876633 3.0219610 -1.3933357 -6.1279283 -2.6869621 -5.4564686 -5.7349434 -0.7540606 -3.1545348 -3.5696001 2.3265460 -13.4674873 -1.8609520 2.9407694 2.8184693 -2.3759668 -0.8191799 -1.7786224 -1.1238667 -1.1746341 -1.7894074 -1.4119470 1.7188197 -3.2814829 0.4926389 -9.1734533 23.6400604 -15.9694376 -0.2505890 -6.1906457 -6.3870330 0.0944191 -1.8356328 -14.5566864 0.7254740 2.4560742 1.6228774 -2.4422598 -2.8294284 -2.3935051 1.2638731 3.2986772 -0.9368540 -0.7692054 5.4614077 -0.7560355 -1.7008040 -3.4722555 0.8746986 1.9799964 -0.8874362 -2.9372628 -0.2640986 0.1989908 3.0715508 -2.6945579 -0.4998630 -5.3839517 -1.5984514 -2.2482030 -1.4086845 -0.3338858 -0.5033299 -0.7297831 -2.0393949 -4.2430930 1.5572128 -1.9440516 -2.0082173 22.1618977 0.2252402 -0.2223777 0.3836547 0.6733524 -2.6135700 0.9757100 -1.8417592 -5.3979731 -0.0885181 5.3952827 1.6441537 -0.4864500 -2.6838369 1.4318429 3.7457678 -6.3254213 0.1816457 1.9538301 -2.2236679 0.2811757 -1.8099242 0.5789543 1.0532296 -1.2640436 1.1723363 0.6023179 0.7637220 -1.1811800 1.9022859 -1.9172381 -0.8663096 0.0777739 -1.6136291 -2.5818310 1.6758199 0.0252557 -2.3863046 -2.0046256 -1.5301957 -1.2536548 -3.4186914 0.3754251 -4.7303815 0.5633305 -1.4196337 -8.0583448 -3.9260030 2.0134153 16.4253902 -0.2915777 -3.2241843 -0.8747069 1.0747567 -4.7844090 -1.8755101 5.7551312 0.5275332 0.4313366 10.0415936 1.7858360 -1.3449005 -1.9939027 -2.1573937 -1.4184620 -2.7521718 0.2926398 -1.2720952 -0.5681263 -0.7131932 -2.3026576 -14.1354141 1.2063597 0.0289390 0.4386136 -0.1812319 -0.9522309 -0.5219580 1.3343263 0.2986618 0.2235422 1.3404362 1.0097052 -0.4786549 -0.1981751 12.3161650 -4.4035659 0.4865953 -1.9570175 -1.2084135 0.5105437 3.4533312 -4.5701079 0.9119594 1.4998504 0.3580139 -2.2178991 -1.5010413 -6.6187878 -2.7691171 8.1469479 -1.9439902 2.1241381 10.3181534 -2.1499820 -1.5427547 -4.9045830 1.4968539 2.3078668 -1.3043075 -4.0913897 4.9921727 -4.4911809 1.0515767 -2.0905650 -4.8183150 -9.4784956 -6.3244486 -6.4237404 -2.4870143 -4.1026425 -7.6901908 -9.3467751 2.2027981 2.4145923 3.5375926 -0.6306841 -0.3110920 36.9426956 -0.0943293 -4.7490816 0.1494192 1.6211350 -3.7916455 -3.0708570 -2.6915023 2.2443631 -1.2073616 10.3533745 3.9852355 -3.5724168 -4.4471121 -4.4142456 7.1000085 -8.6331062 0.5163687 2.5492308 -3.9872739 3.0358384 -3.1196651 1.5411322 2.3277895 -5.2430434 0.2084942 -2.3964007 2.0706546 -0.1164718 5.2166228 -0.5966008 -4.7254791 -0.6039162 -3.0336480 -5.9580431 1.4984343 -0.0775665 -1.4929134 -0.4910687 -5.1872692 -2.3446834 1.2435849 0.0146745 -10.3647633 -0.5548275 -1.2533560 -3.2880685 -8.8386755 1.5762343 26.5769978 -1.5070933 -0.5769849 -1.6752416 1.0113689 0.8615211 -5.6718097 10.7002029 3.7741058 1.6230103 11.9668293 2.0927026 -2.4607520 -1.4089237 -2.7496259 -2.3111591 -5.9598398 1.0001613 -2.9026682 -3.1748750 3.5489173 -7.0563455 4.9231076 1.7092379 5.0493946 -1.2161922 -0.3813125 -3.9192576 -3.0459149 0.5599936 0.9276856 0.2727137 3.5213120 3.1458962 -0.3636478 -2.2698934 18.8384609 -7.8077197 1.7760811 -2.6569142 -4.4967451 0.3128172 4.1418805 -2.3000829 -0.8575351 2.9974909 0.9091890 -2.6193674 -2.7940993 -8.8552923 -2.0121009 10.4761419 -2.1126785 1.0995966 14.4714785 -2.2835598 -3.0521243 -8.0188465 1.1644287 1.5563089 -5.7073970 -8.9296694 6.0082426 -5.0469761 3.1111438 -4.2953358 -7.4027104 -18.9079189 -7.9214282 -9.7550039 -4.5744467 -5.5824599 -9.0296116 -18.9267235 0.3573261 -1.0531030 4.6702847 -2.7764366 -0.3994407 55.9067459 0.1298990 -7.0360775 0.1574293 1.8961326 -6.5209327 -3.1027436 -4.0736742 -6.6164432 -2.0407848 14.3170567 2.2801957 -4.1807208 -7.0642185 -3.6554751 10.0988550 -17.1808567 0.9844744 4.1523914 -6.2204242 3.2107689 -5.3351331 2.2930369 2.5905700 -8.4462910 0.3401747 -2.5869954 3.2466502 -0.5153241 7.8384590 -2.3036509 -6.0153313 -1.2047865 -5.0604138 -9.5248470 1.1382846 -0.7369633 -3.0200803 -2.1040695 -6.9782224 -4.1608539 -1.1136048 -0.7082337 -16.5092392 0.0441766 -2.7934563 -12.3414450 -14.6125698 3.7942946 40.2433167 -2.6006005 -4.2485795 -2.4096508 2.9965525 -0.9204491 -5.2888761 15.5310717 5.4585414 0.7951001 19.9292545 3.4797461 -3.0020809 -4.2016730 -4.6944995 -3.9646513 -8.8280411 1.0460253 -4.3262362 -3.9784539 5.1469517 -8.4060631 4.0292649 3.5462968 6.4985685 -2.2025826 0.0090490 -2.9316452 -3.6423280 0.7144063 -0.0090364 0.0520647 5.0537825 2.4977748 -1.9258285 -5.0977101 29.8270912 -14.7827768 2.6632953 -5.2063503 -8.4354372 -0.3281663 4.1066818 -8.0534286 -0.4995272 4.1850810 1.6080188 -4.0003920 -3.0984399 -2.8722312 1.4135040 2.7763340 -0.7804693 -2.6521893 7.8222136 -1.5255084 -3.1492527 -7.2099376 -0.8554603 -2.7278955 -6.5777593 -13.6012888 2.1851361 -1.4100057 3.5383439 -7.3621888 -6.4421806 -13.6721182 -3.2524238 -7.7066927 -4.6646824 -1.4675515 -3.1990721 -5.3285861 -8.9277191 -7.8845968 0.4794999 -4.4654670 1.1818134 29.0928059 0.3904020 -5.2422423 -0.1580284 -0.1101544 -3.5654628 0.8219844 -2.6573362 -9.9330320 -2.4598930 5.2993445 -6.4318285 -1.5800006 -5.7565513 -7.3140278 5.9716072 -4.6690302 -0.4855048 2.4667454 -3.4810009 0.7671294 -3.1265044 1.9306943 1.1686836 -5.2136216 0.4029596 -0.2051128 2.3812556 -0.4455507 4.9782438 -4.7514892 -1.6353531 -2.5423648 -2.7368572 -8.1098709 -0.8902031 -1.8994613 -3.8808901 -5.1512084 -5.9711323 -3.6247344 -4.0571589 -3.5566766 -12.8409147 1.5688566 -6.5047984 -24.3427525 -13.3364296 4.2534261 23.4197140 -3.8237803 -12.7661734 0.0668257 2.9873068 0.5479861 -2.2373109 9.8649178 1.3280201 -2.4428096 15.7888269 2.9770613 -1.3742387 -4.6164637 -3.8154240 -6.1179380 -5.4659343 -2.2490375 -3.7560949 -3.4654675 3.0761731 -6.0079789 -1.1705616 2.6429245 2.1995642 -2.2879882 -0.4025489 -1.5835537 -0.5991306 1.4911271 -2.6674914 -1.5450244 0.7106628 -3.3575132 0.0955474 -8.6449184 23.8939018 -15.6500807 1.1382338 -5.9222693 -2.9074616 -0.4107440 -2.5373902 -15.5931149 1.2316717 2.5815139 1.5000461 -4.2004447 -2.1971877 -2.6141191 1.2101640 3.3829279 -1.4535410 -0.0085974 4.9316478 -1.3727218 -0.6902640 -4.1647816 1.4131672 0.8871522 -0.3201621 -2.5928504 -0.7685314 -0.4948182 2.9706120 -1.3037444 -0.5658464 -3.5897501 -1.3409342 -1.7652336 -0.8614082 -0.7442642 -0.3771860 0.3338196 -0.6651455 -4.8174067 1.6942208 -2.5252728 -4.4891109 20.9714413 -0.3350453 0.4030088 1.0980545 0.9915413 -2.1277769 0.5058218 -3.2590034 -3.4176188 0.1093220 4.9560142 0.7608551 -1.3772895 -1.9236430 0.5321200 3.5116787 -4.4266315 -0.2273422 1.5616851 -1.3799946 -0.6522825 -1.8941518 0.6602320 1.0752617 -0.8011289 0.7114565 0.5811698 0.4651424 -1.2412008 0.8188938 -1.6074874 -1.4957505 0.2561871 -0.8216842 -1.7721344 0.5750757 -0.0007013 -2.0491438 -1.5659816 -3.8443749 0.0158803 -4.1137052 1.0463433 -3.3680980 -0.1221837 -1.1491922 -6.4906912 -3.5658517 1.5346020 18.7096214 -0.2829136 -2.2710981 -1.3413333 0.6001179 -4.4677258 0.0461623 5.6944947 0.9600857 0.3806743 9.9910831 1.8408016 -1.7752949 -1.2606103 -1.7736027 -0.9710064 -2.8153408 0.1414635 -1.7828156 -0.8884946 -1.0518339 -1.9744319 -28.9577866 1.2332317 0.8392358 0.0862102 -0.4817042 -1.2500314 -0.4272945 0.4719780 0.7306095 0.1233732 1.2794943 1.4838709 -0.4460594 -0.2055990 9.5388126 -3.1145196 0.5900097 -1.3323511 -0.4213253 0.6100612 -2.6088917 -3.5284691 0.6409837 0.9603800 0.3543298 -2.0651748 0.7364463 -5.5954142 -2.7178643 8.3728256 -2.2168450 3.5744665 9.2067680 -2.4732230 -0.2007327 -6.4823384 1.4970785 3.9954677 1.0174793 -3.3721566 5.7416606 -4.5595794 0.9964144 0.5035083 -4.6702828 -6.2001519 -6.5953312 -5.8683963 -1.4963671 -4.0304379 -7.9245882 -7.4994130 5.4656758 3.0564854 3.3992262 -0.3384963 -0.0866315 33.1214867 0.0758507 -4.9560194 0.7557735 2.3760331 -2.9695101 -2.7267427 -3.1096551 -0.9365119 -0.8446810 9.7621107 4.1333489 -4.5618396 -3.3500154 -7.2798753 6.3758140 -3.3927262 0.6149533 2.4325032 -2.9735029 2.7706912 -2.9358323 1.4192649 2.7040949 -3.7447424 0.2401911 -2.2174799 1.9576646 -0.1924181 3.5559340 0.2879217 -4.5509496 0.0551829 -2.2554772 -4.1036496 -0.3635580 -0.1423831 -1.6492302 0.3755102 -6.9061880 -0.8386620 0.0888304 0.8153592 -7.3957705 -0.4725527 -0.6088471 4.5629458 -8.5014830 0.6086998 26.7119961 -1.3130909 1.9494479 -2.0230734 -0.0056482 0.3539625 1.5564666 10.8038673 3.9982693 0.6140798 11.5875731 1.6444498 -2.5527956 0.8798097 -1.8778752 -1.2612734 -5.9185610 1.1776100 -2.8978629 -3.2849243 3.6860285 -4.2383366 3.5875015 2.0169001 6.4981418 -1.8372740 -0.3163142 -7.8922343 -2.9122388 0.6075510 1.3051679 0.2418867 2.9738722 3.7544675 -0.0524816 -1.8455756 18.8100986 -5.5545883 2.0686376 -1.8134732 0.0155939 0.0718623 -2.3172631 -0.9179842 -1.5705004 2.3055544 1.1537424 -2.8002377 1.4929903 -7.6863246 -2.3736897 11.3001080 -2.4810469 3.2270069 13.3365469 -1.9951446 -1.4045982 -9.5960608 1.7703389 3.5564773 -2.6164804 -6.9492083 6.1704516 -5.9805269 2.8238206 -1.3913991 -6.4393182 -13.8953638 -8.8402433 -8.8225079 -3.3421910 -5.2184100 -9.3966970 -17.4227943 5.0728908 -0.0863572 4.5604744 -1.7851589 -1.2138269 49.3823471 0.4508708 -6.6805921 1.0201479 2.6681092 -5.7489629 -2.6625896 -4.0373960 -12.1743670 -1.5256193 14.0797186 4.3122411 -5.3536096 -5.6679192 -9.9348993 9.2969303 -9.0354376 1.0470976 3.9267399 -5.3973236 3.4348745 -5.1331692 1.8414290 2.9192467 -6.2262173 0.4668513 -2.5905180 3.0722766 -1.0031549 6.7108035 -1.1458398 -5.8961363 -0.2245982 -3.9700763 -6.7851944 -0.1157362 0.1179240 -3.2357674 -1.9798318 -8.0659189 -1.7822683 -1.4981154 0.7619355 -11.9856510 0.0653654 -1.9171523 -4.9491081 -13.1470785 2.4995403 41.3355980 -2.4896579 -0.2898487 -2.4502306 1.7297584 -0.9558122 -1.4562016 15.7323256 5.3036122 0.0189249 18.9431725 3.0966656 -3.1672571 0.2460497 -4.0090351 -3.0402358 -8.7053785 1.6244688 -3.9466796 -4.0770693 5.1521211 -5.4680262 1.7873718 3.7980785 8.1157951 -3.5599236 0.1089847 -9.3592176 -3.8220727 1.2032957 0.6826840 0.0525817 4.4873152 4.2539821 -2.6249402 -3.6484628 28.6070309 -11.1955853 3.2972889 -3.7532289 -0.4295067 0.2279795 -1.1341934 -4.7685061 -0.9978490 3.5660622 1.4428874 -4.2385097 -2.7787008 -1.9516691 1.3831712 3.5534816 0.1654471 -1.9369053 7.0677500 -0.9898072 -3.5310230 -6.6094160 -1.8502892 -1.0733106 0.1270736 -8.6475506 1.6880804 -2.7655337 3.5811949 -4.6979113 -3.8355141 -16.5758591 -0.1413772 -6.6629100 -3.7693863 -1.0826708 -2.3686948 -30.8470154 -6.3853488 -4.9023638 1.0248865 -6.0553908 1.0779781 34.2880287 0.6205879 -4.6234765 0.2318162 0.6676472 -4.3148956 1.0743659 -2.3907886 -14.1379318 -2.4271672 5.9856501 -2.2761495 -1.9020849 -3.9509683 -24.5363388 5.1735106 -7.2431784 0.3814516 2.8020694 -4.1950588 0.5329245 -3.1420584 1.0516557 1.1904771 -5.6494765 0.1108806 -0.3187039 2.4843915 -1.4767290 5.2977247 -3.5511348 -1.0899982 -1.8992256 -4.3186836 -7.7010074 -0.1307776 -0.6546961 -3.4516170 -6.3459063 1.7650384 -3.8226752 -4.5520902 -0.2050694 -14.0516129 1.5503992 -4.3283973 -24.9747028 -11.2795563 3.5898571 25.5030041 -2.7571511 -7.9644055 -0.3502910 2.7499142 -17.5683918 -1.6739683 9.5663509 2.7446647 -2.0138912 17.0938740 3.2041609 -1.0366420 -1.2039509 -3.4131939 -3.6907382 -5.4354477 0.0476544 -2.3701653 -2.5447366 1.4108537 -1.1586425 -1.2647429 2.7294014 3.0782800 -2.7149458 -0.1916495 -2.3259339 -0.8799897 2.6674833 -2.2597132 -1.5029353 2.4727314 -2.0373497 -6.8996372 -5.0948529 24.0648384 -11.6427679 0.6033567 -6.3729787 -4.7452750 0.3125747 -0.5296812 -12.7773008 1.2630955 2.1167603 2.1486683 -2.9924889 -1.6555122 -3.3251727 1.3108939 3.1968064 -1.6668493 0.3736165 3.8506639 -2.4588411 0.2303975 -4.4005079 1.1455300 -3.0492187 -1.0760789 -2.0786462 1.9060930 -1.3692743 3.0936539 -1.0462743 -0.9102946 -2.2745230 -1.3359624 -1.4229941 -1.0394936 -0.4501481 -0.3275095 -0.3983202 0.4342790 -5.4372020 2.2332792 -2.0325735 -8.3033161 22.3587170 -0.2239455 0.0983491 1.1014212 0.7584802 -2.0134342 0.9121975 -5.0433459 -2.7381237 -0.0432411 4.3685641 0.2764427 -0.7596357 -2.3904669 -1.3667537 2.6609015 -3.6749444 -0.6189196 1.2053238 -0.6104986 -1.2759581 -1.6028289 0.5884616 1.4542575 -0.8704668 0.4892673 0.4141681 0.0327295 -0.5539690 0.2325681 -1.5152644 -1.3449205 1.0663795 -0.3317944 -0.1841667 0.3103426 0.2051909 -0.5033728 -1.1662564 -4.4336081 0.6609008 -4.6620889 0.8195183 -1.0341128 0.0921293 -1.2199972 -2.5843341 -3.2771475 1.3275245 17.0827522 0.0026859 -1.6440850 -1.5441889 0.0245893 -2.8320441 0.4945618 5.7294474 1.3004414 0.1195605 10.0557117 1.2770308 -1.8259550 -0.8725595 -1.0378499 -1.3253051 -2.6641307 -0.1543676 -2.2943592 -1.1267186 -1.4686852 -2.7429483 -10.2279062 1.9719126 0.7093419 -0.9531396 -0.4264172 -1.0801452 -0.6315277 2.1591971 0.9973966 0.6060714 0.5160768 1.6440268 -0.5984527 -0.4177701 9.1350307 -2.1504517 0.2422655 -1.3164674 0.5248001 1.1195624 -3.3935609 -1.5871694 0.1223989 0.0073593 0.4354451 -2.0855751 -15.8750305 -5.3109794 -2.8908370 8.1440611 -2.3918488 4.4316010 7.5505891 -3.7703886 1.0782628 -7.2627273 0.7059036 1.9188784 3.5800152 -2.1849785 6.1232433 -4.5642247 0.7391185 1.5603670 -5.2096653 -4.0411673 -7.0369396 -5.4658046 -1.1112913 -3.7641284 -8.0406733 -7.8342729 8.3580236 3.9589455 4.0192499 0.0472611 -1.2887354 31.9776363 -0.2137033 -5.3608627 0.9980053 2.8153238 -2.3249719 -2.3411615 -3.7234745 -3.9803452 -0.7456331 9.0372295 3.9089522 -3.3847513 -2.7809327 -7.7970805 5.4617295 -0.7282804 0.6704420 2.2273731 -2.0511403 0.2257859 -2.4994862 1.5293040 3.5722651 -3.1946256 0.4134462 -2.4504168 0.4375412 0.9255285 1.4088526 0.5603209 -4.0151167 1.0946062 -1.9099166 -1.9679513 -1.3931645 0.4451121 -0.7191975 0.1132749 -6.7596955 0.2568071 -0.9612466 1.3557479 -4.2274442 -0.2624012 -0.8702624 11.9887190 -8.0354414 0.2447871 26.3624115 -0.9970303 4.0299549 -2.3426745 -0.8114023 3.8484297 2.5155632 10.5780401 4.9758086 0.1273747 11.2496767 1.1300808 -2.4477522 -0.4322138 -0.8983563 -1.0087211 -5.7984943 1.4538196 -3.7109110 -3.6740153 3.6839066 -4.2528934 2.3363395 1.9261025 7.9635901 -2.7923570 -0.7075984 -5.1618218 -3.4528167 2.9952292 1.3378533 0.4395613 2.4461563 4.0007315 1.7883399 -1.7702104 19.4006119 -4.1122866 1.3073089 -1.5370362 1.2865759 1.0670382 -5.4829955 1.5697722 -2.5466602 1.5949979 1.3541133 -2.7909105 -19.1139469 -6.9381595 -2.3605347 11.3744974 -2.6260967 4.4428582 10.9901390 -3.6944652 0.2719437 -10.3188572 1.0257207 1.3309532 0.4923519 -5.0903001 6.1218348 -6.1589656 2.8798666 -0.9817556 -6.1293836 -9.7630577 -8.6306715 -7.7731876 -2.5258973 -4.6811714 -8.9355202 -10.6068201 8.5944958 1.2073270 5.5783820 -1.5569094 -0.3517807 48.6590195 0.4994762 -7.0214357 1.6349474 3.3229907 -4.7217999 -1.6844815 -3.3538897 -13.5385065 -1.2165393 13.5660191 5.2788558 -3.7779164 -5.2567630 -9.9247437 8.1519938 -5.5860176 1.0712334 3.6937487 -3.7449441 0.5269756 -4.3099008 1.7563884 3.9895692 -4.9659986 0.9240567 -2.8586147 1.3695729 0.2197457 4.6013174 -0.7245649 -5.1019464 1.4244540 -3.0939884 -3.2810934 -0.9645249 0.9663659 -2.2959194 -1.9557813 -6.9063945 0.4463612 -3.0811081 1.8156720 -6.6789050 0.6157660 -1.7708776 3.6731296 -11.9715538 1.5309665 40.5152740 -1.3519130 2.7712677 -2.5651624 0.0541696 2.7893810 0.7446937 15.3614025 6.3986616 -0.5353504 18.8955498 2.1315095 -3.1342757 0.5326484 -2.4750979 -2.1618910 -8.6136465 1.8631569 -4.8143129 -4.2032585 4.6530766 -5.8187943 0.3297781 3.8240521 9.4180412 -4.6256332 -0.1846332 -8.1303825 -4.5864105 4.1384373 0.9470469 0.6089964 3.9633353 5.3418264 0.7702597 -2.8767316 29.7244530 -8.3098125 2.3931420 -3.4053657 1.2793760 2.1652648 -4.9664559 -1.2876770 -3.3230996 3.1608555 1.8503784 -4.0098681 7.2577500 -4.4725814 1.9868691 3.1217394 -0.6881358 -1.3594332 6.4319496 -1.2799528 -2.0939393 -5.8965282 -2.3230627 -1.2214651 -10.7554808 -8.3768892 1.8685349 -1.1947155 4.1307073 -5.4883852 -4.4758439 -14.1252785 -0.9287837 -4.6353951 -4.9988451 -1.0417677 -3.9144397 -2.0432770 -2.5730140 -6.9263525 0.6090559 -3.7013829 1.0977902 28.5129757 0.0867461 -2.2866042 1.1310604 0.2388355 -5.5939960 0.3389938 -1.9374416 -15.8739462 -1.6663262 4.8184156 -0.0106714 -1.6830879 -4.1737375 -5.6839485 4.3922400 -6.7221303 1.1096814 3.0760870 -3.2767296 -0.3634589 -3.2943459 0.5953241 1.4968210 -6.2019005 -0.1880767 -0.2864142 1.8397948 -2.4634953 5.1732183 -2.6506586 -1.7007794 -1.4321139 -2.9507618 -5.5624151 0.3582135 -1.4826978 -2.4703760 -3.2840238 -3.7665548 -1.3310027 -4.6362271 0.8720662 -8.6200762 1.0654541 -2.8316770 -24.0207806 -9.1017456 1.8498256 26.2929382 -2.0552125 -4.9128904 -0.9330269 0.5440956 1.8574480 -1.2020208 9.1022625 3.1350732 -1.9940000 16.4614906 3.3689725 -0.8986520 -4.4031258 -1.8958043 -1.2322750 -5.2417650 0.8455766 -1.7967187 -3.5293453 -0.4114042 -2.8375046 0.1124267 2.9572320 2.3253016 -1.3802084 0.4598669 -2.4144342 -0.4966398 4.7573123 -1.6920533 -1.0793265 2.8224812 -0.5218757 -3.0437031 -2.6983905 21.9937038 -10.4192247 -1.1228112 -5.5598879 -1.8389717 -0.2161390 -0.6041927 -9.3424749 0.3879820 1.7652135 0.8784524 -2.8977947 -1.6948552 -2.2419324 1.3686516 3.1424801 -1.7056286 0.6893230 2.6534007 -2.2661750 0.6061199 -4.6221571 0.7006034 -4.4492712 -1.5324149 -1.4730738 2.9936845 -1.2096967 2.8712630 -0.6124099 -0.8860305 -1.9949245 -1.5671636 -1.3415385 -1.6370401 -0.5731360 -0.5373395 -0.5024185 1.5557277 -5.7473249 1.3850882 -1.4377154 -10.7042980 21.4709091 -0.1607873 -0.3954491 1.2355855 0.4852597 -1.8988410 1.6041449 -5.8955555 -3.2274642 -0.3754740 4.0046988 -0.2460533 -1.5076758 -2.8519034 -1.4889609 1.7643991 -3.1917689 -0.5591274 0.7951035 -0.2651347 -2.1374016 -1.7131095 0.4448711 1.2477216 -0.6238146 0.0392958 0.3642372 0.2071538 -0.6436267 -0.8121153 -1.3694328 -1.0258666 0.9106683 -0.0505910 0.0220581 -0.6356784 0.3065135 -0.2148274 -1.3495289 -5.4116139 1.1773417 -5.0835619 0.4015717 -0.3480319 0.0955220 -0.9283611 -6.3058753 -2.7246044 0.8023037 16.0328865 -0.0000175 -1.1013573 -1.4263991 -0.3157265 -3.0701423 -0.0256486 5.7631474 1.5490392 -0.5056396 9.3646755 0.8463355 -1.7746254 -0.8369134 -0.6340865 -1.3343834 -2.5910561 -0.6993308 -2.0552115 -1.8053620 -1.1528811 -2.2578280 -8.6800051 2.1174884 0.7650836 -1.7016783 -0.4095858 -1.1267864 -0.8762921 2.3177326 0.9041108 0.2552167 0.3871906 1.9860952 -0.0230382 -0.3248531 7.6440716 -2.0038795 0.6247978 -1.0037509 0.9288251 1.3193481 -1.9196386 0.6946863 -0.2442348 0.1302934 0.3384669 -1.6588086 0.8486804 -5.0073709 -2.9641657 7.7440953 -2.5149696 4.9255557 6.0781116 -3.9833357 2.2190545 -8.1965857 -0.1061032 1.7427126 5.1701961 -1.1585823 6.7446718 -4.1581955 0.4415684 3.8749132 -5.6099558 -2.6070764 -6.8856125 -5.0098634 -1.0507880 -3.7198670 -8.1714907 -7.1138825 10.3248205 4.1879678 3.7353983 0.6635730 -2.8266423 27.8193855 0.0115224 -5.7779555 1.3988576 3.3482261 -2.0268807 -1.3989515 -4.5216098 -7.6229973 -0.7048792 7.9762006 4.2476687 -3.3056068 -2.1690028 -7.1575251 4.6097755 -1.2408814 0.8333702 2.3479576 -1.4637951 -1.4759457 -2.1200995 1.6107210 3.7687378 -2.7033603 0.5330917 -2.5407391 -0.6920162 1.2572318 -0.2691645 0.9872839 -3.4479947 1.4178135 -1.4658320 -0.7594038 -1.8264472 1.5883675 0.7686375 0.6182999 -4.1653142 1.2572749 -1.9555125 1.6183109 -2.1660948 -0.4574162 -0.4870889 23.8757954 -7.1835141 -0.6115595 24.7308769 -0.6277970 5.4506021 -2.0674520 -1.6361008 0.4580730 1.9596807 10.4424286 5.8433685 -0.5831996 10.5836706 0.8954606 -2.5220602 -5.5381312 -0.3543998 -0.3546789 -5.5093808 1.2523583 -3.8965466 -4.2426476 4.1500988 -3.9201508 2.2822239 2.2887783 9.6072102 -3.4319744 -0.7856714 -5.0061440 -3.9212832 4.7805400 1.1892465 0.2229695 2.2325540 4.3468070 1.7069733 -1.6209671 18.7213650 -2.9433050 1.0526388 -0.9730709 2.3355913 1.2850214 -3.8059032 4.0082412 -3.3533676 1.1659971 1.4167403 -2.0093174 -2.6896439 -6.4304028 -2.3343592 10.9371567 -3.0867524 5.3938828 9.0756149 -4.9034038 2.1270456 -11.0653601 0.2730969 0.3208454 3.4741626 -3.5282302 6.2537289 -6.1356072 2.7381635 1.5938278 -6.5672693 -6.7566967 -8.0160685 -7.0484347 -2.2803330 -4.5017695 -9.5985289 -10.6915359 11.0049191 1.4851074 5.2202749 -1.0056919 -1.6989393 44.6904602 0.4853990 -7.4534025 2.2107003 3.7950013 -4.1238589 -0.9887499 -4.1792622 -16.0942383 -1.1434387 12.0344696 5.6668992 -3.4623158 -4.6601095 -12.5375118 6.8669252 -4.6899672 1.1761117 3.5174212 -2.9933450 -1.2752866 -3.7719791 1.7274524 3.6549587 -3.8979440 0.8975786 -2.9616127 -0.3001568 0.7511645 2.6183534 0.0415711 -4.5590577 1.9007221 -2.4193616 -1.3714176 -1.5343827 2.2721217 -0.6334659 -1.2636802 -4.8995976 1.5404936 -4.3018436 2.1388710 -3.2853875 0.2151784 -1.5559808 16.6772480 -10.7028723 0.3300746 39.7891006 -0.8720815 4.7585297 -2.4024787 -1.2636569 0.7402970 0.4454632 15.4876165 7.6893148 -0.9030666 18.1601772 1.6564853 -3.3602059 -5.9381399 -1.7388488 -1.2206748 -8.3367615 1.7949544 -5.0652876 -4.7247047 5.0205636 -5.4326458 -0.0711897 3.6661530 11.2055674 -5.3892097 -0.5973346 -7.6350927 -5.1962004 5.7479873 0.9421394 0.5398210 3.6389699 6.2300754 0.7352536 -2.6283767 28.9826527 -6.1165905 1.5122633 -2.3363118 2.4472563 2.3800714 -4.3762126 1.9226602 -4.8770819 2.4060669 1.8334981 -3.0793033 -1.5618094 -2.9822195 2.0524607 4.8288436 -0.7786810 -1.2215334 4.4048095 -2.4404397 -1.6423051 -6.1193991 -1.8674405 -1.3543003 -8.3773575 -7.5056453 1.0098710 0.3916451 4.4969182 -3.9363601 -1.9635438 -12.6236267 -3.9119248 -3.9118884 -3.3961809 -0.7621045 -3.5707872 -7.5396128 0.2888487 -7.7222128 1.3427076 -2.9000046 0.9799382 24.8811760 0.6548743 -2.7285450 2.3719778 0.1491256 -4.8986554 1.0267593 -1.5329218 -13.4988546 -0.8398883 7.6834011 -0.3070017 -1.0631113 -4.4138060 -9.2049751 3.8235812 -9.4989719 0.6267932 2.4495323 -3.0516043 -0.6084617 -3.5376413 0.3613513 1.0806223 -4.2804613 0.1904436 -0.5512607 1.7092323 -2.6117079 4.3891368 -1.7327641 -1.4666653 -0.1868648 -3.2153337 -2.9426110 1.5178032 -1.5235107 -2.4933667 -4.5634751 -0.8381680 -0.8031192 -5.0775766 0.7701893 -4.5927973 1.6627856 -3.5373156 -14.4531355 -8.1021175 2.1297004 25.8243961 0.2242931 -5.2373753 -1.2526275 0.4213620 -5.1484108 -4.3496218 8.7990198 2.2498775 -2.5294926 15.5987196 2.9046152 -1.3537726 1.3416950 -0.9583676 -0.7832614 -5.0959678 -0.6318799 -0.2819780 -1.7561314 -0.2313736 -2.5886180 -1.1161300 3.2702510 1.8553606 -2.2827492 -0.0589328 -2.0761335 -1.5206803 5.4877396 -1.7447174 -0.5170178 2.4603395 1.0611850 -2.2015500 -2.2928336 22.9356594 -8.2332468 -1.2780437 -4.9402189 -1.6819544 0.2868153 -0.9019538 -8.1672812 -0.3364375 1.7054591 0.7755499 -2.5670598 -2.0016921 -2.4861393 0.9785609 2.7091930 -1.8214426 0.1328384 1.4638208 -2.7105949 1.6961122 -3.4531631 0.5940107 -4.9342041 -1.4618864 -0.2166763 2.2693565 -1.6684780 2.9377294 -0.5316862 -0.8163049 -1.1338197 -1.6025225 -1.0327457 -1.7522656 -0.5169926 -0.6796626 0.2419314 -1.7319838 -4.9714265 1.0984532 0.5035806 -20.3450546 20.5275669 -0.4632920 -0.7001970 1.0541047 1.0783241 -1.9226061 0.0114261 -8.6156073 -2.5312130 -0.3704477 3.4027877 0.0604534 -0.2640704 -2.8104463 -0.2762375 1.1187024 -1.8760748 -0.3111097 0.9158676 -0.9034015 -1.1965864 -1.4066268 0.0651301 0.9058191 -0.6573453 -0.1698038 -0.0100683 0.4019587 -1.2316502 -2.0972025 -0.8928443 -2.9283769 1.4385650 -0.0346954 1.0398533 -0.6067647 -0.0817731 -0.0242351 -1.7100428 -9.7998838 -0.2193135 -4.2693052 0.5602183 0.7616859 -0.2279458 -0.6300668 -1.9742436 -2.9842284 0.1230815 15.6874218 -0.9659685 -0.9890239 -1.4008880 -0.8918805 -2.5592008 -1.2743945 5.4790802 1.8610407 -0.7988606 9.1304426 0.2259361 -2.0592015 -0.9494528 -0.3103333 -1.3855644 -2.8112056 0.7937388 -2.4647696 -1.3403798 -1.6139781 -0.8572261 -9.1059370 2.5781608 0.1254006 -2.1579483 -0.2384232 -1.6381381 -0.0396341 2.9571552 -0.0997691 0.1094603 1.2470112 1.8491104 1.3132515 -0.2874453 9.1249266 -1.0102971 0.2331156 -1.6695974 -0.6812428 1.5308410 0.0787508 7.3745866 -0.1667247 0.0862363 0.7727299 -1.2363449 0.1621396 -4.6150055 -3.3699038 7.0027213 -2.7260599 4.6804714 4.0037723 -4.0780954 3.0915222 -8.7526522 -0.3338010 0.5079889 4.0894356 0.9692082 4.1076655 -3.1653841 0.0501990 3.9705021 -4.8748956 -1.0260737 -6.6773987 -4.3131237 -0.8156255 -3.8965542 -8.2679596 -3.1739299 8.5250502 6.1081057 3.3127999 0.4908257 -3.5447228 26.2671089 -0.2693362 -6.9992652 1.3229510 4.2851014 -2.0794506 -1.6563275 -5.2965717 -7.4021406 -0.2702750 6.2124019 6.1971622 -2.4826617 -3.0036588 -4.4107771 3.7003849 -1.2099802 1.1523405 2.6116216 -1.6375655 -2.7097449 -2.4361231 1.3212698 3.3043721 -2.1311505 0.7905384 -2.8810830 -1.3256028 1.1088141 -1.6689686 2.8815501 -4.2465229 2.3217490 -1.1733299 0.9046340 -1.6820961 2.6515133 0.7808583 0.1467948 -6.4383273 0.6754284 -0.9748023 2.2886753 0.1116487 -0.9187559 -0.9814305 9.4097738 -6.7218189 -0.8814517 23.2651482 -1.8276629 7.3785896 -1.8941934 -1.3823069 -1.9092519 0.0763826 10.1473351 5.4973192 -2.1091008 10.0312376 -0.0417444 -2.9801702 -3.8125219 0.6594533 -0.4925765 -5.2203169 2.8474295 -4.0269380 -4.6939688 5.8407960 -4.4811621 -0.2830678 2.4096031 9.1430264 -3.7354898 -0.7711220 -5.9546547 -3.1471772 5.8396578 0.3359181 -0.0037000 2.6445143 4.4912395 4.0697403 -1.6828027 17.7775860 -1.4985337 0.8554012 -1.1506857 0.2793227 1.9923842 0.6229833 11.0730066 -4.7323012 0.8772827 1.9792553 -1.9264766 -1.5369191 -5.3889079 -2.6961877 10.2175179 -3.5089462 5.5926490 7.3791480 -5.7289705 3.3771372 -11.1701555 0.1504571 -1.0404963 3.5041101 -1.0783216 3.3504770 -5.5348282 2.4480350 1.7677374 -5.9816799 -4.2748251 -7.6259980 -6.0988317 -1.8382022 -4.6662903 -9.7942886 -8.2248173 9.7024765 4.0915508 4.7965775 -0.9973752 -4.0438561 42.9873734 0.1075268 -8.3805561 2.4514558 4.7526660 -3.9298766 -1.3567698 -4.9140463 -9.8638182 -0.7963223 10.1101904 7.6718817 -3.1606164 -5.4185028 -10.6629143 5.9686971 -3.6866186 1.4227973 3.5361638 -2.9206669 -2.7114818 -3.9375601 1.4630855 3.2951272 -2.9808762 1.0366627 -3.4341567 -0.8608609 0.3550480 -0.1539891 2.1055872 -5.3817148 3.1566989 -1.9160240 1.2466155 -1.5889202 3.2414250 -0.3874246 -1.1460047 -7.2965965 1.0956463 -2.6845908 2.8541696 0.5931064 -0.3983776 -2.0136979 3.9154439 -9.7532263 -0.4834051 38.7378540 -1.9537815 7.7305417 -2.3652523 -1.6382447 -0.5706960 -1.7564476 15.2536678 7.6628466 -2.1856592 17.0434380 0.6466901 -3.8577700 -5.9926906 -0.3181118 -1.6519182 -7.9635358 3.3417134 -5.4790902 -5.2544789 6.3848343 -5.2107525 -3.8208435 3.7361445 11.0781260 -6.3026147 -0.6744874 -8.1557446 -4.4417014 7.0101151 0.3488748 0.5373576 3.9392893 6.9421682 3.4737892 -2.3754234 28.4114094 -4.0335898 0.7646409 -2.1107206 0.7388735 3.0300190 0.0197390 9.5079403 -5.9267592 1.7843956 2.3881984 -2.9530368 -1.4504564 -2.7160287 1.7055792 5.2063212 -1.3173871 0.2952423 5.1663704 -1.1537232 -0.0934843 -7.0830588 0.2312984 -1.0997599 -4.2037549 -5.7951899 -0.4569151 -3.1899443 4.5710826 -4.5834994 -1.7908081 -9.6141033 -2.0008793 -4.1860065 -3.0191295 -0.8285404 -2.8939874 -10.4129467 0.1283726 -4.7791090 0.7934371 -2.8498299 2.2856677 29.0504951 0.5088853 -2.2300696 2.8682878 1.8661705 -3.2405546 1.6811534 -1.4943179 -7.2670898 -0.7957197 6.4698124 2.5165069 -1.3335592 -3.7667878 -11.9546967 3.8621025 -5.1600595 0.6022997 2.7119360 -2.8611243 -0.3922626 -3.2605579 0.6958098 -0.1934226 -1.5537986 0.9955333 -0.6583264 1.0962766 -1.7367507 4.2513652 -1.1895634 -1.4154395 -0.5610664 -1.6293821 -2.5485528 2.3453541 -0.1154619 -2.9026587 -3.7222083 -2.1373036 0.4862029 -6.2035837 0.8637751 -3.5594463 1.5086991 -4.2732730 -12.6074200 -7.2114253 1.7534343 29.2963428 -1.1697874 -1.8078574 -0.9080135 1.1584004 3.8732185 -2.7945404 9.8270292 2.4909189 -2.2330918 17.4450016 2.5397046 -1.7553101 -9.3271523 -2.9744065 -2.8273606 -5.6328678 0.4017478 -2.8091259 -0.0595334 1.6104760 -3.3572376 -0.8973953 3.2042499 2.8216884 -3.5120590 -0.1762356 -5.3169312 -0.4243449 3.4258032 -1.2520756 -0.9355175 1.8519275 2.7704735 -1.7757211 -1.8356100 21.7725430 -6.3992209 0.6101965 -2.8733652 -0.6927981 1.6425682 -0.5144275 -6.6463442 -0.8836549 1.1501220 1.3597801 -3.8932886 -0.8123112 -1.3029846 0.6605800 2.6177478 -1.6543988 1.0620852 1.9164509 -1.7378950 0.6723226 -1.7466278 0.3497833 -2.0935800 0.5904286 -1.6906327 0.3850299 -0.9763808 2.2336938 -1.0857364 -1.0475211 -1.8724757 -0.9444799 -1.5549619 -0.7180400 -1.1597023 -0.0376948 -0.2439050 1.9393380 -1.4668404 0.6006386 -1.4532498 -14.5363226 13.5745802 -0.3296362 -1.5245495 0.8085205 0.2126669 -1.7720374 1.4540293 -5.8457699 -1.7655308 -0.7574692 3.0716236 1.8149914 -0.6898053 -0.8828795 -1.5385592 0.6344389 1.3290284 -0.3813945 0.2108077 -0.9387448 -0.1105409 -1.3336492 0.5153507 0.4485621 -0.8682463 0.4619125 -0.1005922 -0.0163957 -0.7451155 -1.6167948 -0.5607238 -0.9406626 1.3970292 -0.4215023 1.5601280 -0.6328835 0.3503039 -1.3431443 -0.7810752 -10.3228359 0.1852587 -1.3817892 0.1304421 1.9200677 0.0195752 -0.1636284 28.8385487 -3.2408323 0.4419246 14.2349739 0.4014119 0.6977264 -0.9731228 0.0838792 -0.1194064 -0.5356032 4.7836046 2.3139136 0.1598206 10.7841091 0.8827792 -1.7626272 -1.3205900 -0.1179356 -1.0039935 -1.8235974 -0.3438085 -1.6404009 -1.0517712 -0.0953960 -0.6995091 -4.5487852 1.7832781 0.9483381 -2.2168667 -0.7329830 -1.6119063 -0.9708721 3.9650142 0.2903282 0.4380560 0.8302778 1.7915568 -0.0667111 -0.5976452 5.5098476 -1.7089915 -0.0310266 -0.7745954 -0.4277023 1.4377406 1.0678313 -0.0512455 0.5593308 -0.1829365 0.7535813 -0.6959679 -0.6513559 -0.5866214 1.7101169 5.8590455 -2.0310531 1.4897648 3.8663518 -2.6151562 1.0981295 -3.2992120 -0.6818003 -0.2564956 0.2114724 -3.8572099 -0.8293202 -1.7016919 4.7313342 -2.5936840 -2.0424130 -4.4104600 -2.3540869 -2.3225617 -0.7611766 -1.5361074 -3.4525201 -3.5564122 2.3024359 -0.6738476 1.1271232 -3.4503345 -2.8646307 26.1482906 0.5197031 -5.2643371 1.7548512 2.7908311 -2.8200419 1.5367255 -2.0592449 -2.2164657 -0.0592589 7.8966179 7.2728252 1.6301030 -1.9385651 -4.3243017 2.6900172 -2.4100900 0.4910524 2.5867956 -2.5776842 -1.0798481 -2.5001993 1.3379011 2.1340296 -0.5620620 1.0755391 -0.1888406 0.8177124 0.7620370 -4.1462102 -0.1101794 -1.8177044 3.2473786 -0.4697637 3.8660645 -0.5400327 0.9699563 -2.9929864 0.7550896 -0.1417330 -0.2375240 -3.8010845 1.7131728 4.8841553 1.0952718 -2.1197965 -28.1647224 -6.4413047 -0.0124756 22.5245838 -0.5952179 1.8188562 -0.6207343 -1.7121936 -2.9714720 -2.9258018 7.8367968 3.6101182 -3.0850720 18.1902008 1.0634520 -2.1112053 0.2413132 0.0714559 -1.7136474 -3.7161942 2.5614631 -2.8808432 -0.1430688 1.4444946 -0.6738377 -7.5494661 2.9031587 2.9520876 -4.3158908 0.1265585 -4.6430573 -2.0107317 7.9437909 -0.9587532 1.1760888 1.9057169 3.2735183 0.4389575 -1.3976892 18.9154682 -3.1562531 -0.2391297 -2.1877744 1.6388336 1.9142691 1.3415871 -2.4364448 -1.3617134 0.5765702 1.9054736 -2.3294814 -1.0907428 -1.1177719 2.6986699 8.8568001 -2.9599333 2.5377679 6.1717367 -4.7350364 1.5668076 -6.5605497 0.0029125 -2.6973755 -0.4250196 -5.8735895 -1.6612545 -3.3072755 7.4592490 -3.7132370 -2.0478435 -6.5441723 -2.9403996 -3.6789417 -1.4606893 -2.2550180 -5.3043318 -6.5248518 3.9331028 -2.8707893 2.3031423 -5.0718637 -4.1587210 40.0886841 0.5548461 -6.1152816 2.5255935 3.0644157 -4.2530632 1.5883448 -2.0764954 -4.2709398 -0.5965358 11.7313023 11.3374510 1.4221898 -3.3965743 -7.0935245 4.0787115 -4.4706144 0.4260222 3.0996397 -3.8154099 -1.1424727 -4.2134767 1.6004035 1.0760319 -0.7262929 1.7123402 -0.2003964 1.5464531 0.5425917 -4.3003788 -0.7581527 -2.6122494 4.2682424 -1.1556901 4.6939497 -0.7686802 0.8135565 -4.3323183 -0.4585842 -0.8042613 -0.1035578 -5.1961203 2.4877062 6.1661820 1.5070918 -3.3468816 -32.7905273 -9.5178604 0.3939063 36.5333328 -0.6160997 2.4155138 -1.2370443 -1.2753847 -3.6561596 -5.0365267 12.0765800 5.5528812 -3.2767577 27.0727367 1.9825495 -3.2366004 -0.4634068 0.0637691 -3.1439586 -5.4735785 3.4372330 -4.0892472 0.3277881 2.8085051 -1.2273737 -11.6629019 3.8664455 3.9951737 -7.0032020 0.0916972 -5.2570353 -3.2063205 10.1179438 -0.9869813 1.7840791 2.7171953 5.0936208 -0.1258388 -2.3291945 27.7349911 -4.7657905 -0.6829184 -2.8002706 2.1038842 2.6470931 2.3590782 -4.1341538 -2.3977427 1.0838736 2.6263561 -3.5787659 1.2424815 -0.7407837 1.1676009 4.4412045 -0.8445475 1.3476559 8.4273281 -1.8427474 0.1149166 -7.0820937 -1.2920674 -0.2106331 -1.4955553 -6.3677564 -1.3084236 -3.3904524 4.5684862 -2.8775449 1.0520302 -7.5531569 -2.2308304 -1.5174205 -1.8596543 -1.9434508 -2.1649497 -0.6611072 1.4930815 1.6011944 -1.8131505 -3.8853619 1.5624884 25.0157967 0.3026667 0.3293533 2.2692041 1.0431688 -1.8764170 1.0203356 -1.5426894 -2.4656372 -0.1902986 5.5338998 3.7317390 -1.7029860 -1.5171887 -6.1611233 4.9264927 -4.1250024 2.0287671 3.0038443 -2.8681567 -0.4997294 -2.8572552 1.0961643 -0.0886922 -1.8289328 1.6242431 -0.2910567 1.5912782 -2.0684028 4.4955630 -1.7029655 0.4476312 -0.4971210 -1.4674457 -1.0686907 2.6216960 -1.3087677 -3.3980405 -3.6545525 0.1824397 0.4422485 -6.7118211 2.3540637 -1.0199467 1.3428681 -0.3048867 -7.6631923 -5.9009385 0.5104418 27.9414635 -1.6604394 0.6679009 -0.7542212 1.0793867 -2.0995398 -5.1896100 4.8588262 4.0212688 -1.4926507 17.1531715 3.1266868 -1.4797642 -2.2613492 1.5353436 -2.4386353 -2.1802602 -0.6011924 -1.5408496 0.8826048 2.8476391 -0.1784667 -1.5725838 2.9040174 2.6744871 -4.6865792 0.2370401 -4.3782620 -0.8511302 6.7604556 -0.7232716 -0.3066179 2.0181541 2.4658823 0.0467348 -0.8500826 14.5571260 -4.2736340 -0.2585085 -3.0410450 -0.7902907 0.9525700 1.7315259 -8.5541153 1.0775619 1.0365260 3.2453840 -3.8254440 -1.1382893 -0.7833410 0.3438732 2.5475695 -1.2307247 1.3483185 1.8669732 -2.2050171 0.7249236 -1.8094239 0.1986439 -1.7074171 1.0135250 -1.6065893 -0.0690120 -0.8911355 1.8993338 -1.2446277 -0.8585905 -0.9855838 -0.5745894 -1.5494720 -0.7528293 -0.9068618 0.1290665 0.4099421 1.5133578 -1.3751609 0.2021257 -0.2911747 -14.4942770 12.8371544 -0.3725487 -1.4699407 1.0103400 0.3840080 -1.6897812 1.0307344 -6.1708364 -0.7983537 -0.7857583 2.8717752 2.3783917 -1.3445939 -0.9527841 -1.1906536 0.3481807 1.7076324 -0.1594941 -0.0749654 -0.9180737 -0.0720083 -1.3930881 0.3941747 -0.2230025 -0.5122223 0.5097091 -0.0420555 0.0789504 -0.7078239 -1.5346590 -0.7334720 -0.8107618 1.5494282 -0.4281713 1.8627634 -0.3877776 0.3838821 -1.0445248 -1.2929895 -4.8520412 0.4343857 -0.8737962 0.1523029 2.5614390 -0.1294594 -0.2887903 -4.0616131 -3.0140889 0.4186181 10.7164669 0.3534432 1.0050977 -0.6188726 0.2151107 1.0985478 -0.0643741 4.1513786 2.3769178 0.0101672 11.0515327 1.0019493 -1.4938480 -1.0532019 0.0878109 -0.6291816 -1.5814550 -0.0075761 -1.6535602 -0.8196976 0.1330676 -0.9332050 -3.9917102 1.9161637 1.1158240 -3.2413764 -0.5008208 -2.1902325 -1.0685201 4.5267377 0.3627253 0.3968246 0.6889191 1.7823390 0.0984816 -1.0661277 6.8553753 -0.9831766 -0.6394874 -0.3063715 0.9177386 0.7284411 1.9792010 -0.1007064 1.2034478 -0.2944557 0.6165801 -0.6021008 -2.9464800 -0.1628902 1.6085238 5.6301346 -1.9145199 1.8192072 3.3264527 -2.5268979 1.5880884 -3.8016679 -1.1944770 -0.6934859 0.2321184 -3.5575442 0.8845905 -1.3945637 4.5101514 -1.9898819 -2.4456737 -3.1754029 -1.8406005 -2.3143187 -0.8227729 -1.4372098 -4.0427866 -2.5611298 3.5543520 -2.1574526 0.7350026 -3.1437118 -3.1407528 25.8098335 0.1436194 -4.5232706 1.9014577 2.1974301 -2.8359962 0.8849936 -2.0789018 -2.8451431 -0.2270766 7.4543428 6.8165054 0.8644579 -2.2663240 -3.7621760 1.9728066 0.6196236 0.3286489 2.6006336 -2.7816556 -1.5792458 -2.2774897 0.9803493 1.1347975 -0.3914734 0.9615585 -0.0656177 0.8067780 0.4843522 -5.6256752 -0.5734517 -1.4781048 3.2820175 -0.7248607 4.2902007 -0.0129631 0.2938685 -2.7916284 -6.1116881 -1.6648794 0.2095826 -2.6645260 2.0143645 5.7816792 0.7050002 -2.2319789 -4.1432586 -5.6697640 -0.4581428 22.8166218 -0.9529161 2.2561774 -0.8981312 -1.6848030 -1.4235966 -2.3801758 7.2179613 4.1999540 -2.6186490 17.1995029 0.7903240 -1.9366815 -0.1089176 -0.2568100 -1.4941518 -3.5582042 1.6223668 -3.1795139 -0.1437868 1.7105240 -0.9306459 -6.7233272 3.4423800 1.4245898 -4.9296765 0.3076779 -5.1506581 -1.9108227 9.1535425 -0.6201491 1.0699720 1.0685160 3.5182896 0.2152130 -1.0197536 17.2946167 -2.3044391 -0.7339607 -1.3429118 2.5471647 1.4428285 1.8623877 -1.9203923 -1.6264058 0.0102899 1.8211738 -2.2023525 -3.5798287 -0.6035521 2.6315815 8.5212317 -3.1795855 2.8768370 5.7079382 -4.5807729 2.3135459 -6.4445853 -0.7489623 -2.7503889 -0.3159734 -5.5640364 0.0009619 -2.3380270 7.0741005 -2.5618947 -3.0261521 -4.9882140 -2.2751482 -3.4550676 -0.6771317 -2.4699318 -5.8853421 -3.4991963 5.3726873 -3.4187536 1.5212891 -4.7823539 -5.2242060 39.9302673 -0.0611644 -5.1473622 3.2517252 2.8618109 -3.9169526 1.2965158 -2.3845174 -4.3091736 -0.6903593 11.0805311 11.3539639 0.3816125 -3.1124947 -5.4533601 3.3262157 -0.3359209 0.2591589 3.4626656 -3.4788928 -2.5708122 -3.9063983 1.4437287 -0.0229443 -0.4203213 1.5381105 -0.1458866 1.1647173 0.3341880 -3.8970449 -0.7606946 -2.3684235 4.5185027 -0.7201556 5.7118268 -0.7429312 -0.1150550 -4.5288043 -9.5162554 -2.6262560 0.7955619 -3.5296571 3.2224851 8.0778074 0.8829861 -3.4558091 -7.7664914 -8.1586418 -0.0351890 36.8644066 -0.8812122 3.5714962 -1.4030073 -1.2828482 -1.8827367 -4.2785487 10.6651220 6.6518874 -3.1829290 25.5994720 1.6655412 -3.3230276 -0.0125733 -0.0336099 -2.7153344 -4.9671922 1.8548425 -5.0096169 0.1349200 3.0968463 -1.7911695 -11.0204744 4.5213070 1.6074659 -7.2720270 0.1234591 -6.6110287 -2.8956628 13.4097862 -0.7717164 1.5584493 1.6857498 5.3232956 -0.4408198 -1.4295152 24.6555233 -3.6884031 -1.3515720 -2.0492668 2.8105872 1.6880974 3.1553404 -3.3242946 -2.3268955 -0.3202947 2.8881028 -3.1968367 -0.5292464 -1.9582497 1.1515230 4.0287552 -1.7956607 1.0171161 5.1891260 -4.1534767 0.7932854 -5.3222752 0.4182228 0.2008296 -0.9027229 -5.6956954 -3.5750706 -2.5678942 4.1757216 -2.1030726 -1.4556609 -6.6632853 -0.9134285 -3.1274190 -0.1041944 -1.3195145 -2.7938340 -6.3687711 1.9259797 -3.2680962 -0.0056350 -2.6004736 1.9760364 29.6670475 -0.0103165 -1.7258430 2.5362599 1.0340747 -1.2555407 0.9303715 -0.9980026 -3.6468000 -0.7555324 5.1474090 5.7409830 -1.4642985 -0.1908351 -9.8415565 2.7808053 -3.4084277 0.0650771 0.9933233 -1.9926864 0.6020280 -3.1289113 1.1047463 -1.1310029 -1.2436031 1.0950228 0.0461539 0.2839816 -1.7416480 2.8395829 -1.0127736 -1.3687352 0.6237774 -0.0157071 0.3557839 1.3077058 -1.4174329 -6.7392168 -5.2489977 -0.1507207 0.5055074 -1.3364873 2.1611755 0.6527616 1.1085907 -2.4794617 -7.9206810 -6.0111508 1.4516171 24.8373394 -0.5961890 0.7997275 -0.9381050 0.8523064 -2.3094959 -5.6370931 6.4344153 2.6793590 -1.3198341 18.4571686 2.1944559 -1.8791211 2.1286376 -1.2115012 -2.3703082 -3.6983724 0.5657035 -4.1523023 0.3569592 1.7651161 -4.7078080 -4.7771382 3.6612239 -0.8380795 -5.7431140 -0.1330499 -8.9898052 -0.3953061 7.6530099 -1.2697229 -0.6020605 2.1408677 2.1075354 -2.0232935 -1.6600984 15.7624941 -4.0499701 -3.0072663 -2.3651812 -3.0724595 1.4130989 2.2995753 -7.9335513 1.5433502 -0.1026219 2.6455984 -3.2306056 0.0385445 -1.1304851 -0.0540523 2.7123330 -1.3916240 1.4903586 1.5205507 -2.6680539 0.7691565 -1.8311037 -0.2336925 -1.6619866 1.2812992 -1.6505421 0.0080402 -0.9065152 1.5505979 -0.6526113 -0.7496807 -0.2300594 -0.1071987 -1.7088948 -0.6003729 -1.0094727 0.1147520 0.3249965 1.9406775 -1.1671989 -0.1048282 -0.7590051 -13.4721022 12.3639812 -0.3143270 -1.3369530 0.7242949 0.0911832 -1.5087241 0.6366923 -6.5128279 0.5782897 -1.0059727 3.2279851 2.8700285 -2.5495157 -0.5852535 -1.4260572 -0.0333269 0.8189202 -0.2792614 -0.5127603 -0.7700156 0.3347110 -1.1842234 0.1502855 -0.7271363 -0.2977313 0.5967890 0.0177971 0.0379001 -1.1056519 -1.9321563 -0.6200660 -0.8031975 1.5425773 -0.0921357 2.0644362 -0.1603981 0.0956051 -1.5037754 -0.8666303 -1.7923944 0.5482494 -0.7195320 0.4050208 3.1758144 -0.2798489 -0.2505954 -3.2926936 -2.5131412 0.1149624 8.3828011 0.4708554 1.3797462 -0.8252049 0.0145475 -0.1951808 -1.0637137 3.9213006 2.3379741 -0.1948110 11.1390371 0.9745281 -1.5575720 -0.8223644 0.2262464 -1.0711890 -1.0650742 0.0681340 -1.7408209 -1.4752476 0.3104915 -1.0340941 -3.4777775 1.4736667 0.8605360 -3.4922869 -0.6901200 -2.3135207 -0.8671986 5.6711721 0.2907844 0.4446400 0.2678343 2.1649101 -0.3107427 -0.8949064 7.7684093 -0.4627660 -0.9752594 0.0350443 -0.0057333 0.6407186 -0.4954781 -0.1420740 1.3522680 -0.5653452 0.7963779 -0.7848933 -1.6979902 -0.0428304 1.5159693 5.2769308 -2.2470639 1.6201452 3.3913689 -3.0522280 1.6513517 -3.4358435 -2.1861529 -1.8212872 0.6315159 -3.3097703 0.6449126 -0.8281118 4.2249055 -1.5170527 -3.0377116 -2.0825646 -1.4678757 -2.4767206 -0.6097277 -1.4324394 -4.5685720 -2.2673821 3.1679029 -2.5740120 0.0689158 -4.6741238 -2.2635195 24.7097607 -0.5637211 -3.5500059 1.6680694 1.3726704 -2.8731368 0.4384822 -2.3448372 -0.6144099 -0.4082485 6.7909989 8.1976624 -0.0755986 -1.5811203 -2.6850498 1.7240766 -0.8274788 -0.0266783 1.9500784 -2.8435106 -1.2503105 -1.7798928 0.7147166 -0.0882724 -0.0563296 1.0413835 -0.1384198 0.3939617 0.0552479 -6.0134139 -0.5218527 -1.4684676 3.0821605 -0.0479464 4.3736858 -0.1280692 -0.5637736 -3.4763889 -2.6860456 -0.7721710 0.5368576 -1.7312033 2.4101114 6.2048373 0.0004927 -2.6716652 -2.2612643 -4.6546583 -0.7980725 21.1294422 -1.2913152 2.2293179 -1.7466325 -1.4471081 -2.8538599 -3.3989480 6.4707355 3.3690753 -2.2485087 16.8517170 0.8579910 -2.2940202 0.7736551 -0.1773699 -2.1342669 -2.7340829 0.8185501 -3.0357575 -0.7520533 2.0329669 -0.6744261 -7.0307851 3.2289619 0.2026024 -4.8673720 0.0784325 -6.6315856 -1.2887076 10.8995094 -1.0301187 0.8536953 0.1218530 3.8499987 -0.4052876 -0.0912163 15.8299494 -1.7634212 -1.2924477 -1.0004447 -2.5697947 1.1062254 -1.0153098 -1.2060012 -1.5544101 -0.6256784 1.7294004 -2.4082186 -1.6422381 -0.3643192 2.6594832 7.7355433 -3.5523548 2.7157278 6.4201446 -6.1459155 2.5861280 -5.9691973 -2.1367648 -4.1822252 1.0735435 -5.0350485 0.2730722 -2.1202614 6.9591203 -1.8001386 -3.8460841 -2.9989057 -0.9450102 -3.4961908 -0.1845516 -2.5796332 -6.4861188 -2.2557263 5.0067739 -3.9735250 0.7321687 -5.2868638 -5.0058413 32.6402512 -1.1004597 -3.4635766 3.1531129 2.1158278 -4.0160522 0.9147749 -3.0062468 -1.1352453 -0.9831879 9.8106909 13.3566961 -1.3304709 -2.0038948 -4.1547999 3.4681356 -1.2265384 -0.1478047 2.8352618 -4.0310693 -1.5426327 -3.3573554 1.2468687 -1.5305685 0.4131505 1.5604715 -0.1304118 1.2088101 -0.6895607 -3.0080662 -0.5311481 -2.9014311 4.4873414 0.2042753 6.4104652 0.7060026 -1.0549722 -4.7506723 -4.6054220 -1.2611821 -0.1327063 -3.9594960 3.8591940 9.4798841 -0.3179342 -3.9872921 -4.6693010 -6.3736258 -0.8099188 34.0376778 -1.3877519 3.4282546 -2.2862704 -1.2095562 -3.4977207 -3.3581347 9.1533575 6.3165641 -2.3795421 24.0637035 2.0851305 -4.0241985 1.1647483 0.2708637 -3.7012451 -4.0216084 1.8462481 -5.0902262 -0.3531119 3.4856670 -1.9008262 -10.7016611 3.5100582 0.4470414 -7.9432120 -0.6411309 -8.5650425 -2.0220401 14.0268459 -1.3317081 1.5943172 -0.4653772 5.8168235 -0.8847463 -0.1150402 22.1150608 -2.5901666 -1.4148053 -1.3911239 -3.2202320 1.0075417 0.1587534 -2.4314506 -1.5287583 -1.5219866 2.8877263 -3.6522825 -0.7590917 0.2425868 2.3524089 3.9134672 -2.1414828 0.9177830 2.8199494 0.3621140 0.0143812 -6.4058099 -2.0407500 -1.7983565 -1.6333469 -4.2224355 2.8367312 0.7532571 4.0724792 -2.2162318 -2.0180798 -8.2231836 -7.9536147 -2.8448849 -1.9893757 2.4517639 -3.8555245 0.2200078 0.5554512 0.4831227 -3.7546036 0.3433328 -0.1566573 21.6360283 -0.2021964 -0.1803456 2.1264446 -0.8225699 -1.2459757 1.8328886 -0.2081324 1.7924596 -1.5982019 5.5139108 4.9263129 -1.9262308 -0.9210531 1.2583092 0.8134810 -2.6933990 -1.3166584 1.6120217 0.8228907 2.6009271 -3.5611253 0.0184451 0.3921131 -2.9841280 1.9193174 0.1137503 2.9429791 -2.1489959 5.3188791 -0.3201901 -0.4116203 0.3010462 0.5343073 1.6253949 2.6011839 -2.7073691 -4.1828532 -5.2578859 -0.5213982 0.9637597 -3.5612671 2.0157816 3.3420236 0.0988014 -8.5154152 -7.9377518 -4.3060803 -0.7785341 17.1751308 0.6153299 -2.4212022 -0.3996279 -0.9340953 1.2499546 -7.1918688 5.8821664 2.4912922 -1.4925530 3.2711484 3.2898779 -1.7889358 2.8686397 -0.9826031 -3.8547022 -2.6980495 1.3030393 -2.5691521 -1.1974838 1.0364478 1.9519702 -2.4027872 3.6593990 -1.2760822 -6.8680792 1.8934721 -2.4405966 -1.3884269 11.5004482 -2.2635686 -1.2313941 -2.7694240 2.5565565 -5.4992700 1.1135805 10.2127857 -5.2240376 0.1894277 -1.2682624 0.6429284 2.4907625 0.3948810 -8.1162138 1.9408985 -3.1396332 2.7995338 -0.8615606 -1.1844953 -0.8370579 -0.3614657 2.5629859 -1.4311675 1.3959447 1.9703127 -3.2904632 1.0473423 -1.9750133 -0.3539315 -1.7586001 1.1502006 -1.5245335 0.1870558 -0.2124103 1.1641812 -0.1694195 -1.1651386 0.6091158 -0.1747431 -1.7264440 -0.1919858 -0.7369381 -0.0634729 0.1656216 2.4518154 -1.2598398 -0.8114631 -1.0002033 -11.2639322 11.9817696 -0.7949311 -1.2975669 1.1124334 0.0526607 -1.0357053 1.2978108 -6.7533760 0.9828374 -1.0078638 3.1915596 3.6398373 -1.8618796 -0.3045435 -1.3841872 -0.2550291 0.3870418 -0.5299307 -0.6858103 -0.8647634 -0.3931606 -0.9319958 0.1361056 -1.2754741 -0.2788977 0.6795621 -0.0512181 -0.0498111 -0.5725298 -1.4746345 -0.4113071 -0.3045142 1.6719512 -0.1457368 2.4328728 -0.3533631 -0.0813364 -1.4093375 -1.1134278 -0.5414881 0.6318365 -0.6759305 0.2214048 3.8558187 -0.2868690 -0.5538157 -2.6548362 -2.2250290 0.1359704 2.1872761 0.8067505 1.5231285 -1.0145051 0.2377938 0.0200687 -1.1875352 3.5037975 2.4283209 -0.2592641 10.9660873 1.1253462 -1.4831150 -1.4992523 0.5697741 -0.6355999 -0.8101194 0.1630853 -1.7811400 -1.4703599 0.3675340 -1.0139936 -3.1008446 1.6765114 0.5801410 -3.1907380 -0.9288206 -0.6100540 -0.9249352 6.2304134 0.3744565 0.2390486 0.3872508 1.9820756 -0.6356053 -1.0960546 7.7744436 0.0523034 -1.8016745 0.2654796 0.1126914 0.8087311 -0.4353626 -0.0671027 1.8620716 -1.0404551 0.7791033 -0.5837333 -6.0304232 0.9369665 1.3213938 4.8978066 -2.3993342 1.8097171 4.5171828 -5.1043129 1.3308301 -3.6538169 -2.9767087 -0.7102139 0.2890022 -3.1383901 1.4305089 -0.9924796 3.7514389 -1.7588309 -2.8468792 -0.7720446 -1.4154371 -2.3795161 -0.3766237 -1.2692795 -4.5864177 -0.3929668 3.2493463 -2.2402194 -0.1422325 -4.8983846 -1.8844125 21.6856346 -0.9458900 -2.8315542 2.2367826 1.2928971 -2.2738209 0.9840763 -2.1723762 0.5909496 -0.8666341 6.1619329 9.4511614 0.0394415 -1.0923719 -2.6580074 1.7454090 -1.2515444 -0.1637493 2.0651166 -3.1148181 -2.8809948 -1.7942911 1.2427860 -1.1086531 0.3110260 0.5089926 -0.1770947 0.2257145 0.8081050 -6.3371677 -0.8936973 -1.4855551 2.8934507 -0.8593730 4.7242908 -0.3366514 -1.4315034 -3.4961033 -2.3711228 -1.6208920 0.6692518 -0.9060109 2.4809690 7.0091023 -0.1661754 -2.8666277 -2.9965062 -3.9021819 -1.1842405 19.3731136 -1.0092314 2.7110093 -1.3358865 -1.1904461 -1.5587467 -2.4014449 5.0409451 4.3393312 -2.1964419 16.4989967 1.1894225 -1.9049011 -2.1698651 0.1914459 -1.9661888 -2.7036986 1.0708485 -3.3806217 -1.1602509 1.8552910 -0.2010846 -5.3651943 3.7273369 0.1074631 -4.6020122 -0.2118925 -1.9707216 -1.8578912 12.2719641 -0.3765623 0.6656172 -0.5102389 3.8049610 -0.1481259 -0.1389434 14.7519197 -0.7593952 -3.3859885 -0.5967693 -1.2857500 0.9933501 -0.2379031 -0.8550963 -0.1976689 -1.1029288 1.9307505 -1.7309836 -9.9174271 0.6582052 2.0650589 7.8441544 -3.7390718 2.6829586 6.2197900 -8.7306290 2.5749342 -4.8700180 -3.1591713 -2.1225026 1.1929169 -5.1642623 1.2920897 -1.2640284 5.9815426 -1.5901353 -2.5847456 -1.2226298 -2.8675456 -3.0991642 0.5171058 -2.3790700 -7.6983156 -1.6902469 4.8727016 -3.8534625 0.4165208 -6.9776945 -3.0168493 32.9082947 -1.1499001 -2.9095488 3.8193126 2.5166061 -4.1124654 0.2013590 -3.3545930 -1.3344213 -0.8761820 10.0481529 13.7565269 -1.4025533 -1.2136281 -4.2544756 2.7764509 -1.7536027 0.1090785 2.6812007 -3.2711101 -3.8220844 -2.7925248 2.5468533 -2.4898310 0.4428411 1.1661506 -0.0452411 0.4743718 0.1224743 -2.2010915 -1.1824803 -2.4681876 4.4213061 -0.0674413 7.5285902 -0.2042820 -2.5125370 -4.9291224 -3.6582427 -2.4684401 0.4651722 -0.8568600 3.7402692 11.5699091 -0.1432680 -4.1544814 -6.8061776 -5.3689418 -1.3529338 31.1647339 -1.9270219 4.4964991 -1.6157933 -1.0346369 -1.9637903 -1.2171336 7.3724694 7.4786491 -3.2141666 22.1019478 2.4915512 -3.4607046 -2.6473064 1.9927663 -3.8164911 -3.2569070 1.7112266 -5.6315341 -1.2469884 3.6526146 -0.5832378 -7.9108696 2.8824272 0.2306544 -7.0941820 0.1949790 -2.7137833 -2.6901972 17.9487228 0.0157638 1.3373948 -0.8623493 6.3178759 2.1884706 0.1301797 19.4117031 -0.8028067 -4.6807227 -0.7105832 -3.5970795 1.3834780 -0.8279262 -4.1175175 -0.0114985 -2.6595585 3.2061477 -3.5718253 -6.5036273 -3.9073265 4.4194431 3.5332456 -1.2455020 -1.7022630 6.6565032 -2.6060300 1.3298178 -8.4894447 3.0125766 -0.5322592 -4.2373366 -3.3178623 1.9667742 -0.7291952 6.1412215 0.4200146 9.6935263 -0.8733824 -0.3920701 -0.5160203 1.4328560 -1.4333272 -10.4533844 9.0693226 0.6465779 0.1550960 -2.5694036 -0.4629134 -1.6856854 9.7772799 0.3420002 1.7755122 4.5055809 -3.0348263 4.4407816 3.1815913 -2.4470422 4.2326937 -0.7417233 4.9654799 9.0041285 -2.7097950 3.2660775 2.5108540 2.3354623 -4.5925765 2.1799529 2.8691602 -4.9018254 -1.4730241 -4.5470095 0.4142490 -1.5223137 -1.9164350 -0.1362549 1.3917369 0.3913446 -1.7724783 0.8354169 -3.4342844 2.1116781 2.6282613 -0.1318458 5.6045017 -0.4082300 -3.8015442 -7.0462584 -5.9260912 -2.8209867 -1.5135839 2.8679669 3.2678616 8.8323841 -1.0835050 -0.7349096 0.0663167 -2.9389515 -0.5462715 17.0699940 -6.9014635 -4.3430557 -3.1687217 2.3053515 -3.6060848 -0.3043597 6.7725863 11.8908720 -1.1193584 2.7774172 3.5879815 -2.3733094 4.0952730 1.8850074 -7.5154901 -2.5585387 1.3182049 -7.5323510 -1.8441238 3.2138112 -6.1371493 -1.7599386 1.9709623 -2.5534315 -4.4767952 2.2952127 -2.4189482 0.5813554 16.9135952 -1.2250786 1.9096769 0.8216839 2.9784908 2.5757582 -1.8392850 -0.1594429 -3.4689231 -7.9114013 -6.5962319 -0.5936477 -1.8961198 -1.7511601 1.2531892 1.0363015 -2.1458929 2.4783895 -6.2020335 1.4638387 -0.7355199 -0.3632102 2.6356251 -1.6457484 1.2614584 0.8473299 -3.5640869 1.3850915 -2.0935152 -0.5884721 -1.4989574 1.1524464 -1.3826847 0.1339495 -0.2937427 1.0414696 0.2750343 -1.2029688 1.3924420 -0.2117454 -1.7492108 0.1568978 -1.2044928 -0.2253080 0.5502960 2.6135266 -1.0931604 -0.8693023 -1.2426805 -8.8102980 10.5363140 -1.1993639 -1.2956761 1.1206313 -0.0749007 -1.0190411 0.4347424 -6.5224223 0.9912466 -1.2080846 3.4907672 4.5658574 -1.4878954 -0.0268566 -1.2332894 -0.9863938 0.6339637 -0.5643808 -1.5993630 -1.0887629 -0.7664469 -1.2319241 -0.0827185 -1.4306898 0.0506083 0.7468824 -0.1527391 -0.4008292 -0.3437711 -2.4480088 -0.5893407 -0.7251332 2.2648017 -0.0311439 3.3936238 -0.5437487 -0.4487396 -1.5347798 -1.1949772 0.1713158 0.4280745 -0.4964786 0.4350032 5.0595665 -0.6370531 -0.5884897 -2.3839815 -1.7729379 0.2969994 0.2172823 0.7051631 1.8038853 -1.1124848 0.4737913 -0.5630969 -0.4926764 2.9744651 2.5687897 -0.5777979 10.9852858 1.0657153 -1.7121556 -2.0387149 0.7087961 -1.2744533 -0.6019583 0.0847402 -1.6760280 -1.4185913 0.4408461 -0.8878719 -3.1185062 1.6527965 0.1554153 -2.5804443 -0.9522257 -0.4900944 -0.8471326 6.8780236 0.4352287 0.4879011 -0.2625831 2.2237473 -0.2035060 -0.7300310 6.9810619 0.4752545 -1.8095952 0.2984888 -0.3478777 0.7169290 -0.0539190 0.1606030 1.4778897 -0.9279841 0.8251860 -0.3925824 2.7811875 0.5891851 1.0253769 4.2107549 -2.8264513 1.2876617 4.1640606 -5.5820847 1.3079751 -4.0187035 -2.6696048 0.2190827 0.8039677 -2.8775198 1.9803222 -1.0152137 3.2274544 -1.2936993 -2.6198239 0.0228067 -1.4024624 -2.3535011 0.8104906 -1.0488335 -5.5227208 -2.0464776 3.2694161 -2.1117775 0.1907010 -5.6945381 -1.2001499 18.1696548 -0.9337584 -2.8565607 2.3062019 1.0175738 -2.5131125 1.3269304 -2.8668768 1.2977885 -1.1147740 4.7676101 10.2365112 -0.3736509 -0.5253765 -4.0102358 1.1918832 -0.6320586 -0.3447204 1.5997601 -3.0041251 -3.0542355 -2.0690804 1.2563618 -2.1881175 0.4657211 0.0346305 -0.1927763 -0.6313036 0.6887836 -6.7834978 -0.9524341 -1.4471968 3.0803635 -0.5139179 5.1137404 0.3877707 -1.6580970 -4.0926418 -2.2108021 -2.0631390 1.0857878 -0.7042083 2.3283410 7.4671588 -0.4288506 -3.1820862 -0.2007108 -3.3485098 -1.1065274 17.1511707 -1.1126578 2.6002805 -1.6996161 -0.8311810 -2.7844338 -0.6041479 4.5402942 3.7540834 -2.2805176 15.8239460 1.1629015 -2.5013151 -3.3326106 0.2429213 -1.7618651 -2.1997027 1.3727814 -3.1392624 -1.6119297 1.7488440 -0.6228580 -4.4561272 2.5107510 -0.3706709 -4.4815621 -0.6379508 -1.8430660 -1.4734635 12.0312500 -0.3127573 0.0750639 -1.2402951 3.9449940 0.6769712 -0.3528384 11.3741398 -0.2409178 -3.8365889 -0.5740098 -0.7386149 0.1801963 0.1264758 0.1499800 -0.5051357 -1.8685670 1.8820189 -1.7406681 4.0764065 1.2116400 2.0183017 6.4625182 -4.3003249 2.5437801 6.4118586 -8.8545427 2.0597634 -6.8882890 -3.5495257 -1.4440075 0.9132652 -4.4684391 2.4502540 -0.6734965 5.4614162 -0.8057934 -2.8871393 0.1773329 -2.3200505 -3.3627603 1.6431289 -2.3984272 -9.0498934 -2.4473999 4.2458735 -2.1850967 -0.5732718 -7.9244499 -3.4715180 27.1769428 -1.0571803 -2.4204926 3.8474247 1.6013228 -4.1463590 0.3237244 -4.5772653 1.5657228 -1.8435268 7.9805822 15.6301889 -1.3300161 -0.3992628 -4.8246045 1.8403776 -1.8315387 -1.2422378 2.4244759 -3.7698491 -4.6426530 -3.6349344 2.5112073 -4.5295167 0.7388903 0.7009966 0.0479811 -0.0598118 0.6466618 -2.6697977 -1.1090395 -3.1559887 4.8472276 -0.5264137 8.7655411 -0.4941160 -3.2573094 -5.4570694 -3.6398630 -2.8678458 1.3746517 -3.2762144 4.0137625 13.3718805 -1.2494256 -4.8453369 1.5774026 -4.7343454 -2.0620601 28.1596661 -1.6679255 4.0988517 -1.9344307 -1.2099737 -3.3018184 -2.6495636 5.3223920 5.6005263 -3.3180895 21.9841385 2.3540201 -4.1389399 -5.0357671 -0.1303410 -3.5605309 -3.1925900 0.7337734 -4.5631514 -1.3758048 3.5893583 -0.3886537 -6.8977776 3.4666765 -0.4611973 -6.5834851 -0.6207177 -2.0756361 -2.7396979 19.0233059 -0.4141671 0.7506605 -1.6623517 5.6565218 -1.8337837 -0.4059865 15.5107841 -0.0270259 -5.2865229 -0.9374633 -1.6741362 -0.1904957 0.5430902 -1.2738521 -1.1539246 -3.1278367 3.0685894 -4.0359778 1.8261243 0.4983504 -1.2171235 8.9863129 -3.7345681 3.1863718 -6.0023160 -8.5557756 -0.4002429 -4.6609430 1.4742597 2.6419115 1.2698647 -4.1214919 -0.3954526 0.3777532 2.2142479 -0.8383003 0.4375487 3.0581863 -12.7211084 -4.7101169 -1.1957910 -0.8420308 -4.9341927 6.6846809 -2.8941288 -2.7884665 -4.5504894 -6.0231147 3.6718662 8.7911844 -1.7188693 -0.2306570 3.2378292 -2.7085574 0.8260183 0.2675076 0.7539794 -0.2303533 -6.6281271 13.2584572 4.2751670 0.4067527 -2.3394761 2.6135924 -7.0030055 -3.3761363 -1.6012844 -2.4436395 -0.2286080 -1.0231346 0.1591822 -2.0268877 -0.5863868 -2.4417412 -0.2613078 -0.7764862 -1.0774951 0.6233066 2.9469643 -0.3068129 -0.6764159 2.6271329 1.9373496 6.4733901 -5.5056324 -5.3967214 -5.6657434 -4.3437052 -1.8773140 0.3599752 -1.0147610 1.4384058 10.9349871 -1.0927018 -4.2799144 -0.1436600 -2.1075430 0.5079403 3.4152300 -1.9634677 4.0142179 -2.7495058 -0.9775087 1.6985688 1.3397956 3.1565897 1.2017992 -5.4120688 10.6331539 2.2338231 -2.4277537 -3.8757949 4.9776425 -4.9844112 -0.9106096 -0.3975970 -0.8944839 -6.3377962 0.0802088 -2.1282451 -0.9851975 -0.8843476 -7.8719158 -5.8646255 0.2929847 -4.8402195 -1.6546811 16.3809299 -0.1181756 2.4817712 -2.7307217 5.4148579 -6.8640761 -6.2918873 6.9896350 0.1213454 -7.0096068 0.6509107 -2.7876933 -0.3843552 8.0414248 -7.2382827 -3.4315681 -1.7945689 1.6504002 -3.3948052 1.4496053 -0.8675343 -1.2234735 1.9804969 -1.7500101 0.7975417 -0.3119408 -3.7462952 1.4895651 -1.6121955 -1.1308811 -1.9491438 0.4511506 -1.7013130 0.0426947 -0.8401116 0.4260513 0.6302894 -1.3358263 1.3549185 0.3888830 -2.0699785 -0.0885151 -0.8125679 -0.0756942 0.9048855 2.1565831 -1.0993898 -1.9630175 -0.9854841 -11.3920975 9.7204552 -1.1635339 -1.7126290 0.8770429 0.0858060 -1.1746200 0.1725253 -6.4610014 0.2338331 -1.3698931 3.1771564 3.7209070 -1.4136707 -0.0524907 -1.6825162 -1.8581598 0.2228080 -1.2060539 -2.0922174 -1.0338950 -0.8465630 -1.3091253 -0.6130226 -1.8635036 0.1591315 0.4635558 -0.3466985 -0.5501257 -0.0605508 -4.6673927 -0.9974492 -0.2249911 2.1173823 0.1587511 3.1676378 -0.1518970 -0.5357949 -1.9725962 -1.2272063 -0.2014498 0.6661762 -0.1031489 -0.0325816 4.4819899 -0.7416228 -0.4635841 -1.6943804 -1.7766893 0.2096575 -5.1255841 0.5692476 1.4078180 -1.7308519 0.4322537 -0.3719845 -0.3282526 2.5259216 2.3756657 -0.8404556 10.8910751 1.0069680 -1.6858032 -0.9201820 0.5591609 -0.9152389 -0.2263715 0.1398860 -1.6625460 -1.9462771 -0.1217638 -1.0788218 -2.9951408 1.8895862 -0.0987690 -2.3800559 -0.9310101 -0.3462537 -0.3847193 8.4631262 0.5891405 0.2495965 -0.3422794 1.9849615 -0.7763538 -0.2178758 7.4431562 0.4250809 -1.8989711 0.0843713 -0.5030152 0.6440000 0.7893090 -0.1441247 1.6374613 -0.8882245 1.0128080 -0.3060576 1.3302977 0.8763365 0.6329440 3.0888691 -2.5197566 0.2153805 -0.3680641 -7.2542348 0.9292959 -3.0968854 -2.8126512 0.4977277 -0.6897112 -3.4204466 0.3559509 -0.8409252 2.5747662 -0.7317860 -2.7203615 1.0881737 0.1923213 -2.4943483 0.3185472 -1.2401409 -6.2218294 1.1652625 2.4631133 -4.0319080 -0.3999403 -4.7351704 -1.1504922 17.3653736 -1.7393433 -3.0543416 2.5994883 0.8125473 -2.2138519 0.0784991 -4.3182755 0.2589483 -1.6303763 4.3110032 9.0617380 1.2769140 -0.5923237 -2.1856000 -1.6253463 -1.1572037 -0.6823070 1.1602881 -2.6257634 -3.9027774 -2.6171684 1.1477189 -3.6048286 0.7616554 -0.2824495 -0.5588074 -1.3870336 1.9653577 -7.3896699 -1.3570998 -1.0850577 3.1796920 0.3420428 6.1344156 -1.1421121 -2.1770461 -5.4429469 -2.2023180 -2.3662469 1.8856647 0.1875891 1.5423172 9.1846638 -1.2995538 -4.7919178 -3.5865021 -3.1186020 -2.5114906 13.3829908 -2.3232498 2.1878490 -1.7994356 -2.0288589 -0.7714328 -0.0326723 2.8391485 3.1310163 -2.9739931 13.0327740 1.3154547 -3.0892682 -0.2506190 -0.1380298 -2.2687428 -1.6922482 -0.6650966 -3.3001640 -3.1100056 0.8933021 -1.1247861 -3.2094901 1.0534060 -0.3167258 -2.7818255 0.2023906 -1.6242063 -1.3285559 14.4128342 -0.0340408 -0.1187753 -2.4482787 3.1673431 -0.5167380 -0.1976204 10.9815769 0.2980596 -4.8317132 -1.2530799 0.0386368 0.1824157 3.8877978 0.8446313 -1.9968721 -1.5467525 2.0423520 -1.9505682 2.3746088 1.4518151 1.9944957 5.0924878 -4.3796473 0.5996160 -4.3959594 -9.2490044 2.5082779 -5.6226883 -3.8977206 -0.0400889 -2.3413639 -5.7446322 -0.8026705 -0.6647915 4.9301782 -0.5571378 -1.1833143 1.8998444 0.6618239 -2.7574582 1.8919474 -2.9798241 -9.0797186 1.0948188 3.5809400 -4.9864378 -0.5136531 -3.5716753 -2.9629791 22.8250217 -3.3319862 -5.1218448 3.6520257 -3.0226314 -2.8447282 -1.1387628 -4.6688285 0.0130950 -2.5762422 6.5296478 -2.6985569 0.3436357 -0.2044779 -3.1057787 -4.8252254 -3.4033034 -0.6951329 -0.2795390 -2.6517601 -4.4479141 -4.1435790 1.5164936 -4.5534124 2.2714636 -0.3633381 -0.6812546 -1.8962520 2.2252893 -10.9489050 -0.2325584 -0.5488362 5.5021381 1.5716919 9.9502497 -3.6489179 -4.0281963 -7.8493986 -3.2850885 -2.0489192 3.0146267 0.4289985 3.7867777 14.4189425 -3.0563765 -8.3090982 -12.2200747 -4.4343181 -2.8757455 23.3848686 -3.0830717 3.4931617 -2.8023281 -1.3217798 -1.0830123 -0.0093356 6.1340871 6.0917506 -5.4675570 16.7580032 1.2546827 -4.4798779 -0.8435503 1.6226962 -2.7526944 -2.3252838 -1.9559704 -4.9623804 -3.0088224 4.1030402 -0.2477842 -7.0569382 0.6588826 -0.7397722 -5.6409864 -1.2728913 -2.3801868 -1.6720927 18.2893295 -0.2452785 -0.4481255 -5.6696930 4.6319551 0.7111933 -0.3006935 11.6131201 0.2363686 -5.7980542 -0.9322116 -1.4061689 -0.3844033 6.2236028 -0.7387762 -2.9961388 -2.5025294 3.0114343 -3.3156121 5.8602147 0.1448219 -2.1744747 0.0722241 -0.5195960 -3.6543164 -0.6520449 1.4031733 0.5817673 1.0094819 -0.2020641 3.9373388 -4.7027860 -4.5683131 -0.6876827 -3.4521940 -0.7410269 -3.6812115 2.6903365 -2.5499365 4.8687673 -11.8300629 3.0568717 -2.1070733 -8.1687775 0.7882910 1.1549439 -0.7323319 -2.3339851 -2.0265911 -0.0741023 6.3870382 -0.2452887 -0.0152107 4.1283016 1.0244205 5.9636688 2.6922650 -0.1589823 1.4814860 -2.3128455 1.5038207 -0.3975324 -3.1999571 4.2265506 0.2593624 1.8545977 -4.8245530 4.0417004 2.4368353 0.4234553 -6.1411271 2.8420897 1.2854825 -2.0688808 0.2460851 3.4344115 -5.0137663 -0.1805870 -0.2860589 -0.9286425 1.3476187 -3.2703590 1.4080092 -2.5725911 4.8977299 -0.0433310 -2.1631613 -4.5431409 -4.7764544 -1.5077009 -5.3490610 0.2048697 1.4755269 11.3268604 3.6316261 -8.6499205 -0.1592730 -2.1635928 -7.5085788 0.5133135 7.4120412 -1.4219456 -3.5518453 0.8553932 -1.2715414 0.4004166 -0.4339912 -0.9849454 0.2928793 3.2580538 3.5240064 -1.7220792 5.4739213 4.5372548 4.4757357 -2.0905147 -0.4886023 3.9507923 -0.6299279 2.2976160 3.4347734 -5.0929856 -3.0640221 -1.4663293 0.4626403 1.8254142 -0.9320847 -0.9731191 5.7735858 -3.5207777 -3.1819072 -1.6504763 5.4002643 1.1544409 -0.0950704 3.7692959 -1.9335332 -2.0080814 5.1098027 -2.3963120 3.8128431 -1.9876992 0.5767320 2.6504924 -1.5844806 1.3332279 1.3848392 1.6257643 -0.2867503 -0.9090483 1.8285042 -1.7487597 0.5252591 -0.5224881 -3.6782103 1.3432864 -1.6398902 -1.0696995 -2.0510643 0.6701575 -1.0475986 0.0871541 -0.1066807 0.2869063 1.4928201 -1.4907895 2.4947186 0.3351759 -1.8944757 0.5081035 -1.3737584 -0.5732787 2.0068707 1.8929621 -0.7170354 -1.7044286 -0.2515714 -12.1695471 8.5493345 -1.3925874 -1.3034086 0.6636603 -0.4190776 -0.7775330 -0.5252555 -5.8892736 0.2358660 -1.5791487 2.3258307 5.8365970 -1.3866296 0.5752209 -0.5248430 -2.1318305 0.3737944 -1.4183021 -2.3494568 -0.7003124 -1.2805896 -1.2081683 -0.4916223 -3.1422236 0.2206450 0.0190221 0.0046624 -0.5325310 0.1569428 -5.6196976 -1.4302230 -0.4984405 2.2591414 0.1524676 3.2664528 0.0085154 -0.5138710 -1.8303000 -0.8872917 -0.0266968 1.3650986 -0.0272750 0.4598192 4.6759820 -0.7200134 -0.0877543 -1.2142614 -1.0478334 0.4447844 -7.6715159 0.9626614 1.0905144 -1.8802688 0.7693557 -0.5352346 0.0774415 2.2071536 2.4356976 -0.8031592 11.4901638 1.1229713 -1.6475372 0.3185648 1.2763350 -0.8338720 0.5662689 0.1616366 -1.6599629 -1.8478891 -0.3237753 -0.6327804 -2.6336148 1.8883036 -0.2696742 -2.3738649 -0.8411420 0.1401833 -0.8143031 8.9225740 0.8260204 -0.2013720 -0.2171473 2.5096867 -0.1777069 -0.0174891 7.5041051 1.1287773 -1.9803376 0.4245592 -0.9635884 1.1135700 1.5339731 0.8292245 1.7219549 -1.3854394 1.3107371 0.2175235 -1.8799781 -1.7613729 -0.2918397 0.6856444 -3.5067546 -0.0718279 -2.2513905 -7.8071814 -2.6274159 -5.0391655 -3.8078504 -2.7066956 -0.1282445 -6.0582943 -2.2207320 -1.2842200 2.1223464 -1.3536319 -2.5737183 1.8648170 -0.4631775 -3.1714194 1.8082691 -2.6540828 -2.5559435 2.2550023 1.0177405 -4.9425206 0.1571904 -3.2286391 0.5141127 17.1253910 -2.7261415 -6.1126523 1.4117603 1.1108207 -1.8828065 -0.4387390 -2.5793121 -1.4064504 -2.7527316 1.2674106 -1.1351459 -3.7219102 -6.3266120 -0.4628482 -4.1540885 0.7857906 -0.9337814 -0.4334656 -3.3788390 -2.0982528 -2.6408055 -0.7400301 -3.3743100 1.4696921 0.1821052 -1.0945516 -2.8084700 2.2453802 -6.7921362 -1.4025439 -3.0488377 3.1480093 -0.5908185 5.8748140 -3.4878953 -4.2872105 -7.7948251 -0.1403052 -2.9469783 0.9957930 0.1542972 -3.0464675 8.3909435 -1.6663518 -3.5146923 -10.3595114 -5.6991196 -3.9826720 14.0497046 -0.8330767 0.5144804 -2.5150826 -6.3060217 -3.1448042 -3.4048243 3.3874457 4.2643366 -4.5015430 19.3696804 -0.8130558 -3.9636610 -1.3567035 1.6028962 -2.7588906 0.2565024 0.6701605 -3.0386894 -2.4590230 -2.6153655 -0.7900472 -1.6685650 1.4301403 -3.1508825 -2.8141720 -2.1932502 -3.0957060 -1.1806219 20.9894733 0.3254362 -1.0845274 -3.1218958 0.6378913 -0.3283861 0.5357809 9.6749182 0.1696606 -4.8378825 -1.4168619 -1.5262374 -1.7051867 -0.1954061 -1.0903636 -7.8104734 -2.2051628 2.8404882 -2.4059854 -0.8681313 -1.0554878 0.6968722 2.5016384 -5.2389889 0.7182272 -1.7652340 -10.5169868 -1.6566087 -7.0470376 -5.3884511 -2.6413567 -1.1027901 -7.3088994 -2.2625289 -1.4793906 4.0770688 -0.6303342 -2.9865258 3.6243169 -1.1496671 -3.7048523 3.4531865 -3.6956236 -5.2388148 4.5449862 2.4350491 -5.6091037 -0.5757231 -3.8083401 -0.6554793 26.6607399 -3.6037748 -7.8670936 2.9311881 1.2101184 -2.4963377 -0.4187773 -3.9040315 -1.3276277 -3.3155968 4.1596446 4.4465160 -4.2220669 -5.7036600 -0.9915175 -4.2782845 -0.2822168 -1.6027969 -0.8583211 -4.1389813 -4.2099705 -3.7532916 0.3789633 -4.5808883 1.9479675 1.0846491 -0.8700334 -3.4641855 2.9314091 -3.1394794 -1.6241890 -3.6805601 5.8355427 0.0326086 10.9897881 -3.8116744 -6.0953946 -11.6489029 -1.7483925 -3.3917835 1.2984929 0.7581625 -1.5257666 16.3785553 -2.1880701 -5.4949036 -12.0351210 -6.6959968 -4.9405622 21.1732635 -1.0764426 2.7232912 -3.1865067 -6.9411283 -3.6452782 -3.9896083 4.6882153 6.7135296 -6.0137630 26.8961983 -0.7760936 -5.8319340 -0.1716659 3.0604899 -4.7523413 0.6400913 0.0095938 -4.4885058 -2.7965021 -0.8864137 -1.1388493 -3.8777766 1.5336909 -4.9624777 -5.2265453 -2.7708197 -3.1297495 -2.0054646 32.3869324 0.3613420 -0.4199663 -4.9983439 2.1198735 -1.1102989 -0.0242027 13.7250977 1.2834607 -6.2533073 -1.0820637 -2.6876447 -2.4367187 2.7205238 -0.8947626 -13.0182953 -3.8901212 4.3938608 -3.1285071 1.6708050 1.3734716 -1.3022938 3.9628944 -3.8418858 1.3262295 -8.5974541 -3.3361611 1.0854255 -3.3763092 -8.8538723 1.8136200 -3.4374456 -3.5001750 -26.4403744 0.9929407 1.7079694 0.2061759 -2.1491065 1.7935328 -2.5052049 -2.8660553 1.9018993 -3.0834219 -8.5650635 4.2169094 -0.2784146 -4.4277759 -1.7311329 -3.4211326 -1.0803144 19.2704029 -2.5803821 -2.1226275 3.8911378 0.4733907 -0.0843063 -0.2806444 -3.1488075 0.6945199 -1.9186367 5.6516843 11.4445486 -0.3428721 1.1224422 0.8676752 -3.3456342 -2.3405116 -1.7073523 -3.2340682 -1.9505183 0.7584707 -5.5954266 0.2479522 -2.5650043 2.1194146 1.3105091 -0.1449227 -2.7539062 1.4614956 -2.8277669 -1.1812438 -1.8578275 2.8127878 -0.2932639 6.0588775 -1.3061706 -4.4402909 -16.8781471 -4.3063078 -2.2750087 -0.3297264 1.5886446 2.9037218 10.4407110 -1.9898865 -5.6998887 -2.1133680 -2.1958013 -3.2585106 13.0789890 0.2162270 2.6769745 -2.9082057 -3.9598880 -1.9241967 -1.2326450 0.8002408 6.3661003 -3.9229562 13.8649769 1.0220251 -4.0457678 1.5169194 1.7887105 -3.4572785 -0.6589412 -0.5164803 -4.4011264 -1.4079479 2.6845121 -0.6043719 -4.7824697 1.5689982 -5.6496854 -3.0902483 -2.6296351 1.0275341 -0.6527737 17.9605331 -1.0046548 -1.3774583 -2.7373154 2.0916710 -2.2585680 -1.6420944 2.8362882 0.9936582 -1.4346861 -0.1723884 -2.3545260 -1.9638796 1.8815721 -1.4873261 -10.4176006 -2.7668686 3.0205126 -1.6369756 1.3448497 -0.1856701 -3.5799277 1.3203777 -1.6109849 -0.0790682 0.6499932 -3.7434137 1.4314009 -1.9408909 -1.7669207 -1.3054408 -0.1428016 -1.4481426 0.2038863 0.1491656 -1.3008778 1.6116425 -1.2256880 2.4824924 0.4648892 -2.0120234 0.8710937 -1.0999615 -0.2040626 1.4455813 1.4461666 -0.4514413 -1.9973795 0.2920781 -7.7820978 7.4218125 -1.5915698 -1.1334587 0.5738305 0.4368689 -0.9084387 -0.3315260 -4.9684062 1.0161097 -1.1891881 1.3820268 5.8010325 -1.0482403 0.5346610 -0.5117080 -1.0227710 -0.3503751 -1.7856548 -2.2126825 -0.7281217 -1.4640868 -1.7684546 -1.1538903 -3.7471266 0.5345438 0.3861856 -0.6942363 -0.2357941 0.3378874 -6.0731511 -1.8280662 -0.6405933 2.0038424 0.3376590 2.5935407 -0.5756667 -0.8325937 -2.2910128 -1.1457633 -0.0073711 1.4502877 -0.0916662 0.4236006 3.6649852 -0.9580768 -0.1317709 -0.9928511 -0.7296484 0.3067319 -8.9715157 0.9306520 0.6906888 -2.4120946 0.9646940 0.5571123 0.6165327 1.7385480 2.2909372 -0.8045045 11.0358791 0.9536481 -2.1381171 0.7850174 0.9946251 -0.8525342 0.6301065 0.0927992 -1.6951145 -2.1886716 -0.1954855 -0.8221239 -3.0202506 1.4533390 -0.2090893 -2.6020646 -1.4574016 0.1001445 -0.1137350 8.3775187 0.7869147 -0.7293301 -0.6060767 2.3579004 -0.2057627 -0.2134747 6.5494547 1.2355866 -1.3500158 -0.1150477 -0.3560406 0.2063133 2.2281952 0.3956528 1.6560977 -1.2004652 1.5847299 -0.0104391 -3.5827823 -1.8880967 -0.2908770 -1.5877825 -4.0693164 -1.5775437 -4.2851567 -6.5508876 -2.3413973 -4.8063698 -5.3050666 -2.4522541 -1.6529087 -6.6508656 -4.5536714 -1.3064258 1.6134050 -0.7321777 -2.9286993 1.2592539 -0.4009923 -3.6940527 1.5313956 -3.3916361 -3.4699593 4.7622781 1.0988954 -4.0810466 -1.0043569 -2.1979434 -2.2917268 16.2014675 -3.5601344 -7.9502039 0.8108503 -0.0971095 -2.6025105 -1.8827944 -3.4884140 -0.4840064 -3.4141140 -1.5100042 -2.5033090 -4.2389488 -7.0437641 1.1111701 -5.0236382 -0.3425493 -1.4868329 -1.5723006 -4.4270563 -2.4115958 -3.4385931 -0.5252102 -3.9768758 2.0307629 -0.7309112 -1.4762290 -3.9860170 2.2641923 -9.5946274 -1.6386358 -3.7580683 1.9305019 -0.9648629 4.7051401 -1.2680008 -5.6175671 -7.5958467 -1.0911043 -3.5733085 -0.0079245 0.6327482 -3.9147758 6.6468244 -2.6018169 -4.4249172 -13.2731533 -6.1781492 -3.4754486 27.4071960 -2.9122920 -0.3704379 -2.9499059 -5.3648591 -1.2505506 -3.2383995 2.8879786 3.4446032 -5.0479074 20.4092598 -2.0521302 -3.8145487 -1.0697082 0.3797206 -3.7957277 0.6184249 0.2757119 -3.3796787 -3.6143794 -2.1572084 -1.7363260 -1.5418992 -0.9305207 -4.8141856 -2.7581711 -3.1081858 -2.0828850 -0.8367593 22.5762901 -0.4702293 -3.0318620 -5.1580925 -0.3362865 -0.2335031 0.4822140 9.9178877 -0.2491779 -4.6466737 -2.5862117 -0.1516116 -2.1862283 -0.5406300 -1.2369845 -7.3231497 -2.3259618 2.6219552 -2.4143407 -1.5997491 -1.0874593 -0.3466824 -0.1549674 -5.8867126 -0.8066785 -5.3083429 -10.4572392 -2.5911827 -8.8201857 -9.4648762 -2.6205475 -3.3054268 -8.2532110 -4.8262310 -1.2439448 2.5361161 -0.1561419 -4.4633899 2.6638868 -0.6057046 -4.6592207 2.0709510 -3.7651839 -9.8856087 5.5194740 1.0975231 -3.1069276 -0.7298077 -3.3573997 -4.6957984 17.6197815 -3.6758049 -7.6416030 1.7084099 -2.4667304 -4.2985992 0.3400796 -5.0060554 1.2926096 -4.3274493 1.9675767 -1.5087698 -3.8593309 -7.6648178 0.4611416 -6.7595806 -2.0743322 -2.7858155 -1.8216015 -6.8108187 -4.2564378 -3.4291663 0.1421861 -5.0321817 2.2438276 -1.3491737 -2.3551569 -5.3546004 3.0727708 -9.0307989 -2.9630373 -5.6599174 5.5179925 -0.8213488 10.3082695 -0.3592355 -7.2645822 -11.0557489 -2.6979594 -0.9530924 -0.0365721 -1.2522562 -4.2645693 15.1889696 -2.6675165 -6.8049984 -10.8434219 -7.0272660 -4.4043388 11.0412741 -0.2562501 1.3375349 -3.4150677 -6.7100649 -1.9288770 -6.9092808 4.1026063 6.9916444 -6.6748757 14.2175207 -0.8275583 -5.6709018 -0.4296314 1.5686125 -3.5524075 0.7791783 -0.2547032 -3.3245974 -4.3821697 -2.7493401 -3.4539988 -5.3339930 -4.3064709 -7.4787993 -5.2647834 -2.2249153 -1.0784154 -2.6086912 27.1726913 -0.6183336 -1.9497344 -7.4269691 1.3917774 -5.1175117 0.4808577 3.0499771 0.5985959 -7.8351307 -1.7105840 -0.4554204 -2.8270259 3.3372910 -0.4209130 -7.4042773 -4.7611227 3.9585099 -2.5676563 -0.8444420 3.5661247 0.7203700 -0.0381142 -6.5565000 -0.2560606 0.1699555 -2.5756073 1.0046121 -0.8006801 -2.3476210 -1.4319118 -1.4095285 -3.7273540 0.3433486 -2.2949810 3.0098128 -1.2311054 -2.0869730 6.1541033 1.1515654 -1.8699130 1.8207439 -1.4897200 -0.1001592 -0.7944335 -1.9446734 3.4553814 -1.9893620 -0.1091488 2.0776894 5.1769547 0.5409109 -1.2343305 1.6984205 2.0250893 0.4051764 -0.3416540 -3.5332546 1.3620403 -8.3007612 -4.0091887 -0.6403269 -1.7211934 1.4479313 1.4428737 1.6224248 -1.6586012 0.8223800 1.1418997 -0.4929069 -1.2994593 -2.8258309 0.7403983 -8.3687544 3.3003020 -0.3668656 -1.8842720 -0.1128305 2.3322382 0.0063073 -0.1761811 1.8011377 1.8666310 -0.1809925 4.2588034 -0.0149905 0.0142424 -5.0900512 -0.6944026 -1.0957887 -0.3385849 0.5385756 10.4335480 3.2247858 3.9630771 1.2066280 -0.0712741 0.1808324 1.1784589 1.5493082 -1.1592877 -0.7348595 -1.9329283 1.3919437 1.2094212 -1.7083356 3.9622333 -0.0085668 -4.1663408 0.3900139 -1.7006000 -1.4057053 3.4696925 -0.0893273 -1.9438032 0.9404216 -0.8073983 -0.7635332 -3.2580695 -1.8981750 -1.6130532 -0.1066182 1.8031965 1.5003392 -2.7968600 -3.4067605 1.5248014 -4.3433614 3.1588914 3.4116013 -3.8011911 0.7793478 1.3626229 -0.7100949 -0.0922461 0.2725239 3.1449938 1.5449238 -1.4715943 -0.3526354 -1.7458663 1.2282865 0.3514339 -2.4454021 -3.3825228 0.9247991 4.1532483 1.9192703 0.0454322 -4.6290808 0.4865503 -2.1193871 -0.5358245 -0.0128798 -3.0938065 1.3798600 -1.7026103 -2.1411326 -1.8561739 0.0863590 -1.2064779 0.3655570 0.4040604 -2.0239420 2.0044155 -1.6042616 3.0628777 0.2794987 -2.3560841 1.1281179 -1.2437835 -0.4163661 1.6194743 1.1636999 -0.3926023 -1.7567489 0.8619657 -8.3138218 6.5749011 -2.3498530 -1.4482155 0.3297390 -0.8604782 -0.6659644 -0.3775013 -4.8426886 1.1997645 -1.6572654 0.2922234 6.3636551 -1.6214982 0.8654209 -0.1482161 -1.7388778 -0.2102118 -2.3236771 -2.8527460 -1.2256266 -1.4732201 -1.8923534 -1.5139784 -5.8204188 0.6032199 0.0345218 -0.7287408 -0.3967063 -0.1769545 -6.0997648 -1.6719518 0.0767400 1.8940535 -0.1402556 2.1988559 0.3428777 -1.0313474 -2.8139322 -1.2629389 0.4428883 1.0952244 -0.1635006 0.4118790 3.3755898 -1.2046496 0.1354012 -0.5970929 -0.3201512 0.4511337 -4.4843574 0.5446659 0.2908006 -2.8906341 1.1519939 0.5848756 0.6515457 1.5092514 2.7384622 -0.8328451 11.4132776 0.8948020 -2.0184085 0.8835379 0.9431946 -0.9640397 0.6288073 -0.3988864 -1.6355325 -2.3408434 -0.0797586 -0.8694225 -2.8207726 1.6022296 -0.7722464 -2.9056859 -2.4735727 0.8957615 -0.1612600 7.8081188 0.6862609 -1.1992311 -1.3377142 2.2774532 -0.0949050 -0.1655745 6.5273824 1.5179261 -1.4096822 -0.1429330 -0.4548265 -0.3886364 2.0338445 0.4722309 1.7175250 -1.5181625 1.5881040 0.5185612 -1.5686340 -1.2347369 -0.7017875 -3.7121952 -3.2029958 -2.2455940 -6.2943368 -8.7464342 -2.1672552 -4.2675123 -8.1161251 0.1189467 -0.8533432 -6.7868705 -5.6170068 -0.6217523 0.9564307 -0.1068851 -3.7556591 1.6573344 -0.5608077 -5.3616180 1.4612368 -3.7069535 -2.8496280 4.9527617 0.2111093 -3.7304132 -1.5558456 -1.8178686 -2.8647645 19.0412750 -3.5674670 -8.2753820 0.0200078 -2.8133144 -1.9309568 -1.7416215 -3.4513481 -0.0384451 -4.9280877 -4.7748199 -3.2518525 -4.9241371 -6.9850445 2.1328201 -6.8299403 0.0225857 -2.2463658 -2.4001043 -4.7698331 -0.3071378 -2.5244334 -1.4771953 -5.8754573 2.1529555 -0.6142057 -1.3085715 -4.5391469 1.6913227 -6.8506389 -1.1885154 -4.0908780 0.2976325 -1.1882248 2.2926910 -0.4205348 -6.2346978 -5.9421721 -1.7765971 -2.2365963 -0.6065114 -1.1388558 -4.0071468 3.5514514 -3.0462537 -4.4164357 -12.5607309 -5.5231676 -3.0868161 37.5263863 -2.2530739 -0.8162132 -3.4543240 -4.8263059 -2.5959144 -3.3106735 1.4482971 4.2678952 -5.3895230 23.5859203 -2.6817424 -4.0233283 -1.4380637 0.0269302 -2.7464886 0.7747681 -3.4863911 -3.8948236 -4.2553091 -1.9315869 -0.5005814 -2.3726246 -0.3100829 -5.4558811 -3.4907143 -3.5387645 -2.0096948 -1.0005116 21.7157078 -1.0186716 -5.4467316 -5.4449644 -0.5585255 -1.2102157 0.2662632 13.8915691 0.2523705 -6.0946531 -2.7689230 -1.2848350 -3.4256334 0.6230009 -2.2841601 -8.2365370 -2.7741857 3.0164850 -1.5151012 0.0081451 -1.4689763 -0.2212261 -3.1912043 -5.5767446 -1.2782902 -5.9017005 -13.8794479 -0.6222489 -6.4106584 -13.7614384 -1.5596424 -1.8905017 -8.0629807 -9.1898928 -0.3270938 1.8137370 0.5280521 -3.7492907 4.3418503 -2.1059988 -5.1851735 2.7035334 -4.9937429 -7.9053035 6.1452689 1.4459409 -5.7402048 -1.9623358 -0.7357709 -7.0618515 19.8703232 -4.2202463 -8.1361904 2.4382894 -1.8741696 -2.9135234 -0.8360836 -5.8689585 -2.5667768 -6.0249352 -4.4360170 2.1102355 -5.6913414 -5.6637115 2.5250430 -8.8165236 -1.0844072 -3.1784346 -3.7341332 -6.0862427 -0.9852814 -3.1608844 0.1132466 -8.1588402 1.3286645 -0.3326171 -1.2782499 -10.1774836 2.2189381 -13.5150127 -1.5702020 -6.7102275 3.7068787 -1.3657491 8.2776575 2.6972244 -8.1765976 -8.1828232 -3.9402490 -4.1038427 -0.2592559 0.3190463 -2.1182549 12.8391361 -3.5610437 -7.0710263 -7.1819983 -5.5453839 -3.5036664 7.3235545 -1.6106439 1.7203773 -3.2654676 -3.7335513 -1.9070488 -0.4575678 1.0259013 6.4336715 -6.5261445 29.5551796 -2.2730167 -6.8321357 -1.4358995 2.2240622 -7.1373887 1.1276251 -4.6178870 -5.7663517 -5.5106106 -0.3372818 -0.6332746 -6.1260834 0.7005118 -6.6982660 -6.4877243 -4.4942393 -1.9705167 -2.3328600 37.0632668 -0.4565132 -4.7592893 -12.3845959 0.4396383 1.4949247 -1.8131337 13.5952950 2.2766607 -9.1141996 -1.3949113 -2.3450565 -3.6289785 2.2102251 -0.0003056 -7.8321509 -6.1775789 4.1205502 -2.3677354 0.2338354 1.7783650 -6.4818578 1.2419927 0.9649742 -0.1810217 -4.0249147 2.6961114 -1.1267363 -4.7720618 -4.1338930 -0.4613735 -7.0677924 -3.0462825 -2.6851554 3.6810436 -1.2093054 -1.6453503 0.0385747 0.5917377 5.0359097 -5.9900231 5.8164611 -4.4022975 -4.2391686 2.2208717 -4.3507853 8.0315323 -0.8754291 1.2256896 -0.3736365 4.3518724 -0.9151852 -2.6605730 1.9599564 2.2488980 -1.6604459 -6.9486847 0.7567750 -1.8075008 -6.4512997 -3.5184405 -0.0389265 -3.6366844 -5.8258700 0.9719663 -0.3452870 -3.1970987 -5.3038845 13.4636374 -4.4056420 -2.0493863 1.8085449 -1.7605690 -1.8047637 -2.3264601 -0.5715205 -2.3003857 -6.4332385 -0.6268897 -4.5941076 0.8836475 -3.2481320 4.1689129 -2.2276697 5.1922493 -2.6586461 -2.6288321 -1.0064983 -3.8371720 8.4212370 -4.5704780 -1.6306233 4.8686485 2.7345991 3.1534321 -11.1980305 -0.2417018 1.0763894 -4.4037266 1.7553289 5.9333091 3.2103133 -1.1932234 -1.7915789 -2.3172963 12.1524296 -4.0950584 -8.4733829 -3.5852227 -0.2013419 0.5229914 -5.9614081 2.5397429 -0.9712694 4.8320336 -1.8824565 4.1313834 0.0007461 -3.2492745 2.8507164 -0.1597586 -7.1536641 -4.8327270 1.3205446 0.5643189 -2.4253469 0.2683973 -4.2657661 12.6992865 -2.7729521 -3.8296874 -3.0974107 4.2525501 4.8987408 3.2171223 -0.8065419 1.2830290 -11.5269680 -4.8330975 -3.0182903 0.3508372 -6.8122029 -4.7283249 -2.5332129 -5.3319387 3.3127632 -4.6061192 1.9890528 0.4612790 -5.8389521 0.1911946 -2.2008228 -1.2718943 -0.9594259 -3.1894093 1.2626247 -1.7229280 -2.1465349 -3.2948258 -0.5740154 -1.3048321 -0.3732143 0.3271257 -3.1261096 2.0780377 -1.6843331 3.2763562 0.5116048 -2.4092114 1.5117146 -1.2429031 -0.6993211 2.2225811 0.4406420 -0.0693496 -0.7017142 1.1452932 -8.6785450 6.1665359 -2.9396718 -1.0900745 0.0480602 -1.0416708 -0.9162621 -0.2150447 -4.9906206 1.2513309 -1.9132906 -0.0173330 5.8308291 -1.4768385 0.9660467 0.3843987 -2.6546013 -1.1184102 -2.5234835 -3.3143272 -1.5330472 -1.6824228 -1.8264940 -1.3139634 -7.3489947 0.6132727 -0.5802560 -1.2836739 -0.7394782 0.0079562 -7.0808644 -1.5522426 0.1011367 2.1962783 -0.0325822 1.9861881 -2.3739619 -1.1133180 -3.1441302 -1.4571481 0.5664211 0.8894151 0.1442643 0.6898164 2.6886299 -1.5843552 0.3315157 -0.4760636 0.1225412 0.1968006 -4.7473273 0.2489942 -0.1849042 -2.9310546 1.4330578 0.4182037 0.3657854 0.6515594 2.4046724 -1.0713112 10.9669285 0.8218332 -2.6126502 0.8512957 0.5962232 -1.1776710 0.8150125 -0.0016908 -1.6048431 -2.9993918 0.1984818 -0.6334604 -3.0088558 0.9838710 -1.1906840 -2.6917200 -3.3345938 1.3539740 -0.2595547 7.9793625 0.2290609 -1.5493492 -2.1963978 2.4555514 -0.7737555 -0.0202087 6.3877435 1.7244350 -1.0884415 -0.1225091 -0.6137649 -0.4782643 1.4864345 0.4674000 1.6535597 -1.5039502 1.6404673 0.1540193 -4.0719419 -2.3705530 -1.3089826 -4.5761690 -4.3948913 -3.4487593 -8.7218380 -11.7956028 -2.1211829 -4.3772197 -8.2099905 -1.1615227 -2.4541674 -6.6940498 -4.3004270 -0.9775227 0.3381425 -0.1778270 -5.1016722 3.0067582 -0.4323803 -5.6641989 2.2109389 -4.9230614 -3.3277874 4.2822881 -1.9434144 -3.0197678 -0.7942342 -1.4139308 -1.8699039 18.9705925 -5.0316901 -8.3757753 -0.7056288 -3.4887457 -2.3530450 -0.6258057 -4.0933795 -0.9332652 -5.6462579 -4.3577299 -3.0783451 -4.8659058 -7.4831066 2.1963089 -8.5389404 -1.7270019 -2.3042181 -4.1491170 -6.2006016 -0.7872192 -2.3220682 -2.1445305 -8.8553562 2.0100782 -1.3100798 -1.8190460 -7.0523458 2.2406366 -4.1428041 -1.0961936 -2.9258471 0.1876184 -1.6344119 1.5451323 -0.6804457 -7.5976410 -4.6801405 -2.3973265 -2.6052547 -1.6242708 -0.0448530 -3.7636602 2.3031387 -2.7691426 -5.6261587 -12.7699471 -4.7407293 -3.2380390 12.9580345 -2.1962435 -1.0812395 -3.2916241 -4.2683187 -1.4075004 -4.6938596 -0.3491109 4.1236191 -5.3164539 24.7922707 -3.7957361 -4.3698893 -2.1808960 0.0252068 -4.6933327 0.8390480 -4.3542123 -3.9172411 -6.4501085 -1.5360374 -1.4678587 -1.4786177 -0.7914191 -7.4903998 -2.5042100 -3.7823420 -0.6179314 -0.9682056 24.5715027 -1.9936589 -5.8694892 -11.7998667 -0.3611359 -0.6244923 -0.0161131 14.9950113 1.2238129 -7.2388959 -3.3233640 -1.9190897 -3.0423989 0.3008640 -1.4212765 -10.8574800 -2.5088863 2.9767125 -2.3307748 -3.2561526 -2.7738066 -0.4863396 -3.6146736 -6.2500329 -2.0905318 -10.7841682 -16.5551414 -0.1952311 -6.4929705 -20.1663208 -2.4678178 -4.9150858 -7.5806117 -5.1511431 -1.2652128 1.6211247 -0.0692821 -9.1547661 7.9428968 -1.1098593 -5.7496662 4.9697123 -7.7985902 -6.9470639 4.6534462 -0.1511274 -2.4275730 -1.0620821 -9.6943293 -4.0420165 26.5215321 -7.0803199 -7.7153683 2.3634889 -1.3439698 -2.7155497 -2.5304730 -5.0837522 1.9830244 -6.4880185 -4.8709478 5.7003531 -5.1598692 -5.1584415 0.6170332 -9.7417440 -3.3115537 -3.3356395 -3.9305587 -8.6795464 -1.3590652 -3.3052309 -0.0616629 -15.9682856 1.8591462 -1.1926957 -0.6917360 -9.7334833 3.5692675 0.8983644 -1.6942352 -3.0383172 2.6088743 -1.5645509 5.7927556 1.4625311 -11.2325096 -8.5436707 -4.7739663 -0.1333747 -1.9234229 1.8227243 -1.1771123 8.8199511 -3.9738605 -7.3158040 -6.8540854 -4.3802524 -3.5708671 5.8865027 -3.3477011 3.4508893 -4.1020942 -3.6013057 -1.1264142 -1.8832414 -2.3639703 8.5229139 -7.1219044 30.7010021 -3.6487517 -5.7286325 -2.5178072 1.6303345 -5.8364706 0.4159208 -10.0506496 -6.2258167 -8.8071270 0.6513382 -2.0026598 -4.8380876 -2.2509954 -13.6817236 -3.3121791 -1.8641444 1.2884126 -1.0797545 39.5336227 -2.5787439 -6.8313041 -14.8211279 1.1194198 -0.1968298 -0.9098976 9.0047979 4.6004815 -11.3774309 -2.5686920 -2.0053091 -4.4517016 1.9437951 0.4179884 -13.9451323 -4.4232850 4.9058180 -0.1058382 -13.1643057 0.4151091 -7.5766940 3.2174597 -7.7834940 -1.7703238 7.7213759 2.8869703 2.0758092 0.6600742 -3.5691473 -2.9869988 1.4734550 -6.2806907 -2.2597673 -4.5524392 -4.2789350 -1.6981397 1.8898801 4.8036151 -3.0194633 -4.5457177 7.8511853 0.6565401 -3.2428682 0.3145098 -6.5283961 -0.0050479 -3.7053790 -1.5695528 2.1782997 8.2284861 -1.0466260 -6.1382284 6.6779275 -1.9128829 2.1770127 0.6711463 2.5050535 -3.8690138 -2.2580197 4.0275626 5.9463391 -2.4454865 -0.9447106 -2.8283050 0.5091010 0.8976767 -3.2103033 -3.4915559 -2.6793551 -0.3813576 -6.8806157 -1.1297182 -7.1040816 5.8128657 -1.6567085 -5.7932520 -3.6646652 2.4601498 -4.9118237 -5.3712316 -3.6968527 2.6449940 0.2482847 5.9989634 0.0374291 -7.9431071 -5.9744954 -3.8234391 -0.9991239 -2.5709441 -7.9620986 -0.1494928 11.2805271 3.9587302 -10.7175026 0.0761916 -0.1391747 -0.3528808 -2.0368123 -0.9357950 -0.0202070 2.0793059 -1.2403463 2.0182707 -3.1038013 2.8675396 -10.2157698 -1.3322648 0.6677155 -6.4661326 -1.7149991 -1.6819810 0.3456558 -6.6443162 2.9702499 -1.9901125 -14.8280945 -1.0222099 -0.0222674 -2.4794450 -5.4658036 2.0613782 -5.5045877 -7.4368372 -2.5875256 1.7908672 -2.9460874 11.7891150 -1.2406725 3.0766747 -4.3400402 4.7413979 4.7740006 -4.4792423 1.6970437 1.7943935 -3.6493266 -0.4338320 2.2513051 -7.2761984 4.2761316 0.5409055 -8.5796337 -2.4437373 6.2499480 0.5577937 2.5367792 0.7740719 -8.1775560 -2.0225203 -2.7548144 -2.0403981 -1.1994326 -2.3262422 0.6423029 -1.6283646 -2.3367105 -4.5920644 -0.6834340 -1.2880696 -1.8117611 0.3259559 -4.5009899 2.3237927 -1.6152685 3.7941616 0.4985607 -2.6250403 2.0210476 -0.7195066 -0.9615692 2.5893614 -0.1850327 -0.1050605 -0.4644890 1.8240250 -7.2561660 5.5262942 -1.8914928 -1.3725828 -0.1735368 -1.8271077 -1.1981143 -0.1059834 -4.0564466 1.6680480 -1.8475268 -2.7197330 6.1349344 -3.1152508 0.9857302 0.2060238 -2.9733353 -0.9558187 -2.6214144 -2.8370688 -2.2438297 -2.0810022 -1.4742489 -1.8446850 -9.0775385 0.6746261 -0.9113559 -2.0583735 -0.8267719 -0.7562824 -6.7443118 -1.6191406 -0.0651390 1.8503546 -0.0954397 1.0171670 -0.1169094 -0.9963912 -4.2511535 -1.2487694 0.6614225 0.8484474 0.7706972 0.4040275 1.3841821 -1.1483836 0.5831832 -0.4074338 -0.0756236 -0.2166937 -3.6127727 0.9384016 -0.0649135 -2.9303861 1.0360490 0.7548550 0.6876736 -0.2697288 2.4472077 -0.9367976 10.5893106 0.9271368 -2.6688962 1.3999203 0.0560952 -1.1354933 0.9397506 -1.3141345 -1.6845104 -3.3628457 -0.2282594 -0.6353051 -3.7552962 2.0295284 -0.9841864 -2.6657107 -3.7769730 1.5034318 0.0288858 10.8083658 -0.4862265 -1.1235151 -2.2718868 1.2670434 -0.7125505 -0.0780863 3.5439422 2.1050768 -0.2550222 -0.9010835 -0.7617338 -0.4527229 1.6003760 0.7361752 1.6543076 -1.6315184 1.4238448 0.1136979 -0.7867781 -1.8945819 -1.5856702 -8.0129976 -4.5545273 -3.8248980 -12.0040455 -9.6781092 -3.1682718 -4.6790848 -7.5571141 -3.3660984 -2.8350768 -7.3752203 -4.4495068 -1.9839140 -0.5340079 0.3129432 -4.8797336 3.1192915 -0.2031044 -6.2786870 2.5631113 -4.9332461 -3.5604036 6.3408976 -3.8458536 -2.7546084 -1.4302803 -0.2936720 -2.0363817 19.8564014 -3.5800197 -8.8100662 -2.7023282 -6.2942538 -4.2510443 -1.2894620 -4.2028227 -0.3312229 -6.0089626 -8.2491045 -5.1318030 -6.4181070 -9.5912189 2.1195092 -9.4837313 -2.7988563 -3.5784783 -8.0529642 -7.5035586 0.6563224 -1.6795176 -3.5753202 -9.3042316 1.4283743 -1.5825844 -2.7783778 -8.1753092 0.9443924 -1.9385861 -1.4974279 -2.2599683 -0.4277963 -2.2557158 0.5680124 4.3207521 -7.9867682 -6.0485015 -2.2264094 -0.8970729 -2.8552997 -1.0617831 -4.9220033 1.2444729 -2.8990879 -5.2278533 -12.8626108 -5.1275473 -2.8947477 5.5596862 -1.5897186 -1.1215147 -3.5958912 -4.2327733 -2.1009605 -8.1093311 -1.2128025 3.9191368 -5.6506834 22.8619823 -4.9476628 -4.3494830 -2.7881663 -0.8230339 -3.6201069 1.8982065 -6.7832637 -3.7523139 -9.2147732 -2.3307877 -2.2105424 -1.0463938 -0.0039505 -9.0159359 -3.0018210 -4.2871113 -0.6956499 -1.0726731 23.7309361 -2.8047009 -8.0160418 -11.7673903 -1.8916953 -4.2055688 0.4810847 14.3111582 1.7220271 -6.4085212 -4.3642201 -2.2903976 -4.6613545 -1.3995501 -2.7237463 -12.7321892 -2.8742661 2.3938642 -4.0339808 1.7945426 1.1793979 -1.7396436 -9.9154606 -7.2340708 -4.1320167 -14.2169533 -6.3389196 -2.6464038 -5.0696168 -18.9502010 -2.0657423 -5.2714567 -8.7011862 -2.3325114 -0.9345259 -0.3617464 1.8926026 -9.4357166 5.5795784 0.0330239 -6.7930918 5.6218243 -6.7416005 -8.4595652 9.4248734 -4.3678613 -3.2666204 -3.3268273 -1.6181571 -3.8365428 20.7345924 -4.6744456 -12.3617287 -0.4170498 -6.9836874 -4.5931306 -0.5885715 -6.9653826 0.1789413 -6.9807935 -14.8472281 -0.1106150 -7.6883135 -7.4055071 2.5459127 -10.6175413 -2.6161726 -4.3908110 -14.9143372 -10.0981483 -2.8062093 -4.3499713 -3.4631135 -9.5963163 1.6901759 -0.9301564 -2.2491150 -15.8858366 1.4504906 -6.8613310 -3.1856527 -3.3913159 1.9858799 -3.8541780 4.8219562 -1.3677902 -10.4417219 -10.2463198 -3.1160829 -2.8646781 -6.1894403 0.0332206 -4.0743203 8.0515537 -3.3751194 -8.4988966 -10.9200754 -4.9657226 -4.1581774 -2.7357721 -1.9510036 -0.3577817 -7.1967978 -3.7342191 -2.0562007 -8.1665030 -1.4439980 2.4489002 -9.2320156 12.3845615 -3.9484820 -5.4837699 -1.4749135 0.3733965 -10.9870863 2.9572988 -5.9675341 -3.6438708 -15.6445723 -1.0030550 -0.4341321 -1.9755216 0.5096179 -10.8209162 -4.4577641 -4.2743497 0.1426313 -2.4639378 25.3056908 -3.3441658 -11.8045540 -16.3280430 -1.2690556 -6.8999228 1.1003896 4.9867873 2.1271825 -5.0642033 -3.8700147 -2.9357016 -4.5745287 -0.2278261 -1.4789349 -16.2208786 -5.9129868 3.3102548 -5.7148595 3.6991422 1.1918527 -2.8154821 -1.7250178 -0.8255634 -0.2439758 -2.0828736 -5.4143715 0.3436150 -3.2368531 1.8064795 -0.8647697 -0.4410932 -7.4570460 -0.4224055 -1.9819599 -4.2071238 -1.9050676 3.1141663 3.3452966 -6.0643067 -4.0900469 0.0506577 0.6155536 -2.6012990 9.4955244 -3.2541249 4.6575079 -6.6457124 0.3393498 0.4477010 2.3629527 -5.1370087 -2.1253252 5.1027975 -0.8041140 4.3965473 9.5614710 -3.1340501 -0.5824803 -1.2296392 -0.3722576 0.6552706 -0.4298229 1.9614065 0.6694171 -1.4704846 -2.5884378 -3.8112640 0.8190929 -2.2668293 -2.3143249 -7.5247869 -6.1115942 -6.8097286 -1.3314023 1.0668200 -4.2989616 -1.7568246 -2.4882052 -1.3675150 -1.0517030 1.0473797 0.2038826 3.8719537 1.2819847 0.4245426 -3.9359453 -3.0251811 -4.6290741 0.4227995 4.9857101 1.6037418 3.4350824 7.6623116 -5.2500896 -11.0668554 -0.1405455 0.8546755 -2.5449038 -0.3709636 0.2182603 5.4371753 -2.7637560 1.5730689 -4.4563055 4.9532595 -0.9910501 -1.4222329 -5.1997147 0.2850089 -1.6661370 -7.6496739 2.2749445 -3.3058305 -2.1115065 -1.5599197 2.3713613 -6.9210176 -3.8212321 2.7557492 -3.1195993 -9.4761257 0.4907937 -0.5674586 -8.2314730 1.2100295 -3.0296371 2.2441168 7.1909471 -3.5117869 -11.9925680 2.1560354 4.2191567 -1.1050147 -4.2383356 -0.8669093 1.8784376 -0.6448354 0.1164737 -14.4767799 -1.4370592 1.0413502 3.7514489 -6.2130198 -5.6193571 2.1929917 -3.5459459 2.4127774 1.2017244 -12.3368702 -3.4708817 -2.6292815 -2.2853632 -1.1198183 -1.7655871 -0.3252626 -1.6919420 -2.5909357 -4.4155688 -1.0084549 -1.1828148 -1.0566229 0.4988731 -6.1821637 2.5880229 -1.5831590 3.8411100 0.5824965 -2.5393741 1.5228729 -0.9156408 -0.3566345 3.5286961 -1.5308119 0.1794616 -4.9075251 1.4443785 -5.5842509 4.5831122 -1.7763685 -1.3606160 -0.5854610 -2.4704134 -1.5284573 -0.1326672 -3.8714221 1.3745112 -1.9134920 -6.5254669 6.1845555 -2.7570961 0.8840542 1.5050938 -2.2947686 -1.4274521 -2.9886179 0.6674979 -2.3107011 -2.1582251 -1.4119935 -1.7425491 -11.1401081 0.5689402 -0.6139699 -2.1812382 -1.4537706 -0.9784879 -5.5904346 -1.4150244 -0.9201028 1.6715168 -0.1447077 0.3380702 -20.8601036 -1.2389842 -5.4142566 -1.4357537 0.9798713 0.8317597 -2.2143381 0.6646791 0.1912777 -1.7469832 0.8032858 -0.2107794 0.0610542 0.3720047 1.2710968 -0.3246608 -1.1909806 -2.8992651 1.8091537 0.4969794 0.9362261 -0.5638521 2.1790111 -1.1608227 10.3396225 0.6154341 -3.1531956 1.8177977 0.0877546 -2.7904742 1.1851554 -1.9286542 -1.6532978 -4.0736866 0.2085301 -0.5161700 -3.0992727 1.7840840 -1.3998463 -2.8895240 0.6389976 1.6881932 0.0832611 9.6851568 -0.7900221 -1.9097047 -3.3628941 0.4399063 -0.8034804 -0.0291684 3.2737641 2.2664843 -0.1241960 -0.7756864 -0.7620181 -0.9049217 2.4496114 1.0761563 1.8533155 -2.0679860 1.4045370 -0.0239069 -1.5365661 -0.8684625 -0.5807585 -10.9580097 -3.9835904 -5.2490773 -10.8484831 -7.0931315 -3.3663516 -4.6657915 -6.5999470 -2.9354439 -3.5991478 -7.2228036 -4.2802815 -1.4053164 -0.4968997 0.4854279 -7.3358321 3.5472984 0.2270252 -6.5211544 4.2338147 -7.2825713 -3.2493303 7.7115979 -4.5090752 -2.2967901 -1.9736784 2.2935734 -2.9749455 22.3296432 -5.4911413 -9.9586029 -3.2099130 -8.5065107 -4.0052924 -1.9733682 -5.7659278 -0.4594284 -5.8769751 -12.1487503 -4.8651686 -8.7531719 -9.3168402 2.3863149 -8.2403555 -3.3307898 -3.2867582 -18.8947697 -8.1276007 -1.3167945 -1.3215781 -3.2106838 -6.7781305 2.2237616 0.8392986 -3.7501814 -10.4893723 -0.3907053 -3.5624976 -2.3714499 -1.8440119 -2.2974584 -3.6042666 -1.3059973 10.0222616 -8.2887754 -5.5747204 -1.5687686 -2.5395360 -3.5423000 -5.4011836 -3.8371615 -0.9346221 -3.0708351 -6.3419337 -13.6313381 -4.8010292 -3.1442003 10.4332438 -1.7546788 -2.1494694 -2.7905262 -3.5191541 -1.4000150 -2.8398314 -2.1677604 3.8774316 -5.7280378 23.7731743 -6.2908597 -4.3098040 -1.9944793 0.4803402 -3.1661537 2.9388642 -10.2051134 -4.8708086 -9.5177145 -1.6268601 -1.0682908 -0.6346470 3.1859157 -9.7165003 -2.9298184 -3.7386928 -0.4802823 -1.1388893 24.6297894 -3.0671766 -10.7780132 -17.2991257 -3.1069696 -1.2805557 1.1837933 14.0218496 2.1282635 -5.0466323 -5.4701524 -1.0833871 -4.4275804 0.9490718 -2.2735395 -13.8701963 -2.9433413 2.3500931 -3.9736032 0.7795707 0.4858178 -0.6451184 -13.4278650 -7.0648298 -4.4277425 -12.1964760 -12.9552450 -3.0794673 -7.1584496 -16.9418049 -7.0580769 -6.0168247 -8.1882648 -3.9736872 -1.2621466 -0.0384531 1.4237837 -9.8204670 7.1680131 -0.2919163 -7.2572398 5.8878040 -7.9473553 -7.1472597 10.8572264 -4.8378396 -2.8080134 -4.8964248 2.6972289 -5.7915163 21.4623909 -9.0072422 -10.6277533 -2.6632583 -9.2260180 -4.6787491 -4.2147770 -6.8023171 0.6991305 -7.3812585 -18.0221958 2.2302880 -7.9997435 -6.7372370 3.9816682 -9.6293068 -5.5517578 -5.5865226 -23.1694050 -8.9762859 -3.8365018 -1.8676211 -3.5516193 -4.5255651 3.2860093 0.5420841 -4.2433047 -18.5131721 0.1361177 -3.1188087 -2.6067374 -3.3119457 -0.0700063 -2.8601253 3.8938820 12.6087942 -9.9328403 -13.4056320 -3.4993384 -2.3724983 -3.2608221 -2.8165982 -2.0886588 7.4780087 -4.8152423 -9.5268011 -12.1820755 -4.3345547 -4.8780570 -8.7852678 -2.3801470 -0.0136243 -3.2554209 -3.4241922 -0.8789662 -20.3725548 -1.1992429 5.8680596 -8.0629282 31.1812382 -5.1173396 -6.3983831 -0.8216580 2.9780867 -5.4073715 5.6181302 -11.4650583 -7.1109385 -12.8207140 1.3304632 -1.7802159 -2.7780838 3.4255435 -12.8925037 -4.7393842 -3.4805088 1.8623108 -2.1409717 32.8838043 -2.8078701 -14.4085007 -16.7103996 -2.9777532 -7.5843053 1.4648907 -17.9306583 4.8809400 -8.6037245 -4.5317187 -1.0192692 -3.8361142 -0.0464848 -0.7343011 -12.6713305 -7.4197788 4.1747613 -4.5831032 5.8410349 1.5635561 -9.5955906 -3.8998795 0.0140259 -1.5152780 -1.7782999 4.8850842 1.3342426 -6.7178273 6.6374774 -2.4890187 -11.4381104 -8.2006979 3.5719552 3.6585991 -4.5582128 -2.1409569 -0.5226750 4.8015246 0.9794189 -3.6565435 5.3892913 -2.2840104 -5.5020132 5.7520866 -8.2495508 -1.7320561 2.0520270 0.4009701 -2.2507322 2.9577022 -6.1322784 0.6822672 2.2498622 -1.5092380 -3.6799269 -3.6157458 -2.7399001 0.8251635 -4.3822241 -10.8768444 -2.0404823 -0.2431551 2.8974221 -4.4363093 0.8917097 -5.7384100 -1.5303495 1.5099155 -5.7681389 -2.2517262 1.3808409 -1.5808529 -0.4337592 -2.9495299 -0.5785441 -9.3515415 -10.4953489 -1.8625853 -5.1751986 -2.7698915 2.1865745 2.0696502 1.1903924 4.5023489 1.9615840 -5.8431511 -5.9815502 1.7182828 10.6310120 -7.6670647 -0.2559162 6.0960555 7.8833189 -4.6590066 -7.6383753 -0.8665991 -0.2517274 -0.5587783 -1.6838222 -2.7415187 3.8394275 -1.9009368 6.6785150 -7.3169808 15.6013479 3.4229383 0.9890200 -7.7616420 6.6547794 0.3605370 -3.6577947 1.2584798 1.5716944 2.9372971 4.1329165 -0.5549009 -0.0395645 -6.3010941 -6.0199380 -2.1175191 -3.3978882 -10.8637800 0.2101405 -2.2572725 -10.2230673 -0.8877390 -2.9329484 17.9456406 -2.8242581 -3.6211662 -25.0295410 0.2213635 -17.4814892 -2.2926395 8.5168791 2.1422381 5.9131217 -0.5498876 -5.2555456 -10.5637531 -3.3971965 -5.5875793 10.8591099 -0.1163125 -0.0163672 -12.8815012 2.5184262 0.4934086 -18.7034607 -7.9941483 -2.1105635 -3.0592463 1.6947826 0.5124851 -0.7101362 -0.6732515 -5.7481089 -6.0999360 -0.7433386 -0.9619479 -4.4307661 1.7457732 -12.8485498 2.7476571 -0.9556562 3.2617412 0.4160113 -2.9423354 1.6430869 -0.7142486 -3.2663720 2.0796320 -1.7978791 -0.7071857 -4.3154316 0.5355023 -6.9159732 3.4895849 -4.1055379 -1.7587729 -1.4015403 -7.0969448 -1.7400005 -1.4298288 -3.5005839 2.2931919 -2.9371457 -14.5397415 6.8075185 -1.5553796 1.5460296 -0.3932246 0.3225483 -0.8000488 -1.1119472 -4.4972281 -2.4439819 -2.2691593 0.8732523 -0.7253429 -9.5719709 -1.6114858 -0.6356112 -5.5417452 -1.1885062 -2.2671049 -6.7232394 -0.8604440 0.0865424 -1.8130624 -0.8427724 -6.9971871 -46.3576050 -0.9048691 -7.7223620 -1.2049497 -0.2748264 0.5688304 -0.0360379 0.7189047 -8.3474617 -2.7874830 -2.2097809 0.5715621 -0.3285667 0.5191373 1.9403663 -2.9726295 -0.0540005 -2.1749904 3.1148472 0.5064099 1.3882530 -0.7734952 1.6102790 -2.3181283 11.3008175 0.5352513 -3.4665120 2.9869571 0.0156219 -1.9799180 0.5771489 -0.7592943 -0.4742039 -4.8474731 1.6501542 -0.8617076 -3.5853531 -6.7686515 -1.3954793 -3.0091856 -3.8701403 2.7516389 -0.7992740 5.9205503 -1.5024792 -4.3732443 -3.3896823 -0.5307094 0.3647541 0.2543015 2.5388646 1.9344665 0.4121891 0.3123243 -1.0209123 -1.1129361 2.5535691 1.1890435 1.6658404 -2.2633321 1.0100288 -1.8170447 -2.3847244 -2.1063979 -11.2254477 -16.9182968 -1.1875336 -3.0150692 -4.0873218 4.6385818 -5.9284673 -2.4893255 -0.3299960 1.2718670 -1.7575455 -6.2841387 -1.0562173 4.1920176 -9.5739775 1.1184973 -2.6313303 3.4073260 1.3675259 -5.0908289 3.3080139 -15.9942245 -9.3798075 5.6649475 -4.9003291 -3.0137923 -0.7725999 5.6557317 -2.1937556 11.8333549 -1.6426719 -8.4751387 -7.6237769 -6.1834955 -6.5047836 -12.5416183 -6.7184925 2.1307988 -4.9522915 -14.9015369 0.5463098 -1.2650977 -8.1284742 4.7214437 -3.8217399 -2.8157678 -1.3075305 -4.3644118 -3.5414517 -3.2445235 0.1463093 -0.4825977 -7.5203185 -2.4547734 -0.1398396 -8.5500183 -5.9216118 -3.2902248 -7.4405608 -1.8925593 -9.2445917 -4.7320628 -3.9308484 -5.7918177 -1.0987955 -6.4195585 -5.1533170 0.0065996 -2.4845715 -3.2113407 -7.4470868 -5.7943912 -10.3057747 -4.2056298 -5.7836008 -1.7547052 -5.9021835 -5.3027930 0.5241450 -15.5960150 -1.5975435 -1.1233783 -6.4849968 -1.7066265 -2.0859306 1.5957243 5.9752192 -5.1091599 4.0044465 -2.4070058 -3.0943506 0.5457833 1.4999220 5.0401130 0.9843555 -3.8277912 -1.0538505 -9.3993683 -6.1646161 -0.9260506 -4.2438402 -25.7721500 -8.1102009 -5.2605476 2.1465225 1.8918184 -2.1362996 8.6844015 -1.8861431 -9.2508593 -7.2524300 -3.4329088 1.0942194 1.6276169 -16.5608807 1.3910756 0.5448551 1.4098490 -0.4461660 -4.7792182 -0.1271856 -1.6501073 -6.2736888 -4.8780770 1.4750143 -6.1974854 -4.5468493 -1.4146121 -15.6877623 -13.4053230 -2.8306396 -5.4590235 1.5199581 7.2995472 -5.5490942 -1.2199100 0.6974606 -5.5084028 -1.2321393 -7.0197916 -4.1641736 1.9453226 -10.3357878 1.6509709 1.1438872 8.3082361 -3.6025941 -4.6701798 7.4180093 -11.7666969 -16.8330288 9.1780901 -5.8689132 -3.7706656 -5.6991119 -0.3239246 -4.2409768 17.2310753 -3.3796268 -11.4888134 -5.2916656 5.2787714 -6.9839234 -14.1705132 -11.9119806 -0.4166328 -7.4819126 -15.7050943 5.7915292 -7.5689602 -6.6051135 3.4373736 -2.2896602 -5.3651576 -0.0304729 -16.5956631 -6.1768703 -3.2401140 -0.0263344 -1.2542225 -13.0388985 -2.0781226 -0.3452053 -9.8734426 -4.8088059 -1.9309115 -3.5903382 -2.5979373 -7.8658915 -1.8450623 -5.3676925 1.0298107 -24.5379257 -6.9827089 -14.6113310 -0.6730704 1.1905435 -5.3655910 2.2951968 -6.2918777 -1.0011636 -10.3107271 -6.0973330 2.4434888 -6.1348419 -3.4177461 -0.4349545 -21.3333111 -1.9770280 -1.3475295 -0.2995472 -5.5484037 -13.6879253 3.9861119 7.1529570 -7.5036964 0.3220456 -2.0975108 0.7173926 2.6913958 0.0139117 7.4670944 0.7898453 0.3035720 -1.5220753 -2.8291817 -1.5900543 -2.4451132 -6.9163055 -12.1596565 -16.7614594 -8.2401333 2.9140563 3.0026500 -2.9734082 4.4460340 -3.1689682 -11.1710396 -18.4832706 -3.0156837 -2.6003835 1.8247192 -14.3468180 4.0301232 10.1821489 -0.0810473 0.3236168 -9.4114714 -1.4403393 -0.7212843 -14.1886578 -6.6041794 1.9294894 -6.7059450 -8.4844275 -2.9484286 -9.2186766 -3.9524567 -6.0908680 -4.1002188 0.4581437 8.1971884 -5.0105171 -0.3962872 -7.1642299 -0.2639110 -4.2565084 -5.5575161 -0.1050685 6.6024985 -4.5721993 -8.2655210 6.5810199 0.5933132 6.4991837 -2.6195061 4.4882164 3.1237926 -2.1618035 -4.9915209 -6.9201937 -2.9929345 -0.4450054 3.8171530 0.0073616 -0.0247079 1.8562313 -0.7496403 2.8862245 6.8704658 -4.1791101 -5.9620337 1.1886668 2.9328237 -2.5260561 1.6871030 -0.4112132 -6.9222913 -1.8265024 -2.2292676 -7.5121317 3.5098419 -3.0139482 0.3926204 8.3896761 -10.4853783 -0.4586687 -5.0566001 -3.3567724 -5.5539250 -0.0055006 -1.3274925 4.7628150 -4.6377945 0.4006402 -4.1041117 0.2320823 0.3509702 -3.7207670 1.7890735 0.2080512 2.5008078 -2.5101671 4.5225272 16.7528172 -1.1340487 0.5373439 -0.6346452 3.4795654 -5.4216681 -5.7200203 -0.5229542 1.0800910 -1.6395324 1.0498511 -12.2080841 5.4792972 -2.6792207 2.0546489 2.1156580 -8.3419523 -6.4179630 -1.1220748 4.1160402 3.4668844 2.8033037 -0.1995752 7.9063382 11.5340614 -8.3652782 7.5415421 -5.6018739 3.1235580 1.4561385 -4.1344500 -13.7710505 -5.0839453 -3.4114053 -9.3701105 -3.1572728 -0.4250924 10.4834557 -1.0055169 -1.4142402 0.8618918 -6.3306298 1.1729167 4.0720077 -9.6986732 -2.3500068 -2.7717025 1.8922606 -1.3219715 -0.7084644 -2.2729080 -4.4940448 -5.7954087 0.4300971 -1.2328944 -7.3775673 3.1262999 6.2043467 2.5983229 1.4009962 -53.2235413 -7.1090865 -2.8761082 -1.8777715 0.2490655 0.8466178 -1.4851639 -1.2558700 -4.9958191 -3.6893160 -1.3934644 -0.9708004 -0.6524584 1.2246894 -17.0422058 2.0404377 -2.0189495 3.4692721 0.1525355 -4.0541162 -0.3660284 -0.0245037 -3.7114863 2.4217017 -3.3186753 0.2179535 -13.0238276 -2.7206991 -5.5037451 1.5633662 -4.1251812 -2.8492715 -2.6152954 -10.4084425 -2.5500891 -2.2526107 -3.5288260 1.8724139 -4.4445534 -14.3109808 6.7750812 -3.1152079 0.9909017 0.5827703 -1.7617625 -1.4796268 -1.7930286 -6.4472976 -2.8319747 -2.9293129 0.5617077 -0.6525916 -11.4010935 -2.2914848 -0.7663516 -4.8089914 -2.4174998 -1.8192914 -7.0304656 -0.9488130 -1.3977917 -13.2332935 -0.7266098 -10.9751320 -5.6281309 -1.1847219 -9.2494364 -1.2083488 0.5763332 -0.5931677 0.2649441 0.7360646 -9.2434444 -3.3708918 -1.8631964 -1.4664946 -0.5122490 -0.5557308 1.3641641 -5.8418555 1.0111094 -1.1344452 1.4335916 0.9375709 2.1781621 -1.7398323 0.3707997 -1.0839083 8.2527399 -0.2201913 -23.6880722 2.6006901 -0.5268638 -6.9271393 -0.3852038 -0.9170264 -0.4499165 -7.6720095 0.3050190 -0.4827439 -3.5048909 -5.4538617 -1.3676786 -3.3361788 -6.4955897 2.8460548 -1.2585213 5.0585766 -1.7685344 -15.0878220 -5.5299625 -0.9486841 0.6077242 -0.2167898 3.3365719 2.4110897 -0.3233646 0.3875251 -0.4232517 -2.0662661 1.5917745 1.1829662 1.8485028 -2.5539224 0.4409940 -0.4774899 -1.3017694 -1.7393638 -11.4395218 -16.8578091 -5.5818644 -2.7841837 -4.0477843 1.2918042 -6.3068008 -4.1465683 -0.2729820 -3.4388242 -1.5423115 -6.2163658 -4.5543652 -0.9787962 -11.0732222 2.3626263 -9.6371660 4.9743328 -0.6223506 -7.1474199 2.0727682 -30.6335297 -7.3553066 7.1001930 -4.2239890 -2.7225614 -5.4927816 3.8100092 -1.9560356 14.6543407 -6.0722451 -8.3563919 -9.5847521 -1.5879480 -6.5146861 -11.1849508 -5.1921492 -0.0066597 -4.6775155 -13.6236610 -2.9745007 -14.6362514 -8.0703659 2.8354137 0.0989771 -2.6727328 -4.2510204 -12.1683588 -3.7617419 -4.7589254 0.6791875 -1.4247380 -8.7917356 -2.8333821 -1.0227635 -14.9511490 -5.1747103 -3.4049087 -21.2223530 -1.1025115 -10.4692993 -7.9997411 -4.0357618 -6.5811615 -32.1127510 -7.0927620 -1.9319956 -0.3321731 -2.5242302 -3.8903742 1.3827972 -4.3482370 -9.6002464 -7.1475215 -6.3107281 -3.2404356 -6.2658453 -4.0414729 -2.8025231 -17.7921314 0.2602876 0.0849646 -5.6573186 -1.5187941 -2.3310072 0.2372663 3.4203174 -5.1345487 -19.8864212 -3.5940974 10.2073488 -0.7510732 4.5533175 -0.4943935 2.1670623 -1.6331072 -1.7429721 -11.7849703 -6.5021977 -2.3649864 -2.9037631 -23.8199310 -8.4290562 -5.6644526 -10.9112558 1.3088334 -2.8220177 13.9504957 -2.8739538 -11.1803513 -11.8569775 -4.6230755 0.4684269 -0.0876321 1.2963605 4.3324962 -0.7898806 0.1283416 -1.1639169 -4.7866135 -3.6407478 -1.3298621 -7.1672015 -5.0134454 0.0967828 -6.1640911 1.5809547 -0.9728930 -16.5376034 -21.9242325 -7.6812124 -1.8031197 -3.1990254 4.1748147 -6.6575508 -3.0235322 -7.5795989 -13.7447243 -3.5393760 -7.1985846 -4.3675427 0.0549346 -14.5359030 4.4591193 -5.2604017 8.2561979 -0.9924319 -6.6864290 3.0499866 -21.5926704 -11.8170128 9.6711941 -3.6860034 -3.6813271 -11.2706385 9.1005411 -4.3651733 17.0422096 -7.8701515 -8.5721626 -9.0020151 -6.1140871 -7.6643229 -11.9643135 -6.9502087 1.4611253 -7.6575613 -21.5014133 4.2900705 -19.9633617 -5.2201934 4.1678314 -0.9083543 -4.5001354 -5.9308052 -17.8020000 -2.3478155 -5.2429681 0.8517283 -0.9999715 -9.8527861 -3.7634950 -1.7220582 -22.3084774 -4.1674180 -5.4309111 -6.6068735 -1.8389192 -12.2375526 -9.6918211 -3.5876667 -6.6111789 -18.6288395 -8.5917244 -9.6579943 -1.5806087 -1.0647377 -3.6081581 9.8234453 -3.0513327 -8.1917925 -8.3652935 -7.3720374 0.2967662 -6.0105267 -5.1312690 -17.9521885 -20.4993515 2.8676908 0.3442519 -6.7549949 -1.5411966 -0.7969244 2.5966482 4.9714408 -7.2847385 -3.4280581 -1.0571673 8.6847773 2.2689705 7.7100315 -2.5559170 4.4680319 -0.3642461 -1.9065684 -16.3552914 -7.9520969 -3.6990368 -6.8187466 -18.6170025 -9.7541027 -7.5624003 -13.7224808 4.4842043 -3.9317670 16.1177387 -1.9517485 -16.9183559 -18.5636806 -4.8312540 0.0730980 -0.5298584 -20.8960457 7.0324907 0.7241553 2.6362817 -1.3650250 -5.6852717 -2.1890635 0.1854593 -2.5940874 -8.9394112 1.5003594 -6.4336963 4.4856157 2.7275226 -14.9436178 -12.3113966 -2.8354626 -0.3525213 -14.2417355 7.6045666 -2.1909645 -1.8312163 6.8098583 1.7459927 -2.6131673 -2.6513102 10.9577742 3.3416495 -7.4546661 3.9830012 8.8459253 7.5976486 -1.5964348 -1.2708787 -0.3133699 13.0098791 -13.7734299 6.9205666 -4.9453444 1.8432672 -1.9642241 9.9510412 -10.5865936 -7.6440687 -5.6379919 -9.2298574 0.8077438 -3.1029358 -4.4777722 -2.7825568 -6.8260956 1.7169880 -4.7649107 -15.4525194 1.0435835 0.7803533 1.7685840 1.6008536 -4.2506886 -2.5216141 -3.2761426 -5.0670204 0.4776835 -6.0417547 1.2912519 -0.6631925 4.5871549 -2.6821864 -3.4199226 -6.2195582 0.7363165 -1.8346829 4.7882180 -2.1206388 -1.9812799 2.9011669 -0.1033673 1.7841855 -0.4272681 -1.3028163 -3.6904235 -5.5582895 -3.0813525 -0.4462954 12.8043842 2.2706287 3.5033081 -1.9361229 -1.8232571 -2.0483811 -1.8105255 -0.4941251 -7.5689039 -8.5916977 4.9189076 1.9887497 8.1751938 0.0242977 7.1955967 3.1616821 -0.0691011 -0.4715057 5.7622452 2.0476956 -0.1553087 4.8773670 3.4946933 -2.7021806 4.4923449 -6.1437688 -2.0101519 -10.2072105 6.2783294 -7.7919149 -3.6930616 3.2752700 3.6220062 -2.9820075 -9.1219788 6.3269815 -3.1594210 9.7685051 2.1386979 -7.0693345 -17.6674919 -0.3331250 2.4459813 -0.3614779 -2.5815768 5.4071178 4.5351582 0.7236884 -2.0904012 -4.3410001 11.9679174 0.6436315 -0.8637838 -5.8963981 0.1875016 -0.3514570 3.0459781 0.9778689 -34.2397423 -8.6960716 -31.9234619 -1.8736234 -1.0494248 0.3285913 -1.8712933 -1.3215173 -5.5965381 -5.3171244 -1.7709905 -0.9465065 -0.5719332 1.0768909 -17.7777557 2.0915570 1.3264506 3.6533194 0.2665797 -4.0539312 -2.1748693 -0.6263485 -4.2576470 2.8761737 -4.3305492 0.3222138 -14.9822645 -2.4690351 -5.7171283 0.8551311 -4.0431542 -3.6533008 -3.4518158 -5.6324768 -3.2880991 -2.8905458 -2.9861867 1.7567250 -5.1512465 -17.5128841 6.9395590 -2.8381732 0.5100557 1.2128655 -2.5872233 -2.1734488 -2.3292816 -7.8712163 -1.3523130 -3.1077173 -0.1034344 -0.4027284 -17.1846027 -2.6531992 -1.3069402 -5.4906330 -2.3673069 -1.8942293 -6.3586335 -0.9446201 -1.8342979 -12.7091713 -0.9986255 -9.3060837 -9.0221777 -1.0520502 -12.0497904 -1.4590598 0.7628641 -1.3951370 0.3477120 0.8221906 -6.0992126 -3.4898906 -2.0531273 -1.0767990 -0.9936119 -0.8233600 -0.5697968 -5.2753987 1.2036412 -0.3281422 0.9499636 0.5923302 1.6353298 -2.6089787 -2.6827364 -1.1197637 7.6158414 -0.7418317 -1.3951725 2.5984452 -0.9295565 -6.3234076 -1.8227699 -0.8878955 -0.4622183 -8.9848862 -0.4321355 -1.0638990 -3.3168120 -4.4252381 -2.2470336 -3.2353902 -7.4374795 3.1763833 -1.4449393 -2.5634677 -2.0016348 -16.2942715 -6.3330202 -2.0411015 -0.6628897 -0.3165809 3.8659210 2.8969035 0.9016737 0.1135172 -0.5504581 -2.7865887 0.5042102 0.7712676 1.8714503 -3.0411668 -0.0301298 -2.2227204 -1.3181624 -2.1553473 -10.6419621 -21.1906605 12.5931044 -5.3280849 -7.8348475 1.7325951 -7.0874581 -3.7055283 2.6893766 -0.9044895 -2.3363578 -7.2340193 -3.7021976 -1.3575314 -11.0384731 1.9419239 -2.4099624 6.0937119 -0.4593623 -7.0533419 -0.3398303 -15.6591702 -7.8010769 4.7421527 -6.9372520 -3.2351890 -7.6420331 5.5405965 -4.2692051 14.9084435 -6.2055764 -10.6597357 -11.7924757 -3.5082798 -9.1091213 -8.1722174 -7.4603019 -1.2009946 -5.4276323 -20.2334442 -6.2361817 -11.2268457 -9.6117258 2.1055279 -2.8561466 -4.3548017 -3.0671206 -13.9507980 -4.6187778 -3.3167477 1.9740515 -1.5759610 -13.2561922 -4.2281003 -3.9746957 -19.1442719 -6.3242936 -3.0479784 -9.2550678 -2.1023633 -9.1471100 -7.7578287 -2.3894286 -7.3591328 -29.9569511 -6.2609935 -3.4347525 -0.8569087 -1.9319152 -4.6529560 0.9689649 -4.6517115 -11.4886217 -9.8520517 -6.5312748 -6.4819551 -7.4430790 -3.8808978 -0.1827725 -15.9244308 -2.2237356 -2.0228741 -5.3377171 -2.0909157 -2.3291028 -0.9470274 0.2684320 -5.0061440 -10.3858442 -5.5777221 -8.8749762 -1.7126704 3.0650258 0.7734134 0.6379378 -2.2080646 -0.1691640 -11.8088703 -8.4621572 -3.2445202 -2.6119509 -11.4169855 -8.5985298 -5.8849854 -15.8981733 1.2384448 -1.7720476 6.4839935 -4.2328162 -11.9375420 -4.6888843 -6.7698879 -0.0956252 -0.4335949 7.3997211 5.0993571 -0.1230249 -2.7914793 -0.6463425 -5.7322769 -7.1899853 -2.8109720 -9.2509499 -4.8714237 -0.9267219 -6.8246460 1.3726132 0.0064644 -17.3312664 -26.7558880 12.1698542 -5.1658068 -10.4112854 5.8433714 -7.7046914 -4.1873913 -1.5026023 -20.7965679 -5.3599815 -8.9554300 -6.1720719 0.5007648 -16.2446289 4.1398239 2.0057693 10.6109362 -0.6344770 -7.9369826 -0.8981628 -16.3278027 -12.8915596 7.0953307 -7.1898246 -3.9322672 -14.4950533 9.5907898 -7.8496170 2.2894490 -8.8729982 -9.4189129 -12.2064676 -5.1904907 -10.7635479 -9.6806002 -10.1228886 0.3910998 -8.3470697 -26.9750004 -0.4289677 -10.8186998 -7.3620300 2.3496292 -5.8360209 -7.3872905 -4.6255655 -27.5889626 -3.5095234 -5.5864372 2.1303775 -1.9562136 -8.0338764 -4.4937706 -5.4165850 -28.7911720 -5.6704955 -5.9293861 -16.2192192 -2.6034594 -12.1954012 -9.6829243 -1.6449168 -9.1754761 -32.4525833 -7.6612372 -11.4585772 -3.0018456 -1.3923028 -4.0564256 5.7854815 -3.6044888 -12.3687134 -12.8489847 -8.0155115 -4.8648591 -7.2077746 -8.2639837 -20.4368172 -18.8385124 0.1207743 -1.7801479 -9.3632374 -2.8172834 3.4954946 0.8726005 1.6992259 -7.7156711 3.3463554 -2.5915475 -11.3240795 1.3668947 5.4504437 -1.5115932 2.9182785 -1.1434703 0.1184114 -18.0598335 -7.5848193 -4.2878075 -8.0612297 -15.6354494 -10.3795500 -10.0194483 -22.3204174 4.6473365 -2.5776582 6.0778499 -3.3682115 -20.8312721 -7.4546289 -7.5464864 -0.9696562 -1.5034964 -12.3961630 8.5897360 2.9231126 -0.9209620 -0.4930104 -8.3608408 -4.0862060 -2.5651405 -5.9047456 -8.8086615 -0.4339651 -6.0869389 3.3288379 1.5518239 -22.2726021 -13.8791180 -8.8988190 -1.6293821 -7.1431084 10.9585266 -2.8100047 0.3882788 -20.0614090 -2.3786306 -5.6707659 -7.3110876 9.7865334 3.2714517 -9.9760170 4.1575732 4.6600065 4.0277586 -2.6182861 -2.9714236 -5.4016638 9.9803782 -12.7351007 4.9636607 -6.4593096 -0.1289040 1.0173227 8.2636423 -0.1753872 -4.7807264 -5.5949888 -5.5199070 -1.8504466 0.4396749 -4.7272596 -0.1358738 -5.4500790 4.0412574 -4.1353178 -10.4044514 1.2175578 1.9301850 0.3608767 0.4092973 -7.8959093 -3.9122424 -5.0912666 -10.1991863 1.1966029 -3.8633707 -0.9464494 -5.6317725 1.8158857 -3.4858365 -5.4273143 -4.9148588 0.0879906 -3.6871209 -4.4159756 -2.0481765 -2.4651134 3.1798117 -0.7251208 5.0287108 1.8454866 -2.0600586 -2.4028192 -7.3015375 -6.0911584 -0.2572205 12.9999762 -1.5263206 8.3038492 1.1628484 -2.6702435 -2.1210995 -2.8051481 -7.4639487 -8.9749498 -3.8489301 1.9010143 -0.4315146 -3.5982118 -0.8004051 1.1664857 -0.9816808 -3.3876364 -6.0645151 10.0565557 2.4377308 3.3665869 5.0735188 3.2776392 -2.3937287 4.6312513 0.7545721 -1.8097486 6.8006859 -10.0432444 -6.0398102 -5.3362575 2.1499708 6.2911444 -3.0322082 -5.7702117 6.6035428 -0.8597331 2.0871646 -1.7886969 -2.6818802 2.5282881 -2.8767552 5.1066494 -2.7245212 0.3051928 2.8250306 7.8666558 5.3836751 -1.5891626 -3.0784850 12.4827127 -4.9074068 0.3480451 -8.3477144 0.9915683 0.1486483 2.7217221 1.2891464 -23.9735374 -10.4129219 -2.5984151 -1.6232572 -2.6946304 1.0838600 -2.3623145 -1.1111457 -5.2767124 -7.8222399 -1.8872330 -0.9745147 -1.9547985 1.0177408 -15.5706186 2.6334379 -0.2021292 4.7638078 0.6679100 -3.1603303 -3.1933837 -0.8513621 -4.8999658 4.5833879 -5.1525059 -0.6785998 -13.4223785 0.0389517 -5.7953033 1.0743427 -5.4657907 -4.1065345 -4.8930392 -5.5145984 -4.1826401 -4.5077338 -3.6965318 1.2530619 -6.4905767 -20.6411972 5.8387723 -2.7929630 0.2041014 2.1298873 -3.8279305 -2.5126793 -2.7559099 -9.1798277 -2.6786127 -3.1233966 -0.8096558 -1.4326036 -37.4189034 -2.4625943 -1.6754595 -5.5762801 -3.2600479 -2.0941124 -5.3458996 -1.1861352 -2.4911268 -10.5106001 -1.8465580 -5.7261353 -5.6665921 -1.0561386 -15.8539896 -1.8959216 0.1396259 -2.0700636 1.9559524 0.9841161 -3.7960231 -0.2263349 -2.8123453 -1.3705584 -1.5313933 -0.8619189 -6.2860065 -3.8383653 1.8741485 0.5597656 0.5901937 0.5486958 2.3076377 -4.3595629 -5.2819209 -0.8252649 6.6088891 -1.3832986 -2.2602422 2.4036784 0.2090583 -5.3091350 -2.0114927 -1.9746797 -0.4325195 -10.0372658 -1.4351192 -1.0579625 -4.4119363 -3.9459808 -2.8576260 -3.3950033 -7.5048957 3.4136565 -1.8748941 -2.1016455 -3.7688580 -31.6560802 -5.3880711 -3.1320627 -0.8823604 -0.4514512 4.0682721 3.4554825 1.3227930 -0.0446062 -0.6529498 -2.7386408 0.4613737 0.8671714 1.8681728 -3.5113406 -0.1039209 -2.9580004 -2.2753119 -3.7080193 -10.3170185 -26.5242844 -4.5547500 -8.3157206 -15.4349480 3.6092319 -8.6093445 -3.7231247 5.1755729 -1.4006164 -2.9667845 -8.1921616 -4.4861441 -0.8381822 -11.4039364 1.6774931 1.5047350 8.0241241 0.1430597 -7.5120263 -1.2177215 -8.1223307 -9.4208679 8.8906116 -9.7209120 -3.9491165 -11.2002354 7.5780892 -5.3924708 18.7452736 -7.8778477 -12.1836185 -14.7709503 -6.2666864 -11.5821323 -3.1147041 -9.7415314 -2.3294754 -6.6674309 -27.7514610 -8.3927059 -4.5955653 -11.5095720 7.1143899 -7.9520307 -6.1735401 -5.8800244 -12.8366613 -7.9610929 -1.3392004 -0.5604600 -2.6981590 -12.6600971 -6.0959673 -8.3285666 -18.9484596 -7.0990372 -1.2163131 -21.4225826 -2.5321205 -8.5371828 -10.3697739 0.0379091 -9.6425810 -11.0253735 -5.6423717 -8.0049229 -1.8893341 -1.7159694 -7.1166983 0.7272018 -5.9826760 -15.6317587 -14.7692394 -6.0654931 -9.9586029 -9.1968794 -4.3876338 -0.6367331 -15.3885574 -4.8249521 -0.7200490 -7.4570122 -3.4274137 -1.5467254 -3.3876624 -3.6347408 -4.8947730 6.2465949 -7.4426994 -6.2881088 -2.6317649 -0.3500518 0.9618676 -0.1942925 -5.6096530 1.2291600 -11.6914282 -12.4534149 -5.5488715 -3.5754011 -8.1140175 -10.1747446 -6.2922630 -11.1406689 1.1807607 -1.2765119 2.2204883 -8.9475956 -14.8320932 0.0310714 -9.3451462 0.5906861 -1.5775238 8.2100067 5.9466558 1.1808059 -5.7594519 -1.1221696 -7.0893469 -10.4259367 -3.8417723 -10.9183664 -4.9764113 -1.2460990 -4.6301413 0.4902319 -1.2269268 -19.8236103 -34.4654350 -6.1004539 -9.4531708 -23.8622475 7.6561346 -9.8054171 -4.1537495 0.8709292 -8.0072079 -6.5947576 -10.9240847 -4.8500605 0.4705040 -19.0293121 3.8280849 4.0129180 11.6600389 -0.3132212 -9.6362429 -1.3457202 -7.9043155 -14.6244402 11.7127266 -10.3260374 -5.4439964 -21.7587109 12.3442392 -7.5803766 8.4300642 -12.9772062 -13.1923313 -15.3055420 -9.1579132 -12.4172220 -2.4571431 -11.5954952 -0.8658960 -10.4874172 -33.3627930 -16.7818222 -4.8667836 -9.8019419 8.3460569 -13.8225965 -8.7840443 -7.0946064 -18.2683067 -7.1777587 -2.9059591 -0.5981101 -4.1015439 -6.9431233 -6.4587731 -11.4608831 -26.4136829 -7.2720933 -3.3353944 -13.6061783 -3.6767678 -8.3991919 -11.4415102 0.1436381 -12.7181931 -20.3228321 -6.8651857 -14.9713240 -4.1979365 -2.2758479 -7.1816130 6.6626992 -6.2150712 -18.7069550 -12.6918726 -8.1867285 -12.9283352 -9.9262514 -6.2473445 -12.3583479 -16.7253933 -3.7675123 -0.8076152 -5.0702167 -4.1134777 -4.2152505 -4.3531647 -4.4949851 -7.9671936 26.8504009 -4.8264918 -7.9479160 0.6483390 1.2509960 -2.1447458 2.4005284 -2.5592968 0.9730636 -20.4198875 -9.9893579 -6.4961996 -7.7780619 -15.5439806 -12.6372824 -9.6042852 -14.8456554 5.0913558 -2.5706990 -3.2617371 -10.0655518 -25.3771763 -1.1569188 -10.9054556 -1.0475371 -1.6514815 -13.9184637 8.6980276 4.0756574 -3.1580105 -1.2224112 -8.3852491 -1.8552344 -5.8850746 -8.7350264 -9.5619259 -0.2372646 -4.2747478 -0.1378886 2.9983647 -30.1052837 -5.8076577 0.2069638 -3.2130320 2.4721525 7.7080684 -0.8959358 0.6142587 -9.7171259 4.2899485 -12.7761383 -8.7514114 1.7970188 2.4407444 -11.6598625 1.8909391 7.6974416 3.4507163 1.4308442 -2.2130308 -4.1219869 5.4344573 -3.6476851 6.1363330 -2.5170670 1.2218612 10.4283447 6.6667976 -4.6459599 -2.9424794 -6.5854592 -11.2458096 -0.8367833 3.9075437 -4.7894888 0.6902326 -5.8506374 3.7154179 -3.7338004 0.4751100 1.7659190 -5.0782642 -3.0154736 2.6229103 -4.1295347 -5.7620845 -1.8177172 -23.6453629 -1.4826266 -1.9080430 -1.7508913 -6.8543582 -0.5804649 -1.4405252 -7.0845075 -13.0935802 -2.6441743 -2.4399185 -0.5351973 -3.5302773 0.8342276 0.7821102 -1.4135009 -2.9220829 -6.9618907 -4.3867207 -2.6503594 -6.7061439 0.2382467 -0.7440377 14.3933563 -2.7707045 -3.4258177 4.7541127 -2.5708044 -3.5601101 -3.6073928 -2.2552719 -7.8273625 -8.4312458 3.7035265 2.1630716 5.3064318 -1.0562342 -4.5374808 -4.3677788 1.6982806 -2.9651330 17.7032223 -0.5639064 0.7252046 2.5598929 1.9435369 -2.5323567 0.1566574 2.9515700 1.2009088 6.1439099 9.1986370 -26.7698784 -11.9149141 -1.1511524 5.9691491 -5.0609336 -10.9630651 4.5894856 -1.3061422 -3.4538317 0.8689164 -0.7201518 -0.2474232 -0.4424351 0.2121227 -2.6852446 10.8760815 3.1247115 5.9023848 4.3138986 -4.9215517 -5.1794195 -12.3661165 -8.6850176 2.6644802 -5.0939155 -0.0450793 -0.7870896 3.4519508 1.2632574 -27.7237015 -13.5375586 -2.1501129 -1.6214008 -4.6730542 2.9535477 -3.1176679 -0.0355461 -4.6606245 -11.2744703 -1.8173314 -1.1192812 -2.1297536 1.2594081 -16.0296936 2.7921236 -0.0223603 5.6764355 0.5400227 -3.3825188 -4.7564607 -1.3910414 -4.7753396 4.2148051 -6.1563935 -1.1013954 -15.0819883 0.1038717 -6.0337410 0.4802177 -1.5787914 -5.7053781 -4.9834194 -4.6449800 -4.7592626 -6.9926152 -3.5223491 1.4835299 -7.0522728 -24.6146584 5.2813010 -4.2588181 -1.1802632 1.2193353 -4.0325446 -2.7127347 -3.0821083 -8.3115196 -2.0246673 -3.0231438 -0.7194009 -2.1956418 -29.3695087 -2.4508433 -1.6721908 -6.9683585 -3.4028733 -2.8694005 -5.4086828 -1.1808753 -5.7950721 -26.9105129 -1.3996458 -7.1056309 -4.7312717 -0.9707810 -20.1242447 -1.7206932 0.6931310 -4.3058619 2.9298043 0.2899575 -5.4035206 -3.7750556 -2.2397659 -2.4495161 -2.3275526 -0.9240290 -12.2444124 -4.7022147 1.0961798 0.4848433 0.2957236 0.6168003 2.4658022 -6.1228905 -6.7237835 -1.0789295 6.4280763 -2.4705365 -1.5821193 2.5797591 0.2377572 -3.8031900 -2.9544818 -1.4421060 -1.2806503 -10.5130358 -1.7709440 -1.3258950 -3.5076802 -3.0567267 -2.9885278 -3.3283608 -5.1124640 3.5439849 -1.6141282 -10.0686874 -7.0177951 -26.9416904 -2.2467430 -4.6061220 -1.2427107 -0.5107558 4.4548740 4.0086880 2.1478937 0.0761685 -0.5831183 -4.2035346 -1.0563393 0.8456160 0.1585331 -3.3362274 -0.9653955 -3.1837649 -2.2740176 -2.3459966 -11.6348181 -31.2631779 -3.2672544 -11.4454823 -25.6132526 4.9458132 -10.3971357 -2.2210176 7.6384006 -4.4550209 -2.7180705 -8.6341677 -4.6814041 1.2748834 -13.5490894 3.0421088 1.8137382 7.7070260 0.4635984 -9.8853893 -2.7837353 -1.8400022 -10.9125490 17.4348106 -12.4464025 -5.3334308 -20.1498260 7.0284119 -9.3294096 20.2401257 -6.1566496 -15.6275520 -20.0193386 -6.8542933 -16.6182747 -4.1673698 -13.1930103 -2.5576956 -8.7343178 -31.7962055 -9.2270575 -1.6571382 -14.0965700 10.4544916 -13.2750797 -6.9765019 -5.0163059 -5.6272488 -11.1358232 -0.1933913 -4.1062260 -5.4907784 -15.0456800 -8.2754831 -10.6415510 -21.8679810 -7.8429198 -0.5736431 -7.2520099 -3.4609096 -3.9303889 -11.0639172 0.1082925 -9.4347029 -7.3539767 -5.3630958 -15.0933971 -2.1777163 -1.8049877 -11.8196716 0.9681033 -7.9075484 -18.5841236 -3.4637842 -4.5564089 -15.2515383 -11.0511370 -3.1151726 6.1217408 -23.8099346 -7.1655068 -0.2577713 -5.8836174 -4.0536861 3.6756716 -8.8970327 -9.1085043 -4.5711675 21.2233181 -9.8935957 -4.0271635 -3.7528238 -4.3346944 -1.0543400 -3.0906780 -7.8122578 -0.2067626 -13.1671095 -13.4150324 -5.4550176 -3.6734939 0.7971726 -9.7421818 -7.1930971 -8.9478617 1.4715143 -0.8166800 -10.6822586 -16.1764774 -19.3528461 5.0709076 -11.1779795 0.5637248 -1.0303288 14.1860266 4.3952818 1.4645735 -8.6538763 -1.3426913 -8.3660078 -10.8674984 -4.6776605 -14.8851147 -4.6695371 -4.2537556 -6.3001385 0.5983483 -0.5725294 -24.4288712 -30.3916969 -4.4314036 -13.1450691 -25.8828964 8.0474138 -11.4308395 -2.9117248 4.5821676 -3.7869387 -5.7450876 -11.4050665 -2.8441432 2.8196416 -22.6621761 5.0557232 5.2314706 11.4171009 -0.1245765 -12.0566072 -3.5435290 -1.8935930 -18.2346878 22.2614975 -15.4391718 -6.9500089 -19.8057041 11.3480301 -9.4276810 10.3907146 -7.6108189 -22.7254848 -24.4692860 -7.8360586 -20.4632454 -5.6253257 -14.2996321 -0.8118172 -12.8656454 -26.9599380 -18.1160374 -0.0468211 -13.8026419 13.1212921 -15.8297348 -9.7291269 -7.8218427 -6.7251248 -11.3078823 -3.2869780 -5.1993256 -7.1033936 4.5673685 -9.1854086 -17.4400234 -38.2273178 -9.8480196 -2.5559623 -6.4901223 -5.4159584 -5.9735303 -13.1033783 -0.4666187 -11.5705805 -21.7225037 -6.6259637 -17.7183590 -4.4843030 -3.8011794 -12.1127911 5.8693652 -8.6988010 -21.0206261 -3.8906972 -5.9580312 -15.8717184 -12.9900885 -0.8212737 -13.1393576 -26.4680080 -5.8314886 -0.0053212 1.0894601 -4.5862927 11.8842878 -10.3667231 -12.3581810 -7.4991622 27.8389835 -9.7504425 -5.5157790 -0.7068592 -3.6020591 -4.1682315 -1.0183982 -7.6411157 0.0415199 -23.6388874 -11.7989931 -6.0543370 -7.0635676 -1.9357460 -13.2969313 -10.0037842 -12.7593651 4.5533333 -1.5480596 -12.7778749 -17.4996014 -31.4929981 4.2828846 -11.7993488 -0.6692125 -1.5507275 10.0374708 7.5114880 4.0554295 -8.0425501 -1.0197006 -9.9632635 -2.9995601 -7.5919666 -17.1507187 -9.3692007 -3.1373684 -7.8690810 4.6267061 1.6778578 -43.6085739 -9.1484823 -0.7055749 -7.2835255 15.3268862 10.7349720 0.6263698 0.4594706 -13.6006985 -2.1056406 -16.0194550 -14.5202465 7.8014021 5.3827972 -14.6664877 1.0375282 1.0289012 1.4533509 3.1168540 -6.6949730 -15.3081551 -1.8403454 -4.7931080 6.2638273 -1.5327394 4.6231575 7.7541385 3.3340280 1.5945708 -1.0612013 -3.2692995 6.8863482 1.6541641 -0.8640643 -1.9221878 -3.3813038 -3.8838828 1.3310671 -7.8699923 -7.5243664 1.8953137 -6.6594787 -9.1031027 3.5050201 -7.3736320 -10.6801300 -1.1079048 -2.7278559 -3.7260520 -3.9656599 -3.5914855 -8.9586515 7.2955246 -1.2858640 -18.0682793 4.9131279 -7.6658731 -5.5170188 -0.2084435 -3.9530826 -1.5173264 -3.4639006 -2.6080282 -3.2815487 -4.2253432 -5.5729403 12.3893690 -10.2490606 -11.4246483 -0.0569577 6.0306849 -3.2193666 -2.1674201 -2.0941086 -5.2232599 -4.8837242 -5.9010315 0.1526023 -9.4410067 -8.5178499 -0.5599895 -1.0504639 3.2482798 -11.7462244 4.9321275 4.5171814 -0.4835078 -15.3204479 10.6544905 -2.2542689 -1.1207706 4.7470140 -2.2225614 -0.8149896 -2.1508155 0.0060468 -1.6626285 5.3592849 -4.9062700 -17.4215450 -6.7381849 -3.7590015 -0.1747784 -4.4023290 -10.5295496 2.2740405 -1.3401804 -10.6649685 -2.4016478 -5.4142561 -1.3171092 -10.6704302 -1.1548810 0.3112899 13.7895851 -0.5558062 7.9877772 -1.3899103 -1.7925860 -4.0317945 5.8394861 -16.3212433 -4.0610361 -8.0674162 -1.3428065 -3.9917212 3.7630482 0.6903612 -25.9727077 -16.5606480 -2.0449283 -2.1197028 -5.7170868 4.5018516 -3.3935764 -0.1027596 -2.3960705 -15.9417038 -1.4680628 -0.6137616 -1.8034327 1.4120363 -16.4075985 3.5185513 2.8521800 6.1465673 0.6737636 -2.3710063 -3.8468053 -1.7857882 -5.7220478 4.0702877 -5.6547346 -1.3800876 -31.4623852 -1.1655927 -5.8582425 -1.4614475 -5.8972874 -6.4984341 -4.0977049 -3.9710732 -4.8601398 -6.4277682 -3.0812926 1.6982751 -7.4998493 -29.4515915 6.9475374 -5.1451879 -3.0632188 1.0237215 -3.8647285 -2.7667789 -3.3323500 -6.2530046 -2.5256846 -3.7857633 -2.0440459 -2.3597944 -36.7647896 -3.5028629 -1.4801911 -9.0125914 -2.8695052 -3.5598431 -5.6992245 -2.1369624 -4.4028111 -17.7197227 -2.0863981 -6.9799986 -5.7048802 -0.6275012 -22.6717701 -1.6522176 0.3339372 -3.9583976 4.6221156 0.0963061 -7.0212736 -3.5610249 -1.4513001 -4.7807660 -2.5002620 -0.5308673 -21.7479954 -6.6501451 0.2923067 0.4827971 0.8644724 1.1653892 1.9118191 -7.5691781 -9.1705923 -0.5236986 2.9753582 -3.9279830 -1.8799739 3.1718950 -0.3309910 -3.5901241 -3.2832818 0.0105456 -1.8232994 -11.4795380 -2.0201268 -2.2448921 -3.1990638 -3.5576925 -3.3404593 -3.6624727 -2.1284935 4.0799084 -1.7057796 -14.3089914 -9.1632738 -63.0746117 -2.9255927 -5.0928082 -2.6706021 -0.2505533 2.0748353 3.8575366 3.4696443 -1.4469849 -0.1593624 -4.0111828 -1.4205683 1.0070215 0.5930725 -3.0992925 -2.2609549 -3.6369660 -2.6415980 -3.9908965 -15.4937630 -37.0622635 -2.4433625 -15.3022518 -31.2683849 4.9892340 -12.2673016 -2.4253809 9.1597042 -19.9149799 -2.3053734 -8.4967194 -3.3169038 0.3261198 -17.7441139 3.7591715 10.4346666 7.7371917 0.6441442 -14.7261333 -5.0559244 1.0896219 -13.2576532 18.9139061 -14.3447828 -4.6724677 -29.3224316 5.2351499 -9.8632984 18.2771626 -9.5459366 -15.5663204 -29.2588978 -7.1962771 -21.6692314 -3.9293239 -15.8258686 -3.6407194 -11.7454777 -32.7722588 -3.8195214 -8.5464220 -17.5628166 8.9804611 -16.1556988 -8.7642422 -3.9460118 2.4069707 -14.4450569 0.5874687 -10.0019331 -8.5636463 -5.9471235 -11.2863722 -13.8061790 -21.6983395 -8.0521145 -2.3983974 5.3011923 -3.9277568 -3.5799003 -10.1922665 -5.2592330 -9.1566820 -1.9701384 -5.0437307 -10.5713072 -3.1366725 -2.2816551 -17.7732449 0.5043894 -8.4349108 -20.7579937 -3.4539540 -1.3930110 -22.8319530 -11.8108215 -1.2315361 12.8414621 -29.2500343 -10.3813610 2.6551750 -7.5841875 -4.8418975 0.1508333 -15.6863546 -12.9345875 -3.6985645 31.1623974 -12.5434513 -2.9628057 -4.3136859 -8.2742481 -3.8232837 -5.2529984 -7.8391180 -2.6875191 -16.1074257 -19.8929768 -7.1962719 -2.8085663 4.7141924 -9.8607721 -7.7617221 -1.1039395 1.9317912 -0.6970897 -33.6758804 -26.6449375 -23.9340439 0.1804491 -12.4459438 -4.2305293 -0.4113131 18.5130062 3.7687268 1.1483558 -13.3242025 -0.8050005 -8.1066942 -8.7312899 -5.6121373 -18.2385960 -4.1678085 -10.3239956 -5.0347033 -0.0516775 -2.6766372 -42.9463501 -35.2263908 -3.3318641 -18.3226948 -24.3997173 7.7444987 -14.8360758 -2.0870569 6.5673943 -6.9439034 -6.2027450 -12.2122927 -1.9989259 1.8351140 -31.7677288 5.4330535 12.2542248 11.0720482 -1.0822059 -18.0833530 -5.6352487 -0.0404677 -20.9600430 23.5204716 -17.8638535 -4.7578707 -16.3400650 9.0284538 -12.0422277 9.6861897 -19.8672237 -19.7516918 -30.6562042 -8.2631550 -25.8631248 -6.5701137 -19.7424088 -4.1805582 -16.5810242 -30.8558140 -8.3661070 -15.9765387 -21.6188316 10.9568596 -18.0624428 -12.7844868 -5.3909717 0.0731513 -15.6598053 -3.5052087 -10.4792862 -9.8709269 -26.7908554 -13.1088676 -20.6931534 -39.0345802 -11.9071655 -4.8484254 1.1084198 -5.7490382 -3.6459339 -16.6033726 -5.8167558 -14.5467806 -20.9541512 -7.6058369 -7.1388741 -6.4864979 -3.9776139 -17.6007690 6.0665307 -10.3391867 -25.7106476 -5.4223375 -3.2122855 -22.9874725 -15.2519007 1.2916543 -27.3461609 -31.4726410 -9.1933508 2.4405179 4.0573783 -6.6988068 4.2993541 -20.4583721 -19.0733433 -5.7732511 37.0847092 -14.1883240 -4.3479161 -2.3056028 -9.7901506 -4.0821648 -4.1152596 -8.7635765 -3.2816439 -24.7756367 -15.3153791 -10.0955782 -5.6765466 2.0950181 -13.9746790 -10.1783075 -1.7918766 4.6649466 -1.0047323 -31.9682045 -29.9416065 -35.0218506 -2.6660860 -14.4061069 -6.3145442 -0.9499791 15.9079828 6.0153699 3.9903095 -14.1002913 -1.2552079 -12.2362385 -7.6167169 -10.0996933 -23.5818024 -10.0442448 -10.4280529 -7.1474395 3.7679677 2.7676342 -11.0250015 -4.3540425 -0.4610992 -11.4797173 10.8041477 10.8134394 -10.3990698 2.2060094 -7.0388703 1.1309942 -6.9661274 -7.2983313 -2.5633574 3.7848415 -9.7425394 2.1303017 3.8642039 2.6945813 -0.7087851 -5.7436199 -7.4359403 0.4536343 -14.7815313 5.9294763 -6.2156215 -3.7236001 3.4670439 4.8639750 1.5717219 -0.3050359 -10.3893976 -11.1651278 3.5864532 0.0316392 1.0845804 -1.2541616 -7.5694776 2.7289729 -9.5562849 18.1289902 -1.8027906 -1.8649657 -8.3894300 4.9985714 -7.3329201 -8.2186918 -0.0788597 2.4920747 -4.2207890 0.2925469 -1.4981177 -7.7471280 -3.7826405 -2.6720555 -17.2141743 -10.1897106 -3.9667737 -2.2297909 -2.1032031 -2.2081544 2.6193154 -14.3078766 -1.0688264 -11.8500376 -12.5704288 -4.5903149 -11.0947590 -10.1081009 0.8587870 -0.8986672 9.0535860 -11.2438374 -7.5458245 -0.2019005 -2.2807283 -1.9066556 -6.3508849 -0.5517725 -7.5455756 -9.7867479 -9.4321709 0.7242978 12.7310486 -14.8296003 2.1622167 -1.8115523 -3.6562414 -10.9378214 13.1412039 -4.9765663 -1.7588764 4.0716839 -2.3897059 0.9390780 -0.7325323 -0.7871723 -0.9525319 9.5982609 2.1120441 -6.2803001 -5.5027938 -5.6773486 -8.4127865 -2.3799510 -1.7476614 4.8101940 -0.9118040 1.9057434 -7.2060223 -2.8766983 -5.9295812 -14.8174572 -0.1458302 0.3641953 14.6313725 1.1338935 9.4764118 -4.7488012 -5.4627047 -6.5634842 7.5426955 -5.3172474 -3.3648806 -8.1324739 -0.4436803 -2.7480624 2.3855429 0.7805349 -13.0375443 -17.2975979 0.0489472 -4.6997337 -8.8398476 4.9940848 -4.4202142 1.8333901 -5.8843274 -11.1830616 -3.3560741 -2.1553557 -0.7446758 3.4930313 -11.4232044 2.9824722 6.7826314 7.9608636 0.6933559 2.6324844 -4.7719669 -1.0270355 -0.1268603 3.2560241 -8.7174244 -8.3376074 -35.2064209 10.3361416 -1.9272966 4.1713285 -4.0411348 -9.3210344 -0.2436621 -0.3020899 -2.3404229 -3.5781572 1.5845540 0.5552025 -5.0089455 -30.4576855 2.1862748 -5.7220368 -1.9492093 2.1617861 -5.7893295 -3.6447151 -1.3703767 -5.5375671 0.2089839 -4.3158975 -1.3152447 -0.4770091 -5.0853205 -2.2150064 -0.9473323 -0.9983419 -2.3343661 -3.9817026 -5.2655978 -3.1653571 2.0458560 -12.4058552 0.5164533 -10.5465765 -2.6850653 -0.6956999 -24.5366879 -2.5159843 4.4713731 -1.5769035 11.0286255 -0.3010288 -11.9111605 -2.1337523 7.3280721 1.9102048 -3.5128896 -0.5449048 -13.5946541 6.6286302 -3.3825824 0.6725368 -0.7221202 0.2792652 3.2072277 -7.0553174 -12.6612778 -2.3857441 6.5343323 -3.4998186 -1.8983660 2.4072113 -0.5459593 4.0396318 2.5975082 3.3612974 -0.3187464 -11.3848343 -5.6809130 -2.7220984 -2.7035670 4.6847248 -4.5346775 -3.8713698 -8.2696180 3.7785423 0.7134284 10.3761263 -9.7379322 -25.4872456 -2.7336254 -7.4350810 -0.9852042 -2.1848648 16.1953068 5.9308352 4.7242832 -8.9274216 -1.2123702 3.3030229 -4.1812291 -1.9469383 1.7940955 -4.2545333 -1.6638672 -6.1959381 3.2156839 2.1125827 -11.0846481 -8.2383070 -0.9901521 -6.6035209 -18.6417255 4.8396254 -3.1289060 1.5033984 -20.5741043 4.9968576 -4.2172952 -5.2598681 -27.4210148 2.0797930 -14.6130533 4.0292778 5.2171245 5.7548151 -0.2184147 -1.7317938 -17.3050652 0.7315834 -2.3218222 2.5557065 -6.0878911 2.9709618 34.8284073 9.3405657 -4.4190850 -8.8055887 -2.4977899 -13.6770172 -3.2286732 -2.7314405 -2.4184060 -1.0761583 0.7720929 3.2738860 -4.9152250 -11.8446045 -4.5068049 -8.6409073 -1.7743917 1.1225876 -16.6557789 -1.8633617 -0.2833396 -6.9995723 -3.0231564 -2.2706649 -1.0365903 -2.6127384 -2.6834333 -0.5961591 -1.2178469 -9.8260489 -5.6431699 -4.6351848 -11.5611963 -2.5958879 -0.9241847 -3.0092797 -0.7353218 -10.8899794 -20.5952187 -2.1203477 -5.8716860 -2.7625406 4.3207560 -25.3881264 4.9940991 -5.7863407 -17.1866608 -1.2015980 7.7403755 6.4774823 -6.0530243 0.0921356 1.4424534 5.6493077 -5.8636127 0.2610361 2.4647777 0.2887962 3.7732930 -2.8224652 -8.3880873 -1.1154519 8.1936264 -2.4023657 -1.7151502 1.8898476 -2.5737653 3.4339125 -4.7711411 2.5554366 -0.0013259 -5.0115008 -4.0448108 -0.4922111 -3.8726974 2.2516558 -6.4178338 -3.3658512 -4.5725622 3.5165565 1.0619664 -22.7882690 -10.3852081 2.8282874 -1.7578502 -4.3913560 0.8719797 -1.1398801 9.3768835 4.2830710 3.9106302 0.3676096 -2.3427675 -17.9438858 7.8536253 -5.1036735 0.7067675 -4.2476277 -1.1420190 -2.0168104 2.7666063 0.2622950 18.6982574 -5.7205896 -2.2719302 -3.0344875 26.4218330 1.9882243 1.0189979 -5.3703656 -5.3380322 19.1696758 -3.9344478 -16.2150517 -6.2107224 -0.6844117 -25.1390076 3.0048797 3.4803343 2.6551645 -3.4997640 -3.3794546 -18.2632961 -0.9652320 -5.5590687 2.8360674 -6.7928467 4.1908393 4.6573801 5.2027421 -9.4100599 5.5262761 -2.6433539 0.3206736 -5.2893000 -3.0025730 -5.1180673 -1.4783559 -3.9038820 1.7923326 -5.6324601 3.0003459 7.3456378 -9.7931681 -0.5411748 0.8280659 5.5565410 -4.1964760 -2.1393354 -6.8213139 0.1706861 0.4962485 -1.7997513 -6.3985209 -5.7031789 -1.1180316 -4.7737036 -6.3960786 -12.7490044 -4.6927538 -4.9352965 -3.5562265 -2.0343277 20.2878017 -0.5359018 4.9159203 7.1654248 -6.5762906 3.2476423 -1.7906688 0.8873093 -11.0754442 0.5881382 0.7583924 1.7446381 -1.3304046 2.2001050 6.6263604 -3.8515885 -1.2758104 8.8273706 2.1467302 -2.5670910 -0.8166451 -6.8612175 1.1658349 1.9302776 -3.0779810 -8.6833544 7.3024344 5.4283671 -3.2078977 -2.4791427 -1.6507514 -0.1248976 0.9883819 -7.9159102 0.7423801 -0.6719781 -11.2682638 -18.1315937 -2.7559211 -8.3945723 1.2725521 3.4204831 -3.1830873 -2.7040555 1.3973690 1.1614006 -8.5705786 -5.9318695 9.3712702 -2.9423621 4.3788848 -1.8145825 -2.7030227 0.9065015 1.3873999 1.7547802 0.0845035 -3.0954359 -11.7307367 0.7267165 -17.1549168 -8.4408092 -4.6500797 -2.7178977 -3.3782315 9.0802498 2.0152025 -7.8566103 3.9524813 -7.5290322 0.2800741 7.6387939 3.5569489 3.7918160 -5.1983662 4.0382876 3.1829491 2.8228006 -9.2393217 -0.9747643 -5.7388682 -13.0188236 2.7457261 5.0884857 5.0097799 0.3538531 -2.9239583 1.3605875 -0.5041117 -9.1668186 9.0067072 2.2280276 0.0339298 -32.6733894 2.6317623 -3.1567638 2.2073555 -7.3007793 3.2149830 -11.4594669 -10.4373484 -17.4132214 0.6504336 -8.3932323 -4.0630927 -1.1288794 -1.0553588 -1.3595878 -0.8502813 -3.3567448 6.5273380 19.3389320 -6.4948583 -9.3859949 -4.7358904 -1.1671894 -1.2594336 -9.5360317 -11.0563631 -0.9598949 -3.6192284 -11.2555161 -15.7785740 4.3120513 -4.4295101 -5.9468660 -6.9042878 -2.9183531 -6.9650674 0.7211108 -10.6369553 0.1894974 -8.4429789 -0.1942202 -6.2417765 0.9818291 -9.8397017 -1.9872903 0.9978790 -10.9520445 -3.0490184 8.5698080 -1.9585216 -0.6115995 -3.3499484 -3.8417358 -0.7409865 20.2548428 1.0982177 -0.7425264 -1.6630881 3.3374898 -9.7834778 -4.2302690 0.2188425 2.2301288 -14.9004459 -6.3440166 4.1342244 -3.6890550 -0.6545454 -6.5525203 -6.4114056 -7.1603684 -24.0922241 -0.9289247 -5.3401480 1.7501007 -0.4940648 6.4162993 -5.0782866 -7.7489896 4.7458086 -1.0765734 -3.8309298 -0.3185757 1.6742443 -3.1353161 1.0796117 4.3657651 -3.1890428 -6.0685010 5.3133192 1.0162425 -5.7901821 7.1559272 -5.2388449 -2.3541577 0.9912483 2.3906128 -3.2275198 -11.8669882 -2.2350903 0.8889601 0.0872155 -3.9925256 -3.4568088 -1.8049210 2.1789174 -2.9835804 -5.5434656 0.4167765 -0.5381169 -2.0892632 -1.5802249 1.6974202 -0.0679467 -0.7030205 -1.6676203 -1.3246045 -0.5550537 -2.4893513 4.2659097 -2.6114511 -0.4740555 2.9707527 -2.4796827 -3.4994435 -2.4966061 0.3234333 1.4342531 -1.6548477 -0.3580349 -2.4443519 17.3897610 -2.6491320 0.7878338 1.4195917 -4.4908614 2.8566682 -7.4379783 -3.7404385 -0.0083294 -1.1824405 -6.9447298 0.9205913 -4.4387712 1.7035803 -2.7803030 -4.4897919 1.2918278 0.1966561 -8.6156416 0.4349414 -0.9083587 -0.0855805 -1.6251506 -3.0657845 4.5473118 -3.5902450 -1.7019083 -2.0630870 -0.3378680 -0.7905389 -0.3010543 -9.5030756 -0.2133922 0.4220751 2.1075969 -5.6971698 0.1553698 -0.8213081 -0.1799380 -2.9719231 0.2054868 0.9280238 1.7636904 4.9380999 -1.0858766 -0.6476803 1.3633590 -0.1391255 -5.0282001 14.9437246 1.1052147 1.7547857 1.0563376 -7.5198307 0.0939713 -2.4729505 3.9953988 3.3021173 -2.2274413 11.4777088 2.6850519 -2.1834049 1.2842903 1.6966525 -1.7855480 2.7843816 -14.6675835 1.9107118 -2.0561681 -5.9842153 -0.3586619 -0.2233539 -2.5628061 -0.1342948 -0.8877841 -3.6111352 0.6184962 -0.2116225 -0.5206277 1.4117881 -1.8739318 -7.0102229 1.6069785 -0.3876222 -0.2940208 12.7610111 4.5485168 -6.4812975 1.0108948 -0.2930997 -3.7297215 -1.5849999 1.9845239 -1.2667307 -0.4229500 3.0972381 0.5030754 0.9328829 -3.4098756 -6.6965141 -11.4418736 -4.2183719 1.3419983 -4.5711722 -5.8737683 1.1353521 -2.7305107 -3.9463201 -1.3190826 0.5425910 -2.4557052 0.8476788 -5.9483361 -0.1202045 -1.1563139 3.3704770 7.5340843 -4.6037693 3.1137195 4.4956121 -6.6036301 -6.2154002 -4.6214752 -0.5551694 3.2842157 -4.6802001 2.9845738 -2.9820664 26.7989845 -2.5930469 -2.5120494 4.4820228 -0.8512315 5.0843921 1.4083452 -2.5782025 0.3501661 -0.6935886 -16.5675983 -4.6750970 -6.3719463 2.9941249 -5.6258874 -6.7550573 0.7305704 -0.1115202 -9.4875202 1.5218478 -2.4510813 -1.4463916 -1.2221783 -6.4527302 7.5947924 -6.2208343 -1.5703514 0.1553903 -0.3322389 -1.0513753 -6.2158656 -1.8777502 -0.0107340 1.0913774 3.6493444 -8.3581028 -3.0826576 -2.7431803 -1.2032931 -3.9644322 1.6519506 3.4512885 1.5962167 7.9830017 1.1389778 2.7204902 3.3545849 -3.4454236 -10.3975143 23.1245670 4.8490090 -0.8393657 2.9063659 -15.0190601 0.5873457 -26.0941296 7.5868006 5.9201012 -4.5844264 24.4782543 3.8027806 -3.2928705 1.1691858 4.7814350 -4.1208158 4.6757441 5.8096867 4.2942457 -2.9663951 -14.5843916 -6.6570101 0.8804081 -0.7911477 -4.3290691 -3.0016940 -13.4131956 0.5409569 3.0172081 -3.1461613 1.5580575 -2.1702185 -12.4407969 -2.1166058 0.1012177 -1.7062339 24.9675274 9.9975986 -10.8911209 -1.6776458 0.1670277 3.7249649 -1.8073884 1.2974154 -2.7173007 -3.2242119 5.8356500 4.3379230 1.7854861 -2.7160091 -11.8776226 -16.4661655 -6.9780440 3.1857667 -10.9562674 -9.1658802 0.9240335 -2.9517243 -7.1668615 -1.5344603 0.9888801 -3.0635388 0.1806847 -9.2259960 -3.0948250 0.4205184 3.9737918 10.7661638 -9.9984369 1.9645174 5.1729460 -12.2154045 -12.3224344 -8.3798246 0.1424275 4.3913364 -7.7081189 0.8568770 -5.7845654 42.2845268 -4.4117270 -3.2990882 4.6838536 -1.3149176 6.8646388 -2.5824392 -4.8989120 -0.2479510 -2.4577687 -25.9045982 -5.0594220 -12.2619619 4.1091571 -13.0793047 -12.4867544 -0.0511216 -1.1886010 -15.2598715 1.7728153 -3.0583680 -3.0028861 -1.8826423 -9.1280365 11.8648443 -7.9268641 -5.6036234 -2.0822489 -2.0609396 -2.3232393 -5.6879520 -7.6498442 -2.4539471 -0.1446548 2.5353723 -22.8509903 -5.6601777 -5.6923904 -1.5241197 -8.6220341 0.2044180 4.3973145 2.8064153 8.2274199 0.2177894 2.1395326 1.2317953 -4.6125660 -18.3631554 33.5257187 1.0567338 0.2814759 4.0259867 -26.9103832 0.7037240 -27.3011246 12.3400669 9.2983751 -7.3006806 30.0634823 5.3180060 -6.5600801 2.1505258 5.7707148 -10.9524384 6.7010264 7.8531408 6.0891824 -7.6341677 -22.7300129 -10.0688324 0.3013057 -5.2520576 -6.4395485 -5.5299892 -16.7234917 1.1295906 2.7890074 -4.6228909 1.8043675 -5.4729400 -22.9580803 -2.5162182 -0.9370620 -2.6434011 35.7838821 14.9712439 -15.5098743 -0.9817264 0.6269898 4.8487673 -2.6107802 2.5442562 -4.7342076 -3.7717617 8.1006050 5.1929436 1.2995727 1.0524282 -11.0636663 -9.5528669 -5.6949825 3.5873914 -14.2216368 -8.5849295 -1.2296058 -0.8748953 -6.3018451 -1.3662758 0.3847905 -1.4643644 -0.1832601 -10.1596766 -4.8069773 1.2495291 0.3152046 5.6692457 -13.0074625 -1.8540932 2.0911102 -13.9397964 -9.2692690 -0.5748510 -0.6302990 1.1082519 -5.7387137 -3.2874343 -3.4894409 33.0867767 -4.3292532 -2.3601899 0.9958617 2.3595419 2.9629490 -9.8679905 -3.7606521 -1.4847294 -2.9550140 -21.3118954 -0.6097729 -1.9144008 2.0713611 0.2919935 -13.5429964 -0.4655985 -1.7246163 -4.5782623 1.5326304 0.2065188 -3.1335402 -2.6232595 -6.2284636 7.7790403 0.0181240 -8.6483603 -4.7021890 -1.4609067 -0.6489102 0.8818711 -12.2504969 -4.7763929 -1.7586402 -2.1903086 -18.9657612 -4.4376187 -5.2932267 -1.2400371 -7.9290533 -3.6788359 1.0004041 2.2832458 -0.2881352 -0.4257101 -1.1140817 -0.4811497 -2.7801776 -16.6137524 24.9805126 -5.5889578 3.3585541 1.2196120 -7.2231178 0.3975792 6.1936202 9.2399244 4.8056159 -5.0784817 1.7946502 3.0246632 -6.6748872 2.2411702 2.6341445 -15.1926622 4.4066963 4.5789485 3.8356907 -6.1126962 -7.0255485 -8.0344067 0.8476223 -6.5131445 -4.4183831 -5.6849642 -5.8394699 0.6376693 -0.9019356 -3.2730570 0.5918393 -4.5993028 -9.0557499 -1.0636297 -1.7911983 -1.3137506 22.7058258 9.6007223 -9.6689281 0.1091603 -0.2436330 1.8159659 0.2485752 2.2024601 -4.8479705 -0.9522052 4.6105614 1.2071255 1.0503469 -0.2986773 -4.0998087 -2.3659399 -1.5237701 2.2513876 -2.2459083 -4.3632588 0.1459204 0.5493423 -1.8446425 -0.6353111 1.4521996 -0.3765016 -0.2385775 -1.3684022 -1.1391017 -0.5478731 -0.4454390 3.6349461 -2.9186873 -0.4084653 2.7895799 -1.5436106 -3.0115552 -0.6124068 -0.4271429 1.6085402 -1.1300731 0.5040824 -1.2868975 18.1884212 -3.4830267 0.5316267 1.1096036 -4.1536837 1.7025425 -6.8335209 -3.2805119 0.2528400 -0.6117051 -4.9450622 0.1251492 -3.4677978 1.3035988 -1.5320623 -3.2217665 0.9035094 -0.5423226 -5.5437284 1.6080240 -0.2896238 -0.9203219 -1.6178645 -3.0013585 3.3834157 -2.6923571 -0.9118946 -1.0727168 0.1568190 -0.3526286 -0.7162685 -8.0786591 0.4119949 0.6818268 2.1801956 -4.3696151 -0.5668879 -1.3129750 -0.1380447 -2.3749852 0.5917200 1.1187385 1.8141903 4.3911581 -1.1923858 0.1892852 0.6591811 -0.1330129 -3.6277509 15.3036318 1.6144022 1.6480526 0.5227246 -5.4998498 0.1059585 -1.7610798 4.1239986 4.6351795 -1.7313017 13.2435379 2.2457027 -1.2480037 1.4283255 1.4246380 -2.3535368 2.8821425 -43.6790123 1.3380753 -2.3262279 -4.3856597 -0.4895333 -0.6594825 -1.3466594 -0.0984443 -1.0220395 -2.7211163 1.0462214 0.1763525 0.3864851 1.8180400 -1.1998394 -9.7544889 1.7786716 -0.4894083 -0.9645889 12.8707190 4.0439939 -5.3929482 -0.0617543 -0.0718304 -3.8781650 -0.7973517 2.0550256 -1.5983883 -0.4136513 2.4241443 1.7986306 0.5872785 -3.4187808 -6.2228379 -9.7726936 -3.3219235 1.8327889 -2.6806061 -2.3514819 1.0393218 -2.6346424 -3.0555444 -0.1850869 0.9776694 -2.7095978 1.6797731 -4.3022294 0.5764979 -1.9428906 2.9637427 6.2721219 -5.2106218 2.9845614 4.0814891 -5.8548679 -5.6699715 -4.2953281 -1.5139499 2.4654987 -4.0678024 3.3613782 -2.6181417 25.7870617 -12.1609859 -2.6593351 3.7032738 0.8384011 3.4734285 2.2243056 -2.7533784 -0.2438720 -0.0133674 -13.3731899 -5.1808033 -4.7064357 1.9532903 -5.6242480 -4.1724024 1.1177146 -0.3824577 -3.7538166 3.6625357 -1.8909003 -3.1815124 -1.1553783 -5.6848364 6.8647842 -3.3160341 -0.1231888 1.5177541 0.2649008 -1.0520397 -6.6770630 -1.3528168 1.6049951 1.6956373 4.8553023 3.3476241 -2.6536901 -2.5269854 -1.2865646 -3.6013334 2.1740415 2.4453597 1.4803569 8.7557259 0.9829916 2.7476184 2.0688963 -3.2466829 -7.6136923 20.5421963 5.7331400 -0.4971097 2.5435262 -11.4192400 0.7209097 -18.2565479 8.3113594 6.1516361 -3.9330332 24.6800709 3.6428895 -2.2260377 0.9497996 4.6141591 -1.2283194 4.6741571 3.8568587 4.9469681 -3.5168104 -11.1843853 -5.5894275 0.7411530 2.5408525 -3.8097355 -2.9861743 -4.8724704 0.7914500 3.3113906 -2.0310969 2.3876777 -0.7525793 -11.5374870 -1.5452619 -0.2107470 -1.5508040 23.0290565 8.4341278 -9.4217310 -3.1339808 0.1467859 3.8364091 -1.0204002 1.1586918 -3.3747616 -3.5468109 4.7364907 3.7094543 1.3022197 -2.6439865 -11.0284843 -14.0903749 -4.9816403 3.7487621 -7.5582609 -6.5605941 0.9835113 -3.1545157 -6.2768168 -1.4321575 1.3703773 -3.3929896 0.7992095 -5.4304986 -1.8259284 -1.4427536 3.6267726 9.6662912 -8.3197670 1.9554776 5.4509172 -8.7864370 -11.3127766 -5.8829637 -0.6309339 3.9178240 -6.6961722 2.3687227 -4.6966271 40.4446907 -17.1161671 -3.8493004 4.3167877 0.5109519 4.8546343 0.3650144 -4.0395379 0.1444626 -1.0362819 -21.0932045 -5.7985601 -9.1704988 3.0186872 -9.4034986 -9.0367622 0.9898776 -1.4953457 -9.8908176 4.5212526 -2.8040085 -4.2024684 -1.6876652 -8.8029346 10.5697565 -9.2189913 -3.0884233 -0.7047917 -1.0318097 -1.6133430 -7.3903313 -10.2472296 0.3847928 1.0757039 5.2611146 -4.0951605 -4.2305527 -4.8070149 -1.4800652 -7.3599286 0.9998620 3.5956626 2.8891385 10.9193945 2.4410498 2.5124967 1.2941871 -4.2420697 -14.2748871 31.3074799 4.6400299 1.0085340 3.4644558 -22.2699604 1.4252814 -23.1634960 13.0383244 9.7778873 -6.4966021 32.9342232 5.2033229 -4.7574892 2.1919756 5.4432435 -6.3147116 6.6040111 5.1111827 7.3859205 -8.2736406 -18.4966850 -7.2516971 0.9187679 0.2579358 -5.3065815 -5.0131655 -12.0782089 1.7152627 3.1077156 -3.8185647 2.6352415 -2.7500155 -17.9264908 -1.2985253 -0.3863203 -1.8868411 33.7181778 13.3333645 -15.6004925 -2.2939377 0.9566416 5.0686121 -1.8906589 2.3849487 -5.4691463 -4.0272102 6.8047457 4.7430401 1.3365664 0.1835728 -9.6641092 -8.5141029 -4.8408365 3.3691130 -13.7679634 -8.9455481 -1.2399477 -0.8311183 -6.4207606 -2.3742733 0.3606441 -1.4129556 -1.1863276 -7.9753408 -3.7884059 0.7543170 0.8241531 5.4732652 -11.5789299 -2.1488426 2.8097365 -8.6118202 -9.5787287 -0.5098604 0.2227491 0.7450540 -5.0636744 -4.0765376 -4.4322653 33.5602722 -17.9373932 -1.7997851 1.8363718 1.7834752 3.3560281 -7.5018015 -4.0059848 -1.5524498 -2.0795195 -14.2496262 1.7498857 -9.9851818 1.7831007 -0.9336562 -11.1627178 -0.3213261 -1.0666071 -9.8994875 1.0803157 -0.7454486 -2.3548052 -2.8462570 -5.1795964 6.7684484 -10.2547770 -8.0295820 -3.9669614 -2.9508562 -1.3675797 1.1629382 -14.3422842 -4.6166782 -1.8984125 -1.6461881 -13.7967119 -4.7786098 -5.3868251 -0.9220766 -7.1101489 -3.0236511 1.9664426 2.3456516 0.2985233 -0.4992520 -2.1620607 -0.6472520 -2.3220692 -16.0712605 25.2161503 -6.4377723 2.9510849 1.0872819 -18.2538223 0.5709239 -3.1702154 9.0992613 5.2397246 -4.3674850 8.2682581 3.0256567 -5.6850605 1.7670112 2.0100145 -19.4507847 4.5314751 4.3426223 4.0771399 -7.7467017 -13.7313900 -8.3354521 -0.0568432 -5.2677197 -4.9369473 -4.6126261 -3.7758050 0.6099342 -0.2126504 -1.2612706 0.3027680 -4.0562692 -1.0046577 -0.4349258 -2.4258473 -1.2160641 21.2782593 9.1891670 -11.5963631 0.1782135 -0.1909594 1.9280219 -0.8248965 2.4428661 -5.6226568 -0.5344932 4.1443071 1.2698026 0.6424574 -0.3816830 -3.8583620 -1.5417017 -0.4294654 2.4549499 -1.2846793 -1.3108413 0.2446470 0.2584496 -1.5316377 -0.0187057 1.0700454 -0.5792298 -0.3589932 0.3767781 -0.9471220 -0.6385736 1.6447433 2.4982848 -1.9572288 -0.5137097 2.2263403 -0.4489218 -3.7317395 0.1740863 -0.6844738 2.4044523 -1.1798927 0.3175162 -0.6042798 13.3718758 -2.3879621 1.0020934 0.8671257 -3.2436011 1.1504124 -3.8064904 -3.2416382 0.3929071 -0.5280281 -3.6339722 0.3036099 -2.1908340 1.4941280 -1.3711025 -2.0791113 1.1056306 0.1766679 -1.8769380 1.1103538 -0.0797376 -1.9690186 -1.5956208 -2.8810074 2.6007862 -1.8572268 -0.0248302 -0.6983932 0.5477479 0.1318768 -1.2095630 -3.9767756 0.9918824 -2.2400208 2.3435645 -4.5171719 -0.5954274 -1.4640678 -0.1620430 -2.2107491 1.3300700 -0.5146971 2.3041854 4.3419313 -0.4556277 0.4044160 -0.8708302 -0.0261157 -2.3303967 13.3495474 1.3915668 1.4877844 0.5622521 -3.7994452 0.4584271 -0.3823361 4.6439209 4.8839636 -1.1226979 13.2508287 2.1813104 -0.9241424 1.1491529 1.2133652 -2.2725780 3.0384343 -41.1675911 0.5668885 -2.6256478 -3.2573006 -1.0552216 -1.3008587 -0.2670647 -0.2389529 -1.4149166 -1.8724750 0.5435109 0.3867421 0.6848460 1.3214543 -0.5748549 -7.0071492 1.7558799 -1.3676302 -2.1127913 11.3929081 3.1279414 -3.6741507 -0.1159481 -0.2768695 -4.5229206 0.0063362 1.8318377 -1.4642103 -0.7364612 1.5805230 2.5064561 0.4012010 -4.3050194 -6.1787882 -7.8652940 -1.1509001 2.3158588 -0.4496685 0.3528550 0.8790365 -3.4380357 -2.4148297 1.1851838 0.8923720 -2.5684035 2.0856659 -2.4068019 0.7007569 -2.5060766 7.2455058 4.3436174 -4.4338303 2.8371947 3.6648905 -4.9187417 -6.0194335 2.3125505 -2.4951196 2.6384680 -3.7106507 3.0267782 -2.4451737 24.6665306 -1.9974934 -2.4280829 3.5115047 2.9777191 2.1874967 3.6789105 -3.3453357 -0.5464592 0.5423359 -10.4434347 -4.6235576 -2.3804948 1.9478130 -3.9880486 -1.8766013 1.1540346 -0.7341340 0.7970720 4.3189187 -1.5647916 -3.7079284 -0.3689167 -5.5749454 5.3769255 -2.1171827 1.1860723 2.8166580 1.3398802 -0.6988680 -6.3428659 -3.2090747 2.8438330 -1.6221455 5.5757637 8.5396690 -2.0350230 -2.3876805 -1.1505504 -3.6614008 2.9762936 1.8630458 1.8723519 9.2365532 -13.9219351 2.4142618 -0.2826243 -2.9674268 -5.5087967 18.1931915 5.5920491 -0.2056810 1.5544086 -8.0624352 0.9314470 -13.9465284 8.8026085 7.1431880 -3.4251144 24.6182766 3.6284959 -0.8673715 0.6645875 4.9072242 1.3912922 4.6970611 2.0926609 3.2126186 -3.8817048 -8.2783651 -6.0079188 0.6796086 3.4999630 -3.4090111 -2.8216963 -2.4568264 0.3130150 3.2844555 -1.7066116 2.3306634 0.2267506 -4.4945488 -0.9992564 -5.8562446 -1.3535143 20.6840839 6.9385691 -7.3534241 -3.1885481 -0.2126340 4.3368354 -0.2815946 1.2001247 -3.6104629 -4.4758420 3.3109522 3.1361454 0.8867458 -4.2355385 -9.9678850 -11.4795122 -2.2319436 3.7781115 -3.7537072 -3.1229260 0.9597198 -3.9330966 -5.2896719 0.1087357 1.1875426 -3.4104202 1.4459116 -3.2169790 -0.5370766 -2.8045805 7.3622680 7.0052547 -6.7789640 1.9503579 5.0799236 -6.6362352 -10.3484783 -1.2278225 -1.5415466 3.5635068 -5.7856822 2.2534542 -4.2142873 38.3726120 -6.9040260 -3.2950044 4.4412012 1.9978584 3.3648047 3.7497039 -4.9349937 -0.6191891 0.0440866 -16.4343510 -4.7776475 -5.7320247 2.8498621 -10.9753675 -5.3066335 1.2968928 -1.2039183 -3.9484682 5.3901052 -2.1316688 -4.6354132 -1.0636655 -8.5408201 8.7784481 -5.4161811 -0.7888525 1.2576573 0.5410380 -1.1092378 -7.9572549 -10.9576426 2.4264524 -1.8436159 6.6218066 1.0403312 -3.4249902 -4.2573957 -1.4383284 -6.2932496 2.1279490 2.8566544 3.2914140 11.9498377 -12.3983164 2.4291439 -0.1946755 -3.8515837 -10.7688999 28.8221169 5.7355356 0.7876787 2.5818827 -16.0549946 1.5144928 -26.2102833 13.5943527 10.9684372 -5.6208944 34.4823227 5.4197941 -2.4334462 1.7426643 5.2304282 -0.9141415 6.4038744 2.7163341 6.4756169 -6.6397610 -13.7629232 -8.3139582 1.2532575 2.4138610 -4.7740397 -4.6371517 -6.1462464 1.0189010 3.3397613 -3.0324047 2.5038149 -0.9212471 -9.2072592 -0.7211320 -5.0317383 -1.7632648 30.6771736 11.1356983 -13.1878929 -3.2083414 0.4898219 4.7773118 -1.2239250 2.3190162 -5.6203251 -4.8879099 5.1968246 4.3190913 1.6730670 0.4998904 -8.5337391 -9.0531759 -3.9249482 2.5133026 -8.3098612 -7.0676160 -1.0628687 -1.0224407 -6.0063033 -3.6707160 0.7951759 -1.3027614 -2.4684937 -4.0419507 -3.0400956 -1.8418490 0.1738687 6.1556602 -4.3290286 -1.9193665 3.3803031 -6.5669746 -9.4684830 -4.0593605 -0.7965178 1.4864984 -3.9215686 -3.5281146 -2.0915143 32.9019890 -1.4685249 -2.3834960 2.2270162 2.4185524 2.8604348 -4.0260110 -2.6515214 -0.3236107 -0.7963687 -16.9174671 -0.5477668 -8.1343832 1.8607501 -17.7294674 -6.7991104 0.0556537 -1.0037812 -8.4901686 1.7643209 -1.6683340 -2.4086497 -1.3692017 -5.3658357 6.5824037 -7.4053478 -6.5393028 -4.4601498 -2.2933340 0.3544104 -0.1561869 -19.6944275 -3.1842766 -1.4807582 -0.4874814 -18.3922691 -2.0926185 -4.2727318 -0.5268126 -6.5381303 -2.4658017 1.8932741 2.7213748 1.8223419 -34.7813301 -2.3058910 -1.4486673 -2.1575608 -13.8636065 20.7487755 -3.5918436 2.4866145 1.0149914 -18.7224636 0.6998804 -20.8792171 9.0951319 6.7875094 -4.9086142 12.4640865 3.2773502 -3.9715736 1.8345838 1.2621994 -8.4057455 4.3482175 5.6142106 4.5691051 -7.8718033 -9.8272400 -5.9886937 1.1825560 -5.4209671 -2.1397362 -3.0704598 -6.7482862 0.2340924 -0.0157683 -0.1155897 -0.0663814 -4.0703354 -5.7231445 -0.4858311 -4.2204094 0.5328997 21.5437527 8.5563583 -10.7407980 -0.3886547 0.4947694 2.5100818 -1.6938109 2.8064930 -6.3107843 -0.7870552 3.6056294 3.4061933 0.5433447 -0.4497496 -4.3337770 -0.5910455 -0.5775011 2.5198262 -0.4632193 0.8892800 -0.1655760 1.3276050 -2.4745343 0.5796768 0.7544132 -0.9687756 0.1940252 0.8553470 -1.2534592 -0.8654485 2.1254411 2.0146065 -2.1525652 -0.5204731 2.2245471 0.1537626 -3.9839277 -0.4608684 -1.7315406 2.5143476 -1.0634319 -0.0387958 -0.9526513 14.4744749 -1.2018768 0.6766528 1.0938854 -2.1170738 0.2820245 -1.7198911 -3.0117550 0.9064047 -0.1159260 -2.0822921 1.3838944 -1.8580773 1.0405447 -0.6970680 -0.7883358 0.4198600 -0.1830601 1.4984772 1.9442589 0.2044597 -1.2328917 -1.5691468 -3.2146807 1.5471110 -0.7763187 0.6185275 0.7611024 0.5960447 -0.1210398 -1.5681139 -2.1356075 1.6317928 -0.8437520 2.4549756 -1.8390198 -0.5475070 -1.4939095 -0.2508336 -2.5009608 0.1485451 -2.3122907 2.1428170 4.1333361 -0.5930943 0.9626804 -0.7310166 -0.2753991 -1.8680192 13.9520340 0.6115492 1.1415421 0.3445382 -2.5707469 0.2975624 -0.8289258 4.0463686 4.6189127 -1.2366849 12.9541941 1.8479303 0.0745382 1.1551006 0.0673756 -2.4551144 2.7078958 -22.4963207 0.3810020 -2.2197132 -2.4504986 -1.3791163 -1.1797389 0.5705408 -0.2875081 -1.5583183 -0.3802749 0.2060299 0.9045638 -0.1742283 0.0500419 -0.0525457 -3.3208201 1.7812082 -1.9132985 -2.2133651 10.1017399 2.9023416 -1.2247962 -0.2714603 -0.3283546 -5.2698870 0.0815500 1.2126318 -2.1074941 -1.0243540 1.2998606 3.3192263 0.0205598 -4.5271773 -6.3390737 -6.2501655 16.9955864 2.5830200 0.6086209 3.9920290 0.4182281 -2.6285295 -2.4276106 1.8968775 0.8167807 -2.9470351 2.8024740 -2.5246994 0.6499987 -2.6426795 10.6679201 2.5804086 -4.0063457 2.2992179 3.6228032 -3.6642008 -6.4374886 3.6450512 -3.5977595 2.8811328 -3.4587526 2.7404747 -3.1586533 25.8973579 -1.2761430 -2.8178215 3.3020616 5.3384271 0.5740072 -2.3488576 -3.6842380 -0.9325121 0.8232672 -7.9298420 -4.7425542 -1.3196037 1.7815434 -1.8426820 -0.5807457 0.7641057 -0.5288977 3.5047369 5.4065137 -1.5109421 -2.6604602 -0.3373203 -5.3949795 4.0684819 -1.4199982 1.9792620 4.4191418 1.8010178 -1.0149059 -6.7579370 -6.1851788 3.7313261 -2.1222539 5.8924117 12.4987535 -1.5073705 -2.1200025 -1.1118119 -4.5871377 1.6101143 2.0538709 1.4455571 9.2949343 0.2089575 2.3375323 -1.2429416 -3.3269188 -4.4377332 18.1666012 5.5286098 -0.8251637 1.0815250 -5.8107114 0.9548568 -11.8823099 8.6431131 7.9648347 -3.1791897 23.0089989 3.4825029 -1.9615664 0.7296888 3.6733477 3.4050725 4.6823521 3.7730174 -0.2470062 -3.6775236 -7.2708149 -5.6905885 0.9205498 4.6600122 -3.3747895 -3.0455027 -1.6967744 0.2791783 3.3365231 -1.4905864 1.1503925 0.8473266 0.8226825 -0.9354253 -1.4016914 -0.8841945 20.5750961 5.9755936 -5.0252180 -2.9219682 -0.0199415 5.1774678 -0.0406601 0.4349084 -4.0533581 -5.6991539 2.5912473 4.7016978 0.5354012 -4.8150649 -9.4809647 -8.4779491 15.1475306 4.4348216 -1.9388256 1.0646368 0.1743815 -2.7087712 -4.3896971 1.0434495 1.2366611 -3.6803923 2.4522083 -3.7063913 0.1490952 -3.3910775 10.9598360 4.6436329 -5.4066825 1.6172750 5.5158949 -4.4781280 -9.5936441 1.7189605 -3.4562008 3.7208393 -5.0618606 1.7970436 -4.7140613 40.6999397 -4.8510628 -3.5714991 4.8203025 4.5688081 1.4960873 -0.6649873 -5.0784411 -1.0504555 0.4322078 -11.6904430 -4.6054196 -4.2381234 2.7456541 -4.6208110 -3.4487262 1.0349324 -2.4493954 -0.2727353 6.8880777 -1.9838156 -3.2191262 -1.0911690 -8.3927650 6.7541385 -3.8513525 0.7410192 3.4551029 1.3365847 -1.5916164 -8.4876032 -12.6226015 3.9612093 -2.2214320 7.2501159 6.7681894 -2.4917138 -3.7117412 -1.4244393 -6.8979974 0.8517427 3.3303549 2.9998994 12.1686001 -2.7611773 2.3532066 -1.2842773 -4.0678420 -8.6300163 28.5307121 5.8928165 0.4456392 2.0728612 -12.0969086 1.4979424 -22.2339592 12.6765146 11.2740164 -5.1174016 33.7961578 5.4208426 -2.8266160 1.7495946 4.3823996 1.9552916 6.5440278 1.0820826 2.4838681 -5.8950143 -11.7410221 -7.6748209 1.7008163 4.3804545 -4.1864629 -4.6849647 -3.9084961 1.1695335 3.6878617 -2.5229778 1.4618704 0.3487570 -2.7493975 -0.2377521 -9.6038303 -1.1266462 30.1988602 9.6149778 -10.1510973 -2.7702198 0.3718899 5.5538816 -0.6503391 1.7601780 -5.8855758 -5.7915158 3.8533366 4.6689496 1.1386486 -0.5330352 -7.8668537 -5.9820790 -3.5117927 2.6927292 -8.9300642 -2.2988403 0.0266015 -1.2860687 -5.3865390 -4.1603584 0.9968939 -1.0056527 -2.3790653 -1.6318030 -2.7571063 -2.5297515 -0.7284175 4.5436039 -3.1700065 -1.8953116 3.6202047 -2.4909666 -10.7537861 -3.0287988 0.4426162 1.4537923 -3.7685249 -3.9956005 -2.8022714 31.4235725 -1.8377740 -1.7733027 2.6480429 -0.2185100 2.6720824 -3.0035763 -2.3567469 -0.5920078 -0.8311185 -10.4326391 0.8294669 -7.1066279 2.1974907 -5.9995852 -7.7374172 -0.0635248 1.1909137 -8.9993505 1.2918113 -1.6222439 -2.4852629 -1.3436680 -6.2210078 5.1913805 -12.0207443 -4.9987679 -4.0422063 -1.6549479 0.0031657 -0.5123472 -11.8045397 -2.0089571 -1.5443038 -0.2814368 -15.5887680 -1.3492824 -3.4407666 -0.7073808 -4.9388185 -2.6603143 -0.0870950 3.0926547 1.3913666 3.1364536 -1.3502452 -1.3511233 -1.2839803 -9.7131233 20.2433949 -1.3665247 2.4318023 1.8634845 -14.4967928 1.1095555 -3.7722983 8.8843231 6.8431849 -4.9145503 15.3433180 3.8271008 -2.1328068 1.5731049 1.4137671 -3.0629046 4.1760192 6.2097664 3.7048452 -7.8787093 -9.1573229 -3.5268672 1.9170599 -0.3890755 -3.4042475 -3.3223121 -4.3989611 0.4212047 0.2568421 -0.5826618 -0.1147691 -2.2276134 -4.0987420 1.2141759 -2.9992518 -0.2983387 15.6446304 7.1265769 -8.6556854 0.7303460 1.3157796 2.3902099 -1.4236755 2.9728818 -4.4425716 -2.0890689 2.9793935 1.8309892 0.5202494 -0.2522816 -4.1705174 -0.1306770 -0.3332072 2.7087278 -0.8169690 3.3373494 -0.3466422 2.0163805 -2.6645207 0.6375313 0.2760830 -1.0279192 0.4442447 1.2170449 -1.0968204 -1.2111968 2.0415664 2.0414031 -2.0267315 -0.0995146 1.8561897 0.3052786 -3.9665279 -1.8262999 -1.5908604 2.3799970 -1.3600032 0.2697197 -1.1136091 14.3290529 -0.7712288 -0.1086837 0.8540247 -3.2082229 -0.1517099 -1.0518200 -3.1952901 -0.3189946 0.1835870 -0.9878998 0.9507083 -1.1656468 0.5415708 -1.1666931 -0.2792092 0.4511880 0.4030132 3.0173359 1.1262842 0.1195119 0.0192640 -1.5952194 -3.4525623 1.1809393 -0.2084191 1.2453810 0.7313919 0.7625394 -0.2355059 -1.6725991 -1.8027353 1.9802970 0.9511579 2.2359943 8.0853987 -0.5456429 -1.7095222 -0.1969585 -3.0889492 -0.8914388 -3.3846643 1.8897799 3.4256592 -0.8049040 1.0457349 -1.7513400 -0.5625615 -1.9440114 12.8637218 0.0391393 1.1114107 0.8219671 -2.7305212 0.6266122 -0.9385329 4.2166386 4.2799320 -1.3299407 12.3897505 1.5717800 3.4974947 1.2124870 -1.1344244 -2.2109721 1.9784015 -9.3946953 0.2704390 -1.8632561 -2.6997914 -0.9585679 -1.4470390 1.0654671 -0.5870100 -1.7959598 -0.8267181 0.2149037 0.9604928 -0.9725294 -1.0015485 -0.0984513 -0.2431292 1.2103946 -1.0125335 -2.3319068 10.1510506 3.0101905 0.2154850 -0.2319956 0.2413972 -7.0459065 0.1795518 1.1757233 -2.1161988 -1.1057668 1.3298327 3.5256672 -0.2695195 -4.8892164 -5.8914704 -5.2754970 0.1623673 2.4438777 0.2819987 6.9441996 0.1630606 -2.2109182 -2.4912870 2.4107928 0.5755776 -3.0974138 3.2523663 -2.0733788 1.0337392 -3.0079956 11.3551855 1.6809102 -3.3863246 2.5366175 3.7724411 -4.2985635 -6.4684286 3.2242587 -4.1170440 2.4473062 -3.3227139 3.6871064 -3.3559036 24.5889587 -0.2982408 -3.4065728 2.7658880 5.0835690 -1.0537157 -4.8869767 -3.6701498 -1.2009741 1.0393425 -6.0674357 -4.5546422 -0.2755071 1.4314786 -1.2109761 -0.0130418 0.6353285 -1.4668916 5.4056330 4.7423449 -1.0598383 -1.8240353 -0.4048853 -5.1802697 3.3888028 -0.4805774 2.7343085 5.1638575 2.1340380 -1.2159100 -6.3616161 -7.2215109 4.2587337 -0.6084874 5.6242356 14.5145054 -1.1814854 -2.2270441 -1.3245947 -4.8465018 0.0319226 3.6280463 1.1425314 8.3194151 0.5270816 2.5161173 -1.6711437 -3.7268698 -3.6687322 17.2255783 4.8913565 -1.0966889 0.6839079 -4.6758094 0.5252787 -12.1463728 8.6250858 8.4470091 -3.0292253 22.2245007 3.2775140 17.9296303 0.6793045 1.6703234 4.7970533 4.2375422 3.5877066 -1.9713918 -3.4169939 -6.7967997 -5.6812787 0.6845523 7.4122968 -3.6531539 -3.2758324 -1.4301629 -0.1730289 3.6796255 -0.8345674 -0.5749910 1.2843065 2.3184099 -1.3527784 -1.9875392 -0.8674228 20.2648144 4.9156871 -2.1142964 -3.2263029 0.0020227 5.0722842 0.1290557 0.3127528 -4.4024606 -6.5586305 2.0164821 5.6767101 0.2111107 -5.0682034 -8.8151522 -6.4672790 -3.1582694 4.2999930 -1.7790320 5.8594255 -0.1131046 -2.1126328 -4.2828150 1.8118176 1.1874881 -3.8262072 3.0250208 -3.0375953 0.7911116 -4.2150683 11.9615669 3.1819053 -4.5029359 1.8029680 5.5351796 -3.9555051 -9.0202427 1.4850897 -4.6837702 3.7388501 -4.9594607 2.7848408 -4.4869518 39.5739174 -2.2774620 -4.5658288 4.1474123 4.2859449 -0.5379724 -3.0358570 -5.1541481 -1.2647181 0.9317043 -7.9783077 -4.7014294 -2.5475843 2.3972147 -4.3293781 -2.5297494 1.1302837 -5.4093227 2.7838750 5.4486489 -1.4867216 -2.4576275 -1.4112843 -8.1239262 5.8460069 -2.0687449 1.7768469 4.7123508 1.8422590 -1.5971723 -7.8579259 -12.6025276 5.0838962 -1.2670728 7.2636395 9.4248190 -2.1143148 -3.8586569 -1.7513584 -7.0731277 -0.5995697 4.3665643 2.4588931 11.2100210 -0.6844838 2.3485115 -1.7035681 -4.5398912 -6.9971089 27.1970196 5.6223731 0.3148817 1.5313783 -9.4275780 1.0840327 -18.6935673 12.3147993 11.0782356 -4.8833809 33.1879158 5.1487803 18.9861240 1.4917026 1.3506987 5.0417690 5.7669072 -5.2745008 -0.1383630 -5.1782331 -10.1573210 -7.3286381 1.5202365 7.2285457 -4.7937369 -4.9995470 -1.7821683 0.2905872 4.2908068 -1.4273483 -0.2871986 1.3505520 -0.4197940 -0.3337514 -14.4603653 -0.8219130 30.2782173 7.9820457 -5.6612449 -3.2190096 0.1065071 5.0495925 -0.2912745 1.5686383 -6.1794319 -7.1517940 3.3392055 5.3442659 0.3277754 -0.6200222 -7.2715445 -4.0240703 -2.7044768 2.9474430 -6.6400056 -5.0076241 -0.4763640 -1.3030517 -5.2518444 -1.9950738 0.2597740 -1.7612691 -0.8891709 -1.5138988 -1.7153208 -1.9218442 -0.4195701 4.0223947 -2.0759773 -2.0288744 3.3635769 -1.7393767 -8.3587599 -6.1718121 -0.1944391 1.8967620 -2.8921854 -2.4675608 -2.7692320 30.5291119 -2.6471858 -1.1332715 2.8333166 -0.9247968 1.3095245 -1.5406609 -4.0862985 -1.1507149 -0.5001946 -6.8957181 1.4717977 -6.0430050 1.7171650 -8.6770458 -6.7280908 0.2312592 0.9717281 -7.2882729 0.9871837 -0.4990524 -1.7391593 -1.7977462 -5.7171659 3.6024969 -9.0630789 -4.1523666 -3.3662891 -1.0937077 -0.7839407 -0.9936644 -7.1048012 -0.3373648 -1.5428711 1.5952702 -9.5187035 -2.5207620 -3.3484030 -0.8788760 -6.1892529 -2.8589275 0.6765174 2.5904515 4.2525001 -1.2640032 -1.1438518 0.3263012 -1.6217020 -8.3155422 17.9231148 -1.1759923 3.0194280 1.5494361 -11.6314297 0.3706860 3.6352642 8.1701488 6.3071666 -2.9639480 18.4583225 3.8291566 -2.9936886 1.2245487 0.8779416 -1.6575267 3.6830184 3.9823263 3.0729742 -6.0848598 -6.9778099 -3.4651389 0.9951807 -1.3411189 -1.6281537 -2.6703038 -3.2964859 1.0318091 0.1317442 1.6295372 -0.2599651 -0.6224558 -4.2480359 1.7629210 -4.8521457 -0.3314816 19.0858517 6.4839573 -8.8777285 0.6918435 -0.3746960 1.4072157 -2.8118832 2.0528364 -3.4729013 -0.5649107 1.7805882 -1.9295686 0.9819263 -0.4755955 -4.4534431 0.7720762 -1.5916785 2.9135869 -1.0189567 4.6951332 -0.0079482 3.2424319 -3.6686261 0.0481788 1.0576149 -1.1671619 0.5378268 0.8496001 -1.3461285 -0.8683378 0.9124361 2.6980066 -2.0338409 -1.2644320 0.7864078 -0.9062321 -3.8513291 -0.4438333 -1.2019610 1.0952675 -2.1534319 0.8215368 -1.0827684 15.8048849 -2.1383429 -0.7265815 0.7232335 -6.9169106 -0.3538557 -0.8092940 -3.8439503 -1.0528735 -0.6021591 0.9962142 0.8150992 -0.6750130 -0.0539000 0.0974209 -1.2258668 1.1610590 -0.8697899 9.1118355 1.0310239 0.0675204 1.5234038 -1.7475117 -2.9561696 1.2176334 -0.3189037 1.0655209 0.2949775 0.7481478 -0.8899146 -1.1060275 -0.4724989 2.2963178 1.5241472 2.9724760 2.8344624 -0.4178565 -1.5992419 -0.3521697 -2.8787658 -0.4085249 -4.1080780 1.3037927 4.1869378 -2.3601046 0.9624687 -1.3457099 -0.9443302 -1.2745272 14.9389658 -0.7271131 1.8750802 -0.1746746 -1.3385079 1.4500147 -0.9387105 4.3570399 2.2421257 -2.2634597 13.0091038 1.4480928 -0.2687945 0.2374164 -0.8465790 -3.8144217 1.8241185 -6.8983102 0.2429870 -0.8186243 -1.0327854 -1.1492884 0.0057388 0.8705350 -0.7021036 -2.1115577 -0.9517631 -0.0983322 0.4635966 0.2100081 -1.0469155 0.4755799 -2.5612242 1.7043113 -1.7230014 -1.5644879 9.4383736 3.0267050 2.0537720 -0.0482305 0.0015480 -6.1669402 -0.0567527 0.5649137 -2.3129811 -0.7195195 0.9309683 0.1959827 0.0715838 -5.3947768 -5.9981756 -3.7226968 0.7538528 2.2275550 1.5863771 11.2208834 0.3798952 -1.6614237 -2.4634395 2.4560237 0.5678091 -3.5617459 3.9425871 -1.2084078 1.0366668 -3.5639203 9.9103479 1.4253429 -0.2300971 1.8946569 2.8939328 -1.4279429 -6.0610623 3.1024547 -3.9477239 1.1420203 -3.4863081 5.8818326 -3.4494717 24.3995152 0.3034732 -4.3735132 2.5428886 4.7758884 -2.1320753 -6.0633059 -4.5017438 -3.2001662 1.3792666 -2.7031436 -4.9607515 0.8607507 0.8208216 1.8329355 0.2131555 1.8342093 -1.6938312 11.0491295 5.0653787 -0.7389645 -0.8079696 -0.0617472 -4.4027977 2.9210646 0.3115945 3.4421091 4.9774566 2.6043921 -1.5410851 -6.3008552 -5.4552693 5.1388049 1.7891381 6.1260972 16.4315090 -0.8801636 -2.2136936 -0.9940490 -3.7359934 0.1502060 1.6234323 0.5745041 7.8981051 1.0530238 3.1115804 -0.3218651 -3.7654562 -2.9494805 19.8737774 4.8608842 -0.7766361 0.3158146 -2.9453664 1.5981860 -8.4335775 8.6305923 8.1742191 -2.9419856 23.5494595 2.8873837 5.4664879 0.5730574 1.8602141 5.7223840 4.3903222 1.4065576 -4.8991575 -2.9792202 -4.7825279 -5.3865471 0.5956954 11.4128361 -3.2965307 -2.9286799 0.2959966 -0.7211330 3.6464891 0.8292674 -0.9609912 2.4681232 -0.2183226 -0.5350631 -1.7708732 -0.2683601 19.1453609 4.4429560 1.4585027 -2.9479787 0.1604823 4.3418655 0.2295027 -0.5583934 -4.9502983 -6.2730308 1.3693200 2.4352431 0.5088750 -5.8136749 -8.5826063 -4.2378573 -1.5088407 4.2974181 0.4923562 10.8967962 -0.0847174 -1.0293993 -3.9145906 2.3091486 1.0483274 -4.5051084 4.0827188 -1.8748196 1.1481324 -4.8917270 10.9485998 2.4113994 -1.0899453 1.1464310 4.5888839 0.4202359 -8.5886745 0.6808730 -4.9352746 3.3364475 -4.6088963 4.8780580 -4.4707565 40.6147041 -0.7551246 -5.7387109 3.4259577 4.1805468 -2.3139372 -5.0901852 -6.3457937 -3.1925874 1.4579231 -3.5919437 -4.9930825 -0.7618117 1.6258841 -1.8843558 -1.4559788 1.9008483 -7.3487415 9.3399372 5.3988910 -0.9972216 -1.4466629 -0.8113855 -7.2695174 4.9084601 -0.9739924 2.8731985 4.7506146 2.3967891 -1.8275613 -7.6969757 -8.7336912 6.3711343 1.1720031 7.9772987 12.7159700 -1.9355537 -4.0251122 -1.6179798 -5.8270359 -0.4953380 2.2876799 2.0085545 10.8319197 0.7539517 3.3993502 -0.8465168 -4.6366162 -5.5120583 30.0935001 5.6449552 0.9375363 1.0381804 -6.5639062 2.0674918 -15.5569706 12.1870451 10.0701618 -4.4005089 34.1996956 4.6182146 4.0857859 1.3990359 0.8352000 7.3654056 5.6376762 -11.7846918 -3.6899254 -4.7987366 -7.3948102 -7.7787604 1.3095181 11.1662912 -4.7868786 -4.6513996 0.9122053 -0.1581788 4.1556692 0.8326851 -0.8161186 3.0619745 -2.4915726 0.5611365 -16.2702847 -0.4872790 28.4037743 6.9892693 -1.3361880 -3.6435747 0.2374747 3.6220558 -0.2582678 0.4028303 -6.9129338 -7.4929833 2.9254613 2.4009478 0.8035052 -0.8438019 -6.0989962 -3.1175430 -4.2073140 3.4745076 -3.0990756 -4.0289550 -1.0920149 -1.8099129 -3.4657578 -1.2795738 1.0730757 -0.8557719 -0.7017871 -1.1890280 -1.2032843 -2.4331806 0.5723246 2.9065082 -1.6155108 -2.5295842 2.1259634 0.2314195 -5.9054046 -5.3979788 -0.8184340 2.1959085 -2.7847364 -4.9077129 -2.0950692 28.8758488 -2.0177331 -1.5488342 2.2906773 -2.2428076 0.0696947 2.4841988 -2.8229997 -0.5487863 -0.3855459 -5.4283504 2.1810360 -4.1874614 1.7461159 -5.2195735 -3.9289508 0.9222851 -20.5917835 -6.0136819 0.9548687 -0.9891375 -1.6020596 -0.9933196 -5.8614922 3.2265224 -4.4158983 -2.6900530 -1.8099616 -0.1907286 -0.5638354 -1.1090922 -5.7917738 0.9078305 -1.6907250 2.3818221 -6.2680187 -0.9757583 -3.3633151 -0.9243022 -4.9897289 -2.2427630 -0.6824064 3.0447948 4.6841168 0.7356731 -1.7712239 0.6200138 -1.5952495 -7.2116256 17.4541664 -2.5518601 2.6107595 0.4070323 -10.1010847 1.0427887 -10.2221107 7.6418815 6.3994412 -3.2884371 21.3847675 4.3123899 -1.9248562 1.6542673 -0.9093820 -0.3353765 2.3084013 -3.6528826 2.2867026 -4.4055471 -6.0397182 -2.6446090 1.0138025 -2.7763114 -1.2388391 -2.6099379 -1.2404563 0.6338043 0.1909433 -1.3718270 -0.7307109 -0.1627697 -4.1228557 1.9087905 -9.8768568 0.3075324 19.5442181 5.3228893 -6.9515085 1.2940036 -0.5218074 1.6772847 -0.0540980 2.7958293 -4.0181866 -0.3057913 1.6378251 1.9821551 0.3200837 -0.9734355 -2.6637950 0.8656080 -1.4839158 2.1874032 -0.3338163 2.8100574 -0.1855490 2.4366107 -3.0983191 0.0024424 0.5447878 -0.9980599 0.2917441 0.0333733 0.1680680 -1.1212223 -0.6421664 1.4870255 -2.1254799 -0.6165475 1.5683416 0.8881069 -2.1664889 -0.7647117 -1.1180062 1.2723851 -1.0392503 0.4935866 -0.9277562 11.7827368 0.4383072 -0.9104959 1.2742549 1.7627205 -0.3122394 1.9017951 -2.7109916 -0.4076005 0.3002955 0.4745398 0.5314730 -1.0805823 -0.1491344 -1.2095900 0.4845761 0.1408185 -2.8401089 2.4002516 0.6866328 -0.2209571 0.2274516 -0.7937565 -2.1774294 1.0985081 0.1990485 -0.0216368 1.2711762 0.3779525 -0.4646004 -1.0602912 -2.2272186 1.2912533 1.5808284 1.7700496 -2.4724276 -0.9193724 -1.7295789 -0.5732147 -2.0372319 -0.2290878 -3.1123762 1.2325646 2.6426821 0.1854585 0.3952538 -1.4185412 -0.9285408 -1.7457718 8.8645277 1.2572595 2.7263281 0.5595369 -2.0381496 0.3854145 -0.4589330 2.8962808 1.3998075 -2.2477620 8.8149900 1.3250777 -1.5839825 0.7310563 -0.1697467 1.9300276 1.1008872 -8.9761953 -0.7565061 -1.5704488 -1.4462477 -1.5746790 -0.1899424 0.6390178 -0.8325866 -1.4152910 -2.3291080 -0.1626638 0.2628009 1.3011750 -1.5133637 0.3150560 1.7764456 1.7131191 -3.0554981 -1.3609295 7.5751834 2.2674518 0.9431861 -2.0827012 0.0136352 -1.9593832 -0.0306898 0.4740067 -2.1362078 -0.8316516 1.3257191 -2.1806617 0.0728351 -1.6118643 -4.6219158 2.2026048 -2.5143285 4.7672396 -0.6649625 3.7555366 -0.9061257 -0.5571001 -6.5482225 0.0629805 0.3565477 -1.3403285 0.6465012 0.3873684 0.8282186 -2.2499568 1.4120035 -0.1639111 -0.8038160 -1.8812804 2.4701762 1.4547473 -5.4758434 -2.6451659 -1.9754595 0.1010096 -2.1199963 -1.4744925 -1.9375429 28.3120270 -2.1698720 -2.6016889 1.9500459 0.4230547 -0.9766740 1.1274674 -4.0050330 -1.8070819 -0.0882824 2.1222694 0.5993818 -2.0836222 -1.2120121 -0.6648255 -0.1960028 0.6412776 -1.9576068 -1.9918114 3.8392844 -0.3309059 -0.2732774 -1.4132676 -3.0257561 3.3587048 -0.2996780 -1.5963938 1.9243094 1.0249393 -0.8142473 -1.4955684 -3.4995954 2.5322545 1.7908534 4.3464046 -23.3752460 -1.6399299 -3.7009194 -1.0851464 -4.1430106 -0.9330316 0.1439359 2.5962873 7.1364379 -0.6856009 1.0344266 -2.5783782 -1.6713144 -4.2859645 13.2158051 -0.6996207 4.2522449 0.7807695 -4.9344816 1.4306102 -5.2430367 7.0702233 5.1730013 -3.2077808 19.6444397 1.9062823 -2.1543255 1.1926190 0.2342200 2.3936658 3.6707346 -2.4322255 -8.2557335 -2.3764279 -2.8047154 -2.5269537 1.3887902 8.1468153 -1.3857024 -2.6007683 -22.0404606 0.3144171 0.7715766 5.5749555 -1.8351876 0.9000055 0.6628448 3.1872432 -5.4024124 0.8168108 12.4498138 2.8344991 -1.2381225 -1.2727505 0.1438557 -1.2024586 0.6743398 1.8921163 -4.6891532 -2.8299894 2.3850844 -6.2391229 0.3925843 -1.5187695 -7.2985620 2.3076451 -4.1022744 6.6218328 -0.8199562 4.5758700 -1.3972598 -0.6168053 -8.8015575 -0.4010805 0.8184576 -1.8843598 0.8799795 0.6374272 0.7555530 -3.8261783 0.3498118 0.7785590 -2.0618432 -2.7902868 3.9454672 2.5620918 -8.3497992 -4.9773974 -2.9299119 1.1310792 -3.1655712 -3.2480016 -2.4783602 40.8367424 -2.4411738 -4.0756750 3.1010582 0.3810943 -0.8914207 2.0734003 -6.0353775 -1.8900443 -0.2599805 2.0778441 0.4035506 -3.1373863 -1.5547762 -2.8108790 -0.8717921 0.6110900 -4.1084633 -3.2474875 2.6808982 0.0821546 -0.6968752 -1.6456435 -5.6525917 4.2747521 -1.4563618 -2.2556748 1.8491981 1.1044801 -0.5519479 -2.0937405 -5.7891860 3.5044641 1.9335598 6.0589337 -26.5417252 -2.9073253 -5.5551343 -1.6944531 -5.9142423 -1.9858737 0.2625830 4.0746436 9.9069452 -1.0098503 -0.1928553 -3.6454210 -2.3670731 -6.6826310 22.0619926 -1.0857557 6.5555439 1.9640347 -7.8563328 1.8807900 -9.7071495 10.2077341 4.9701180 -4.4439588 31.3979340 3.1800568 -3.4985209 1.9286944 -1.6644307 3.1964724 3.4598062 -11.9525080 -8.3723993 -4.4579067 -4.3212843 -3.8716516 2.5156612 9.5333748 -2.6807246 -3.8210418 -40.6761818 0.6661626 0.8494665 5.0212216 -2.9387727 1.2905748 -0.9506496 4.6949930 -13.8653069 0.0427751 20.6782875 4.8654351 -2.9648383 -2.2081571 0.3150879 -1.5619472 -0.3185498 2.7456064 -6.7654700 -3.6248877 4.2157917 -7.7468052 0.8603118 -0.3597026 -6.0896697 -0.9904385 -2.5464275 3.6242912 -0.0704967 0.0764554 -0.9169395 -1.6179454 -4.6895032 0.5199198 0.6828931 -1.0223385 -0.5056789 0.3307299 -1.5776447 -2.3922086 -2.0781047 1.7438313 -1.5078322 -3.4077404 1.6594093 0.7571130 -7.3718147 -7.7424383 0.4072025 0.0361287 -2.6306853 -5.6460490 -2.5644963 28.0688972 -0.0738757 -1.4204345 2.1025982 -2.3759677 1.3275962 2.4051576 -4.3677726 -0.6813672 -0.4543071 -2.5941722 1.2207228 -1.8520842 -1.7293110 -3.8744440 -1.9242778 0.9204822 -1.8204286 -4.3054242 -0.2199360 0.0022053 -0.0782797 0.4470988 -3.4504516 1.2448090 -2.9826076 -3.1381593 -2.3345249 1.1112049 -0.2064539 -2.1644959 -4.3316188 0.5548227 0.2742492 2.4010050 -5.3264775 -2.0283375 -4.3024750 -0.8580202 -6.7835150 -1.7744310 -0.7050786 2.3698218 4.8567758 0.8640946 -3.1820765 -0.3907491 -1.6169277 -5.8212633 10.7625523 -4.3091488 3.2165623 1.9316089 -9.2241364 0.8856130 -8.6419497 7.3447118 0.8113640 -2.2607539 15.9588776 2.2124305 -3.0946791 1.8144506 -1.4852358 -2.3913836 1.0741999 0.5220633 1.6764312 -4.2680459 -3.6268442 -1.5511795 0.0474024 -0.3497700 -0.6390474 -1.4109635 7.5264030 0.0737111 -1.3295356 0.3640594 -1.7015320 -0.2228193 -2.3334212 3.0153058 -2.3238597 0.1557161 13.0656242 4.0418448 -4.6729589 1.2172911 1.4959103 0.5893138 -0.6278101 1.5899760 -3.2829857 0.3575636 3.3618612 -28.3890400 0.3073191 -0.9138634 -2.3464046 1.5802904 -2.1863003 2.0519969 -0.0596870 1.5823544 -0.2798196 1.8335068 -1.8052837 -0.0481176 0.6538516 -0.8642939 0.2953640 -0.0816362 0.2753902 -1.2283252 -1.3447725 1.4772784 -2.5155928 -0.9720873 1.6647182 1.1446162 -2.3743498 -0.5735482 -1.3092452 0.7331498 -0.6704211 -0.4818507 -0.9830178 9.5017996 -2.3980832 -0.7903844 0.9764985 1.9269940 -0.7640346 1.5845947 -2.6385584 -0.4317664 0.0979475 1.7732595 1.9858643 -0.9978192 -0.6772295 -0.7521817 0.0775758 -0.2827167 -3.2639272 1.3410679 -0.3340558 0.1603797 -0.0705771 -0.5479285 -1.8514962 0.6802998 0.2475028 -0.3732416 0.4476534 0.1915202 -0.4761976 -0.8074137 -1.2840393 1.2753236 1.3782213 1.9314470 -1.9868094 -0.9875627 -2.0292239 -0.8055026 -1.2914754 -0.5106906 -1.9244804 1.3346971 2.9086955 -0.2775562 0.0833055 -1.1719656 -0.8192772 -1.2350413 8.4701586 0.4608613 2.5310493 0.3767066 -1.4479845 0.1139005 -0.1828861 3.2278569 0.4219611 -1.7342782 8.1549568 1.0866256 -1.4420797 0.4963162 -0.9435362 2.8824046 0.7875996 -9.0269117 -1.7725248 -1.6947659 -0.9170191 -1.5355082 -0.3798005 0.6291820 -0.8404116 -1.5989463 1.6952544 -0.5566207 0.1093151 2.9055161 -1.6729100 0.4603476 1.4951611 1.7890922 -2.1811881 -1.3111645 7.3019929 1.8050861 0.1102535 -1.3158801 0.1404410 -2.1388047 0.1444883 0.1870632 -1.9137590 -0.7643769 0.9668011 -4.2880001 0.0322861 -1.7532979 -4.4089527 2.8977554 -4.4026804 3.9579213 -0.4910656 2.1490149 -0.8251079 -1.4865729 -5.4279652 -0.0691689 0.3684686 -1.1287993 0.6278228 0.1724094 0.6712556 -2.2477865 -2.1865318 -0.2114972 -1.2977170 -2.8170435 2.7234888 1.2775345 -6.0541978 -2.9656658 -1.5736984 0.3975698 -1.4044915 -2.0763061 -2.7285054 25.2295914 -8.4210520 -1.7427746 1.4203242 2.7136517 -1.6664133 0.5519812 -4.5893197 -1.5457491 -0.3781953 3.6219437 2.9055047 -2.0927367 -1.7009410 -2.2848644 -0.2766256 -0.0392184 -2.7920272 -0.3642702 1.9397069 -0.2997997 0.5024161 -0.5014195 -2.9520533 1.9870716 0.1028331 -1.7753205 0.9607301 0.4682870 -1.2322614 -1.4649441 -2.8032780 2.3231206 1.6460434 4.2014976 -1.8855716 -1.6169269 -3.6612806 -1.5777829 -3.1047454 -1.6768630 0.6071233 2.6866477 6.7994537 -1.5908227 -0.6717705 -1.4758688 -1.3133947 -3.1433475 15.6217442 -0.8414554 3.4812365 0.4802159 -3.6973214 0.6765412 -4.1830826 6.7604270 4.5410261 -2.5485806 17.9083881 2.1522822 -2.1843209 0.8076627 -0.3174050 3.5690451 2.5834115 -3.7882557 -11.2901812 -2.8200321 -2.0493076 -2.9004304 0.3255752 4.6570945 -1.7110462 -2.4681792 0.6834786 -0.2231048 0.2240899 6.3058696 -2.7274718 0.8810517 1.9928515 3.4934478 -4.5233383 0.6262991 13.6216335 2.1751447 -2.0598776 -1.1541376 0.2034363 -1.5640707 0.5708590 1.8823525 -4.0882487 -3.2328930 1.2254757 -8.5613308 0.2749548 -2.0871582 -6.8917108 3.9939916 -6.3094678 6.0446630 0.3449999 3.2506654 -1.1534649 -1.6046830 -6.7473950 -0.0819830 0.6358976 -1.9141120 1.3618156 0.2940134 0.6476096 -3.7567225 -4.5514278 0.3062890 -1.8553435 -4.1551795 3.8173883 1.2519621 -8.7836485 -5.1706553 -2.2699740 1.5424508 -1.9324095 -4.6334639 -3.3496287 38.2350044 -14.0261059 -3.2843375 2.1667590 3.3806334 -2.3997180 1.3874577 -6.6204519 -1.8752154 -0.5502084 4.9191322 4.0060058 -2.8301916 -3.0885420 -4.0835285 0.0133020 -0.1168398 -3.9048603 -1.0404087 0.5252505 -0.0840288 0.1470655 -0.3956601 -4.8164759 2.5854962 -0.2522818 -2.5312493 1.3327094 0.6799484 -1.3927455 -2.1545155 -4.3244271 3.4105234 1.9956031 6.3490181 -4.0441170 -2.7041101 -5.5851488 -2.0001528 -4.3270507 -2.6811824 0.0714930 4.1900239 10.4217510 -2.7696297 -1.8472000 -2.6769223 -1.8879941 -4.9891133 23.6861572 -1.8833864 5.8406286 0.8926300 -5.9015946 1.2637920 -5.9756079 10.2019072 6.5862808 -3.2806058 27.9873314 3.0052991 -3.3689344 1.6525797 -1.4211736 4.8803339 2.5673680 -7.0899658 -10.3893099 -4.7162519 -3.1480992 -4.1177597 0.7213615 6.3131595 -2.8177824 -3.8620322 0.6048249 0.0651994 0.2338329 8.2314501 -3.5804489 1.3748232 1.3204292 5.3855958 -6.3628950 0.5911751 20.8281059 3.6871874 -3.1151791 -1.5192839 0.5137926 -1.9410145 0.5344702 1.9253854 -6.0051618 -4.1905408 2.3570342 -9.9080162 0.4028576 -0.9654508 -5.3329492 -0.0615212 -4.2534156 3.3854795 -0.7818655 -0.6943299 -0.6860551 -2.6773715 -2.6406684 -0.9146228 0.4342273 -0.7114210 -0.3669197 0.4174670 -0.8260885 -2.3764448 -7.1840234 1.1877024 -1.6057795 -4.3686690 1.4605249 -2.1264884 -6.2929864 -4.8894858 -0.5574296 -1.0216421 -1.9586377 -6.2148075 -1.6614385 24.3957348 -39.6776810 -2.0911608 1.8859544 -1.3599043 -0.9130192 0.3050982 -4.5779586 -1.4119097 -0.7654656 -1.1044782 4.0632167 -2.6237400 -2.0420709 -3.7594266 -1.2186432 -0.2643977 -1.9482150 -6.7541037 -1.1818752 -0.6203882 -0.8154415 -0.2223112 -4.0429416 0.5031227 -1.5962254 -3.1786087 -1.0742506 0.2984065 -0.8231837 -1.1610209 -2.9677291 1.0468228 0.9534339 2.5323205 0.1142702 -1.9939057 -4.0658174 -1.3732011 -4.1682644 -1.4020412 0.1410922 2.4531586 4.9803133 -3.1684282 -1.9165299 -0.3975691 -1.7594639 -4.9307485 14.6342173 -3.0456848 3.5783575 -0.0111122 -6.9933147 0.5689032 -6.4964466 6.4750161 4.4376106 -2.1438334 18.0723267 1.8592235 -3.6031733 0.7324682 -2.0699854 2.4445968 -0.5725958 -0.6030057 -0.4589561 -3.7780311 -2.4716403 -2.3446510 1.3366772 2.0939262 -1.3022360 -2.7312393 -1.7008839 0.1346927 -0.3752348 1.6440120 -2.5233641 -0.9458671 -2.0542655 2.9445329 -7.9619236 -0.2940697 16.2003632 2.4424491 -4.2186947 1.2720919 0.4578101 -1.5097537 1.4182444 1.5020555 -3.1289802 0.4123975 1.0129025 -23.5986366 0.3568447 -1.1673487 -2.0744529 1.8374456 -1.7584324 1.7709520 0.5017477 2.0413289 -0.5522698 1.8521795 -1.9423710 -0.1903598 0.6308302 -0.9246821 0.4665731 0.1506167 0.3380330 -1.1284693 -1.3140094 1.0002271 -1.9564890 -1.2702098 1.7263757 1.2678006 -2.7667286 -0.9083347 -1.3368176 0.3814090 -0.3849128 -1.0442913 -1.1174949 10.1289339 0.5312411 -1.0747980 0.6600475 2.0726306 -1.3348234 0.8934420 -2.8502576 -0.8571693 -0.0996702 2.4937515 2.5402458 -0.5498079 -1.1916938 -0.6239579 0.3622140 -0.5664198 -2.5157537 1.3446034 -1.0419068 0.0663392 0.1390666 -0.4359300 -1.7058020 -0.0814661 -0.0225306 -0.4410711 0.1014194 0.4044894 -0.3900507 -0.7040057 -0.5301930 1.5384743 0.8243794 2.2910841 -1.8815206 -0.8672292 -2.1604769 -0.9075359 -0.7979128 -1.1111922 -0.4593178 0.9182814 3.3211045 -1.5835415 -0.2070307 -1.4825314 -1.0110415 -0.7385106 7.5800414 -0.2681591 1.9206574 0.0821378 -0.5091951 -0.3266739 0.1870801 3.0468149 0.2588091 -1.1742359 7.8170023 0.8894492 -1.6562825 0.2374454 0.0760553 2.7369676 -0.1613572 -6.8249078 -1.3472784 -1.8241694 -0.1911851 -1.9343833 -0.6106341 0.2242335 -0.8003085 -1.6812485 0.7780514 -0.7208357 -0.1942932 3.5315871 -1.9156892 0.5692139 0.9582776 1.9097462 -1.5255992 -1.0809474 7.4605503 1.1822731 0.5523522 -1.1378362 0.1102822 -2.1598825 0.1804088 0.0493132 -1.8825347 -0.9749770 0.7769330 -5.0679445 -0.1608751 -1.7535938 -4.0743728 3.4438281 -4.4218698 3.7251697 -0.0798889 2.7821271 -1.6413460 -2.5505223 -5.6763673 -0.7343343 -0.3036244 -1.2143351 0.3705936 -0.0519245 0.5730864 -2.3296213 -2.7047064 -1.3787605 -0.7972870 -3.6162934 2.0750101 1.4022772 -6.2321272 -3.7274518 -1.8755808 -0.2438503 -0.9142466 -1.3728684 -2.5144827 22.0734177 0.6285986 -2.4930682 0.3667101 2.9424753 -3.3105226 -0.4804457 -4.9971576 -2.0733244 -0.7515258 4.6714516 3.9289572 -1.9861550 -3.2796295 -3.0241735 -0.5727684 -0.6459278 -2.6675570 -0.1588306 0.0191989 -0.3324273 0.2426510 -1.0321001 -2.7636590 0.5477145 -0.2934653 -2.0701864 -0.5020176 0.5730169 -0.9346811 -1.0118009 -2.1012032 2.9046185 0.6575293 4.5878191 -0.8734097 -1.4721351 -4.3145924 -2.1299624 -1.9510159 -2.2769213 -0.5096144 2.0939946 6.8376245 -5.5018673 -1.3198292 -0.9912522 -1.8789159 -2.3457398 14.6089563 -1.7699542 3.0081079 -0.0539683 -2.5452061 0.3099859 -2.8307910 6.6882305 1.4635509 -2.2167339 17.0623970 1.6291189 -2.7709291 0.3707233 -0.7434129 2.3963981 1.0841151 -2.8604677 -9.7716322 -2.9368908 -1.3016334 -3.0713961 -0.0493166 3.8481469 -2.0476491 -3.1131263 -0.3078189 -1.0226246 -0.4173764 7.8196139 -2.5466027 0.9586816 0.8431481 3.3895855 -2.7554564 0.8019648 12.9301825 1.0130137 -0.9714563 -0.6767427 -0.2683657 -1.8290359 0.4372552 1.1830803 -3.6552119 -3.2530849 0.6348431 -10.8887691 0.7092096 -1.8266739 -6.0223079 5.2177329 -6.6876221 5.7427335 1.2545893 4.0053620 -2.3731425 -2.6460767 -6.9583607 -0.8928674 -0.1323932 -1.9307222 1.0955682 0.2610485 0.7483898 -3.2377238 -5.4159198 -0.9670805 -1.3161274 -4.6277823 3.5921879 1.0287377 -9.4110289 -3.9350104 -2.3609769 1.0225648 -1.8475842 -3.7034042 -3.1999488 33.5464554 0.9170006 -3.5940993 1.2692966 4.1142244 -4.6913757 0.7515707 -7.3398619 -2.3925536 -1.1238953 6.8646574 5.1095471 -2.1448889 -3.8556442 -3.1361363 -0.2593841 -0.9783458 -3.5368781 -0.6503898 -2.6236002 -0.1639370 -0.2816451 -1.2257951 -4.1962724 0.3917407 -0.4140644 -2.8436792 -0.9426362 0.9547819 -1.3834318 -1.5682788 -2.9319773 3.7270601 1.1629590 6.1448793 -2.9295459 -3.0466542 -6.6161571 -2.9654469 -4.2326407 -3.3329594 -0.7106833 3.4808829 9.5813742 -9.7256813 -2.9047666 -1.3235875 -2.4617476 -4.0922804 21.5465622 -3.8390732 5.4977636 0.3297969 -3.7563322 0.8138046 -4.4943891 9.2407465 4.3944278 -3.0745218 24.7099133 2.4529052 -4.6117067 0.6779476 -1.5489312 2.5200462 0.7764632 -6.7823834 -7.4045897 -4.5226431 -1.2887223 -3.7497516 -0.0894026 5.8317208 -3.6486695 -5.0467062 -0.1890792 -1.0918810 -0.4782114 10.8333273 -3.6668777 1.1598907 0.9612395 5.4534349 -4.2765493 0.2242159 17.0500717 1.9713905 -1.6484103 -1.3126552 0.1655382 -3.0958164 1.7763318 1.6857744 -5.1139917 -3.5894053 1.4414507 -17.2143116 -0.9017864 -1.6201152 -3.2692161 1.3575261 -0.1920284 3.2464719 0.2808149 0.2216427 0.5692895 -1.1560122 -3.7346337 -0.3077983 -0.2365488 -1.3145837 0.3368352 0.7154453 0.3805180 -4.5314951 0.8258320 3.3668551 -1.1199553 -3.0567110 -3.8680818 -0.7332240 -7.3085399 -2.2856929 -2.2019279 -1.4706844 -3.4443495 1.7028332 -0.1600893 12.6447210 2.3580613 -4.6661272 2.2676930 3.0659838 -1.2370836 2.5496979 -4.2608781 -1.8292582 -0.8875269 0.8536959 2.8131652 -3.1235931 -3.8367560 -1.0482942 -0.7152934 -0.3848030 -1.5914726 -3.8650148 -1.8337693 -0.2444063 -1.2261711 -0.4370323 -2.1151464 -0.5996956 -0.9645534 -4.4676523 -1.9806890 2.7865086 0.2001300 -3.6419895 1.9118816 0.2395344 0.6657058 2.1943374 -0.6983579 -1.5219325 -3.1090333 -3.6956267 -7.1927562 -0.7034444 3.2695477 1.8517022 6.0256195 -0.0059853 -1.0610803 0.3586352 -3.2722914 -4.4552355 0.4392941 -4.2437015 4.1489744 0.3328559 -6.3048820 0.0065767 0.3898177 6.0212994 7.6397128 -2.9059465 4.0341082 0.8874348 -3.2890215 0.0862074 -0.1296621 5.4189801 0.1693799 -2.5938559 8.4886293 -1.9544643 -2.0406282 -2.2755055 0.7169355 0.5214518 0.4922584 -2.6332788 -3.4473343 -2.0680611 -0.8654771 6.5745635 -1.9800237 -1.4352609 -0.7973779 1.5959049 -7.6097879 0.6853243 -0.6830990 2.7604599 -1.7860450 -0.1176426 -0.0444281 -1.6471460 0.3272111 -0.0143487 -4.3834023 0.8434728 4.3550124 1.9847940 -0.0301559 -1.1105013 -2.1740465 2.2473364 -2.3230886 1.6116171 1.0191277 2.1858032 -0.7610900 1.3548417 -1.8725455 -0.2604277 0.3134847 -0.9273747 0.6829292 0.3042198 0.2223092 -1.1249230 -1.8980469 0.6585102 -1.9486802 -1.5040213 1.7833644 1.3318086 -3.0012944 -0.9873931 -1.5353999 -1.2818609 -0.2065522 -2.0931211 -1.3198291 9.6700401 0.0652992 -1.4926939 0.7520096 2.1621273 -1.4933274 0.0033328 -2.9531050 -0.7214618 -0.0944015 3.2416413 3.3117816 -0.1624477 -1.9307534 -0.8975982 0.8774886 -0.6598231 -2.2713287 1.1920513 -2.1462233 -0.0381160 0.1160467 -0.3698713 -1.1830977 -0.5920680 -0.0007627 -0.7060266 -0.1382533 0.7114922 -0.6970885 -0.6051533 -0.5723922 1.4063940 0.4096655 2.1200056 -1.1337135 -1.1466858 -2.2711878 -0.7770815 -0.1243266 -1.0606390 -0.4166320 0.3309608 3.2122154 1.3145840 -0.3419897 -1.2768385 -1.1010892 -0.0238777 7.9363346 -0.9561737 1.8160589 0.0188091 0.6427969 -0.2583207 0.7266001 2.8232718 0.0832043 -0.7982202 7.1889281 0.6698791 -1.6441973 0.2308051 0.0854444 2.4242842 -0.4400316 -3.6170151 -2.5835712 -1.6302719 0.4234579 -1.7679170 -0.9169397 1.1910591 -0.9729047 -1.5598968 0.3789241 -0.9953707 -0.5581934 5.1724734 -1.5237249 0.5222865 0.7556193 2.1059875 -1.2173233 -0.9928893 6.7789903 0.6954854 0.8819806 -0.8280597 0.0405587 -2.1340675 0.1405750 -0.3953889 -1.6520756 -1.0766044 0.4329481 -6.9530873 -0.2763865 -2.1197054 -4.0084190 3.8450906 -5.6862192 3.2095289 1.2542381 2.6632798 -1.9643344 -2.4872160 -5.3327136 -0.3832775 -0.9492817 -1.2741653 0.5690649 0.1032605 0.4830005 -2.3064048 -2.9270988 -1.9707841 -0.8705898 -4.1387310 1.5934104 1.5054095 -6.8488898 -3.0048187 -2.1258700 -0.0447285 -0.6543657 -3.6159780 -2.6658552 21.4136791 -1.0266881 -2.3581173 0.0814749 3.1418564 -4.4420557 -1.8869183 -5.2212491 -2.2414651 -1.1144822 5.1216407 6.3922906 -1.6304247 -4.2475419 -0.8852361 0.3126113 -1.5519601 -2.9811726 0.3144456 -2.1666119 -0.0498846 -0.4364523 -0.7043455 -2.6944032 -0.9668316 -0.2708532 -2.2853312 -1.1389971 0.6587978 -0.8025851 -0.9460083 -1.6256828 2.8384306 -0.0745659 4.4691133 -2.6602135 -1.9559665 -4.7878466 -2.2381954 -0.7092181 -2.2296267 -1.0454395 1.6551549 6.2722521 1.1214799 -1.2816163 -1.2982421 -2.1123302 -1.3623325 15.1998034 -3.2107925 2.8501949 0.1472590 -0.8742445 -0.0370932 -1.6322598 6.1515350 -2.6228838 -1.4809917 15.6190720 1.1678681 -3.0871716 0.1858717 -1.9249119 2.0091679 -0.3209040 -1.1485267 -6.9442210 -2.8235672 -0.2231546 -3.3736556 -0.8605461 4.5517073 -1.9275328 -2.6502900 -0.2331884 -0.8480403 -1.0482727 9.2044411 -1.5438447 0.9185312 -0.5056545 3.6040611 -2.5705457 0.0169119 10.6551218 0.1709887 -0.6863876 -0.6781741 -0.3824085 -2.2234309 0.1050565 1.0673320 -3.5417712 -3.3249259 0.6529908 -12.5364828 -0.4198954 -3.5335159 -6.3690982 6.2869644 -8.9148388 5.0576015 3.2687747 4.2130117 -2.7992127 -4.1678047 -7.0915942 -0.8302183 -1.1934643 -1.8931010 0.7226108 0.4815664 0.4367872 -4.0132170 -6.0257592 -1.5485518 -1.1545843 -5.3619719 2.4333243 1.3932858 -9.0615377 -4.2081409 -3.2506828 0.5047741 -1.2761805 -5.7874770 -1.7694173 25.8916702 -1.4208940 -3.2861331 0.1569741 4.4946117 -5.9479537 -0.9650458 -6.8548932 -2.1413481 -1.3546996 8.8989487 8.1165943 -1.7273548 -5.4275475 -0.7355215 1.4265122 -2.7591000 -4.0958629 -0.2996965 -5.1589651 -0.6342534 -0.6161090 -1.1996902 -3.8093235 -2.1053767 0.1029979 -3.4626932 -1.7889273 1.1860840 -0.4494326 -1.7436100 -3.0863185 4.2260132 -0.3241459 6.9562850 -3.7217505 -3.0903499 -5.9589086 -3.1565106 -1.8297353 -3.8301878 -2.3131983 3.2316325 10.0875692 1.2738400 -3.3163221 -0.9562829 -2.2841623 -2.3240170 17.0084019 -4.0867777 5.1338682 0.5185521 -1.5105923 0.4298180 -0.3157085 9.3118448 10.7747736 -2.0846038 23.3320904 2.1345046 -4.5356579 0.3238134 -1.8658012 1.8843522 -0.8926332 -1.4047688 -4.7971311 -4.5026078 -0.5244908 -4.1913033 -1.1961131 6.9995003 -2.6491632 -4.7822337 0.0897967 -0.5838154 -1.9781744 14.4591560 -3.2602448 1.5805311 -2.0856440 5.7071681 -2.2907627 0.3213345 16.4175625 1.1032274 -0.3526444 -1.0228660 0.6929423 -1.1372273 1.1156197 0.9642680 -4.5714540 -4.0602970 1.7173626 -16.5585938 3.2656088 -3.8498185 -2.3104155 4.7859974 -3.3423340 4.4667263 2.4447587 0.2477615 -0.3677792 -5.0742636 0.0158094 -1.5048320 0.8598023 -0.8964182 1.6654490 2.0539095 1.7451941 -0.8932014 -1.8767134 4.3863244 -2.1117747 -3.8031242 -3.8839822 -4.0659571 -11.3614883 2.5686471 -0.0361730 3.4063954 -3.8876941 -4.0735841 -2.2284377 0.8455558 -0.4416839 -2.5281603 0.7767096 -2.1682026 -3.9505785 -10.1411724 -2.9158945 7.6908588 -2.4166279 6.4307728 -3.5276268 0.0203865 -0.6930975 4.0779505 0.4196512 -2.0898724 0.6015912 -0.6330059 -1.4648204 1.3341219 -1.1963502 0.8267128 -3.5634973 -2.3869572 -0.6633038 -0.3018665 -1.0317982 2.2655895 3.9542763 -3.5814960 -4.0716724 0.1990568 2.0510471 3.3877895 0.3101294 -3.3294399 -5.5220485 -2.4371967 -0.8323914 -1.6360067 -8.6038465 1.5816797 7.3374529 -3.0320461 -4.2602754 1.6153204 -3.5697896 -1.4211367 -0.0966152 -0.5466265 4.0376115 -0.8705946 -3.8063011 -1.8946266 -9.1464405 5.1923008 -1.7599108 -1.3566109 6.8664627 2.4464362 -2.6205771 1.2551994 0.5321683 5.6960073 -1.3288383 -0.4976931 0.6042699 -5.2322669 -1.7228233 -7.2817388 -0.7343253 -2.7056706 -0.4398942 -2.2702129 -4.5884547 -0.7045004 -1.8579621 9.9253197 -3.7858236 -0.2760941 -3.7086685 3.0667887 2.3321500 -5.6181717 7.8316112 1.5029329 -2.1045945 1.7808406 0.8412384 -4.3725562 -0.7761393 2.6432467 -4.7668533 -2.9770103 -1.6765563 -8.9555655 -0.3189664 -1.2015355 -2.0870306 3.0305865 -0.2858894 1.7637628 1.5420628 2.3809869 -1.1539710 0.9593935 -1.6124005 -0.5149827 0.0616969 -1.0326121 0.5049973 0.5231124 0.0705863 -1.1582170 -1.7772712 0.5185572 -1.6382413 -1.9815675 2.0151420 0.9574904 -3.2365346 -0.7765511 -1.8320558 -2.1087265 0.5074621 -2.0275831 -1.4938630 9.1225872 0.6893684 -1.3718702 0.6723334 2.3986218 -1.8779942 -0.0624190 -2.9125760 -0.5953730 -0.1954235 4.2998567 4.0562077 -0.2855064 -2.6411760 -0.4550605 1.3169099 -1.1918261 -1.8274962 1.3675100 -2.4686427 -0.4113148 0.4447149 -0.0335940 -1.0330632 -1.2062610 0.1703393 -0.7282763 -0.1258031 0.6821736 -0.6997668 -0.3108647 -0.9005106 1.6717649 0.4273723 2.3975441 -1.1948931 -0.9708701 -2.7262101 -1.0289335 0.2608403 -1.1918931 0.3858751 0.4623794 3.5024672 0.6072889 -0.7742913 -1.5180519 -1.1459956 0.2389824 7.2321439 -1.4197918 2.0670037 -0.4417265 1.1906006 -0.8097373 0.6151842 2.6863430 -0.7754018 -0.4845433 6.2213645 0.3365189 -3.0590181 0.1431663 -0.3055893 1.9900099 -1.2096280 -3.5111165 -3.7014582 -1.6564950 1.0665252 -1.8720111 -1.2161256 1.1367397 -0.8740917 -1.7721082 0.1053038 -1.1289512 -0.6714944 6.0072360 -1.5319310 0.4765996 0.9407056 2.3228126 -1.4045664 -1.0199891 5.8437200 0.4403946 1.1411660 -0.4291285 -0.1102940 -1.9922240 0.2502717 -1.1496750 -1.7099243 -1.1797031 0.1566733 -7.8069715 -1.0737160 -2.0119793 -4.1139956 4.4330235 -1.2758652 3.1150429 2.7287948 2.5350025 -2.5880568 -3.9493546 -4.2329831 -0.9009022 -1.1992402 -1.3862801 0.7898269 -0.0065094 0.1343703 -2.8108764 -2.4508607 -1.7588925 -0.9505473 -4.5713916 2.7234786 1.2066004 -6.5277948 -1.6817131 -2.5013561 0.0846555 0.2513826 -4.6376886 -2.3411672 17.3964386 0.1713744 -1.9989991 0.1480657 3.8648252 -5.0459437 -0.8938407 -5.8633790 -2.0405378 -1.3329630 5.9853778 6.6719122 -1.1445464 -5.0167899 -1.2430466 1.7764598 -1.8408002 -2.3094492 0.8520623 -3.4472344 -0.1520644 -0.1055683 -0.1620715 -2.2698007 -1.6643866 0.0329853 -2.7071888 -1.0964041 0.5958533 -0.7168954 -0.4603156 -1.7593189 2.4416792 0.0466532 3.7231929 3.2127678 -2.1606827 -5.4572344 -2.6519573 0.6136181 -1.9818363 -2.9261580 1.5199196 4.6160889 -0.1820941 -2.4462895 -0.9014858 -2.3945532 -0.8333814 11.2813244 -3.7990577 3.2450638 -1.1155677 0.1448388 -0.7377979 -1.5573632 5.1283131 -2.6279695 -1.2337456 13.3706913 0.9386309 -6.1976171 -0.5858429 -2.4867721 2.2112949 -1.6980158 -1.8465912 -4.1325960 -3.1451156 0.5698960 -3.2836118 -1.3480785 3.6182775 -2.3395159 -2.9552298 -1.8298386 -1.6134202 -1.1025958 10.9122601 -1.5436791 0.4552293 0.4213997 3.4568853 -2.6077478 0.2533064 9.6268673 -0.4560174 0.0695925 -0.0637555 -0.4627366 -2.8228827 0.1252968 0.3548351 -3.4941216 -2.9886959 0.6364447 -7.6216340 -0.5674004 -3.3542547 -5.9996214 7.5804844 -2.8071036 4.4350810 4.1115999 4.0005174 -3.3974664 -5.0158420 -6.0243044 -1.7842238 -1.0459830 -1.9590684 0.3104409 0.1957868 0.1225453 -3.7655156 -5.8028760 -2.7651596 -2.1519003 -7.0952368 2.1585016 0.9309350 -9.5660982 -3.3485022 -3.0183494 -1.3247929 0.1222625 -8.3491764 -4.0474257 23.0825577 -0.0663006 -3.6429245 -0.6810942 4.9443831 -8.1377096 0.2599112 -8.1166639 -2.3219514 -2.1941400 10.7709532 9.0823498 -0.9698123 -7.1476693 -2.8335230 2.4745226 -2.6378739 -3.8500841 -0.3382741 -6.1716156 -0.2250018 0.7586627 0.1147060 -3.6789951 -3.0082464 0.1378679 -3.8680389 -2.4874399 1.1265100 -1.2727864 -0.6488822 -2.1259987 3.7364583 0.9372647 6.3302708 5.7113161 -3.6432555 -7.3711743 -3.5985081 -2.0603659 -3.7140708 -3.4654891 2.5355132 9.0917072 -0.9089743 -5.1295137 -2.5563779 -2.4952981 -1.3097888 16.5665588 -6.4801679 4.8429575 -2.2194757 0.3003804 -0.1059695 -0.8236173 7.8861737 8.9410219 -1.8507965 20.7847519 1.3983192 -10.1457157 -0.1639930 -3.0054893 1.3211143 -3.8271832 -2.5421133 -3.0634646 -5.0263062 1.2937083 -4.4959812 -2.7500072 4.2754436 -3.6957834 -4.8227520 -2.5585852 -2.1351395 -1.6368395 14.3870077 -3.8125467 0.7919833 -0.5562091 6.1527009 -3.4117553 0.1726025 10.7109423 -0.6975074 0.2508960 -0.5464997 0.3108051 -3.2664609 0.2176043 0.4415336 -5.2056346 -4.3102579 1.1795805 -14.1436195 0.2899989 -3.0334847 -2.5674224 4.2309661 -1.2879308 3.2823927 3.3181267 -0.1006003 -3.6446445 -3.0051475 -2.3942449 -3.0512831 -2.1442561 -2.9252975 -3.5672584 1.3318684 0.7276833 -0.4083655 -12.1112700 0.9166607 0.6235031 -4.9578943 0.1914105 0.7690096 -4.3534384 4.8584528 -1.3262271 0.0026790 -0.1885049 1.7111390 0.1674289 8.2368946 -1.8626733 3.1004882 2.4444773 -4.7654190 -1.3305939 2.0034826 -8.3585148 -6.9039540 -1.8574725 6.0912623 4.7579083 -1.3786042 1.4323720 4.0060072 0.6900532 -3.1772447 1.3472577 -3.0543044 -2.6651535 1.1067311 0.6596080 0.2862993 -4.2474484 -5.9837198 -0.7265329 -3.6535671 5.3298788 0.8048372 1.4447294 1.7569230 -1.2974890 0.3672627 3.7609890 0.6822836 -0.4087760 -3.3415730 -5.4308701 -1.9233966 -2.7885635 0.3221548 -0.8895102 0.7470366 3.1860909 0.9329355 -3.1132154 -4.5324264 -2.4252055 -0.9111179 -4.4258709 -4.1820955 5.5033188 -1.6176481 2.5888021 -0.5214716 5.2906933 -0.3711995 4.5825529 0.0859024 11.8706741 2.9346311 -5.0253735 -0.2317255 -3.6686258 -0.3982014 -0.9827448 5.1727743 2.1438570 -2.6851578 3.6303160 -3.0144157 1.9284117 7.2156425 0.4288108 -3.7274528 2.4493611 -0.8812824 -2.2123106 10.5192595 -8.4528027 -0.4607370 -4.5987720 3.4372759 3.2118447 1.1812760 3.0807118 0.6385959 0.2742309 1.1296746 -4.5865607 0.6991711 -1.2245104 -1.1476408 0.2575733 -3.1139483 -0.1652721 -4.9612818 -0.0057384 -0.7817957 -1.9783796 2.8801448 -0.9610708 1.5986570 2.0195527 2.1559095 -1.3899006 0.6879083 -1.2493827 -0.6314457 0.1775072 -1.0522112 0.6031144 0.6672581 0.0381940 -1.6315621 -2.4866998 -0.2703335 -1.9152299 -2.8275812 1.5633500 -0.3215937 -2.5739930 -1.2107388 -2.1702063 -3.5720308 1.0625297 -2.2388649 -1.4058300 8.9471693 0.6676375 -1.2717595 0.2490340 2.5755141 -2.1315222 -0.4330081 -2.3450098 -0.1318879 -0.5080224 3.8766279 5.1129594 -0.3023133 -2.7214506 -0.7785212 1.6162055 -1.2032411 -1.5475320 1.1961092 -2.5619431 -0.0204413 0.4562539 0.3725534 -0.4325384 -1.6828321 0.4046833 -0.9992977 -0.5702732 0.3898455 -0.4431469 0.2332244 -1.1444504 1.3900063 0.7065439 1.8532790 -0.4483877 -0.2931247 -3.3868229 -1.1171242 0.6476770 -1.1478684 -0.2833024 0.9897872 2.5820019 0.1534739 -1.3628528 -1.3319290 -1.3409957 0.5578369 6.7553506 -1.8020194 1.9329182 -0.4759529 1.5543767 -0.7265103 1.3243015 2.2671933 -3.1888824 -0.3933637 6.6819310 -0.0308897 -1.1782404 -0.4711830 -1.2323706 1.6294608 -1.4364414 -2.0411274 -4.5569887 -1.4082191 1.6663637 -1.6023821 -1.3296721 1.7028962 -0.4967428 -1.9853680 0.2739904 -1.0105639 -1.1251305 7.7785301 -1.5065707 0.0625428 1.3370063 2.0075717 -1.0035866 -1.2005057 5.8756661 -0.1799227 1.1869922 -0.2044826 -0.1285797 -1.1127257 0.2319044 -1.7809244 -1.9320285 -1.1541566 0.2263358 -6.4684954 -0.7370279 -1.5418319 -3.6119845 5.2435489 -2.4346642 1.7659485 1.8561434 1.8442055 -2.5941913 -4.3194375 -3.2973537 -2.1824782 -1.3009775 -1.6599915 0.2325036 0.6171387 0.2396840 -3.0853169 -3.8491294 -3.7856019 -1.6678377 -6.8859859 2.3639517 -1.6568372 -6.5086775 -2.1571457 -2.4042330 0.0463833 0.8240029 -4.3348546 -3.7633634 16.5776291 -0.4443603 -2.5643387 -0.8293355 1.6963414 -6.6348472 -2.5594087 -5.2470164 -0.3699900 -1.8357505 7.6087680 7.6108875 -1.4796287 -6.0590754 -0.0471953 2.3978798 -3.3104444 -0.4208524 0.7775790 -4.0858579 0.5044460 -0.7781267 0.3402738 -0.9324952 -2.2163651 0.0277479 -3.2357686 -0.4507988 0.1477771 -1.6884327 0.1603859 -2.2791157 2.0367072 0.9660751 3.6489558 -11.3971949 -2.1022913 -6.5203667 -2.9705396 1.2001141 -4.5363612 -1.4759688 1.3431116 5.3235002 -0.7864610 -2.7434673 -1.1296316 -2.3278434 0.2569984 11.1662493 -3.8537133 1.5872560 -1.9418207 1.4693288 -1.7704043 -0.1266812 3.5911460 10.0739241 -1.0565983 10.1327591 -0.0065165 -1.8580968 -0.2108265 -7.4671078 3.4014506 -1.8935237 1.8374546 -5.9424539 -2.6321678 2.4432077 -3.5210986 -2.2331583 5.9486198 -2.7198367 -2.8292930 -1.6713918 -1.7491750 -1.3235344 13.9732838 -2.2884014 -0.3451310 1.9443045 3.6918781 -0.4630643 -0.1503979 8.5619888 -2.2689645 0.2999951 -0.2632105 0.4791972 -3.2442582 0.3630761 -0.6741014 -4.3620219 -2.6587110 0.0459251 -3.2296605 -5.0676546 -1.8874445 -5.4286137 8.6625328 -4.1303935 3.3761432 3.9544408 2.8828280 -3.9158416 -6.4649472 -6.6412745 0.3525147 -2.5165336 -2.9646556 1.7823644 -0.4802416 0.1209774 -5.8172636 -5.7871051 -6.5589404 -1.0984523 -8.8098164 2.2918777 -4.1907778 -8.2576923 -4.6481705 -6.6132097 -0.8557785 1.6062579 -12.6584826 -4.0016632 14.0384483 -2.9940407 -5.1366310 -0.8101269 5.0579529 -9.6149368 -2.7814276 -9.6602917 -2.3232644 -2.9614217 12.2533531 8.3707991 -2.8910277 -9.5990229 -2.0397458 3.5589943 -6.2347379 -0.2963892 -0.3040680 -5.5487947 0.8284557 -2.8302212 0.6347228 -3.7105069 -4.2787724 -0.2681105 -4.6654863 -1.3719198 -0.0709761 -2.2006774 -0.6294606 -3.4606791 3.2098825 0.7484924 5.5796161 -12.6324854 -2.7590413 -7.7543945 -5.3077321 6.6518106 -4.2000551 -6.3727002 2.9179506 8.6291599 -1.0592722 -4.6957555 -2.0819249 -3.1357563 0.2191800 11.4875402 -7.5096049 4.6687312 -3.5987599 1.3539579 -4.7218690 -0.5702111 5.1060290 0.4571207 -1.6527787 20.8427296 0.7212995 -3.9116261 -0.3913404 -9.3485355 2.7965336 -4.6907444 3.1562631 -8.7052641 -5.3866472 1.4561981 -5.5392966 -3.0387557 6.1550226 -1.7866868 -3.9386134 -4.1346588 -1.6330096 -2.0620203 16.1956444 -5.0153627 -0.1392460 -0.1529435 6.4170146 -3.0210698 0.1354028 10.4485722 -3.7265859 2.1527359 -0.7554051 0.1655481 -3.1586623 0.4775087 -3.3850970 -5.0652933 -3.7277572 0.7178156 -18.3866444 3.4079340 7.7118039 -1.5964484 1.6368269 -0.9136374 1.2410663 -2.8758528 -3.1300609 -9.5763884 -2.1849070 -1.1039536 4.3035645 0.1003124 -1.7507485 1.0826985 3.9084356 2.6077113 4.1403875 0.4505263 0.7250051 5.0909033 -2.1398714 -3.1516221 0.4859112 -2.7329092 3.7113962 0.3548640 0.2740543 -1.3964221 -0.6771075 -5.9052081 0.2139346 -2.2462311 -1.7039521 3.9822676 -1.3710320 1.5588593 -0.0950718 -1.3189927 -2.2804058 0.2585067 7.9970198 0.5602651 -2.5255158 -0.8962069 -0.8565187 2.9324796 -1.6516545 4.5927057 1.8696967 -2.3496597 5.0067420 -1.8119229 -4.0472217 2.7195702 -3.8652947 -3.5374939 -6.4515343 2.2566617 -0.6682488 1.5007855 0.0341650 2.7015939 1.1722749 -1.4284947 -2.0108056 0.0920673 -5.0530286 -0.5735354 -0.8141950 -0.9618810 1.3443907 1.2024869 1.8004357 -0.3485385 1.0231365 -5.6714673 -0.0994388 -0.3076048 -4.4789019 2.2808242 1.1435140 -2.9323182 -4.0164304 -6.4901867 0.7927988 1.6626335 -0.6842564 1.6278615 1.9653955 3.9710538 3.7702496 -2.3358183 1.0487871 2.8633163 8.0984125 5.9495182 3.3469484 0.9070965 1.8625382 -2.8941414 -2.6739395 -0.0908832 0.7952811 4.7833977 -5.1150403 2.4751790 -1.6197016 -2.0286069 4.2426877 -4.3182063 0.7632951 -3.8946598 0.9496059 -1.9107286 -1.3594341 0.0197418 2.6820574 -1.8983330 -0.8283803 -1.4357874 -3.4649003 -4.0819416 -0.7012013 0.8780485 -2.3920565 -0.5244139 0.5486791 -0.3986369 -1.2180368 -1.4621316 3.3845186 -1.0743929 1.2942127 2.5948052 1.9535439 -1.5307052 0.6080959 -0.7881610 -0.5192321 0.2927283 -0.9717040 0.5792367 0.5649887 0.4846095 -1.2780899 -2.8246970 0.0311460 -1.5854313 -2.7451556 1.6558533 -0.4150248 -2.3121755 -0.5554506 -1.8533442 -5.3597121 1.4463972 -3.1062758 -0.9803216 8.2309856 0.4230634 -1.1601752 0.5290968 2.6270134 -1.8297710 0.8782323 -2.6801145 -1.1657735 -0.7906092 4.8640103 5.1087165 -0.6199027 -3.6425619 0.1225791 2.1048326 -1.4595609 -0.0246305 1.3566828 -3.0876076 0.1192216 0.4440975 0.5316312 -0.1578939 -1.9577210 0.8394854 -0.7020980 -0.6806440 0.0497778 -0.4361419 0.2429671 -0.8171217 1.3299595 1.4061245 1.6544504 0.2673452 -0.6011989 -3.2653775 -1.4659750 1.5342357 -1.1462768 0.0023846 0.5697848 1.8848981 -0.1038664 -1.1317582 -1.1823850 -1.4630189 1.0280552 6.2210307 -1.5844457 1.7085028 -0.4003772 2.3372583 -1.3140945 1.6443915 2.1198840 -9.5165167 0.0371626 6.1132841 -0.1137821 -1.5271853 -0.7903438 -0.2399897 1.6483126 -2.0705972 -0.1151422 -5.0950890 -1.2375134 2.0638578 -2.0907295 -1.6537681 3.2044969 -0.4342676 -1.9148418 -0.8931174 -1.3239063 -1.4249717 8.4515438 -1.4069537 0.1066109 0.7261916 2.2557297 0.2673610 -1.2890041 5.1465068 -0.4372946 1.9857007 0.3177801 -0.3256789 -0.9089587 0.3303387 -1.8391122 -1.5935955 -0.8544984 -0.0020284 -8.3699846 -2.2766614 -1.7329335 -4.9355187 4.8943667 -2.7702463 1.3306986 5.0035830 -0.4248218 -3.9665487 -4.4875050 -1.2407041 -1.3391584 -1.3620000 -1.9358202 1.3433801 0.8175725 -1.0913699 -3.8370564 0.4594349 -5.5569806 -1.5036842 -5.6903014 0.8293371 -1.8068625 -7.3374443 -2.3960156 -5.0293250 -0.0343967 0.9021611 -3.0084865 -2.6698129 13.5377836 -1.8215809 -3.9300342 -3.3021135 1.4150563 -8.7025509 -3.1976373 -5.1882710 -2.2404854 -2.1737385 7.8827128 7.0018725 -1.8700602 -10.1402330 0.6673827 3.9397848 -2.4443760 0.3368603 -0.9524596 -8.3478451 0.7560172 -5.3956800 -0.1587652 0.4331663 -4.3383303 0.5354034 -4.0036936 0.0661702 -0.5803206 -0.9800503 -0.7864363 -3.1805105 1.6976007 -2.5418718 1.8340588 -6.1295552 -1.9958837 -7.1088109 -3.9513915 -0.1160142 -5.2400231 -1.0408983 0.4673231 1.7658889 -0.8865833 -4.3628178 -3.4383962 -3.4959188 0.0031621 14.5345526 -5.6523604 0.5556644 0.0130838 1.4361584 -2.8198929 0.8680922 4.8593512 1.4020041 0.2770410 13.5378294 -1.1826422 -3.6016505 -1.6046596 -4.7729845 -4.9733267 -2.0380921 -0.2394130 -4.2136235 -3.1076405 0.5382431 -2.8987951 -3.5180035 1.6485951 -2.6606538 -4.0509748 -3.1943536 -2.3716774 -1.3482442 17.4643841 -1.0293176 -1.1125331 0.7876008 2.8507900 -2.5202549 -1.6939771 7.5618577 -2.9072433 -0.3355076 0.9064534 -1.4584502 -2.5726633 0.6284050 -2.7691844 -3.3187573 -3.0040858 1.1947541 -6.6331701 -2.0597360 -2.2023528 -6.6995668 9.2033281 -4.2969456 2.7393799 7.3582549 0.6985345 -5.2048078 -6.3923383 -2.9201961 -1.8957496 -1.9246280 -2.8076229 2.0744247 1.1294085 -1.1641411 -4.6583939 -3.2309985 -6.4758601 -1.4581329 -9.1518269 0.2983368 -2.7033100 -10.2982063 -3.7560852 -6.0307550 -0.7115367 1.5566998 -11.9852924 -3.7393038 21.9242916 -2.0155807 -6.3332777 -2.7840555 3.0477562 -10.7073755 -2.7249191 -7.5437155 -2.2466898 -3.3794713 14.3882418 9.9571400 -2.4246380 -15.6527510 -0.1905557 5.8004756 -4.4526310 -0.0328609 -1.0105356 -11.0724754 0.5798471 -5.3499551 0.4938264 0.6039385 -6.3571215 1.0905032 -5.3090277 -0.7807353 -0.1216313 -1.8168272 -0.8140053 -4.1406474 2.3851030 -0.9196357 3.1796296 -5.9771433 -3.3103552 -9.2849836 -4.9948134 0.6966526 -6.9996099 -2.1690698 0.4857951 4.7262926 -1.7931559 -6.4332409 -4.0352736 -3.8187203 0.4037870 19.6662712 -9.4612303 2.7418776 -1.3130615 3.0496194 -2.6831717 2.4359055 6.3863792 7.6406569 0.5261948 19.0449791 -1.2397666 -5.2690225 -1.1897606 -5.9834275 -5.7018890 -4.3105388 -0.0642166 -16.6466942 -4.6738052 2.3657877 -4.0392632 -4.9401364 3.6914656 -3.6334076 -5.3937306 -4.0917501 -2.6177223 -2.6040471 26.5451469 -2.9450986 -1.3300294 -0.1414628 6.1116805 -2.4494815 -1.2929642 11.5087509 -3.7327647 0.8156253 0.8986682 -1.1166924 -4.4782367 1.1239355 -4.5173821 -4.4702630 -4.2716703 1.1189153 -15.6427250 -0.4228987 -0.2888963 -3.7499466 5.9484463 -2.8897295 1.8923004 4.5299702 0.9785928 -2.0871139 -5.7689548 -1.0935861 -2.2887065 -1.5296630 -2.2300324 1.6070793 0.1285913 -0.9007547 -3.6943398 -10.8095818 -5.3704433 -1.6403170 -9.8099108 -13.8829489 -2.4307647 -4.8835015 -3.6586998 -1.8679518 -1.8234215 -1.8547076 -12.8194447 -1.7030392 17.8127327 -0.4419957 -4.4914961 1.2028797 -4.2532296 -3.8681784 -3.2545917 -5.6028318 -1.6586652 -2.7591236 8.8972092 6.9999270 -1.5926259 -16.9381428 -2.7891526 3.2136114 -4.0374842 -0.2238972 -1.7185606 -6.6008554 0.0089517 -0.8997922 1.3665463 -0.6428285 -4.2709289 0.0520188 -4.1199274 -2.5856886 0.7003202 -1.1860894 0.4508312 -3.8432057 0.3856676 0.3616045 2.0553868 3.9980803 -3.0305808 -4.7981367 -2.6841607 2.6116729 -3.2065299 -2.8961174 -1.3174824 4.5605516 -2.6461926 -3.9928265 -0.8990294 -3.4104738 0.7813778 6.1555281 -7.3396888 3.0953019 -2.1176093 2.2628074 -0.6513099 3.6340177 1.0188642 4.7131243 0.3576383 10.5146046 0.0361383 -3.2090840 -0.2514152 -5.2997923 -1.3476058 -10.2556782 0.3911209 -12.9351692 -3.9312966 4.3168354 -1.6542041 -0.4334123 4.3744607 -1.2055986 -1.8654956 -1.6818969 -2.0186582 -3.1025150 12.8527832 -2.8143010 -2.2818027 -2.3025947 4.6086178 0.6512067 0.0860390 7.3470430 -2.6932819 0.7130824 1.4870338 1.1869210 -4.2211666 0.7709039 -6.3275332 -2.3100433 0.8439249 -0.8354936 12.7357244 -0.4644617 -0.5692213 -1.5253638 3.5883849 -0.9879371 0.8621552 3.4009478 1.8432642 -1.9062464 0.7055243 -0.3099004 -0.8577902 0.2805585 -1.3477352 0.4899540 0.6554133 0.2416575 -1.0022602 -2.8713882 0.3600103 -1.8339890 -2.9319923 1.2778002 -0.4897657 -2.6924961 -0.0622184 -1.8807964 -6.2141171 1.5439479 -3.0221605 -1.7891400 6.9751177 -0.1501322 -1.4135674 0.1166398 2.2811179 -2.2577524 0.7355219 -3.3574040 -1.8499143 -0.9438396 5.1899652 5.8282652 -0.4682174 -4.6119485 0.1893639 2.5870295 -1.4281129 -0.1726893 0.8350344 -4.2075973 -0.0551484 0.6696492 0.7519488 0.4795762 -2.3142407 0.3793457 -1.5047946 -0.5002041 -0.0576606 -0.7644807 0.8618680 -0.6511126 1.0364366 1.7672895 1.3285941 0.2728908 -0.6572354 -4.5651565 -1.2650777 1.7750549 -1.0257294 0.3233609 0.0859277 1.1764067 -0.1612825 -2.0444927 -2.9281678 -1.8366809 1.3952930 5.4519305 -2.4223840 1.8135844 -0.4747945 2.7984204 -0.8590464 0.9244695 1.5978580 -16.0983181 0.0726564 4.7115884 -0.5346873 -1.3686991 -0.5636112 -0.0702000 1.2434214 -2.2688785 -0.9924254 -5.1889596 -1.6803056 2.5300584 -1.2748580 -1.5914367 1.5039235 -0.7781647 -1.9368508 1.3484564 -1.4526383 -1.7182066 10.0688219 -0.9812121 -0.0645758 -0.0666430 2.2133830 0.2148946 -1.0070850 4.5239449 -0.7333699 2.4154978 0.0609130 -0.2623657 -1.7227718 0.3020977 -3.1808929 -1.4216458 -1.0137923 -0.1215981 -7.9836407 -3.3617091 -1.6053551 -4.8769531 4.4176059 -3.4118011 0.3360356 4.3860917 -1.8086840 -4.6727242 -5.3346486 0.1155576 -1.8737464 -2.2923474 -1.6429851 0.6382215 0.5836230 -1.2744727 -3.7118826 -0.6220352 -6.6411176 -1.7634189 -5.9847569 -3.1765034 -2.5363145 -7.2066255 -1.4735388 -5.8017402 -0.3107986 -0.3711565 -6.0648575 -3.3166482 14.2137270 -3.7863326 -5.2888813 -3.8403041 -1.0693543 -8.8370914 -3.1779845 -5.1874266 -3.9619613 -3.3718932 7.2591081 8.5072966 -1.7084892 -9.2039585 1.5725771 3.0825145 -4.0189371 -0.6759858 -2.5761132 -9.1323824 0.4005845 -4.5209937 0.5640508 -0.3067599 -5.1114750 0.0538527 -5.0757976 -0.9373584 -0.9301056 -1.6994046 -0.2813425 -1.8292859 -0.0456211 -2.0528171 -0.2339831 -9.3248243 -2.9022443 -9.0027514 -4.2371607 1.4899485 -2.9908841 -1.8221815 0.5911616 -1.9647787 0.0817592 -6.1795678 -1.6934913 -4.9593692 0.5952925 13.6761847 -7.5637021 -0.2197774 -0.6402204 2.0928946 -3.8311937 0.8349150 4.9166775 -1.1158810 0.5211582 13.6385622 -1.5308462 -3.7281215 -1.9720659 -3.3557236 -6.1468239 -5.2132001 -3.0798516 -3.4924762 -4.1753573 1.2773112 -2.9559813 -4.1629596 -5.4525800 -2.9002230 -3.5965180 -0.5381134 -2.8026550 -1.7217722 18.8159618 -1.1186377 -1.9422529 0.5764358 0.8924987 -4.5654778 -1.1188161 8.8025017 -4.1600590 -0.3981874 -0.1906841 -1.8049244 -3.3310857 0.5120080 -3.4290323 -2.2042820 -2.9061551 0.3426093 -3.8684464 -3.8826101 -0.8914076 -6.0929456 9.0193863 -4.2337317 2.1588669 8.1291666 -1.5068958 -5.8337493 -8.2863045 -2.9247441 -2.6402450 -5.0407939 -3.1236651 1.6597512 0.4638813 -1.3288635 -5.4484315 -5.1305032 -7.6330948 -2.2770679 -8.9669380 -3.6661689 -4.3172817 -9.9855518 -4.7828946 -6.1664653 0.1535324 -0.8027661 -6.5202065 -4.8359361 15.5464830 -3.9767342 -8.6558428 -1.8697926 -2.4175370 -10.7356892 -1.7788738 -7.4985013 -3.2287760 -4.7650170 13.6520872 8.9269361 -3.0760908 -12.1792393 -2.7556732 6.1116047 -7.3524051 -0.0451721 -3.3908863 -16.7100925 -0.3600423 -5.6449184 1.5212636 -0.1867257 -8.3361502 0.2992773 -5.3568854 -2.0445004 -1.0811533 -2.8353307 -0.5818922 -2.9819188 0.8068091 -1.8826952 1.4824482 -4.0996265 -4.7184596 -12.6431808 -6.4388719 1.7116889 -7.2778540 -4.3723650 0.7916590 3.1766047 0.3428885 -7.5950317 -1.7590504 -6.0861449 2.5126832 10.7156410 -11.3347073 3.5890656 -2.2397714 4.9574738 -5.2107368 5.1461368 3.3687639 -6.6350012 0.2462959 14.3943357 -1.1155633 -4.7180033 -0.7072755 -3.0972319 -6.4017177 -7.4304290 -5.5379257 -7.8242817 -6.9342189 4.2140036 -4.6230283 -4.1224909 -5.9461336 -4.8191428 -4.4744563 0.5424284 -2.8404064 -3.3967290 24.8688469 -0.9123011 -1.3158242 -0.3683046 5.1140738 0.1021842 -2.0242622 0.1109290 -5.7776461 1.4264491 -0.3939926 -1.7846812 -4.4280024 0.7323539 -4.7289066 -3.7826920 -2.5449014 0.4301001 -9.7572613 0.7648978 -2.1432295 -0.8253309 1.8087167 -1.3589799 0.2708256 4.4360847 1.0596759 -5.5844970 -0.2623924 -3.6017551 -0.3247374 -0.7385067 -0.3712046 3.8521926 0.5223816 1.8378763 5.7170281 1.0143940 5.9506974 0.2008295 -6.3159442 -1.5964606 2.9796031 -1.3435374 2.4904563 0.4903227 1.4405419 5.8882813 0.5082260 -1.0262836 0.9216844 0.0718917 -0.0237154 0.8760444 0.3964721 -1.7898145 0.8819988 -6.9027076 -0.9178994 -2.7127190 2.0545263 0.4082837 -1.5779667 0.5625481 0.1907545 6.1399283 -0.3556364 -0.6152388 -5.1548576 -3.0663083 -0.4371068 1.4902629 3.6134913 0.0668900 -2.8146362 4.6717343 -5.3180175 2.6566720 2.8450570 2.5674274 -1.8912090 1.3317124 0.5606355 1.0288155 -2.4882326 -0.0528400 -2.5697398 -2.3377218 3.7269061 -0.8906230 -1.5374959 -0.0824660 0.4829905 -2.8625851 -0.9045956 -7.8581533 -0.0760670 -1.1363355 -0.7168827 0.1196259 -2.7251346 -0.6158944 -4.1502562 2.9177320 0.8045833 -4.4852509 3.9330542 -0.0271116 -3.6097164 2.2541125 -0.9945354 0.8390892 -1.0419927 -0.5681860 0.3448354 -2.2197349 0.2927534 -0.2194719 -1.9338038 4.3902178 -0.6934013 -4.8192592 1.7690037 0.6178483 -3.4407971 -4.4317198 3.2937851 -3.3063352 1.2268890 -1.7720202 -3.4576743 -1.9763600 2.5374510 -2.0232923 1.7779101 0.3620627 -0.2918369 -0.7959973 1.2130337 -0.9171096 -0.5488802 3.7078779 -1.4296961 0.3634878 -0.5214145 1.5188954 0.9464998 -0.2450925 -0.6334121 -1.2990818 3.5445907 -0.9222157 0.1633316 3.8452606 1.4181124 -1.8752248 0.0629237 -0.0491596 -0.5585192 -0.7880797 -1.5001173 1.1442919 0.7750312 0.2561884 -1.2315593 -2.9326177 -0.0166407 -2.0781772 -3.1777256 1.0427936 -0.2387619 -2.4074483 -0.2877462 -2.2091670 -7.7864423 1.9329756 -3.5985022 -1.5397915 8.1535530 1.4458928 -0.7131612 0.0865907 2.4253740 -2.6193368 0.9005257 -3.3164771 -1.4058858 -1.0627111 5.4638557 6.1654844 -0.4446243 -4.9597654 0.1370903 2.9559906 -2.8134549 0.0260612 1.0590228 -5.2936039 -0.0178613 0.8924206 1.0484552 0.4424891 -2.7551055 0.4874156 -1.4899286 -0.7827733 -0.0319042 -0.7542976 0.9612242 -0.5711818 1.0336033 1.7413492 0.9873876 0.2035193 -1.0045952 -4.3384771 -1.5734473 2.0260365 -0.8184867 0.3874270 0.1942854 0.4158397 -0.2659539 -2.3390939 -0.8035588 -2.1805964 2.0529742 5.6413112 -2.6508968 1.8033599 -0.6492109 3.5641737 -1.7162666 1.3061831 1.1535403 -23.0743389 0.1893698 4.7460527 -0.5546890 -1.4078660 -0.8121939 0.4752738 1.1297193 -3.0861247 -0.3815474 -4.7296147 -1.7248578 3.1054263 -1.3896816 -1.8505136 1.4987265 -0.6307309 -1.8195796 0.9716937 -1.8395813 -2.0249331 11.0662985 -0.9370441 -0.1924743 -0.0205527 1.8405734 -0.0385816 -1.1290796 3.7434113 -1.1893092 2.4644158 -0.2587872 -0.0997021 -1.9833272 0.0518652 -3.3888073 -1.1922362 -0.9162145 -0.3031140 -7.4289961 -1.4791478 -0.4574676 -5.1323581 3.8479030 -2.9886706 -0.9156907 5.3174062 -1.3624343 -5.0180020 -6.5724602 0.2163609 -2.8813694 -2.7215095 -1.0108430 0.2660186 0.5084150 -1.5850625 -3.6701474 -2.0469239 -7.0325031 -1.4841894 -5.5068398 -2.7225249 -2.4685938 -6.8624825 0.7287626 -6.5926790 -0.7695844 -0.1322904 -5.5291424 -4.1732340 18.1786060 -0.6535708 -5.6770315 -4.9919348 -1.6875550 -9.3458385 -3.1912911 -5.4414392 -3.8212910 -3.5759664 6.9800749 11.1198463 -2.2392745 -10.0888271 2.0295951 3.7545934 -4.6247363 -0.4081891 -2.5495179 -8.7021790 0.1590846 -5.2260714 0.2354160 0.8869839 -6.0544205 0.1127788 -5.5074162 -2.0515921 -1.4876947 -2.0941663 -0.5988005 -2.7037833 -0.3906031 -1.5963296 -1.0494133 -9.0805836 -3.0370545 -10.0065718 -4.8623061 -1.9709464 -3.0537686 -2.2760212 0.6741389 -3.3209901 -1.2033764 -7.1597962 -0.1611334 -5.5352635 0.9549858 14.7636499 -7.6985898 -1.5995382 -0.9975221 2.7379398 -3.2824326 3.2000084 6.6272354 -0.8435292 1.0280671 13.6012077 -2.5101795 -4.5514097 -3.4150069 -1.8998840 -7.3475146 -6.1354356 -2.3321333 -2.9718649 -4.5205908 1.8811537 -1.9810227 -6.5088720 -5.7543221 -3.2040679 -3.9612083 -0.6569991 -3.3453109 -1.9299896 19.5614185 -1.1141286 -2.7268789 -1.0662067 -0.1553040 -3.1749043 -1.6884986 8.5627155 -4.9773374 1.3900026 -0.8096083 -1.3779036 -3.6850200 0.3314359 -2.5818050 -2.4170272 -2.3947010 1.1785543 -4.4310732 -1.9860691 -1.4415594 -6.6056395 9.7570944 -3.1571083 0.6515324 7.7706857 0.1435280 -7.3398752 -10.9970636 0.8886783 -2.3562641 -4.9792361 -2.4662192 1.6706258 1.3562815 -1.8431728 -3.6577504 -3.1480463 -6.9700651 -2.1236308 -9.5022011 -2.3362758 -1.8867775 -10.1376543 1.0422711 -7.3903990 -1.5414085 1.6198533 -11.6918478 -4.8217010 18.5472279 0.9706546 -6.4674206 -4.8530025 0.0582923 -14.2893381 -2.6843839 -7.5231194 -4.3229470 -5.6422739 16.1509018 15.6971874 -1.1387948 -17.3546238 3.0878913 6.0095010 -9.0369186 -0.8878853 -1.0389346 -13.0682058 -0.9308519 -5.2229176 1.1944258 2.5638177 -8.7269335 1.1541641 -6.8339562 -2.8102322 -0.1394773 -3.3812928 -1.7466174 -3.6864698 -0.1398592 -1.1431233 -0.7181883 -5.0332766 -5.3536520 -15.8604441 -6.2883687 3.0554056 -3.6105721 -2.3108878 -0.0930874 -2.0521514 -1.8144573 -8.7046566 2.1392386 -5.1772599 2.3089395 21.8786697 -11.6276255 0.8783597 -2.6609988 5.3936095 -3.5744102 4.2034469 2.7489624 6.9362612 2.0158341 17.2009315 -2.9707098 -6.3020201 -4.1770482 -2.3193600 -6.9658108 -7.8376517 -4.7641277 -12.1837454 -6.6387253 4.2717643 -4.6095076 -8.1558075 -1.7368459 -5.1945114 -6.1296873 0.6378044 -4.9049273 -4.6155562 36.1032486 -2.7886076 -3.0192800 -2.9791632 4.0423942 -3.3031781 -0.8253698 -0.5149107 -6.3556790 3.9816706 -0.6429892 -1.9264987 -5.8842263 2.3667006 -5.9625225 -3.7442513 -2.4534400 1.1035705 -10.9584761 6.0370669 2.5654578 -2.5381851 1.0037366 -2.8808672 -2.9194603 2.8575759 -10.5484076 -6.2054186 -5.4339151 -1.7676411 -3.5867116 -1.3705361 -3.6209648 5.3549142 0.8712630 -1.5413289 4.0126305 -1.6860065 2.0630989 1.1685704 -8.3079967 -7.5812197 -2.8010974 -6.6179795 5.0744572 -4.7869039 -4.6871204 -0.6259347 -1.3273280 -6.1551991 -0.3734461 -5.1332321 -0.2860515 -2.5854952 -1.7997919 -7.4248204 -4.9498615 -3.8090112 -1.2619860 -3.1493306 1.9636449 5.8116188 -9.9407034 -1.0179712 -2.7168624 2.4424777 -2.7666113 -3.3328481 -5.3584814 -1.4828563 -3.6392198 -2.3066378 1.7235779 -0.7398775 -5.5892358 2.1396601 -8.8457174 -0.8448619 -8.8553429 -4.3392353 -2.9385333 0.7912636 2.2997677 -3.7238486 -1.5644544 -0.3772891 -0.7203812 -10.8582850 0.5550933 -0.9984784 -11.0367966 4.4739714 4.2368889 -7.0004325 -4.2020087 -5.1473899 -1.4901899 -5.8585777 -1.1486361 2.8371053 -6.9426398 -2.5545657 -5.0343370 -1.5784657 2.3847528 -2.4040568 -5.2963834 -0.5801260 2.6787484 6.2603226 0.7223253 0.5024910 5.2634034 -0.1502852 0.4736235 -1.1566907 -2.5251799 -2.8870511 -0.0550422 -2.3414938 -0.9512589 -2.6132791 -2.5562680 -3.9438596 0.2531199 -3.2257960 -0.6068581 -2.6473620 -0.5981241 1.0288208 -4.7926111 -2.2031689 4.7841682 -9.9544430 1.3910056 -0.8236285 -1.1494168 -6.2411380 -3.1067865 1.1318146 -11.4719152 3.2123787 -2.9379752 -0.3244016 -1.7083583 8.9520416 1.4698699 -0.6348833 -0.3058933 -1.2394854 3.0601909 -0.9881070 -0.6333902 3.6873889 1.1187767 -2.1676090 -0.3478614 0.6451832 -1.0919956 -1.2875818 -1.9784369 0.6882443 0.7161142 0.1380600 -1.0980358 -3.2984395 0.0629863 -1.5374527 -3.8641100 1.5192215 -0.5549093 -2.5652666 0.3269742 -2.0222037 -9.5949383 1.9850389 -3.9350362 -1.3899871 7.1653543 1.0070276 -1.4093105 0.0252853 1.8258214 -2.8572240 1.0374395 -2.9556684 -1.8448291 -1.5630454 4.8780479 6.1891880 -0.4553914 -5.5116448 0.4970019 2.8415360 -3.7244759 0.3148729 0.6742109 -6.2978449 -0.2440683 0.8422586 1.1837543 0.8438379 -3.1182251 0.3828470 -1.7769444 -1.2752069 -0.2347291 -0.7023183 0.8955388 -0.3866455 0.7167395 2.0866125 0.5740560 -0.0574379 -0.9916264 -5.0102329 -1.5205318 2.5912721 -1.0402231 0.4028984 -0.2289554 -0.6434121 0.3259496 -2.4029176 -3.8504329 -2.7985697 2.3949108 5.3381872 -2.9910412 0.8411098 -0.5082126 3.9996796 -1.8237468 1.8508983 0.5799348 -22.8975677 0.3719005 2.9399409 -0.8975527 -1.5705453 -1.2884908 0.0814439 0.7312013 -4.0747375 -0.2371005 -5.2287855 -1.9835937 3.3879166 -1.4610877 -2.2519045 1.6901156 -0.9507205 -1.7671673 0.5560181 -1.7583624 -2.4711912 11.5391140 -0.9202981 -0.7102763 -0.6960838 1.3361282 0.9470969 -1.0467553 3.0519943 -1.5595536 2.6536560 -0.0185380 -0.3241633 -1.8688300 0.1109303 -4.8716111 -1.2453218 -0.8096530 -0.6690997 -5.9877896 -3.5335491 -0.7841381 -4.3952031 2.9566464 -3.8837283 -2.8344252 4.5543242 -3.3093266 -5.2923503 -7.7665024 1.8696560 -4.2638483 -4.4121575 -1.0708923 0.2902890 -0.5553467 -1.5979919 -2.8670743 -5.0945706 -7.9837856 -1.3760170 -6.7276468 -0.7389362 -3.2089009 -7.0788074 1.2120532 -6.1182871 0.3944847 0.5466843 -4.0269504 -4.6483970 19.2595634 -2.1498456 -6.4134016 -4.6110682 -1.0639592 -8.4121513 -3.5866621 -5.5733981 -3.5555463 -5.0503511 6.2788863 11.3195629 -1.9156685 -9.3820467 1.8146474 2.9858410 -8.5193281 -0.2939431 -3.1354411 -7.6774168 -0.0434617 -4.5749793 0.8949735 1.7150602 -6.7497606 -0.1049921 -4.9942937 -2.6070173 -1.4892242 -2.6003563 -1.1368626 -2.3520639 -0.4271722 -0.6402426 -1.6728535 -9.1328096 -4.0377197 -11.5419855 -5.7501836 -2.4818759 -3.9975910 -2.6121225 0.2656648 -3.9066498 0.1741085 -7.9024153 1.3909378 -6.0289097 1.9149263 15.2636671 -9.1479149 -3.8528235 -0.6921602 4.1118841 -4.7846365 1.7006992 7.8036256 -3.5011501 1.5227724 12.6563091 -2.7635562 -4.0525537 -4.2034760 0.1911991 -8.9678402 -6.4314599 -1.8545080 -5.2829843 -5.5904884 2.8471992 -2.5841215 -7.6428728 -5.7288570 -4.1306248 -2.9698756 -1.1012092 -2.6113405 -2.4932914 21.5645390 -0.0309796 -4.0114517 -2.6327233 -1.2279115 -3.9646218 -0.4722632 9.1848783 -6.0398989 1.3835332 -0.8226073 -1.6179634 -4.5596194 0.3564509 -4.3115993 -2.1621208 -1.7030090 1.3079332 -5.1668868 -4.0710692 -1.1495392 -5.6443386 8.4736204 -4.9826155 -2.5607703 7.8512878 -2.5490718 -7.6713848 -12.6051636 1.4129288 -4.2612224 -5.0316591 -2.0616415 0.7742215 -2.1684759 -1.7084004 -3.9615703 -10.4331436 -7.6688848 -2.2178667 -9.4461966 -0.9522504 -4.0630484 -10.3770428 1.6366826 -9.6523314 1.1509464 2.5054967 -6.5212135 -7.9537740 5.1644073 -1.3874117 -5.4506402 -4.8265224 -1.5955426 -14.0944309 -3.2545154 -9.0818434 -1.5955487 -6.8730783 14.1642494 18.9498482 -1.5140148 -14.7768869 -1.4274783 4.8471484 -15.7752218 -0.0123049 -3.9176221 -18.5478897 -0.0941482 -5.7258854 1.4285760 2.7804861 -10.5458097 -0.1225289 -6.3416500 -3.7232821 -0.4895588 -6.4828892 -1.5446223 -2.9584434 0.4212367 -0.8170770 -1.3136179 1.2623703 -5.8694868 -13.7694139 -7.5779920 0.1078900 -6.3819866 -3.4145615 1.0560182 -4.0429196 0.5488963 -10.5634022 -0.0892797 -6.2459865 3.6963077 22.3219337 -14.6448278 -3.6832182 -1.5217535 8.0233402 -8.4549313 4.1871371 6.3932571 12.7559166 3.1781082 16.7871914 -2.8217821 -5.8034267 -3.3834512 -0.0505235 -11.2590685 -9.9907875 -6.5383778 -0.3562675 -7.4389076 5.9160457 -4.2263274 -12.6216230 -5.5397034 -5.6268554 -4.7128878 1.1469101 -4.7595687 -3.9737680 35.8212433 0.3806801 -4.5155373 -4.2568421 3.4495735 -2.2237682 -1.5852330 12.0483255 -7.4291539 3.7394056 -0.9493451 -1.5888199 -5.1610832 0.6973897 -7.5975962 -2.4067013 -2.5569808 1.6797028 -4.0236130 -6.1196866 -4.8721008 -2.7221127 6.5063930 -6.2996559 4.1739845 11.5405350 -9.7261438 -0.4902499 2.0496004 -1.1839789 2.9055650 -12.8476000 -6.2366352 6.9978824 1.0882261 1.2662219 -9.4207306 -2.2288084 -10.2035379 4.0478725 -10.5545835 -5.9470735 -4.2244763 1.6154263 -6.9757285 -5.7017379 -1.6927416 -2.7022936 -6.7202811 -2.6179869 -5.1257892 -15.7649946 -0.3114539 1.8077686 -1.1179127 -4.3122296 -2.6700125 1.0039073 -7.3864241 -4.3694439 15.9825869 -1.6692157 -9.2238770 7.1305780 1.5542336 6.0909104 -5.0978179 -0.2670014 -1.5815972 -3.3407583 -3.2227244 -0.1571825 3.8111444 6.9349604 -8.8925686 2.5457401 -8.6109104 -9.4273310 -2.8290544 -5.5063415 1.5720724 -2.3466721 1.6125292 1.9104998 5.9780903 1.3478354 -3.7637134 -5.9456916 2.6767311 -8.3211823 -10.6527548 3.3308125 3.2978003 7.5950456 0.5996218 -2.9257810 0.2162415 -5.4530473 -4.4057980 -8.6137266 0.3423584 4.0999126 -5.5760217 -2.2567458 -5.9150400 2.0044448 4.4026341 -1.6736317 -3.3136489 11.5187979 0.4686000 -4.8949008 -8.3755512 -0.2781337 3.0144539 -2.7573433 0.2874945 -3.9276235 -2.5624256 1.3629978 -4.9197459 2.5599115 3.4970150 5.3102827 0.7043049 -1.7668842 -1.0009649 -5.1599011 16.1837997 -3.7081196 6.3135166 -10.3937473 0.8436375 2.0052805 -2.9061177 0.1189494 -6.9442110 2.6998484 6.0470328 -8.0915651 -5.5545855 -1.7137545 2.0030015 -0.8576555 -0.6709012 -1.1143932 8.1223688 -0.9299620 -0.3431017 -1.1981859 2.1631567 -0.6048201 -2.0456712 4.0261726 0.9977357 -2.2891026 0.3612955 0.8572353 -0.6845914 -1.5190473 -2.2751956 1.0984575 0.5515288 -0.0235008 -0.8140646 -4.0582166 -0.1945670 -1.8850693 -4.2262888 1.6699759 -0.6484160 -2.6584330 0.5139157 -2.4257576 -8.9956236 2.1413269 -4.4381852 -1.6430011 8.5012245 1.2717806 -1.5194074 -0.1089811 1.8513439 -2.9209549 1.5977968 -3.0544562 -0.8950120 -1.7294860 4.0722427 6.3786273 -0.2557315 -4.6585665 0.4968517 3.0988457 -6.5378327 0.3450195 0.7552463 -7.8563156 -0.3444535 0.8193758 1.4898626 0.8513108 -3.7003870 0.3454301 -2.1677186 -1.2558178 -0.5413104 -0.8977688 0.8837993 -0.2563686 0.2460217 2.1991479 -0.0435811 -0.4978399 -1.4532744 -5.6464362 -1.3363211 4.3590226 -0.8730851 0.9339628 -0.3938967 -0.9190276 -0.2110902 -2.9858949 -3.4204059 -3.7312560 2.5904632 5.1729326 -2.9953282 0.0386862 -0.9706349 4.2519035 -2.6520944 2.1121078 0.2313700 -25.7607765 0.9899434 1.4680690 -1.2033657 -1.3475783 -1.1518165 -1.2679193 0.8067449 -4.9905939 -0.0335173 -5.4298730 -2.0274947 3.6067915 -1.5867419 -2.8891590 2.3073363 -0.6449237 -1.4532913 0.3875074 -1.2794342 -2.3959408 12.7382507 -2.5258968 -1.1374351 -0.4592561 0.0586012 1.1619232 -1.1491405 3.2537053 -2.1043720 2.9075119 -0.8384839 -0.9195226 -2.3527963 0.4301541 -5.2680221 -0.8802332 -0.5243815 -0.9887569 -5.6669760 -4.3297491 -0.4947560 -4.1099896 2.7793126 -2.7655411 -4.9311709 3.2061336 -4.2037182 -5.2334495 -7.3994989 1.0951785 -5.7922516 -5.3532467 -2.0841985 -2.2839601 0.0174820 -1.8400973 -2.9624324 -7.6824117 -9.7998295 -1.9760990 -7.8035836 -0.9548399 -4.1512241 -7.0928931 -1.5488007 -7.4292960 -0.4427271 0.1794558 -2.5169773 -5.3722377 21.5571175 -2.2351980 -7.7701435 -5.1559067 -2.4020853 -9.3221779 -2.2078254 -6.4907265 -1.6858203 -6.3975978 6.3466225 10.6203203 -1.6773663 -9.3833055 0.8677558 1.9125311 -16.6603088 0.5031893 -3.7311604 -6.5769668 0.4117618 -5.9024019 0.2673258 2.5416541 -8.8462954 -0.2105972 -5.4257469 -3.3759956 -2.1942186 -2.8539474 -1.0867893 -1.8775752 -1.2222470 -1.7018297 -3.4753380 -8.5182247 -5.6728806 -12.5750504 -6.1196809 -0.9618845 -4.2158351 -1.8402897 -0.1230142 -7.2804618 -0.4988056 -9.0622578 2.0349383 -5.6933851 2.8187418 15.1571083 -8.1627674 -5.7125607 -0.8827181 4.8212132 -7.7211351 4.4053473 7.5009685 -2.6513972 1.4165297 9.9772673 -4.0085974 -5.3129301 -5.2979598 0.6393409 -9.2662544 -7.6589084 -3.2383509 -3.5948839 -5.7844572 2.5344763 -2.7809439 -9.6021051 -5.0562587 -4.3045607 -2.3193436 -2.0574331 -3.2463319 -2.0208640 24.6442719 -0.4450319 -5.2674499 -3.6572034 -1.0946642 -0.7286333 -2.2515848 9.5318546 -7.6411252 1.7908350 -0.8890925 -4.4354048 -6.6095858 -1.8975388 -5.4963603 -2.7600849 -1.4318810 1.9988686 -4.6349926 -3.6950223 -2.2573221 -6.4641562 6.3779202 -3.4496896 -3.8618746 9.2592802 -7.1444907 -7.8525352 -7.8691659 0.8509341 -9.3523884 -5.0908861 -3.2961438 -3.5301430 -1.8286949 -3.0203941 -1.8953770 -11.6399641 -9.8622713 0.8048728 -9.2117453 -2.8901141 -5.1572442 -12.3893280 -1.3983917 -8.9396772 -0.9802342 1.9041028 -7.6269431 -8.3283558 -1.0441501 -1.6746827 -13.9744110 -7.6530132 -2.0542102 -24.6985016 -1.9132800 -9.4519997 -5.6775980 -7.8542247 12.2190447 16.7475567 -2.7626355 -11.8906155 -2.6654174 6.8331733 -14.4333668 -1.0854437 -2.2161934 -11.0580044 -1.5653102 -6.5134273 2.8529861 3.2081735 -12.3412075 -0.7947681 -8.6802063 -3.7235553 -2.4164224 -3.7889621 -2.2294240 -5.8302350 -1.2592566 -0.5909665 -5.5255203 -6.9829383 -6.4773698 -19.1620464 -8.4626951 4.1826639 -7.6912928 6.1290917 -2.1598506 -10.9185286 -1.6841898 -11.6104374 -1.7346171 -11.6301031 4.2786684 17.3110104 -11.4671211 -5.0536399 -3.2656076 7.9507656 -8.8634396 6.3640943 0.5290266 -7.1214762 3.4383657 1.8912959 -4.0921164 -8.3619156 -6.5339518 1.0377942 -10.1911860 -9.5947456 -3.0979061 -5.6615314 -8.7198792 4.3010325 -4.4993939 -12.3943691 -0.0016939 -7.4831891 -3.1673391 -3.5278969 -3.8491607 -4.7929330 30.8042622 -0.2857496 -6.6400642 -7.5806756 0.3258188 -4.1027374 0.7710559 12.5438442 -9.2442827 3.6634820 0.4228585 -9.5690622 -6.6327052 -4.4260030 -15.5817223 -2.6106346 -4.0052485 0.4138256 -7.6498446 -21.4802494 -2.8945849 0.2944443 2.5618145 -7.2429061 0.8751298 3.4309042 0.8112378 0.3152832 -2.5909894 -0.5558839 -10.7650099 -6.3471565 -5.0541749 3.2433879 -5.8334126 0.0055140 -7.1546779 2.3773694 -0.2831769 -2.6609244 -3.4626033 -0.0283071 2.1573024 -6.7818084 3.4847581 -4.7726817 -4.8232713 4.1045074 2.3456652 -1.8780689 -1.6550696 -0.5457957 -1.9994186 -5.4318151 -3.3338909 -0.4230058 2.0822632 -1.3149062 -6.9081273 -3.5767126 6.6950698 1.1036102 -6.4015703 -3.5250535 -6.3187165 7.3165922 -0.6612609 -4.8278813 -1.6387916 -2.1905797 1.4604244 -8.6529093 0.3774703 -0.8257027 -6.2808414 1.0506692 -4.1641660 -1.3436165 -0.9058398 -1.7108769 -5.6176810 -1.4242070 1.6736959 2.9937460 -1.4372063 -0.0574638 -1.3381667 -2.6429129 -0.6997830 1.9486444 -1.2735949 -2.8309097 -2.8359857 -3.1100230 -1.1697239 -5.9486332 0.2281769 -0.5100409 5.8360214 7.3502245 -3.7941139 0.1185572 -7.4883542 5.1441073 -1.8135301 12.6050158 1.1827217 -0.6566744 3.0715084 2.4905090 2.3863037 -6.7437353 3.6166260 -0.9062089 6.3517385 -8.3663597 -0.8436252 -2.8667824 -9.7894821 -2.7965350 -6.7091856 -8.2793856 -2.1149230 3.4506068 -3.5808609 -3.2884381 -5.2312131 -1.8415443 11.1254873 -4.7138205 -3.3853748 -3.7361047 1.5641418 0.1371131 -1.6317759 4.1379666 -8.2729731 13.0016747 3.5792353 5.7334762 -11.6675472 -2.3436825 0.0565055 3.7462316 -2.0718644 2.3744771 3.3407140 -1.0898947 -0.1747706 -1.0796319 0.9189845 -0.5372828 -3.6407752 4.3679595 0.3393552 -2.0149159 0.9694155 1.5244886 -0.9749026 -1.9634340 -3.1331356 0.0949647 0.7869859 -0.2508210 -0.2436450 -3.8395414 0.2384826 -1.5954751 -5.2086525 2.2764840 -1.1453115 -2.9596801 1.4836912 -0.8842976 -4.4719691 1.7732346 -4.0300894 -1.6831238 6.2654290 1.3061415 -2.1970479 -0.6083003 1.1361619 -3.0962882 1.3684592 -2.6855214 -0.8834535 -2.0459988 2.5697613 6.1538696 -0.1982109 -3.3907635 1.2030262 3.3040569 -6.8858943 0.6354546 0.7094822 -9.3784218 -0.2777716 1.1269373 1.7199441 1.5337281 -4.0162086 0.2047478 -2.2170365 -1.3741741 -0.1213247 -1.0457364 0.8839092 -0.2794090 -0.3163185 2.3423238 -1.2843246 0.3254405 -2.0703962 -6.5559835 -3.8972409 0.4098877 -1.6616198 0.8804771 -1.0916781 -3.8508952 -0.1113455 -2.7491117 -16.5358143 -4.9600825 2.5307438 4.2375050 -3.3086832 -1.0521427 -0.9682819 4.2464533 -2.8929873 2.5462320 0.9215131 -19.6134415 0.6827460 1.3729365 -1.5015363 -1.2587130 -1.8199893 -1.4411485 0.5467925 -5.1268096 -0.4217550 -5.2574968 -2.3592775 3.7928557 -1.7273252 -3.1372247 2.1962049 -1.5644761 -1.2817990 0.4096059 -1.6306384 -2.8963468 14.3303652 -3.3190100 -1.7666944 -1.1070158 -1.8164364 1.2235742 -1.0699384 2.7544234 -2.0787251 2.7257452 -0.6435821 -0.6450948 -2.9787648 0.8022136 -5.9606481 -1.1155691 -0.6201391 -0.7781044 -3.5972221 -3.9726057 -1.7014755 -4.5529366 1.3134934 -3.1282909 -8.0026579 3.1933227 -5.2339835 -4.0096736 -6.7709775 1.9814994 -6.3894105 -5.0249629 -3.1844072 -4.0035691 -0.3300742 -2.7721319 -1.9448004 -10.6221571 -10.1269255 -2.2550964 -7.8194289 0.6546674 -4.8645058 -8.0392017 -1.3755522 -5.7972913 -1.4202324 1.8446475 -2.8851624 -5.3967800 23.5069065 -1.9822000 -9.8783970 -6.1316624 -3.3451047 -9.9336290 -2.2150481 -5.9818754 -1.4521191 -6.9342990 4.6548452 7.9236598 -1.0494844 -7.7859449 1.2464582 1.9829391 -32.0913048 0.2548761 -3.6344533 -6.7142348 0.1803046 -4.9930553 1.1059245 2.4663796 -9.8255615 -1.1775471 -5.5533161 -4.2957954 -1.6975316 -3.0922861 -1.1067441 -2.0173411 -1.5865562 0.8380592 -4.9639707 -11.4557228 -5.5192518 -12.3228369 -10.5944700 -9.1330700 -4.3093543 -3.0449247 -0.5862694 -10.5805683 -0.6777616 -8.8983669 -11.5291147 -5.7014275 3.4011989 16.0509491 -9.6425972 -6.9385700 -1.1158841 5.5217152 -8.3238382 4.8414197 10.8242846 8.9736500 0.3374938 10.7559509 -4.2747016 -4.6851754 -6.4136505 2.2984095 -10.4753456 -7.5336585 -2.9961023 -12.0343475 -6.4484348 2.8391752 -5.1106939 -11.0082111 -7.0229335 -4.7798486 -2.1939137 -1.1459852 -3.1557171 -2.8163025 24.8796482 -1.0158745 -6.4679890 -3.4232745 -1.7331380 -2.2389364 -2.0877585 8.4351940 -8.5143652 1.0590479 -1.8771011 -4.2704258 -6.3655977 -1.3382528 -10.8837137 -2.4042056 -1.6643658 2.4103138 -4.0917597 -5.6849890 -0.7341335 -6.1932316 5.3355169 -3.6855578 -8.1119728 7.1948862 -5.7056041 -4.9490533 -9.0155125 1.0392838 -10.5625334 -6.7703896 -6.0155950 -7.3729849 -1.4915479 -3.8402605 -2.3229494 -12.4878092 -16.0449295 -1.3651928 -12.3130302 -0.8588839 -5.8568316 -10.5567675 4.0290718 -6.5067096 -5.8489161 3.4440961 -3.7100267 -8.6555042 26.8168354 -1.0890499 -12.1261063 -10.7923441 -6.5942593 -19.8248329 -1.6402789 -8.7272701 -2.2602880 -9.5456896 11.1135836 11.2955112 -1.4690769 -9.5986738 3.2346685 5.1112957 -29.7169476 -0.6448318 -4.2224331 -17.3575420 -0.4640962 -6.9157939 2.1405275 4.9397888 -12.6749620 -1.2218341 -8.2308712 -6.9987931 -1.7119063 -5.1235681 -2.1501915 -2.4558511 -1.7502198 -0.8954512 -6.8478665 -13.1466789 -6.8761306 -12.4467812 -13.6059189 -4.3007207 -9.5353413 -1.7578952 -1.2983438 -14.3348274 -0.9671434 -11.5283937 -2.5047123 -9.5661116 6.0076060 24.1333027 -14.0274343 -6.1585813 -3.1052561 9.9498739 -9.8273010 8.3911610 9.7659359 -7.1265717 0.7096780 13.7203560 -4.1596985 -5.8052330 -7.4799767 3.5456524 -9.9746180 -9.8161678 -4.7040172 -5.3550076 -9.7003660 5.7377715 -5.4037142 -12.8993196 -4.0175338 -5.9909425 -3.1673813 -0.9953238 -4.5185461 -6.2324185 40.0062141 -1.6368390 -8.3769846 -4.8866487 0.2136689 -2.2123604 -0.3102280 7.2022319 -13.0329523 3.2301033 -2.3524146 -3.4525816 -8.5959883 -1.5195713 -27.4619827 -4.5408325 -1.5885607 2.8851404 -7.0670748 -2.3964651 -3.3358796 -0.0256544 1.3580340 -4.8969164 -3.4917057 4.6615405 -11.4299402 -5.6048255 -13.1938324 9.3447790 -1.5224171 1.8485079 -5.6638126 -5.9799709 -8.5046272 1.1341416 3.5021298 -2.6285026 7.1109867 0.6362098 0.9358006 -5.5256538 -3.7953019 -5.4467511 4.1684389 -4.5009317 -5.1468296 -0.3175914 2.9599078 -5.5214553 0.9758700 0.4610954 -5.9538569 -5.9631295 -2.6996603 -11.9188700 8.0491171 -6.2373619 1.1135683 -7.9263153 4.0562019 -2.9715579 -9.3751507 2.8357437 -8.6102438 4.3211474 -6.9722624 -7.7085338 2.8124769 -2.9497340 0.0372158 -2.8871284 0.0616918 4.4944749 -16.6856937 2.7448013 -7.3429079 -10.6713572 -4.8829465 -2.5879004 -1.6570861 1.4995724 -1.5284344 -10.3645124 -3.9936020 2.2300255 -0.9836780 -8.6726284 -2.4073942 1.8112702 -5.1343184 -3.5411990 -4.4257154 -11.9593801 -4.3537560 -5.4988933 -0.5804470 -4.2630134 1.8839417 -0.8931915 -8.1661234 -3.3032808 -7.3505545 4.7132525 -2.5666127 5.8029528 1.2555686 -2.0629876 0.8861684 -5.1909556 3.1854239 -4.7607374 -4.2258415 3.2278647 -13.5953922 1.6639692 -3.9683943 -8.4567013 -6.1961451 3.3926525 -3.0093997 -3.9444537 15.5344896 2.2692647 -2.1535139 -1.9616549 -3.1956396 -4.5800853 20.5591869 0.0432745 -2.3182960 -4.8585715 1.3396163 -2.6382730 -2.8183792 2.1062124 -7.2971425 -3.2475786 -4.5791655 -7.7680602 -5.1217432 3.7934148 -7.0606856 -1.2920446 -1.0945780 3.5637145 7.8909411 -0.7425363 0.2923539 -1.0137999 -4.2862000 -0.4572612 -9.6288338 2.5973392 0.0250672 -0.5699808 -2.7725399 -0.0097955 -0.4595056 0.2625912 -6.8088369 -4.1911383 1.3918623 -0.6749644 1.6902541 -4.9376631 0.5304286 -0.5324883 -7.0235796 1.2958601 -1.0278544 -2.4025514 2.0245435 -0.9394037 -7.5634909 1.3269014 -5.8441949 -1.1116480 9.7544928 1.9139935 -3.7414198 -1.8561382 0.7201334 -3.3501096 1.7441361 -2.2573795 -1.4414670 -2.2439134 -4.0699658 -0.9749669 0.5365401 -2.4888437 2.2608342 2.6931803 -5.5241566 1.3727303 2.0831900 -11.8717155 -0.9067082 0.5975818 1.2944747 1.4568229 -4.1142640 -0.0155219 -3.4985561 -1.3409457 -1.1564667 -1.1348901 0.9266498 -0.1389708 -2.3823800 1.9930542 -4.7661057 -2.0281985 -2.0432785 -3.6131446 -3.9770126 2.4018865 -3.6000190 -2.5618932 -2.3113012 -8.1508722 0.0007769 -2.8503218 -45.4868355 -18.4166050 2.3513567 3.9142303 -2.6105082 -4.0517578 -1.7385296 4.0446758 -3.9043357 2.1712091 -0.4596176 -19.7311230 -2.1378000 1.5660129 -1.6943785 -0.8807163 0.0626700 -3.7703118 1.5345441 -4.3933244 1.7846893 -5.0584135 -1.4041650 4.3011007 -1.1565121 -4.0867968 3.4873097 -0.4058234 -1.6174979 0.9867632 -1.5837470 -3.0614951 14.2097378 -4.7287903 -5.1042628 -0.5387701 -6.7997632 2.8954580 -1.0185951 2.4229693 -2.5608480 2.6630793 -14.8840284 -2.5854075 -2.1747692 0.7789328 -13.8580379 -1.1496857 -0.2018438 -1.0335888 0.0639719 -1.1355575 1.4092035 -3.3767557 -3.5897222 -2.7291262 -7.4604101 0.9697975 -5.6038690 -0.0755500 -7.6031351 -3.6830828 -2.6715341 4.1208091 -8.8707495 -6.8965411 1.6917274 -3.0283463 4.8292198 -5.5809312 -6.8519754 -3.8743992 -6.8847961 1.3107039 -4.3232565 -7.4849362 6.2210031 1.5702673 -7.9413948 1.2645670 3.4401534 -3.2314653 13.6332283 -1.2858950 -9.9238501 -5.6260996 -1.1211985 -13.5218573 -1.2107546 -3.4510477 -6.5779114 -6.5126276 -3.5096495 -0.0111430 0.8393849 -3.5341403 7.8506584 1.2188144 -6.3577204 2.4597216 -1.8167558 -6.4120302 -0.9516057 -7.5023246 -1.2574581 1.6043599 -9.5290298 -1.4691690 -7.4019556 -2.2423556 -0.2002977 -3.0527022 -0.5181262 1.5887939 -3.5331278 -4.6333284 -9.1663198 -1.2368512 -4.6797018 0.1940644 -7.3829336 -2.9335260 -1.5239359 -2.3740888 0.5324834 -14.6536312 -0.4773229 -7.0205727 -0.3650358 -5.9219680 2.2128835 11.6808834 -6.7289090 -0.8407461 -3.5319910 5.2389927 -4.8612089 4.4549818 -0.4380497 -9.5915270 -8.4739485 11.4300041 -3.7541528 -3.2527835 -4.0878286 -0.9941940 -7.0822015 -8.7096844 -1.7480392 -2.4816797 -4.8246021 4.4951286 1.6291213 -9.1702175 -4.5381742 -2.1040919 -5.5295129 -1.5959108 -2.3298976 -3.2950056 19.1999817 -5.5716138 -12.0242214 -0.8053569 -3.3889599 4.9267612 0.1639670 9.8423595 -9.3824978 1.2210269 -8.5385408 -9.7416544 -5.0868969 -3.1578934 -9.3444519 -2.7918434 -0.7938794 -0.1718321 -5.2520652 -0.6231479 -2.0867498 -5.4757996 3.8208745 -3.6931725 -7.0576925 3.9710836 -10.1608181 -0.1252966 -11.8390875 -2.0275869 -3.6374974 5.1247892 -8.8802299 1.4531908 2.0617576 -5.0843940 10.6474667 -4.5237131 -3.2967103 -1.2816658 -11.0752506 4.4891453 -4.2284741 -5.8840022 -12.0598917 3.1535087 -17.1481190 4.1107984 1.0482249 -3.6689153 21.7130985 0.1025805 -10.1185093 -2.2469413 -2.9290047 -9.4693737 -2.8764601 -3.2889230 -7.2858343 -8.3540392 7.1241617 6.9600911 2.0365586 -2.2730494 1.4931600 3.8079057 -11.7137213 -0.8885491 -1.9376895 -2.7065358 -3.3358774 -9.2715025 0.6015027 1.5859789 -9.2447262 3.0207090 -9.5628967 -4.2920256 -2.4797430 -5.6156335 -1.0721288 -0.3515442 -1.5912346 -1.8647460 -8.8718939 5.7007651 -9.2347670 8.4555244 -6.5461016 -8.2661572 -2.6990685 -4.3484640 6.1920514 -14.7260303 -0.8411747 -15.0537367 -26.2005024 -8.3434258 4.8064427 11.5574970 -15.8444462 -6.0967374 -12.5476866 10.2298183 -7.9977427 8.3056173 -1.6222053 -15.7548466 -8.6602879 16.7778454 -2.5235162 -4.0090442 -6.0377464 8.8316278 -17.0586967 -10.4827251 -0.9547047 1.3065364 -5.3730111 8.6827230 2.7018979 -8.2120991 7.0907283 -2.1213286 -6.1822762 1.8797300 -3.5704536 -2.5866489 28.1886406 -3.6839180 -13.0354538 -2.2768414 3.0776682 8.9515495 -3.2213678 14.6939716 -10.6243982 2.3956821 -4.9512868 -19.9683228 -3.8324068 -4.5171709 -11.0276756 -3.3746848 -0.6872279 3.2023005 -3.9256463 5.5275006 2.5637057 0.2441594 2.3568735 -6.6460214 2.4963109 4.4906211 -7.8956213 8.1970940 -5.3866754 -1.0178031 -7.2937756 -3.3145208 1.2610096 5.4255934 -4.8132768 -1.9533458 7.2343035 -2.6793578 0.7503571 0.5420839 -1.2450039 1.2203740 -4.5579662 -1.1186275 -3.2933972 16.4959221 5.6163893 1.6934196 0.3339801 -1.8341532 4.5114856 3.2393951 0.9409876 -4.1648240 -0.3285608 1.5551838 -2.8227942 -1.8003719 3.9882007 -3.8443038 10.0171394 -2.7676129 -1.1321667 -5.3063450 -4.8819723 3.9549398 -3.2006292 7.6296730 -1.5999825 -12.8086224 -1.6864252 -4.9238591 3.3828776 1.4253899 -1.4884981 -2.0499356 -7.4720855 -7.8753638 -0.0966437 2.4119325 -0.9945245 -0.2341233 -2.7014859 -10.5773783 0.5919502 -0.5429118 -0.0763556 4.8291368 -1.6949085 0.4055664 2.5237749 0.4393310 -5.6115174 -0.3361061 -5.5781255 -8.0032063 0.2127240 -4.4533291 5.1247029 9.4064550 -4.6433120 1.8183324 -3.2912347 7.6513720 3.4297888 -1.1451036 -4.7265401 0.3641092 -4.2090154 -7.1499653 4.8667154 3.0052929 -3.4291170 -7.4892001 -2.3602552 -3.0697153 7.1285033 1.1504451 -4.9702444 11.1302843 -7.7549429 -11.2433653 5.7473183 2.0050094 -6.2763872 -5.0757933 -8.3962688 -3.7672293 -4.0910811 -0.2185379 -3.8683777 -8.6552992 1.3834627 5.2724562 -6.6878128 3.9516671 -8.0213490 5.1637807 -4.7752914 -0.5821035 5.0719519 -9.2611475 0.1053124 -5.8046069 -0.1685742 -0.6550084 1.2103033 -1.1849091 0.3329294 -0.4360054 -2.9806297 -0.6973824 -9.6445751 3.3258297 -0.6595747 -0.6971101 -3.6879618 0.5735918 -0.4024594 -2.1132848 -6.1265397 -2.8803470 1.0578964 -0.1520810 0.6154558 -4.5334229 -0.0524410 -1.2931424 -6.6139126 1.4706560 -0.6608130 -2.2650723 1.5396714 -0.1546677 -11.4747019 1.6689472 -1.0903177 -1.0472400 10.5312653 1.1537430 -5.0531926 -0.8825573 -0.3423300 -3.1049910 2.0539443 -1.8754994 -1.6830021 -2.3921013 -2.0226929 0.5041005 0.7607432 -0.9132862 1.2573913 3.4617181 -5.9606929 0.7015489 1.8749858 -11.9860392 -1.1245759 0.7881413 1.8414712 0.0320055 -4.0258217 -0.1006223 -2.9640932 -1.5196158 0.0991132 -1.3273087 0.4796619 0.1919478 -2.8700593 1.8286641 -5.9711061 -2.9551630 -2.5051816 -7.7125444 -2.5992920 2.1578362 -2.5897119 -2.4838767 -6.8510118 -11.3489799 0.1039656 -3.0706165 -4.2902412 -21.9542065 3.5225840 1.6366345 -2.7678294 -3.5869703 -1.9144228 5.1678438 -3.3232672 2.3646276 0.2484374 -14.1818590 -2.3251331 0.8215774 -1.6802946 -1.4606781 -0.2697216 -2.9164107 1.1935561 -5.1947274 0.7971510 -5.6463022 -2.2704005 4.9730453 -2.8672695 -3.9965124 1.1192480 -1.3038199 -1.4620856 1.6842880 -1.9032450 -3.4110544 10.4048176 -7.4512544 -4.9162607 -1.1615677 -8.1598711 2.5043204 -0.5972990 1.3440099 -3.0724206 2.5182002 -4.0231209 -2.9383769 -3.6294308 0.9935019 -10.9725409 -0.6711781 -0.2473612 -0.6414131 0.6848702 -2.8951933 1.5513819 -2.8396306 -3.8582473 -2.1674631 -10.8429146 3.0868633 -5.6561012 0.8811533 -9.7602577 -2.3550012 -3.2549453 1.6099102 -14.2650833 -0.7208685 1.2789816 -2.6338987 3.5219088 -2.5192523 -8.2018929 -1.9824046 -7.4426775 -1.9194902 -3.8189194 -6.1938610 6.6497707 2.3736708 -4.3813524 1.0115021 5.4967289 -3.0344379 16.9579716 -1.6214149 -15.7148724 -5.5341029 -5.6891193 -11.4628439 -3.7948384 -3.6165416 -6.3455453 -7.7653351 -2.9753408 -3.5384002 -0.4918526 -4.3847027 6.8109345 2.4710608 -9.9254799 0.7001030 -2.1418431 -15.5841446 -1.5330033 -8.2880573 -0.3091322 2.5642977 -8.4191980 -0.8012787 -6.8143983 -1.4220653 -1.4242334 -3.0654142 -2.0320444 -0.4116975 -4.0434098 -4.9156218 -9.8776627 -1.9358081 -5.7748551 -7.5461345 -6.1933618 -2.1257770 -3.3861136 -3.2079456 -2.8205714 -13.6996965 -0.2494704 -7.5854511 -32.8931541 -7.3020277 4.6483011 11.5896931 -10.1769371 -7.8781109 -3.5392170 8.6585836 -5.3395433 5.7467747 1.2610507 4.6416092 -7.5045285 13.1287842 -4.7304597 -3.7178295 -4.3092971 -9.2727909 -8.5857563 -6.3291650 -3.1037624 -13.1078367 -5.3172631 7.5889931 -3.0630705 -9.0196600 -9.3460922 -3.5876663 -4.7953401 0.2158477 -3.4517343 -3.3648539 21.7716122 -5.9046950 -11.4675140 -2.5960588 -3.7618279 2.4407396 0.3764641 8.9008083 -9.5743837 2.6906633 -9.6137037 -10.8530245 -6.1747036 -2.3601513 -21.3979759 -2.2484593 -0.5050663 2.3084843 -3.3391817 -3.4358256 2.9447291 -3.6156812 -3.1270633 -2.2233360 -11.7342291 5.9515347 -5.7934542 1.1161753 -12.4032068 -2.8534107 -3.4804807 -0.8475764 -17.0521393 -1.0179210 1.4969040 -3.8347180 6.5729184 -0.8786731 -7.7488265 -2.0066321 -12.8272038 -10.6591349 -4.2837439 -8.1562471 10.2928667 5.8490348 -9.3218937 3.8151038 12.5728922 -3.1756656 22.7673607 -0.4711352 -19.4334488 -12.8102541 -13.1509352 -17.5070076 -3.0727546 -3.1418676 -7.4957185 -11.0273438 -0.5545030 2.9595532 0.5986495 -6.3082795 8.3567390 5.1500483 -13.2904692 1.0086272 -2.0611200 -12.8965588 -2.9565535 -8.3919554 1.0052085 5.0267444 -12.0490742 -0.9542921 -9.7620173 -2.4783306 -0.5220081 -5.5150247 -2.5323904 -0.1552077 -4.3189402 -5.7033210 -13.5043125 0.4492370 -6.5386710 -3.9037862 -8.8483448 4.9055271 -5.6246405 -2.0680099 -1.8394407 -18.3665581 -1.0953656 -7.6710262 -16.0489407 -12.5324364 7.5423493 15.9177103 -14.1538553 -8.3055687 -6.6430554 13.9433489 -6.1234012 7.9549394 1.0235863 -19.2409267 -9.1389780 15.5715256 -4.3652287 -4.3266845 -4.7635245 1.8837864 -7.1124120 -9.9732656 -3.6511366 -3.0856204 -8.4692106 13.0470409 -2.3106251 -11.3596802 -3.7597001 -4.1370811 -7.2307482 0.8055674 -4.6583319 -6.8922477 32.0233498 -7.7773843 -14.9392338 -3.8038065 -3.6408877 5.2365594 1.2871375 8.5423813 -13.5918198 6.1714640 -10.2402067 -16.1336746 -5.5601411 -1.8664901 -20.4524956 -3.0484581 0.0586700 1.2826033 -5.7439694 -0.0357871 0.3661381 -2.3922851 1.3994117 -2.0688684 2.4620135 2.2990329 -3.7669537 -1.0328503 -7.6973920 -0.0631086 -4.5897279 -7.6007533 -7.1576872 -2.1736569 -2.4348745 -2.7898376 6.4484425 -6.2008281 6.2010274 0.4864418 -1.1331052 -7.7488275 -6.5963860 -0.8831630 6.8556285 6.0868330 -10.6414118 3.2587888 14.8505926 -2.2280316 0.8602548 -2.6279948 12.9746027 -8.5144453 1.1203877 4.4286203 5.9422078 -0.3926522 2.2509103 -9.1645794 3.1338692 12.2182693 -0.6288311 -0.5103824 2.1374719 2.5311985 -27.6354561 0.4730293 -3.3641486 -2.9643545 -3.4467716 0.0674640 0.2947223 4.2528343 -12.2545929 -0.4157592 -6.6447783 -4.8894124 0.2956232 -2.0415211 -0.8432320 1.6212806 -1.7726488 -5.6984730 -7.7423434 -2.8219798 -1.9841081 4.8064666 -5.0079269 10.3627014 2.3185778 0.0130732 -2.1390705 -10.2055883 -1.5717876 -0.9878142 0.7235166 -12.0124235 3.3917294 3.9443555 -0.1830292 1.2949954 -4.2974095 7.3973002 -2.2127352 1.3730649 -7.5666413 -0.8280728 -1.1357924 7.4944115 2.2791829 -2.2460442 1.6496695 -4.7578616 2.9479687 -1.0312321 0.7782684 6.5784817 -6.0945854 9.1331024 -2.2282512 -9.8112001 3.6634297 5.9947853 -5.9555120 -3.4711182 -1.2256309 -9.0278578 19.0071964 -3.3939385 -5.3771262 -2.7673469 2.8200319 1.9542431 -1.8463504 5.7743573 -6.4864588 5.1141372 -0.4411578 11.2728205 -1.7037292 -2.3142257 -0.2313179 -4.2998915 2.1332221 4.7345462 4.7639637 0.8277845 0.0890524 -0.7796003 -4.1835113 -0.5863988 -11.4769592 2.0159991 -0.7614179 -0.2245752 -3.8770781 0.5178792 -0.9975656 -2.7374666 -6.5597577 -2.2944670 0.8718932 -0.5985142 1.8538873 -4.5822182 -0.6342871 -1.0570507 -7.5079794 0.3073294 -0.7780825 -2.2890115 1.7737975 1.9003873 -16.2998695 0.1124576 -1.0929000 -0.1600486 11.1872749 1.9053401 -6.9585547 -1.0726880 -1.5272746 -3.1306577 2.1233077 -1.3741162 -2.3205683 -2.7639596 -4.0247903 -0.4256472 0.3684070 -2.4505198 0.9604172 2.6823790 -4.4565573 0.9435686 1.4240184 -14.1398106 -1.3395399 0.5979935 1.2155674 -1.2692810 -4.2579679 -0.2336037 -3.4737062 -2.2635536 -0.1134237 -0.9704266 0.5020025 0.1624681 -3.2952108 1.0247737 -6.9966440 -1.8154613 -1.9812073 -5.7731509 -3.4830050 1.8927633 -2.6086869 -2.5313871 -10.5396528 -13.3255682 -0.2203518 -2.5696929 -11.6087599 -18.0411873 3.6728592 2.0406768 -2.8863001 -3.7648497 -2.0711703 5.1755247 -3.8288984 2.2898588 1.2329385 -11.7770853 -3.0065281 0.7689392 -2.5851192 -0.9768888 -0.5095279 -4.3685446 1.5555540 -5.6503744 0.9027647 -5.6575041 -2.4180028 5.3342338 -2.0971978 -3.4259765 0.8304737 -0.0580843 -2.0133669 1.7851871 -2.4246662 -3.6620362 9.6300526 -8.1794949 -6.2254052 -1.1015403 -8.0625362 3.7566695 -0.7804651 1.2570840 -3.7394683 2.4307296 -3.6870089 -2.6679342 -3.1422784 1.4842257 -10.9857492 -0.9445111 0.2730322 -1.3605359 1.4406228 -6.2232165 1.1956580 -3.3430808 -4.5241909 -2.5685642 -12.6096001 -0.0480320 -7.3703032 0.4214273 -10.5669136 -2.1042318 -3.6459048 -2.7074385 -11.1217833 -2.5991988 0.9618308 -3.5208173 3.1157634 -3.6775839 -7.2449384 -2.6232545 -8.5328197 -3.2364898 -4.1695995 -5.4569874 5.9812307 2.2951751 -3.4496882 -0.6960718 6.6038361 -3.5649986 24.5740108 -0.6588553 -16.7566967 -6.5913506 -8.2420406 -10.8601599 -4.2045574 -3.2976873 -3.0828826 -9.2916946 -5.1775379 -3.2355180 -2.3883908 -8.2412119 7.1485429 0.2282007 -5.4681392 0.5104779 -2.9604743 -11.3519526 -0.4133807 -7.6732388 -1.5696534 -0.4570632 -8.3936462 -0.9322152 -7.5087109 -3.1542487 -2.8845387 -2.9726188 -1.5013386 -0.6322560 -5.1965985 -3.9516144 -12.9739914 -5.9158354 -6.6570530 -4.1674485 -10.3347998 -3.1764765 -1.2972416 -2.3253391 -5.1866388 -19.8216076 -0.7100791 -7.6419024 -42.1329231 -8.7578220 5.6371074 12.3080473 -10.4950857 -8.6386499 -4.8785133 9.6753712 -4.5583057 2.5088899 0.8478888 6.6453471 -8.0344543 13.4797211 -5.4814596 -3.5763526 -2.0305085 -4.9305387 -9.5884180 -6.6836300 -2.2298648 -9.1305943 -6.9175177 8.1128254 -2.7199733 -11.4421511 -12.4379225 0.2571938 -5.6089773 0.2810511 -5.5404587 -3.6646700 16.8080692 -7.5916820 -14.4065208 -3.8690221 -4.0691671 2.1254964 -0.4964340 10.2212639 -10.7787056 2.8676109 -8.8052750 -7.7101870 -7.2806516 -0.1366687 -11.7261715 -2.3460922 0.0127166 1.7222238 -3.4995115 -9.8914394 2.4614294 -4.3559842 -4.1796751 -3.2798867 -13.0367317 2.4478300 -8.6345863 0.8267413 -12.5982733 -1.8660859 -3.6360428 -6.4526763 -13.6412077 -2.1807601 1.0295962 -5.1278057 6.2924895 -5.8504343 -6.4186130 -3.1568062 -13.4406185 -8.4086294 -5.5610118 -6.4901433 9.0888939 6.9877467 -8.6213636 1.5035555 12.4669819 -3.7908115 23.0500565 -0.0662101 -16.5118313 -12.5092907 -16.7307186 -20.7296219 -3.7342727 -2.8134632 -5.4975419 -13.0864143 -3.0924056 -0.3281585 -1.4061674 -10.0211210 9.2252502 2.3821912 -7.7293959 0.4115361 -3.9917686 -10.4968424 -1.9423363 -7.9088836 -0.2027966 2.0687304 -13.3522358 -1.3532130 -10.5705919 -5.3329701 -2.4447780 -4.9550843 -1.6545075 -0.6814918 -6.0892253 -3.8602099 -17.7093410 -7.2158623 -8.3649149 -2.7637489 -16.2238598 2.2127175 -7.4842916 -1.6215417 -4.2731028 -25.6010284 -1.7374207 -8.2439928 -44.7741241 -14.9395895 8.8352489 14.6267986 -13.8183575 -7.3751473 -7.6896267 15.0555906 -4.9637446 5.5599470 4.2576265 0.0463134 -8.8500566 15.1586580 -4.9865499 -4.5970840 -0.9167762 9.6354723 -8.6691608 -10.3811159 -3.4214547 -2.5492759 -10.7588968 13.2999544 -2.0928018 -15.6655130 -9.2388296 0.6916119 -6.9919491 -0.3939527 -5.5818830 -7.9638648 27.5422535 -8.9147987 -17.4852924 -4.7567215 -5.1090050 5.4056535 0.0852250 6.0615244 -14.6901150 5.5107751 -8.8244238 -10.4634562 -7.9109492 1.0237181 -8.5423841 -3.0832431 1.1318727 1.3747358 -4.5249214 0.3734750 1.1157541 -4.4634767 -2.4298904 -3.7297697 -1.5941526 1.7929854 -6.6086946 -1.7137036 -7.7262506 8.3433037 -1.9220550 -11.9129667 -0.6680892 -0.6016797 -1.1646889 -3.2779787 6.1516867 -5.8044367 1.8444948 -0.0366816 1.6323200 -1.2234890 -5.9737687 -2.1052194 4.0980110 3.5233431 -8.6812601 3.2019532 15.8932238 -0.5356179 0.3023486 -0.0305312 -1.2682793 -1.5445147 3.3202577 -9.8095312 6.0873141 -1.0029285 -0.7452516 -7.6972785 -1.9208437 0.1344704 0.4492916 -8.3425369 -2.2454748 3.8561430 -3.7985818 -3.5782385 -3.6714377 1.3969579 -3.8310449 -3.3090806 2.2281733 2.7244730 -13.8215456 0.6790463 -6.5866041 -11.1257277 -1.3258436 -4.1113305 -0.6005540 -0.9070431 -3.0467753 -6.2762322 -6.7655554 -5.9890079 -1.6026266 0.0074691 -19.1855869 10.0359411 6.9643016 -4.9403982 -2.9980197 -6.4158506 -2.7804229 -3.2501171 0.5268880 -11.9759464 4.3181047 2.1906924 -0.8880194 2.3548491 -7.1102686 7.1686206 -3.5513639 4.7393365 -6.3225908 -12.7726030 -2.2731836 2.6412001 -2.0093162 -2.6128843 0.3979874 -1.2383114 -1.3332527 -2.3559124 -1.9611381 1.1846548 -8.3765869 7.4876504 -1.6536943 -5.4383535 -2.3796427 4.2344141 -3.1748090 -3.1243422 -1.3557812 -8.6713552 8.2948971 -4.1237321 -7.3118215 -1.1345141 1.6936646 2.9947338 -2.6568291 13.1689653 -9.7685986 2.8577864 -5.2753229 -19.6042175 0.7570146 0.1454492 3.4448588 -1.4803705 2.3798201 2.5458307 0.7300276 -2.8046179 0.5007360 -0.8049399 -5.3151217 -0.3204548 -12.7581663 1.8927131 -1.0379268 -0.5243144 -3.9442840 -0.8889847 -3.3317654 -3.6049190 -7.2253304 -3.4740331 0.8223500 -0.9514142 1.8973542 -3.2372525 -1.5725591 -1.6300334 -8.3424320 -1.3150817 -0.7350292 -2.1564994 3.3780966 1.9372283 -23.6207809 -2.7725973 -0.4241321 -0.2207368 8.6776571 1.9675139 -8.9735069 -1.6787502 -1.9784034 -3.1179101 2.3180788 -1.3146335 -2.5334971 -3.2041864 -6.9786706 -1.3466188 -0.7273318 -4.6082740 2.0938084 2.4901948 -4.4128790 1.3159261 1.4787756 -16.0292835 -2.8397069 0.4105155 0.2295595 -3.2410624 -4.6644473 -0.6040969 -3.8761466 -1.6352997 -0.5681685 -1.3732041 0.7354063 0.6664649 -3.9754992 0.4445866 -8.5285912 -2.6515896 -2.3688805 -3.0013311 -3.7112768 2.9992225 -1.8587166 -1.6644223 -13.7887230 -16.1261673 -0.3610067 -2.1254778 -9.0160465 -17.3428993 3.8128679 1.2351623 -3.1683760 -3.1713850 -1.9597346 6.4539676 -2.9294803 3.7858872 -1.1310890 -6.9847083 -3.8198476 0.2019426 -3.7642174 -0.7899624 -1.0716822 -5.6840925 1.8216020 -11.2277403 1.0216926 -5.2181416 -2.7219839 6.4795046 -1.4295820 -3.1846347 -0.6641442 1.1160245 -2.2608006 1.8896104 -1.5011376 -3.7044282 8.6625557 -8.0711918 -7.5619922 -1.6406517 -6.7673163 5.7058959 -0.9132332 1.4602073 -4.6287637 2.7096000 -4.2949147 -1.1843129 -3.7802725 0.8176709 -11.5618620 -1.8657116 0.5093097 -1.1282078 1.3289490 -3.0426540 2.4971077 -4.7397876 -6.0391583 -3.0377390 -14.7520580 -4.5925474 -7.6120830 -0.1865920 -11.7457829 -0.7100837 -3.7755315 -6.9141402 -15.1425819 -4.7741308 0.6667820 -4.7714968 2.7342179 -1.1536041 -7.9764228 -5.3190169 -10.0540237 -6.1561890 -5.2564573 -4.8960676 9.3812895 2.8148170 -4.7189450 -4.5538058 7.0951486 -4.2593322 20.4847832 -1.7335593 -21.6035938 -7.2382970 -9.5788717 -10.4249878 -4.4030972 -3.8801799 -4.4846830 -10.7620840 -9.0969734 -22.2711239 -6.3746805 -12.9834099 9.3473701 -2.3894725 -3.9801955 0.3821650 -3.9993806 -3.9521465 -1.1839610 -8.2586470 -3.1290305 -4.9977961 -8.2764025 -1.5171932 -8.8986578 -4.5680833 -6.0840607 -3.0387392 -0.9474720 -0.7096065 -7.9694996 -5.6007643 -18.2419319 -7.8012409 -8.0758228 -5.0594645 -7.6545086 -4.0664287 2.2774513 -2.5352104 -8.4951925 -29.1943378 -1.6849276 -8.0980911 -24.0011349 -9.8102188 6.7805347 10.4891663 -11.6828432 -9.2942677 -5.5979209 10.7177439 -4.9560156 7.1720552 -0.4912694 7.8498273 -8.4083519 12.9266529 -6.8111854 -4.3412318 -4.5310683 -5.4119062 -10.4930086 -8.5371246 -1.6578752 -6.3163085 -8.4612894 8.7743311 -0.8334333 -11.2776594 -19.0682812 3.5858741 -6.3029900 -0.2631715 -6.4705915 -3.5647564 10.9045639 -10.6171274 -18.1348381 -6.2239046 -5.1383839 4.2744036 -2.4746830 12.2765102 -12.5135946 4.7918010 -8.5219479 -1.5197594 -9.4042044 5.6881814 -9.7447901 -1.3766559 0.3600073 1.1134419 -3.6520047 -3.6092536 2.4873357 -6.1840696 -6.9410291 -3.8644071 -14.9058151 -3.5736780 -9.5202761 -0.3192930 -12.7199059 2.1060758 -3.3380067 -12.4990129 -22.2283154 -4.6395965 0.5551997 -6.8008776 6.1884770 -3.8643055 -3.5326998 -5.9775157 -12.0567970 -12.2335443 -7.1011434 -6.1425505 13.7808990 7.4445724 -9.9917955 -3.5808926 13.3765335 -5.0900774 16.0277748 -1.9167655 -18.8282127 -10.2819252 -15.3754196 -13.1031752 -3.0260177 -4.4310741 -5.3423104 -15.2947102 -9.5187178 -21.5135345 -5.2911716 -15.2719975 9.7305832 -1.3549117 -5.8294230 0.4921290 -5.4972892 -9.1494102 -3.0959260 -8.3050699 -1.2104849 -2.1083415 -14.9003668 -3.2802820 -13.3325500 -6.7996140 -5.6611738 -6.0926571 -0.8204607 -1.1414993 -10.7621984 -7.1049018 -25.3676624 -10.2182655 -9.8689146 -5.3290834 -13.7451677 1.6954463 0.2422317 -0.8434917 -8.2055035 -35.2715073 -2.9169281 -8.6989145 -36.4843788 -16.1158981 10.1560831 11.0591364 -15.3547573 -8.2605228 -8.7986431 16.1795349 -4.9941068 9.9034271 1.0079137 3.1350565 -9.0764599 13.8889551 -7.8075223 -5.6252179 -5.1733456 6.6244936 -9.9266272 -17.4746971 -2.1347680 -3.2875500 -12.5668612 14.0728407 -2.0327606 -15.9470577 -20.3922787 4.1263366 -7.9627762 -1.7143711 -5.4106822 -9.5328732 21.8203583 -10.5044212 -22.7596855 -6.9130011 -6.7224298 7.5702429 -1.0758462 11.3206673 -14.6237535 6.8444371 -10.7582359 -1.5106143 -9.6951618 7.3483644 -1.8301290 -1.3873900 1.7043880 2.1492712 -4.5527067 -0.3778342 -1.7485816 -6.8892989 -0.7374558 -2.4482181 1.2645919 4.6122818 -4.1374846 -0.1958415 -13.1322947 6.8571301 -1.3077018 -13.6072769 9.4203367 2.1052656 -1.8016984 -7.0168223 7.2294803 2.6900113 -1.0517504 1.3121545 -4.5939746 7.8409142 -1.4378222 -3.9309347 8.4587822 5.0986319 -11.4006128 4.4342837 10.3089561 -1.2992774 -12.9985008 4.3256636 -5.6388645 8.7486601 12.9161997 -5.4320898 -4.3887615 -2.7921298 3.0070279 -6.3436790 0.2965373 4.4327054 -1.4060776 -8.9642839 3.1818702 5.8579488 -6.1111999 -1.9291196 2.0125868 -4.5364051 -3.6928756 -0.1273721 2.8292704 -0.8319533 -19.1144772 -3.0445132 -9.5236149 -8.2717028 -4.9028440 -1.5202812 0.8631511 -4.8533974 0.0380874 2.7967963 4.1726718 -7.3170815 -3.5000069 -3.3555932 -24.5611115 2.9051178 -9.3999395 -6.5113893 -5.6902308 0.3392135 -1.1968900 -3.3454399 -3.1384616 -19.0402946 3.1218364 4.0146790 -3.2807086 2.1697392 -6.3775816 4.7865748 -7.6193576 5.4197197 -2.1574235 -18.6243572 -1.6581126 -2.5081487 -5.6141047 -1.2175674 -6.9313307 -8.7950249 -3.7905002 0.3168189 -4.2960238 -5.3591614 -12.6414785 5.7069368 -4.0415230 -5.2329788 25.5774784 1.2525640 -3.9641232 5.9211192 -3.1094081 -7.6883655 0.9351528 -0.1693188 -2.6373138 -1.6310323 -0.0902667 6.1664186 -3.8246059 7.3097091 -8.9674225 1.8505132 -2.1365499 -2.5133183 -1.8678638 -0.2265687 -3.3815856 -2.5675521 0.7120626 5.4015417 3.6836472 -0.6056170 1.1386797 -1.0924360 -7.1641741 -0.2706371 -16.0764637 -0.1623737 -1.2299997 -1.0880152 -3.6905570 -1.8597320 -3.3134246 -4.0949397 -8.4754877 -2.5488710 0.9359242 -1.6638213 2.3931897 -3.6430771 -2.6507447 -1.7029120 -10.3129625 -4.0600967 -0.6225055 -2.1722348 2.9631510 3.5827441 -24.3875580 -4.6988626 0.3588209 0.3130321 7.4059749 1.9185563 -11.7035398 -3.0141864 -2.2055790 -3.5882659 2.1620951 -0.7721041 -3.4831896 -3.5783315 -10.6807222 -3.9549742 -1.7984751 -7.5777707 1.2577844 1.1854830 -3.2752497 1.0445788 1.1429882 -18.2356453 -3.3020377 0.5066725 0.4309242 -7.0383224 -4.9376602 -0.9765325 -4.4080744 -1.4776458 -1.5158076 -1.8256698 0.6487550 0.6483024 -4.1948957 -0.1731527 -10.0184336 -3.2322893 -2.2884309 -1.7865968 -4.2207408 3.7836819 -1.9182322 -1.6746520 -17.7471714 -18.5900288 -0.1619638 -1.6735884 -7.6154270 -19.3220482 3.7342911 1.5242630 -2.3704724 -4.0306120 -2.2315249 6.3663497 -2.6711009 4.1654549 -2.9913230 -6.9070597 -6.2940717 0.0788623 -5.2521586 -0.7489058 -0.4842546 -8.7549963 2.5807655 -32.3913307 1.3036447 -4.1763449 -3.4059002 6.1954207 0.3296719 -2.4435048 -0.0136132 1.1595125 -2.6786513 1.4751347 -2.5555952 -3.9306080 0.9107871 -2.2887144 -9.3906250 -1.5346702 -5.8529291 3.9648581 -0.4531767 0.4274934 -5.5976682 2.9626915 -4.0772166 2.4123888 -2.6127257 -1.6856387 -12.3133707 -3.3909056 0.6001768 -1.3574498 0.4982809 -1.6823059 3.7929974 -5.8150001 -6.5525608 -2.8698273 -18.0160866 -9.4172621 -6.7405863 -1.4977040 -11.7802172 -4.0696068 -5.5718431 -9.3446369 -34.9970055 -5.7234893 1.4698333 -5.9722481 2.9134560 -3.4113307 -8.8630028 -7.0766239 -12.2869997 -11.7836132 -5.2386336 -4.5937533 10.5580616 3.4299474 -8.4883633 -9.2950430 8.1863499 -4.1147680 12.5149517 -2.0934670 -32.2525826 -8.1869440 -10.6875229 -8.4886379 -4.1607451 -3.5049200 -0.8293297 -12.0313463 -11.5611877 -26.9916801 -9.9081125 -18.0931873 5.5589166 -6.2709641 -2.0751231 0.8835536 -5.2741961 -0.1453892 -6.2966237 -8.1731138 -6.1748323 -13.2883215 -9.4436283 -1.9840031 -10.0113420 -5.5284052 -8.1596327 -3.9267511 0.1551109 -0.1713730 -10.1670780 -7.1806202 -22.2374611 -12.5824423 -8.3750992 -7.4273958 -4.7639303 -5.3815989 5.9703517 -1.6782128 -14.6389523 -35.6624870 -1.4451098 -7.7314796 -14.5821867 -12.9053068 6.5087008 9.8181610 -10.6450939 -11.0750942 -6.2149878 10.3461742 -2.9972634 16.4547558 -13.0744896 9.0110331 -13.2370977 13.2890644 -9.7357054 -4.5390368 -6.1541224 -2.1111963 -10.5787687 -24.9133549 -0.9448574 -7.1767936 -9.6212206 7.5524449 4.2058411 -9.5593224 -17.8621826 4.8760457 -8.0251007 -0.5985086 -2.9761405 -3.9659903 -10.3952065 -12.6547337 -21.5873661 -6.2151132 -7.0579138 6.5403299 -2.2345901 13.5205460 -14.5454693 4.6514163 -4.1343446 5.0549273 -9.7208662 8.3253040 -8.8929892 -2.8273299 -0.9371545 1.4288348 -4.7001853 -2.9221582 3.6167073 -8.7112827 -11.6909256 -3.3113284 -20.7068501 -10.3786211 -7.5462208 -2.1913733 -15.1267414 -0.2624314 -6.1798625 -15.6893263 -38.6185303 -5.5910873 1.5423013 -9.3205013 6.4034467 -7.0788031 -4.5175285 -8.1430960 -18.1274700 -7.6214972 -6.4742002 -7.3887558 17.8903866 8.3969707 -13.7307816 -7.0259976 13.9169283 -4.9790406 24.5082912 -1.4823798 -33.3052101 -15.6132984 -18.1686630 -7.8897533 -2.6300373 -4.3807797 -0.1337665 -16.3675804 -18.6398296 -30.3869915 -10.8157215 -21.5747929 6.5650792 -5.4884596 -3.6635575 1.1288763 -7.3371062 -1.2534529 -7.5692301 -7.9033136 -4.3272467 -13.3547955 -15.7194386 -3.3927264 -15.5534229 -8.0550108 -9.5661583 -6.4759307 0.7167222 0.0285959 -12.9752150 -9.2771196 -23.5140648 -14.6059036 -10.2186737 -8.3087072 -7.4273577 -0.3116541 3.4052448 -2.0862696 -17.7326965 -34.6736221 -2.8209536 -8.8083124 -20.9550228 -22.3099575 9.0933943 8.7058363 -15.3301239 -11.9079809 -9.3314066 14.9871120 -5.1679621 21.7173424 0.2814800 2.7706749 -14.4325075 8.1580706 -12.6654997 -5.7079349 -7.4864092 6.2233710 -9.8405714 -13.3136797 -1.3712626 -20.7309475 -14.3048401 12.8362494 3.5774634 -13.5736628 -24.2084427 6.0701404 -10.1832581 -1.3276992 -3.3130805 -9.2580023 -10.9820375 -13.8458509 -27.7463245 -7.3462105 -9.5618525 11.6671801 -3.1602178 16.8832760 -15.9557161 8.0999603 -14.4376841 7.0649681 -9.5985575 8.0889912 0.1657141 -3.2555223 -0.0499631 3.0264540 -6.2698712 -3.4938521 -0.2044035 -7.2508678 -8.6914406 -1.6379796 -1.9205210 -7.9067721 -11.5956240 -2.2584717 -9.2121029 2.3546984 -5.6956897 -17.3432827 9.0735130 -2.6718061 -1.8651780 -9.9023142 8.0315304 -2.9464214 -2.5635400 1.6276444 -4.3217735 -2.2147560 -3.5934737 -6.9026332 8.6522617 3.2381215 -26.5144310 1.3520840 7.8340220 -2.0306478 -10.3503199 -1.2376540 0.8927687 10.3840151 4.0144377 -3.3141582 7.1560235 -2.6151156 -21.8698597 -8.8011093 -9.6959763 8.7948017 -1.7575618 -3.6116102 0.0587096 -2.3601422 -6.8165646 -0.8938670 -3.5230169 -5.2881017 -6.3539715 -1.3426969 0.1589604 2.0323572 -18.1964130 -4.2131319 -10.5546980 -17.1885815 -9.0576048 -2.4983852 0.0147893 0.8130824 -0.9433777 -8.0561838 -3.1631541 -4.9696975 -1.5126901 -5.7758803 -5.0409532 4.8498278 -2.6156549 -4.6267600 -5.9645300 -1.2049550 -4.4068060 -2.7835147 -11.9456453 -29.3432903 1.6182488 10.0856647 -7.6349201 2.2857842 -4.9551973 3.6336372 -6.9034677 6.5483899 -2.8162897 -19.0029240 -4.2044311 -2.7409048 -6.8352494 -3.8467634 -10.8271418 -13.7844629 -7.0413189 10.4035931 -4.4751287 -10.8838663 -24.0718002 3.5362027 -0.8531047 -1.6233399 19.6735897 2.2858639 -3.7437758 1.5385327 -2.6676629 -10.6421480 -16.2634258 -4.2586474 -8.8802433 -1.5539886 -5.8048353 6.2136841 2.0756271 2.0507169 -3.0193367 0.7867764 -2.2099190 -1.8773223 -2.6995850 -0.6328675 -7.1954341 -3.0929494 -0.1974015 4.0834641 -0.3786743 -0.5508057 1.7639614 -1.4268599 -7.8333220 -0.1015381 -15.9372168 -2.1506643 -1.0131122 -1.0319490 -3.6935568 -1.5485603 -4.0507770 -4.0900550 -10.0143394 -3.7272742 0.8078695 -2.0982833 2.7115686 -4.4420500 -3.5241561 -1.4963927 -11.3932838 -7.7195292 -0.4672820 -1.8722506 4.2079954 4.5310626 -16.3445320 -7.2603087 2.1600807 1.5341482 3.9809375 2.0849850 -15.1580677 -3.3524241 -2.1480987 -3.3955593 2.6794078 -0.9508441 -3.1632783 -4.2968812 -13.1932793 -9.2985039 -3.8006046 -10.8466034 1.2228647 -0.1849024 -3.5759842 1.2580922 0.9109233 -19.2098885 -5.7676072 0.2911984 0.3226907 -8.1457663 -5.4536853 -1.3904868 -4.7161636 -1.4212550 -2.1759763 -2.1844790 0.7820910 0.9212504 -4.3185034 -0.6433026 -11.4279985 -5.1726727 -1.9769517 -0.1169572 2.7369480 4.2778044 -1.4310341 -1.4923871 -23.0210361 -20.8919086 -0.0409944 -1.8609172 -6.6960020 -18.1999149 4.1244926 0.8132348 -1.6674501 -3.2205484 -1.9386718 7.4642444 -1.4840125 4.6489663 -7.4279785 -6.1291633 -7.7918272 -0.0093396 -7.1762800 -0.5403036 0.5624191 -12.4164200 2.9111567 -29.8209000 2.0665407 -4.6665096 -3.7524328 6.7625647 1.1056637 -2.8434548 0.7784644 2.8337176 -3.2945943 1.2852722 -2.8917248 -4.3502932 9.3152418 -0.8433203 -11.2072592 -1.7704773 -3.7721825 5.7097683 -0.6700307 -0.6949775 -6.5632281 3.3464313 -2.6398938 1.6851648 -2.1035426 -3.8017144 -13.1048021 -3.6900377 0.9805284 -1.4004362 0.5012978 -0.6138081 4.0831141 -6.4052773 -9.5597305 -2.7397449 -20.7510471 -16.0706596 -6.8581691 -3.6468456 -11.3238354 -5.3702121 -10.7115755 -10.7871218 -64.5642776 -9.0933151 1.5994853 -7.0243444 2.9722981 -2.0933733 -12.0906067 -8.2993765 -13.7274456 -16.2716942 -5.3313680 -4.3543396 9.2253304 2.5781353 -10.4296360 -13.5988989 9.0742369 -4.4001365 42.9783859 -2.5067050 -39.9590034 -7.6590729 -11.0881519 -8.2267256 -4.0877881 -5.1002784 -2.6064448 -13.0150566 -16.1215496 -11.5649366 -15.0739918 -25.2380676 4.1168799 -10.4898272 -4.5897279 0.5519347 -7.2791219 -3.4977593 -17.8468590 -8.1543560 -7.9388046 -18.6413174 -10.5696793 -2.5640602 -10.1726789 -6.4172273 -10.2562656 -6.5631418 -0.0752164 -0.0468221 -9.8114548 -6.7865605 -22.0325203 -17.8625717 -7.4869623 -8.4340038 5.2554579 -7.1241474 8.7786121 -2.1945083 -22.1327972 -34.1975784 -1.7073723 -9.1927919 -7.1413980 -17.8612843 6.6109066 12.0317192 -11.8083668 -11.8201189 -7.1478605 11.4437475 -2.0929680 16.6331615 -19.6188145 9.3668289 -17.5784893 12.4615679 -13.9372969 -4.3962817 -5.7559404 -8.9511347 -10.9982834 -33.2780380 -0.8623785 -8.5409966 -11.3847370 7.0431795 3.9847443 -10.4636602 -23.7957058 10.5922222 -11.6836920 -1.2935714 -1.6436726 -3.0246506 -37.5292892 -16.8444481 -22.7094364 -7.3565693 -10.8284731 7.5101900 -5.9702120 13.5293818 -17.8978577 5.4601712 -3.1037493 6.3134437 -9.5533657 -2.3274970 -3.8771906 -4.4011326 0.0586222 0.5576088 -4.8651109 -0.3452371 3.4673119 -10.7566299 -16.7216301 -3.6921906 -20.8117981 -19.3995113 -9.1926651 -4.7433224 -15.7726984 -2.0279858 -11.8621206 -15.2689590 -39.8117142 -10.6568003 0.9055589 -11.3212271 6.5917635 -13.8416719 -10.7834930 -10.7826405 -22.3244400 -9.5973682 -6.4391022 -7.2694340 16.4095745 7.5789986 -23.7215385 -11.4173231 13.7389641 -5.8927717 18.3755455 -2.4536734 -39.5323067 -18.9020576 -17.0671215 -8.9184208 -1.3615484 -6.5609488 -2.6296313 -20.4114552 -25.8766651 -27.1035328 -16.9602413 -32.3821487 6.0353913 -12.4590282 -7.0239291 -0.1520641 -10.1307516 -0.2218817 -17.9622040 -8.7509966 -7.3066092 -29.6851501 -16.9319859 -4.5634451 -16.4282818 -9.4971085 -13.6378450 -9.6576996 0.2581515 -0.3153959 -14.3351116 -8.2794819 -23.0252304 -20.0966702 -9.7260084 -11.7073755 7.0355444 -2.6797011 3.6772447 -3.7521818 -27.4426708 -29.0092506 -3.4229794 -11.0414810 -14.6428518 -28.9643669 9.6063881 12.2884979 -15.8287640 -11.7502966 -11.5302944 15.5428181 -3.8234184 20.7119522 -6.2618093 -1.7918962 -19.8890858 10.4020691 -19.2152596 -6.0001206 -5.8932238 5.3956203 -10.0371971 -18.3252659 -0.1192032 -12.7826185 -16.7068253 11.0285988 2.6869388 -13.7762880 -27.5314770 11.0095415 -15.3293762 -2.4533985 -2.0584984 -7.8799157 -20.8387451 -16.0064411 -30.1387615 -8.8636236 -13.1369009 11.4890089 -8.6122408 13.6854267 -22.9694881 8.3586302 -10.4896059 7.6624079 -10.4360161 -5.2586665 -10.1130915 -4.9921598 1.0549092 2.3456028 -5.8531337 0.9748634 0.0134175 -15.0306425 -11.0616922 -2.0055420 1.3165139 -8.0350552 -11.2342720 -1.2052969 -12.5287533 2.6841111 -4.4787941 -14.2193251 15.4211130 -1.1980716 0.4481572 -15.9396753 7.4658666 -9.0701361 -7.5083933 1.8037217 -6.9957056 7.7375655 -6.4661679 -6.0431952 9.6266289 8.5932570 -14.4423943 -2.8615713 5.3318448 -2.5895669 -9.5251541 -2.0587714 -2.5047364 10.5614061 -8.3599539 -4.1707683 -1.7113206 -1.5334369 -0.5955208 -8.9160862 -12.1831961 -1.1139607 0.0700942 -24.8966389 3.7381997 -4.5149727 -4.6864109 0.3187758 -11.2405043 -9.6014051 -3.6519411 -3.2169697 -0.4132723 -0.9571123 -6.1795468 -5.8732152 -12.8709908 -8.9211502 -9.2225800 -5.2407842 -0.0086340 -1.6523275 -8.0180759 -5.6888728 -7.2476101 -0.7746305 -2.4481897 -8.8288956 2.2664597 9.0292702 -12.2519312 -9.0833797 -7.5277176 14.7409039 -6.9190478 -3.6668320 -15.8515739 -11.3272133 2.0832088 10.1645088 -12.4681673 5.6261916 -9.0221176 2.7904065 -3.6512935 4.2993512 4.1527443 1.7994263 -4.2620602 -8.5371046 -11.7666330 -2.3189237 -4.1030345 -1.2350878 2.7650750 4.0984674 0.5734454 -9.1135788 -22.2981739 3.8941362 -1.3360368 -6.4659395 3.3443294 1.5376931 -4.7962980 -3.6574988 -1.2305974 -7.8039322 -10.4990606 -8.2601709 -22.9572487 -4.4457517 -4.5432191 7.6608963 -2.0261717 -4.6825476 -16.9145908 2.0051808 -0.8914860 0.6152099 -2.6800966 -3.3875284 -8.4303074 -1.5077593 1.8761604 7.0066748 2.7541788 0.8881686 -0.5545369 -1.9488997 -8.5052290 -0.2916222 -11.9755888 -5.7037606 -0.3794737 2.6866090 14.6855698 -4.1144295 -2.2483356 -4.1734591 -8.6555691 -2.2868886 -0.5436816 -3.8465395 5.4548340 -3.8774431 -3.7189364 -0.4001985 -14.0242052 -24.0333366 -3.9532356 -1.6170175 4.8174758 9.0710211 55.5996628 -15.4707222 9.9214697 -3.1791816 -0.7883229 0.2275793 -4.0894952 -4.4850078 1.6851354 -4.3984342 -1.9545228 -1.4175084 -1.1991028 -5.7120047 -18.6841049 2.3426981 -4.0021849 -12.6024466 1.4083893 -3.0056076 -5.4333792 1.0560426 0.7913379 -21.6539135 -7.0566497 -0.2200296 1.0184584 12.3259840 -6.5726695 -0.3095019 -4.0854416 -1.6112906 -1.1541009 -3.6451380 1.2809825 0.2891883 -1.9216418 -1.6869529 -7.2008018 -2.1505349 -2.0150981 1.1570230 -2.5256410 9.8131199 -4.1729102 4.7048368 -28.0812511 -14.6740551 -2.0853233 -0.6569009 -1.9586964 -22.5443058 3.7116120 3.3628020 -4.6189156 2.8424792 -1.6655774 8.8071337 -1.7862736 1.7375634 7.4454751 -6.1790752 -4.4845624 0.7121043 -6.2616224 -0.2079930 1.3007026 -12.4411354 0.0601054 6.8439922 2.1946080 -3.5362053 -4.9346771 10.3691759 -0.9943842 -9.0044355 -0.3052679 1.2634065 -4.4564509 -0.7726417 -2.0932920 -4.6586299 48.5341454 -5.0874596 -15.0163021 -1.4869553 -1.8382682 5.4477649 -0.0716928 1.6187375 -6.9389586 5.0451093 3.3891971 1.1950477 -2.5121632 1.5849886 -11.2632627 -1.2224953 1.8754497 -1.7801703 -0.6367240 1.9736214 -0.0965499 -5.9676256 -13.7368889 -1.3247868 -30.9943066 -1.9102168 -2.0078890 -0.3047078 0.4101329 3.2353950 -0.8731179 1.1029227 -2.9093771 2.3886292 0.4545239 -6.1872921 4.6744328 -5.9178219 -1.4267396 2.7580285 -11.2509079 14.3885469 -0.6644894 -3.4862587 4.3980546 6.4211907 -12.5756893 -6.3055081 -7.1945977 -3.5513623 15.8602982 0.6673807 -12.0425644 -22.0507126 3.5479209 -6.5673509 7.3848553 -4.9353337 1.3390365 -6.4276547 -24.9892349 -1.2946502 -2.6093838 -20.8273277 3.3359666 0.1239429 -1.9846842 -0.7739738 -1.6658006 -5.1304383 -3.6771002 -0.9843389 -0.4357001 -1.2150722 -6.6489291 -0.6657994 -7.2140384 -1.5517344 -2.8588171 -4.5900121 0.9530064 1.3998108 -7.5746365 1.7971050 -5.7166529 3.6415262 0.8208835 -3.2341261 -0.0965919 3.1442904 -3.2443857 3.4084117 -43.4520874 -5.6816025 -2.1745191 -4.2799163 -11.5157290 -14.6858559 2.1219397 -12.5055676 -8.0447531 -17.9235954 -3.2380877 5.6087494 0.1825318 2.0554929 9.4523859 -15.9503212 2.4150047 -2.3531945 -6.0937638 -2.0876057 2.0147629 -15.6433392 -11.0852909 -34.7935181 -0.1474546 -12.2456627 -5.8433399 7.1617393 -0.2328916 0.3423308 -11.4692307 3.4087393 -1.3385303 -2.8459461 0.8943567 -3.6253965 0.0705521 -2.9832697 -14.1808443 -3.1250362 -38.3532791 3.8686318 1.0208226 -1.9585487 -5.0476141 3.4626033 0.6229345 0.7302755 0.6093391 0.0382812 -4.3397589 -2.2505624 2.1517034 0.4923216 -3.1627159 -1.2146269 -0.5055774 -3.5004406 -10.0648470 0.4508766 0.2594877 0.7120649 -5.8090754 -3.5452778 -3.1412225 2.6089032 -2.0416026 -3.0260396 -8.9022827 -2.0284936 -1.0966824 -4.5421491 0.5442191 6.6347294 -1.8829318 2.0285945 -5.2723246 20.3383999 -1.6606636 -9.1964188 3.0998347 0.1270405 -13.6625786 -4.0763068 -19.5560608 -0.0537719 4.7745757 4.1967282 -16.3344173 -8.2762594 -1.1066556 -19.2428474 7.6035218 -8.0600262 -2.7623973 -4.7042656 -8.4697924 -8.1521616 -9.4607849 -10.6903372 1.9210109 3.2575123 -3.5335522 -5.2306070 -1.5650034 -1.5736983 -4.0273709 -8.2197781 1.7095289 -7.9999089 -7.8952203 -0.4423236 -2.5670025 -2.3278105 -6.8105617 -1.9566954 -0.1691115 1.8073009 2.0346630 -8.1329613 7.5992751 3.5775025 2.7153945 -6.4905782 -2.1587515 -2.5202653 -4.0898170 -0.0504553 -22.5600262 -0.3169230 1.8024826 -4.8997512 -2.1274748 -2.0467806 1.7582951 5.6446924 -2.0302165 -0.3138248 -2.6850870 4.4072371 -6.0640774 3.2071068 1.2028356 2.8966932 -0.9503849 -4.8676300 -5.4305258 -1.2464898 -2.4598057 -0.2093791 7.4488530 -10.9607906 -9.9813957 -5.6464696 -5.9867325 5.7676778 -2.6245401 -0.4173051 -1.6379362 3.3040330 -2.3509958 -0.9724144 -1.6958883 -3.4233587 -22.5516911 3.2159472 2.2054005 -6.3361273 -3.6839483 3.3846030 -1.9913944 2.1851363 -3.1801322 4.9615030 -2.5162477 0.1511944 -0.5638502 -4.6470084 -21.3740826 -2.1311052 2.6329057 1.5221794 -3.3376904 -5.9532213 2.1696866 -2.4107671 -14.1119194 -0.2421487 1.5981760 -1.4008203 -7.1040006 -4.2883563 -10.2865591 8.0606699 -0.6451358 -6.2998714 -26.7534809 -5.5969963 -5.9172602 2.6028128 3.4991014 -1.5886807 1.0319389 -0.5108321 -4.1516495 -0.8381220 -0.7714335 -9.8765755 12.2603388 6.6675119 -17.9720631 -2.9184904 -4.3739810 2.7472291 -25.1346397 3.3763146 -1.2462947 -2.3712704 -2.3143308 -9.1698828 9.1606455 -7.3050761 -0.9260828 3.4648919 -3.6235740 -15.2584438 2.3568769 9.6703129 -2.0101705 7.8270893 -6.8417788 -11.5926476 7.0148835 -5.2732048 -12.4248810 -0.8804073 -3.6818843 -23.5923958 6.8842654 -2.6541800 -10.3063259 -4.6941824 -8.3037319 -2.2306528 0.3214067 -9.3748865 -0.7853871 -3.8872168 -1.4184173 6.9173527 0.2961795 -9.0663099 -2.7780952 -1.6183827 0.1629663 -6.2111850 -4.6942430 0.2389044 -0.0045853 -19.1591511 -1.9931060 0.5712222 4.1517835 1.8974522 -2.9191096 0.2761688 -9.7222700 4.8539371 -0.6803395 6.2015147 -8.9049473 -1.2730108 -4.4913645 -1.0080181 -19.5882492 -2.4717844 -4.3305449 -0.3509424 4.2799578 -3.1016374 -1.5995531 -4.9179335 -5.1784511 5.1932869 -4.1039281 -3.2323582 6.1238475 1.2060033 -8.5187149 2.2437763 -8.0238581 -5.1445370 -3.9510026 1.0305327 -9.3356638 -1.5004613 1.3936988 8.0507898 -6.9599733 0.4601110 5.4559746 7.9915447 2.2314811 -1.2605811 -7.9515390 1.5933273 19.7833214 -7.4960551 4.2346454 5.6986747 7.6025772 -6.4183798 -7.9387550 -1.8964314 -2.1801147 0.1696804 -3.8536499 11.3702793 -0.1018842 -10.0193443 -12.3171263 -6.6376238 -2.0343368 5.8815517 -17.9308949 3.6934485 -5.2554159 -0.2995536 -8.7009745 -19.3780918 5.7971306 -1.3569632 3.6379540 2.4345822 0.5307188 -59.0851974 -16.2888241 -4.2414689 -21.5991898 5.6014199 -12.6139555 2.8595722 47.2528114 2.4161410 -13.0332079 -3.8013055 1.7726601 -8.8331575 5.8075395 -3.0553885 -4.3777137 -8.2072706 -0.0453556 -14.3539047 -7.0162678 -22.0117645 3.1815033 3.7717700 -4.0629277 0.3793119 0.9451864 -5.4489808 0.1966590 -11.6303883 0.9546559 2.7157905 -14.6011810 6.5310068 -2.0501766 3.3535616 -11.4776859 9.0821733 -1.3208144 2.4531343 -3.3331690 2.9041808 -22.2990322 -8.7009001 -1.9827377 -5.6916447 -2.8579953 -5.7354774 1.8042186 -10.0373793 -4.4055729 -70.1193542 4.7813201 -5.9717836 -11.2378654 -21.5119286 7.5472655 58.1163559 -0.4825298 -11.5960703 -2.3935890 4.8076649 3.7768402 -2.3613727 16.0661278 -7.7156196 -7.6616974 89.0369873 0.5379202 -0.5248313 -4.8811145 -13.2048731 -4.9188342 -10.1460896 -6.5720205 -3.6271820 -39.0300941 5.6097116 -2.3098686 -0.5947666 5.1835623 9.4201040 -5.2136683 1.0756805 -6.8909445 -0.9022483 -5.4655437 -0.7745603 -4.1307273 6.3073363 -7.9366765 11.2422724 2.6586466 135.6528931 -56.4848366 0.3227354 -19.1938534 1.3722075 -3.4066095 -6.0351968 -28.8843651 -1.3683404 6.9798169 17.2042389 -8.3076420 -3.2554765 -7.8196659 -9.4544964 3.8752666 -2.0056343 1.3197702 9.6636028 2.3540967 -3.2538378 -12.2394218 -9.9728165 -5.1718621 1.8838651 -15.7481337 -0.2086026 3.2699332 -5.9777675 -9.5219707 -3.0445900 -11.0736122 2.1909559 -9.4452600 1.7550588 -5.4369712 -4.8381248 2.8053558 7.7817907 -18.9147987 5.4012413 -4.6222043 1.9801320 -8.7254715 -0.9550742 -22.8322201 -6.5668063 -0.5287712 -3.9452903 -0.9632137 -0.9660809 -7.2131119 -4.6014185 4.5553164 -29.5007591 -1.9867687 -30.7577591 11.2023954 5.7791677 -5.5167646 2.9559753 -2.1571808 3.6065764 -1.3201543 -22.1306438 3.1555145 1.9802622 -13.4194098 -10.4939404 -2.8477972 3.4100900 -12.1288853 7.4214563 2.1422229 -4.3630371 -6.3197951 -2.8151381 -38.3492966 -7.3518143 -5.9024000 -6.0204802 -6.2967157 -4.3873034 -7.6191163 -10.1526737 -13.1339645 12.8277473 1.5343207 -2.6175780 -1.9663713 -25.8033543 9.8930807 30.8085060 -2.4303610 -1.3487465 -4.9452024 10.0463238 -2.6643357 0.8974989 15.4381542 -2.3828752 -16.6967163 3.2293582 -0.9166773 -3.2707324 -3.1584616 -6.8088970 -11.9742260 -14.7687521 2.4796054 -2.0627954 -12.9235945 8.7355032 -4.5105405 -1.2693698 6.8174949 3.5814691 -6.0064330 -2.2525856 -4.9926920 -1.4660685 -3.9674637 -6.8322310 -6.5324774 -3.9042659 -6.2143879 -8.9385672 1.0885243 -37.6390457 -9.7454548 5.8731546 -10.9194908 -0.5964874 -2.8316946 0.9112543 -7.5891333 1.5975100 4.8447223 17.3579102 -2.1660271 -1.4066442 4.0075784 -1.2236139 2.6652265 -0.4661462 0.0381133 15.2550116 -8.9103518 -5.2756205 -14.8182440 4.1178503 0.6856796 -15.2842417 -3.0809267 15.1803665 1.9668251 1.8376031 -14.5160942 1.0179337 -16.8041744 -28.9893551 -12.4106245 2.7148285 -4.3790669 -1.8237536 25.6740437 15.9233856 0.8550378 7.3505583 -3.1405261 4.6832180 -4.3329988 -1.9031025 -11.0051479 -6.5452852 4.3766594 2.5918078 -2.3811555 -8.0393629 -4.5727706 -1.8807232 1.2986839 -6.6426868 -0.0341252 -5.3355579 -9.7609930 12.4692745 -4.6819386 -0.2167480 -0.5689800 3.9714530 -2.9051962 1.5792506 1.5302037 2.0858328 -14.2572374 7.5105767 -7.1131735 -1.6308520 -4.4093361 10.7651310 -5.8063073 -6.7500877 -11.5483656 -5.0872054 -4.5111647 -9.0498419 -14.3242760 -15.1934938 -11.6621571 -0.9160532 -4.4540648 -5.1758981 -6.9722953 3.1252394 -9.6951437 -5.7878189 0.2319251 6.4612722 6.2895284 21.3379135 -15.7447472 -1.8383944 -10.8342428 -0.9177311 0.9996001 6.1793756 12.2916336 -3.9823189 -3.6704869 7.2121468 -1.9469458 -5.9121799 -15.7161627 -8.6704092 -14.9765120 -20.3890514 -5.8535080 -8.6102104 0.1906760 -6.0682373 -1.7507370 -1.4833277 -6.2095566 0.4708325 -8.5494118 -2.8684366 -30.3890362 -0.5588267 -2.2789321 -9.7809153 -4.6952963 -23.4698639 0.4534849 -13.1609020 7.3299193 9.5034771 -2.0242426 -1.1873264 -1.6944302 12.6715164 -7.5291562 -3.3690436 0.6266237 0.2512066 1.4862595 24.1603756 -18.1878014 1.2385510 7.6136136 0.7093679 6.2489142 -4.8873215 15.8303871 19.0243053 -26.6509399 4.8281975 -10.0265455 -38.0871964 12.8413782 -7.4641342 -3.2132237 6.5199795 0.3058874 6.2058105 0.9132659 -16.5758591 -3.0189810 -4.3476443 3.3871710 2.1291463 3.6143041 7.2193384 9.8051271 2.1588402 0.7052127 -16.7308083 -25.0476151 8.2077942 8.0317955 -3.5184839 29.5157337 -10.3829679 5.8710136 4.2385869 -5.2526908 -3.7099679 2.2674704 -1.8585203 18.5779247 8.0124512 0.6946285 13.2352448 -5.1807976 -9.6231098 -2.5779762 -6.1256399 -22.4431629 2.0253558 0.8308669 9.7504988 -0.8025987 -4.1061974 13.3975143 -3.0567136 5.0533409 -7.6651587 2.0088129 -2.1700575 9.9621296 -18.7884922 -26.1340561 3.2243574 -14.8690577 22.7623119 -3.0427964 47.1426239 -2.0328038 4.0272260 2.4415567 -21.9526062 3.3026421 5.0556812 -1.2970955 10.1975212 11.4541636 7.8859382 5.3135133 14.5361204 8.4009743 16.6882553 -3.2388973 10.0739384 -2.9845085 -8.4250107 -9.1914043 16.2850056 -8.0729580 22.7580757 10.5485020 -0.0222357 -0.7355880 7.4266572 3.9627380 -14.8181648 7.0424523 -10.7970438 4.9628496 18.2343845 3.7172801 4.9627085 -0.3586951 7.4281936 4.5293517 -5.4844279 -4.0448413 0.8003202 -126.5492172 -2.4404221 -3.4495325 -8.8555231 3.7341394 -2.4649329 -2.8873739 31.1333122 6.2090449 -28.8087654 5.2929187 -1.0993583 -0.9431192 21.8302574 0.8596608 -2.0073986 1.8943471 0.0307397 -15.4194069 2.5696328 1.3661802 12.0595579 -19.1225872 0.8057259 -10.2422676 -14.1521273 20.2870979 38.2928391 0.1812520 3.8071861 -4.3870006 5.2171803 -0.1707173 -9.5478191 7.2200875 5.8682694 14.5970421 -9.6380243 -10.7450838 11.7342815 2.0105939 15.7308273 3.8886809 62.7173309 14.8654661 16.2773914 -20.6437054 4.7053437 31.1505413 22.3429203 65.4882431 -0.9359049 13.6039801 5.1761594 0.8815598 6.6815062 10.9887400 34.0478210 19.5391769 -0.9631934 -23.8972301 26.0390797 -31.6019897 2.7140613 1.7057344 -9.2878075 23.5054302 -12.9507551 -0.1328610 -3.0694470 16.8583241 -9.8522787 2.1040473 -30.4707832 -3.3887069 15.0543203 3.3159735 -2.5063846 -21.7748528 0.6956065 8.2190609 8.8977785 -14.0972605 -14.8673973 -16.5069885 12.6135902 4.1280060 -1.6047821 18.3590622 16.1204758 12.1667280 30.8310642 46.8547287 -25.1513939 -0.3425933 0.9062642 -57.1580772 -48.1523170 20.5879765 54.4658966 9.2168636 -1.3370708 3.4244192 18.5636234 12.4029884 -7.4468455 0.0284128 -16.5061665 30.9870968 34.3237419 8.5646324 2.9683282 -2.1136041 -52.7904358 8.6889009 -9.0146208 -29.6383686 7.7602696 2.8795688 29.4875984 -36.7733650 24.4993725 8.5417156 -5.7969475 9.6273918 -1.8740780 4.0227103 -5.8487444 10.0697527 -18.4309120 -13.8159227 -3.9066563 -20.8448009 -49.6323700 -10.6598043 19.2797565 -11.5328217 7.9175749 -27.0150471 7.4632220 3.5917804 -31.7540646 30.2603168 13.0435295 -1.0567597 9.7282715 -15.0587425 5.8651476 1.8669484 -0.4626245 7.0418334 -3.0611026 11.9713106 6.3904080 -7.7236967 2.7161212 -1.8371444 15.8750648 3.6289327 7.2580919 2.3555145 8.9806843 9.0768223 4.2480407 7.2087855 -8.8992243 21.3707409 11.0538845 5.4796629 4.5054617 -4.9974194 7.8285990 -11.2961664 2.4035156 -18.4744778 -1.2959433 -14.1479244 7.2048421 48.2358284 -3.0239995 3.7290740 1.8904603 -16.2926788 6.8196325 -3.0504780 9.6353979 6.3048663 2.4340270 14.4820900 7.6597643 14.0223598 15.9963636 -5.2323709 5.6308351 -1.6652830 -5.6424217 -10.1991901 7.2161422 5.5472546 -0.1091588 2.7403457 2.5558875 5.6278601 4.5270472 3.2221653 -7.0113544 10.0146503 3.4705050 1.8088143 -9.6515760 5.0985141 3.3079734 14.8949575 -8.0852957 8.9799328 -7.9933858 1.2463906 5.1748395 -12.8998766 3.2270062 6.9642305 30.6660538 -1.4727259 8.3755293 -22.6869831 122.8124542 -0.8083200 18.0462685 0.0713226 10.3262053 1.0369334 -5.5037861 1.0249408 -15.9944096 -5.7153425 -108.2697830 11.2142792 19.3177891 1.3675754 -1.8861595 2.2668781 13.9051390 -1.6079471 -3.9321823 -21.0934505 26.2500343 1.6853768 5.4859028 -2.2512362 5.8104076 4.6154046 0.2415066 -2.3518658 -5.5719662 6.0278950 -8.4439754 4.4236112 -0.1704935 12.5579376 -4.1294651 -1.3745576 -14.5999603 -8.8712654 15.1017399 15.5829010 -10.5852480 -3.9917159 -2.6008275 6.9751668 13.0386314 -0.0635462 -1.4531785 5.2516594 1.0529699 -2.4209116 2.3538160 -2.4525826 -0.2329660 -0.9090007 -2.0995469 3.6571739 -4.0446343 -1.8535746 -3.2860749 0.7716681 1.3151125 -4.2889175 3.7023115 7.5519552 -3.9963167 0.9040699 1.1136173 -1.2738951 -8.8878603 2.6294072 1.3575839 5.2044888 0.7187308 -2.7310669 2.2801578 0.9665068 -4.7996416 -2.7812858 -1.2322912 -6.1887140 -2.5904324 45.9797821 -0.5153743 -2.1683726 -0.6509342 -5.1482477 2.5853570 -1.0127556 -1.4102304 4.2694373 -1.9710772 -0.8986499 12.2567530 -0.4526236 0.2480873 2.0443506 -3.6725891 2.3280768 -1.2686968 -3.8528073 20.2653751 0.1421286 2.3289306 -1.5408920 -1.3277006 -0.1411688 1.2430537 2.6303089 -3.9296823 -0.0902296 -1.1686631 0.9233999 -2.7719219 0.9398794 5.4388776 2.7664347 -6.8653479 0.4441298 -12.1740007 2.0518727 -8.9063530 4.1430006 1.6626316 4.3760490 4.4113646 -1.5854063 -0.6704636 9.7954645 -1.9897883 0.2181059 8.4729910 -1.4982159 -2.8132591 -0.1151805 -1.6833469 4.0526934 2.4016104 10.4648905 -21.0996971 2.9701793 7.9901237 -1.5486253 -2.1788216 -1.9053153 11.8008394 -3.2531164 -4.5668492 -2.8247900 3.8651557 -1.7456403 -1.3752619 -1.8659538 -4.1438527 -4.8599939 0.1225706 -0.0629134 -0.2274643 1.1296612 1.1871710 -9.7293549 -1.9365511 0.6038588 -4.7465968 -12.8761883 -3.6073451 -1.9400810 10.0728617 1.8892022 0.1402553 -0.1408766 3.4887733 -2.4521348 2.5630217 11.2629690 0.0768325 0.9000666 2.2521260 -2.0251083 -0.3918564 1.2183244 -20.3969059 -8.1463079 -0.4376942 -6.1283574 -9.5918818 3.0281010 -4.6962805 0.2992140 -3.9507937 -12.1751795 -2.6026354 -0.7185847 -11.1341782 0.9321629 -14.0671787 0.4334484 4.0184002 8.7569160 1.0384185 -1.1589353 -6.0927830 -2.2566540 -1.5882144 2.3100448 -3.8334634 2.9157686 16.3715782 -3.5690238 -7.9937816 -6.9245906 -3.3447657 -3.7491386 -0.5942404 0.4741125 0.4316095 -4.7290778 6.5525355 2.4977903 -2.4591167 -8.7816029 -4.8518920 -2.6575649 -3.4498737 2.0330758 -9.7778578 -0.4013678 -0.0932320 -7.6167932 3.9375398 2.2410054 1.1718569 -2.7610776 -33.4422226 0.9300512 -4.7811241 -8.9929991 -2.7161281 -2.0265119 -9.4050798 0.5243282 -2.6044004 0.7860376 2.2453632 -14.5475464 -5.6444407 -0.9377172 -7.6129942 -1.0153506 3.7613950 -0.7550679 1.4252682 -2.9822946 -17.7061882 -1.7120800 6.0344429 6.8169255 -3.7868392 -4.4185057 -59.0260735 -0.4586438 -8.2141151 -0.1429240 -6.2366533 1.5242978 0.6553810 -12.3476753 0.6385641 -4.0709715 -0.5905046 -3.9071383 -0.0872734 -0.8774402 4.4257479 0.8417994 -10.7581434 6.4507456 -1.0585235 -5.7028427 -6.5703025 1.2075915 -8.8429937 8.6873598 -2.9835761 -0.5496079 -3.6571269 0.0447676 1.8349521 -53.6822968 -4.2311525 7.1728806 -0.6189967 -10.3017073 -0.4366492 -0.4163450 -0.3062148 5.4611807 0.4237648 -6.8376217 -2.0931678 7.9896922 -5.3616567 5.0589614 -0.7041596 -2.6039846 -7.8241029 2.0945861 0.1727184 1.5269625 3.0365868 0.8238164 3.1207867 0.8750503 -0.5016750 -0.3238335 0.8478281 1.2403526 -1.4578891 -7.5185156 -0.0576145 -2.1360211 1.6609415 0.1334949 2.5642395 0.3719361 0.0767436 -1.0685710 -0.4194773 0.8241412 -3.5790973 -1.1747079 3.5884726 -0.2007965 0.3410691 -4.1962862 -52.0213318 6.2212801 4.9691315 3.4126503 3.0325181 1.7984142 0.8468302 3.0153580 -0.5553251 5.4758162 0.9253965 -0.3364150 0.8099574 0.8458863 2.0643258 -1.8423791 -1.9465775 -0.2024757 1.7496527 -0.7016286 4.0012221 3.6735725 -5.3690763 -2.4531596 -0.6479694 -0.5673203 14.1611452 1.9118042 2.0846446 3.6732557 -0.1962824 0.0214326 3.2292914 0.2861995 4.4344497 -34.9949913 -1.4839145 -12.4168024 1.9051148 1.1368542 -1.4822104 -0.1006350 2.3177962 -6.6190271 1.1101218 -0.0970150 -8.9518938 2.9073863 2.7905147 5.1189122 -0.1524931 3.9182904 15.2127256 7.0404935 -1.0383838 0.6792530 4.4223523 -1.5432441 1.1390977 5.0536780 1.5311408 1.3181124 5.0490303 -2.3804493 1.7759178 0.3036888 -2.6486130 6.0254784 -1.2772434 -0.4145215 0.7492902 1.4573416 3.0479665 0.0699064 1.8482542 1.5325532 -1.7418905 -1.3179917 2.3315136 -0.1151090 0.3933501 3.4778945 2.5633128 -29.9572163 2.6237032 1.5814012 3.8678002 -1.7469558 7.9434500 0.3080772 0.3108856 1.5897539 -0.6238897 17.5166626 -1.5800490 -4.9409781 -2.6285613 1.0374885 -0.9672891 0.9022892 0.1986250 -1.3587000 1.9106171 -1.9394192 -0.4428367 -2.9425824 -8.8213720 0.7338740 -2.7490263 2.1581035 -3.0267720 -8.7299137 -1.0560721 -0.3585236 -2.9175584 2.1818888 2.4001367 -0.5391003 -0.4398210 1.7319313 1.4703274 0.4962043 4.8638391 0.9094127 1.8386962 -0.6817227 -4.2139621 -2.7061903 -4.1061344 2.1508143 0.4930495 -5.4682031 1.1182830 -4.5848422 1.4362550 -3.6187589 4.7510667 0.3345019 1.6248120 1.8419652 -5.2548141 2.1611245 -5.3168697 -2.5256491 -0.6670104 1.9409873 -6.2637796 -0.7017584 1.0958558 0.0958792 2.9155643 2.7039149 -0.1331962 -4.0213509 -3.3975692 1.2113968 1.1333427 0.2213504 -1.0828381 -3.2615862 -1.9930784 -0.0110051 2.7434483 -5.9513459 -0.4083238 -8.4992914 -6.2797379 -0.0694398 -4.6850300 -1.2438835 3.0761054 -1.8670443 -3.0659482 -0.5350694 -7.2209196 0.5246589 0.0254123 1.5785071 -0.9546744 -0.3955075 10.6999083 4.7681513 -6.8201032 -1.5960985 -0.9138849 -0.3576251 0.6603061 -1.2547920 0.4216370 -2.9582090 4.1107798 -1.3847796 -0.0150208 1.4408386 3.6000724 2.1765609 7.8384705 -5.4294991 -2.2844777 -0.1474328 -2.4713542 -1.0179868 4.3821630 3.9596822 -2.0038373 1.9615250 -0.2410622 0.9014614 0.3975413 8.6811810 1.0215333 4.9823422 -1.2942673 -2.9053321 1.2018449 1.2653925 7.7561312 0.8561589 0.4360624 -6.4324355 -1.4814621 5.6878238 1.4338869 1.2667623 -3.0760961 -0.2225629 1.5051239 0.8895125 1.2325073 -3.6126282 8.5455818 5.9249439 -3.0402143 -1.8710792 2.2816639 -3.9454172 -2.2501879 -2.4254413 -3.8327787 -8.5164137 -2.6453371 1.7955620 0.7632919 -5.2188177 4.2792277 0.9612901 -21.7482662 1.4274026 1.1466308 -9.3314571 -7.7038846 -4.7423148 2.1679628 5.0453196 -4.1089253 0.6079664 -14.6685266 -2.9507227 -11.0499811 27.4974251 -5.7160168 -4.4344773 -2.5438623 -24.5239182 6.5391159 -12.0496721 -2.2542491 0.7259731 -12.4739676 19.0377007 0.1509510 8.7991056 1.5583446 -0.1977184 -0.1014628 5.7441607 -3.0665197 -6.2029095 -5.8599086 4.8624244 -1.2801759 -4.5117607 38.0719833 0.2754071 -1.7453586 2.2779338 -2.5294318 5.9500165 -2.4993300 -0.8433530 -9.3643656 15.8712845 -6.7023377 31.6529179 -86.7257767 -1.5302665 4.1381264 2.0215664 2.1170769 -13.3600397 -31.5293102 2.5760005 41.2879524 -6.6107674 -1.7823178 -5.0882826 -1.0746409 4.4086518 31.9870243 0.0240670 -8.6953526 -5.8683167 3.9007118 3.5898476 -1.8762498 18.6343498 -1.0408328 -0.3746645 15.9937449 3.7522478 -3.9396703 2.1005228 -2.6015749 -16.4596901 19.7803917 -10.3850107 -7.8850536 -4.3808904 0.1202343 -1.3784978 13.3920622 12.4517412 3.1885169 -1.4292220 -7.1616940 0.5915787 -2.1903656 27.1000671 -14.5864124 19.7875500 -12.6980009 -7.5151920 -1.0441736 -0.5093142 16.0572910 -0.8329788 -2.1709137 1.8514031 0.7611704 -7.0903845 3.0770736 1.7533337 3.0285685 1.0648820 0.3752454 10.7440557 0.7508765 -1.2442768 19.3556709 -7.8678222 -0.9347414 2.5335798 11.5807409 -16.8289299 -7.4877005 -4.8784170 5.4248652 17.8445740 4.9618931 2.3623912 5.7096529 -8.0770206 10.9098930 8.9173374 -6.5654588 -24.6926632 -2.0147665 -11.5065355 -12.6945362 5.5408058 1.5093246 18.7946854 5.5061107 1.0060374 -11.4514856 -2.7988229 -15.0318537 26.9442730 3.7703540 -15.9763508 -1.4735950 10.8962440 4.7297602 -3.9634879 0.8985306 6.2474985 -7.4920020 -6.8030763 -2.9272361 2.4013758 -9.1902609 -9.4752808 -0.0154690 9.4318819 -2.5858147 4.0973892 -5.8258862 2.8479929 -2.5666726 -1.2141427 26.0456810 -4.4497361 -7.1208715 13.3853321 1.7363888 4.6088653 -4.5453925 -0.6936170 -6.5981116 -0.5224079 -11.5626011 10.8442698 33.2349777 -0.5630357 -7.8141952 3.3843164 19.1654015 -7.9035053 7.6202941 -10.3953133 21.6685429 1.0660625 16.8180103 14.6369820 -9.1725969 2.2961621 38.5182648 1.1581168 -14.5623426 -6.8771849 -5.4534144 2.8676445 8.3334732 17.1882095 1.4804645 5.2873611 31.9908180 2.0361955 -0.5016254 6.8741255 -6.7576175 -2.0185995 4.9764681 10.8067875 4.8981452 7.4620605 -12.9318275 3.6096179 9.9273396 13.1330395 8.2191687 -6.4975524 -13.5930996 2.5658064 -2.7950008 -19.7230091 11.8590422 -6.6329169 -6.9172349 -12.0354204 0.8025899 2.2836118 10.4639616 -12.7233963 -10.6372499 7.7949309 3.0697453 -3.1834528 0.6460066 -6.9770775 6.5433512 -5.7429414 1.1166503 33.4609718 -1.9966210 2.4064105 -13.9186506 -2.9776959 5.4059725 -5.3957319 -20.1152325 21.7110806 3.3336504 5.9107203 -13.9721622 -46.7985077 -7.5543747 -7.0391216 -11.2297869 5.3228722 -7.8195500 -7.8881874 9.7781181 14.4151735 4.0665426 2.3355830 -2.0488939 -10.0282555 -1.3616639 -6.1076303 -4.7806635 -4.2947216 -3.0769629 17.5064411 10.0660315 -3.7752807 -3.7729678 -5.8882604 -2.9193962 -6.8913851 2.1350441 -2.0421741 -1.5748193 -5.4519482 2.6879261 1.5575056 -27.8909569 -1.9579327 -2.1039484 16.9914265 -5.9020638 -2.2999635 10.1887398 2.2204957 -1.5545769 0.7170160 -0.5982077 -4.3479753 -7.9944377 3.3814297 3.6978567 -10.0546694 -2.0406759 -5.7265830 -5.5760260 1.1010485 3.4912550 0.3232269 6.0359406 -8.8498268 94.4965744 2.8006027 10.6606846 -2.2232711 -12.0805626 -1.8886977 -7.3945346 -1.1149153 -15.9969530 -1.0742251 -11.3398571 -14.7607803 -3.7265053 -2.1396010 0.1637548 1.7204933 1.1107740 6.0122547 8.9893112 0.9034222 -6.1970358 -5.5925217 -9.8907146 -8.7680092 -22.2118015 -3.8512075 1.2764248 -6.0876198 -9.1806517 0.7823468 4.2622638 0.2901359 -16.6448650 -4.3862519 13.3560352 -2.6450255 -1.3637290 -10.8053703 -6.2743158 1.5356205 6.7185254 -4.5855117 3.3729014 -4.9925785 -20.6033802 6.2703056 8.2083673 -2.4191232 -5.7319932 -6.7357264 3.4508078 6.2012253 12.3272963 -7.7885013 -4.9354434 -14.5695410 -11.6733274 -2.5024297 -9.3454123 5.3793745 -1.0286138 -16.3966408 7.0092812 12.0219517 -1.2612927 -1.5939546 -4.8347301 5.7141714 7.0182481 -18.6050587 -2.4176521 9.4712219 -8.4683714 -1.3833529 -3.4149964 2.0434439 -3.5232418 5.8562646 -0.5552416 7.2520394 -16.2999687 11.4436340 -8.8972950 -3.4794769 -4.4222436 -10.1903811 7.9312525 -22.2439537 4.3206763 1.8869725 -5.4162483 -22.1357422 1.1510133 15.9981403 -6.5497265 -2.4193919 -8.2557049 -28.6284370 5.8815703 2.4150722 1.7172425 9.0629978 -2.2389393 -1.2327749 6.7769976 -7.2473245 -7.0617270 -9.1768093 -2.1740434 -15.4833860 -3.7308004 -7.6789656 -4.0895948 -4.0195141 6.5413184 -5.1920347 7.3457069 2.3913004 -2.6802976 1.5197921 -3.6521845 -6.0323181 7.4519377 5.7763939 2.6638892 -2.4966714 1.4668959 -3.1083379 -18.1068840 -0.7614798 -5.8755226 3.8513362 1.4336170 -9.2220459 -26.3589973 2.0933206 -0.8626818 0.5335844 11.2206240 16.5146313 2.3430195 -9.5128012 16.0102654 7.2509217 6.0879388 -1.5032285 -14.0574322 -0.0390606 -7.0418901 -7.7448597 -0.1392293 -3.3637223 15.9980412 -1.9533757 -3.4027615 8.5207186 7.0184379 11.1338634 3.9692774 2.2832685 -9.9863815 -4.8524904 -6.7884398 7.2646122 0.3266370 15.7393217 5.5244718 3.1156809 -19.0272312 15.4226751 0.6598326 8.6760302 4.5405903 -3.8108706 9.4710274 1.3029600 4.0642290 5.0810704 10.7658644 3.2401464 -24.0370426 -1.3885924 6.2601142 1.1158925 1.3917751 2.0134590 -6.1578884 5.1964159 9.2232399 11.3677778 -4.6039996 -12.2301035 -0.3507901 -1.5166690 1.8851674 -6.7731743 -5.4414620 17.6764164 2.7630186 -8.3964453 5.3063707 0.6744273 1.7407573 -2.0922136 2.4540462 -3.8349361 -0.4747863 -5.0526853 1.8855345 -6.2294078 7.3973136 3.0309412 1.4094650 7.8981194 -4.7941422 7.7817082 -4.1000800 -0.7547203 1.7643714 15.4431820 -2.0948417 -7.6495695 10.0596218 0.9015005 6.4450898 23.3457870 -7.6593685 -0.4190517 -0.8376219 -2.3935964 2.2913499 -1.2831635 -6.2155232 6.4105778 6.2959294 -9.8545628 2.0420442 8.1689901 -0.8507049 9.8606710 0.2272155 2.2970662 -2.2814474 5.0006304 -7.9065990 -4.9889102 3.8030877 0.9372579 3.1697552 4.5291781 -7.0251293 -8.1118374 -6.5827203 0.7000970 -0.5079567 -0.7869480 43.6495514 -0.8642018 2.3526719 -4.8695951 0.7013893 6.9736600 27.5699997 -1.7874109 -5.4507089 1.4778786 -11.0785990 -8.5776997 -3.4116285 9.5388527 -7.3788528 0.4679958 -5.5001292 0.5757768 12.9683781 -3.0286760 -1.0584929 3.8478322 -6.0502267 1.3426431 -9.5158815 2.6743569 0.6508601 -8.2654104 -9.5349178 -6.5914183 -6.9564986 0.3667643 13.8526468 2.7548921 6.8374100 -11.1092482 -2.0899744 -21.8394222 -8.7539721 -0.5224989 19.9853420 -12.8770943 -0.6836213 -15.3332634 -10.7580185 2.1898842 -3.3904073 -3.5643048 -3.8969431 -7.1698112 -3.4247580 0.2298418 20.0106506 -0.8862560 -5.7351351 6.2909002 -3.7931945 -3.0284953 5.3055201 -2.7260079 -8.4830990 -7.0109916 4.6241689 -3.4787910 -16.0204334 -39.4186211 3.8441751 1.2783695 -27.0382786 37.6518211 -3.6540339 19.7976780 -19.0861645 7.7057123 7.3544497 2.1552777 -15.9917736 4.2445264 -9.0801630 -8.9258480 -18.0523663 -29.1589642 6.2659664 -13.0632582 -52.1349220 2.9180713 0.3026701 -23.0276775 0.4336202 -15.2092886 -23.6870804 -27.2748528 6.5981755 17.3595638 1.0011139 -27.6332130 -11.6054325 -56.6734276 -6.6327729 6.4118543 10.0302877 -4.1662278 13.9872303 -59.5289230 -28.9065628 3.6490417 -13.0962849 -7.4828444 -17.6872444 6.4663024 6.4970732 4.4390197 19.7329388 -2.0703161 5.3601203 -7.9493284 -28.7380447 3.1700602 -0.5326295 -4.9981494 16.6594887 -3.0359843 8.1210260 -0.6012513 10.0646381 -0.9094042 -45.7495079 -38.7558441 14.0776281 14.2347670 -7.8417706 4.9949150 -68.2684174 -14.5582390 17.2007027 -11.2980337 -74.2259903 4.3775296 12.9515457 -25.9750595 -30.3190136 -19.2084770 8.6523142 13.0528736 -21.3902664 2.7324817 -25.7334709 12.7434216 -3.9116302 16.8750324 -131.8983307 -12.9012680 25.6101627 -18.1600037 5.5075359 4.5891404 -25.9776440 32.6153221 -4.8380127 39.2680626 -41.1554565 7.9794149 -15.3422747 2.3021448 24.1166058 -96.0827713 0.9691314 3.8280463 -2.0625403 17.4912071 3.2879329 -157.9414368 1.9481447 5.0602217 22.3516426 -23.4559441 3.7843461 5.4443278 12.2826109 1.7102599 -4.3029575 -2.7065651 1.2213360 20.7092762 -4.5691485 11.4873486 -12.9600897 0.2257513 -7.2923856 -9.2612715 0.8357913 2.7596111 0.9390790 -4.9771328 -0.6739238 -1.6889685 2.9837570 4.4776087 -0.8391432 1.8737713 0.8998446 -1.3859862 0.5754866 0.2920611 0.7885875 1.5709286 0.7146414 0.6441420 -9.7604141 2.1382914 -3.8019190 2.7486157 -0.5024642 0.2152525 0.6285056 -3.1289132 1.3791137 0.1656326 0.2146302 2.6020238 -2.1664004 0.7072861 1.3727376 -2.8559601 -2.1792569 -2.3214922 -1.3208531 2.9639118 1.4677885 -1.2520586 1.5302621 -0.3750691 1.8678690 0.0087304 -1.4747623 -1.4187224 3.4645081 -1.5940717 -0.6840601 2.5523925 -5.2248130 0.0815983 2.6934507 -0.7361700 -1.7247416 0.3029075 2.6907005 1.4061525 0.5772426 -0.7152015 0.2466564 -2.1614182 1.3295087 5.0129147 2.9431863 6.9167104 0.9110324 0.8796253 1.2942920 -1.0085330 2.4318104 -2.0922666 5.5246201 -1.0958585 8.3605137 -0.8035455 -0.3560294 -2.1452596 -4.9826479 0.5649132 6.9456291 3.4888029 -6.6890683 1.4317725 3.6007385 -0.7948850 -15.3181143 -6.2545342 -11.2250347 1.7982290 2.1966927 -1.2226638 -1.2451860 0.0658100 -5.4541874 -0.4424592 -3.4248598 -6.1669073 1.4315354 1.6401367 3.0418065 3.4692683 -1.0101893 2.7985840 -0.3452708 -2.3434744 0.7855747 0.8630570 -0.9118033 -5.6772714 -5.5069203 3.4113474 -0.7122853 -8.8446808 -36.6227798 1.3333658 -1.5305361 1.0943153 2.5523853 -4.2390189 -0.1066528 2.6287949 1.2984080 0.7474839 -1.9317038 0.6556778 -0.7909855 -1.9508013 -1.9291282 0.9734828 -9.5506382 -10.8717194 0.9037883 -21.7053165 -0.6866347 -2.8236961 -11.3162279 23.2876205 8.4429913 1.7868834 2.2461247 -1.0944971 -1.6340878 -2.9082036 -9.0158663 -4.4004383 -19.0591583 -11.2367239 6.4616332 -8.3915577 -29.6977406 -6.5540080 -2.9109056 -6.6160955 -9.1947889 -6.7942557 -0.3919728 -13.0071487 -2.1490817 13.2419682 -1.3898493 -10.1035061 -10.9041424 -37.2726860 -1.0632569 -13.4489164 -3.3099482 8.4078064 -3.0688174 -9.7186670 11.4204102 -11.4885712 -8.6245174 -8.1456041 -1.9304971 4.8208504 -0.8630475 -13.0495081 -4.9682460 10.2109756 -4.2313771 -7.7078528 -14.5158634 -4.2886481 -5.8977776 -9.4570532 -1.5067805 -7.1465411 -2.6251185 -0.4451796 -1.3430721 -8.1010551 -9.4015007 -13.5339870 12.8089886 8.0928011 -9.2438374 0.6206342 -13.9595490 4.7175050 11.7386293 -3.6970277 -21.0741787 -3.1969404 -9.0260849 -8.7219362 -7.0840335 2.3285377 -9.3614178 -8.3785658 -25.8390675 -7.6206493 0.5967430 -2.4370015 7.4443693 3.6629660 -33.5399818 3.8337107 -4.8931570 -3.3486047 -1.7752352 -0.5377296 -26.9182835 -4.3474717 -19.5780106 -5.2961831 0.0641803 -4.5651069 -3.9715040 0.2363328 8.7534857 -5.4098778 6.2809343 0.8834740 -3.9037271 1.6525555 2.9051151 4.8964725 -3.6184824 -0.2903066 -8.3437862 -12.9912205 3.3346634 3.0859964 -18.8454838 -8.3348894 -3.0306494 -12.9010363 -0.9712912 3.8723438 -8.5914259 -2.0060377 8.6325045 3.8493962 -1.3436264 -2.1738105 -9.8680277 4.5469384 21.8242893 -1.6973336 6.7258353 -7.8209987 11.0207634 4.2513256 -4.0438042 9.8932772 5.7332087 8.4727354 1.4132577 -2.1599703 -40.1000938 1.1127825 17.1455021 -18.7663689 14.2015629 -11.9523325 32.7121544 8.1761179 -0.4290584 10.6727161 27.9995327 -10.0792236 -21.9983387 15.8396406 2.0486209 -20.3472862 -3.2519906 31.5190678 6.3953133 31.0231915 2.2123494 -0.9674101 -2.9960585 16.6895428 8.3947153 -8.0656776 1.8449091 1.9508257 29.2735996 8.4809895 -0.3772103 -11.3860245 5.2323804 -10.1968203 3.8415549 6.3431883 0.7182630 -5.2400174 -1.9012805 3.3125622 -6.8712530 2.3425345 3.6867168 5.7102761 8.4972925 -5.6976719 -4.9243188 -1.1257557 11.3305779 -0.1926181 3.2328660 3.0419581 22.5452614 19.7844563 -5.1795936 -1.0307508 4.2827015 7.0180759 -15.1021061 9.9599981 8.9104214 11.9913807 -6.5569158 -89.9971542 7.4173465 9.2259016 19.9670544 -2.7215924 -12.0751467 4.3659120 7.6660151 -16.2944107 -16.1771832 2.8623209 -3.2033446 0.9434811 26.0392838 4.9731469 4.6647787 3.9661388 -1.2790056 -7.7839212 2.6395183 5.7856894 4.6580424 17.6044464 -10.5367851 17.3808746 -30.6715145 -1.8215511 -3.4192543 8.7187767 6.0201740 1.0187708 4.5713134 -5.1850095 -2.1558890 -0.1594608 1.3189278 7.9176397 -7.9847584 10.1700449 15.3510742 -6.0465088 3.1689467 2.0597959 -5.8264179 5.6946149 17.0868702 -17.2507267 12.5732336 6.6156416 3.3691087 -0.3720856 -5.8751655 0.8667784 -6.7075996 -1.0964898 -3.6267064 1.5295782 2.1237051 -13.7885418 -1.9152653 3.3985851 4.3579602 2.4041257 2.4402943 -2.3562694 4.1301212 2.9207509 -4.7982535 -1.5439001 24.3991947 -9.2872391 -0.2168013 4.9874272 -9.4709768 -4.4674320 -7.4196482 -4.6815400 -8.2692204 0.7039665 -2.6986351 5.6124496 -2.0486803 5.5834570 -11.9040251 -3.9406109 -12.2838707 -3.5867379 -6.3761139 -15.8880682 -0.3920826 -3.8942728 -0.6227347 -0.1122169 0.7145320 -1.3271080 -10.3037758 3.5500393 0.3026944 4.2135911 -1.9714718 -11.6307230 -7.4163880 1.4085915 -18.1379681 -5.3962588 -0.1619601 -1.5465227 1.0317721 -3.5036526 4.2006607 -1.1661245 -0.7569761 -4.9544220 -3.5607162 -4.1235323 -15.8810406 -9.0532255 -41.8446426 1.3192610 -3.3928108 -3.4646957 -13.9565039 -1.0979147 9.3948755 -1.4493427 -16.7722874 2.2361405 -5.3650618 -7.4033194 -5.9004230 -4.6621752 19.1356163 -6.1994720 -6.2233829 4.5367918 -5.2826657 -8.3007345 1.2966012 4.2598009 -25.0591545 2.9357564 15.9892054 -4.9129381 -4.1916213 -4.7317357 6.8975039 -29.8577805 1.0367481 -10.7802992 4.2461600 -0.2727223 -8.7214012 4.0075827 -3.8984840 -21.4184532 -0.4071519 -6.2119832 -5.6106520 -1.0829296 3.4725170 15.9811411 2.4786015 -3.7738338 1.9817849 -4.9202499 -11.4116163 -4.1479068 9.2767572 -1.6338758 -10.9622421 2.3271861 -7.6823621 2.1668980 0.4245954 -6.9887671 1.1941688 -2.9068766 6.3861828 -11.0569344 -0.4336556 -1.7078469 1.4830225 -4.6035399 0.1641917 -5.2450976 -1.9001569 1.8772823 -1.9393755 1.5582632 -3.0107601 -1.8314459 0.9922818 1.0756742 -4.0136561 -0.3838022 0.3672636 -1.4585129 2.6911657 -1.5577868 -3.4499927 0.2792471 4.1228852 2.2643857 -0.2255465 4.9020481 -0.7909020 4.3346109 3.1017036 2.4153347 -2.0978734 3.5982716 1.4230299 -3.2407453 -0.7724558 5.8059707 -0.8783581 1.9879918 -1.8996052 1.2685819 0.0902928 -8.0673494 0.0862439 -3.8206813 -2.6355481 5.5514536 -1.9102499 1.5075959 2.2158234 3.3479297 -6.6602883 0.5085223 2.7279692 -0.7586232 -1.8771100 -3.1389880 -0.2871705 1.1440873 3.1348753 -2.3494549 -0.9594101 0.4620477 3.4049153 0.0859656 0.4000655 -2.0344400 -7.0420713 -0.7666168 -2.6755812 0.6386982 -3.1214628 2.4123929 5.3221860 -1.1658837 -5.2589564 0.5217621 -1.3656071 9.9858837 1.3459427 1.3400723 -0.2306302 3.3513987 -5.3682971 0.5460353 2.1724811 -0.0492057 7.4627752 4.2955995 31.0877037 -1.0954211 1.1675658 -1.6095611 0.3494828 -0.3023379 0.2941220 2.0194685 3.1035185 8.0799723 -19.6246243 1.0987031 -2.3010089 0.0115845 -3.9964733 4.2550249 1.1856066 0.5505036 3.5449941 -0.7173777 3.2642663 -1.9152005 0.3932763 -2.1592567 0.8258620 -0.6877223 2.8388112 -1.1394665 -0.7944668 -1.7996478 2.7295611 -0.6749010 2.1212881 -0.7585348 -2.2240005 1.6972265 0.6777430 -2.1923299 1.4443033 -0.4971252 -8.3140173 -6.1855950 -15.2664213 -19.5322304 -5.0537052 -22.3122196 -1.2661765 -6.1772513 -11.3023062 1.5796719 0.4536999 -4.4444637 3.3051589 -2.0938766 -9.4094305 -4.8608789 -9.9922342 -8.7859793 1.4222049 -43.3227921 2.0704303 -5.7682157 8.0403509 -5.8458676 -13.4342937 -8.8173819 -15.5852861 15.0488501 -11.0732698 -15.8208075 -7.7316389 1.8961561 -6.4604788 -9.6156569 -23.0064201 -8.4604149 13.3759518 -0.1828760 -12.9881220 3.7087717 -2.4540565 -20.5254250 -12.7281809 -11.0863628 -21.2247639 -6.3939409 -0.8949831 6.2965512 -3.0654790 -14.0392513 2.1387107 4.3752532 1.7540436 -2.9444392 -12.0394468 -11.8702497 -0.9185637 -4.5465636 -7.7561998 -10.0264444 -2.3177745 -4.0546069 -6.3690062 -7.3784828 15.8301859 -30.5333538 -26.0157318 -2.4748733 -27.4042721 -2.3611329 -23.0189037 -3.9008522 -2.0503516 -6.9792929 -49.1389084 -4.7885637 -10.4947691 -36.6208153 -1.2403086 -3.6654012 7.8548408 0.7507569 -3.0684423 2.3922465 -6.6867499 0.8307582 -2.4593086 23.5845642 4.1560907 5.5849934 -42.3959808 -12.3067551 -6.4606686 -5.6697955 0.8646650 -16.2011509 -15.2081022 -6.9625583 -24.5679169 -16.5478954 -12.8060169 -5.8999944 0.8473508 -0.0449520 -9.4102716 4.9441462 -5.7196913 -5.6576791 4.1240354 -10.6421566 10.9765024 -3.1185527 -6.2896056 -14.8190889 -8.5726099 -1.9322765 -22.4246674 -25.9724293 -4.0137949 10.1148548 -1.5684577 -10.4153728 -5.8117995 -33.4975357 2.7780452 -2.6364834 3.3828826 11.1462288 -2.6883605 -5.6404324 -5.8554397 -1.0944964 -3.7853737 -8.2955494 2.5798693 -1.3400614 -7.0664062 4.5079260 9.2714338 -2.8664527 0.5535419 -31.9825974 -10.1672668 -4.1380134 -1.7049607 -9.2380056 -23.1170425 -13.2511377 0.8613969 -6.2632132 -8.3541250 -5.7107205 -4.0953622 -4.8601274 -15.4334841 15.6511059 -6.7526388 -12.3091402 -6.7334948 38.2233124 -1.3001236 -29.4377480 -10.5891991 1.0990726 5.2309279 0.9668552 -11.0031242 2.5857668 -1.2392635 -2.8958211 -20.0832996 -8.7796574 -8.3984709 -4.1418710 -0.0453206 3.5818427 -2.4170144 -4.1731696 -15.9965563 2.7526534 4.8926339 -1.7389802 -5.9918313 -1.4970834 2.0713139 3.7006769 -8.9016953 -7.5332513 -2.0358415 -0.9943317 -4.9883652 1.0035796 16.7186069 -2.2872050 -48.1927071 -1.3753629 -21.7780056 -0.0964433 -24.3391151 4.5613313 -6.4338675 -5.1536913 -28.5641289 -2.2763293 -6.9622402 37.2218170 1.7359318 0.7298496 11.1942596 -5.4320641 -7.3453240 4.0460715 -0.9916390 8.3296013 -1.8385125 35.7222939 20.4147530 12.2922239 -4.4832139 -4.3003945 -4.7656713 -5.7680154 -16.2449074 -11.3431196 -11.2813978 -4.4936833 1.0103872 -7.3647122 -5.7932558 -5.7468934 -5.6331792 -12.7859297 -4.9318423 4.7366090 0.0438418 -7.5124397 4.5545979 -12.6864443 16.4662933 3.1896012 -8.9992142 -8.7621956 -10.1674776 1.3718159 4.5818062 -3.4234042 1.6578829 6.2116323 4.5699315 -9.7829943 1.7542301 -19.6095428 1.7063538 -0.5832571 4.6789141 3.7749870 -1.0895365 2.5187912 -2.1203513 -18.9600372 -5.8066888 -3.7877612 -1.2321392 -41.2929726 -0.4356217 -4.1889124 -10.2192574 8.2863016 -1.8970226 -0.5046668 3.6026516 -4.6962280 -5.0597744 0.7213668 -13.5091047 -9.8880434 1.4990122 -3.1038945 -9.0019312 -6.9090991 1.3499320 -6.9116669 2.4740336 -0.1695733 -1.5596274 -19.8081665 4.7354817 2.3121784 -4.7643180 4.2529502 -9.2624846 -7.1398945 -0.1264870 -20.7596359 1.8985739 0.6670551 -1.0813749 -26.1447182 -0.4101114 -5.2829328 1.6026838 -8.7180223 -12.0562916 0.7340922 -5.7442946 -12.0739126 -47.3260040 -1.6121823 5.8839478 4.8833265 -1.6188594 1.6706077 -5.5275960 0.9347848 -8.6661959 -1.0861756 -0.6789219 2.5790770 -11.9949541 -8.1999245 -12.3070602 -13.7752733 -9.3263340 2.3810663 8.2908039 -1.1102591 1.4908698 -5.1343770 -3.2229705 -2.6540086 -12.8623199 -7.6977701 7.2804756 7.6270180 -5.3051400 -0.7988706 12.1250210 -17.2723083 -3.5430260 -9.8084650 -0.9666419 -2.2511227 -9.0765238 -14.0256138 -13.6246471 -2.2614627 28.2715912 5.5384007 -3.7608705 -0.1688453 -9.4783535 -7.7373400 -4.1822567 -14.7116871 -4.0457234 2.6082118 0.9515228 -0.7046030 1.1237342 -10.8348055 3.8409212 2.7564659 -19.3877201 -0.6321424 1.1784258 -24.8323078 3.4967129 -10.4299545 -1.6139392 -9.6919317 -23.1454334 -2.9131219 -33.5453148 0.2653063 -12.9123640 7.4135766 -3.6576796 8.6632671 4.7935624 -4.9821358 4.4472008 -0.6141565 9.4011755 -8.5669355 -0.3817349 -1.2836920 1.0100971 -0.6063634 0.0522409 -0.6938640 0.3414966 -2.4799223 0.7537951 -0.6297876 -1.1574931 1.6071397 0.5614898 -0.0067622 0.3003354 -1.3030993 1.0924017 0.3811022 25.9348183 -5.4740815 0.4595377 -0.6996100 1.2649179 3.7525005 -0.0592180 2.4319091 0.6634021 -0.8502095 2.1562002 0.7498105 1.9306707 0.5101199 -0.8335531 0.7464094 0.0942024 1.1972847 -0.2682559 -0.3183641 1.1237743 -0.2857865 2.0512707 -0.4238260 0.2310893 -0.6092187 0.4451369 2.0316401 -1.3680964 0.3790793 -0.8835248 -0.7892849 4.2391348 0.0317883 1.1623144 1.1084217 0.4560611 0.0088301 1.1012048 2.5761571 -1.1420480 0.2829009 1.3117838 0.7879018 -0.2460906 -1.4914654 0.9097986 -3.1713905 -136.3987579 0.7137976 2.1030033 0.0926269 1.0721427 -0.6352222 -0.4532799 -0.7862707 -5.3395982 0.6242383 3.3204150 3.3745456 -0.6977745 0.6042320 12.6767817 -0.9100822 -1.7742268 -1.4601902 1.5068252 -0.6700667 0.3930269 -1.0121113 -2.2746508 0.0934703 4.0002327 1.0041667 0.6880110 -0.0954012 0.9629596 2.6325314 0.9477664 -3.0936501 0.3099267 3.0787830 1.6357181 -0.6602535 -0.2821073 -2.2615201 0.8605533 -0.3564389 -1.5713506 -0.6491431 0.5170686 2.0579846 2.6891489 -1.9295869 0.2649662 -0.2833757 -1.6230673 -1.0121019 -12.4696970 -2.8107708 -2.6691267 -0.8196145 -1.7537760 0.4249371 1.8584054 -0.8548862 0.6332401 -0.4882923 0.3990995 1.2169762 2.6342404 -0.6671824 -30.0693684 -34.9582176 -8.8031197 1.8868891 -13.2990160 -2.4171386 -5.6968164 0.3896888 -10.6551437 -5.1349311 5.9742637 -34.5079842 0.4376052 -14.8116312 -15.1429300 4.7624421 5.5131574 8.9938993 -6.8400769 -5.7410383 -0.0171570 -9.2006226 -21.8170872 -3.3047845 0.6456409 9.4075174 -6.8159356 -9.2843237 -1.3152590 221.9224091 -8.7787027 -3.4163213 -1.7380452 3.8280001 3.6051185 -18.6274548 -5.5070806 7.0228128 -6.2157617 -39.5300407 16.1379910 -12.2147684 2.8790321 -9.5581789 -22.8116074 2.2383029 -5.0718565 -17.2474422 3.1070504 4.0897317 -7.9852409 -9.5696087 -10.5526648 10.1856060 -3.6883039 -23.5294590 -9.7004499 2.2847121 -1.4137623 0.3040385 -19.7831383 -8.9871674 -5.3415546 -9.4286690 -22.7144661 -3.5702593 -25.3097973 0.0237082 -10.1905060 -3.4814556 1.9673719 0.6226951 -7.6134915 0.4663268 -1.2052090 -9.1005163 -3.1807520 -53.3658524 34.7846184 -7.5372534 2.8119447 3.3081453 1.9989674 1.9220290 -7.0427680 12.0973539 8.9719019 -1.0566937 -1.3950806 5.0084023 -8.8563538 4.7997537 6.3320460 -17.1222363 8.1574316 7.0103579 6.0279331 -6.0826421 -33.5091591 -9.8620701 -5.1444731 -10.5468092 -6.2727237 -14.0962820 -10.7368126 3.8415420 3.7778392 -7.5483785 2.7810755 -15.1935940 9.0570297 -2.6776714 -2.0157931 -1.8521826 28.2425308 15.9538355 -11.3346682 -0.1356477 1.7380941 3.7917624 10.6674566 -1.6774166 -9.0709152 -5.5654783 4.6155176 2.3247716 2.0168827 -5.2349167 -30.9827976 -29.0317516 -4.4859266 2.6174514 12.6614380 7.0415492 -2.3460422 1.7762928 -13.7905226 -0.4709220 -0.2159797 -13.5298176 -4.6446943 -1.0142615 -10.2915277 -1.0486134 4.1331429 12.4857035 -3.0695419 -6.3457303 -9.7050400 -25.3681545 -21.8199806 -2.6007519 1.7768555 6.9535174 -26.4962635 -3.8201859 -2.4322455 -4.8153744 -7.0524859 -1.7069331 -2.8077145 3.5534139 2.1220286 -0.9325550 -9.0327501 -0.5459534 -7.5669398 5.9940505 3.4738016 -14.0125608 -1.7783879 -10.9476175 -26.0482750 -5.0425153 -5.4115396 -3.3886833 3.1613081 0.8074400 -11.8496008 -10.9564934 -9.6619377 11.3191719 2.4148116 -29.8884678 -5.7830000 2.6604762 -1.0586855 0.5302982 -3.7141085 -17.7352734 -0.8350916 -2.5636141 -1.6386756 -0.6504349 4.5583110 -4.7519326 -4.4173374 -2.6753159 4.8723068 -0.0699934 1.4024127 -1.2255032 -3.2439456 -7.2361627 -4.7305050 15.7822332 43.9579277 -23.7407074 5.6925740 3.7674091 -6.1674442 -2.0516989 2.5389721 9.4219141 7.5862465 -6.8235826 3.3415451 -0.4558262 -8.0060320 4.0689540 6.3276410 14.8942156 8.3699160 3.6947057 6.5632529 -3.4898839 -16.2326889 -23.4960041 -7.0169492 -12.3100901 6.9476366 -16.1921291 -11.0293140 3.0954852 3.2260423 -4.7584066 0.0417498 -34.9087181 3.4838850 -5.0323138 -3.8174202 0.9334747 12.9784441 17.8262081 -6.4302068 -2.3242533 -1.2608703 0.7072583 -1.9194214 -3.4509940 -23.0609245 -3.2521362 3.1655090 0.5975253 2.7820528 -36.9856682 -1.1078801 -1.7847792 -4.9849234 -8.0549335 -1.9642546 15.9289150 -6.4885850 2.2344515 -19.2571926 9.8820896 2.5912116 -7.1395850 4.3721790 -9.1113634 -8.5402660 -15.9730406 -6.6704655 4.4640832 4.9599171 -21.5511627 -7.5286775 -9.7180395 -4.4378080 3.9449649 -5.9718447 6.1589165 -5.2743711 1.0795395 -5.0253577 12.2296066 -1.2331681 0.9340957 -6.1275988 7.6375313 -5.5911956 -13.5275898 -1.4745109 -0.1847875 7.0264401 4.4193916 -1.0364789 0.2567253 -7.5836864 -7.9141073 -0.4692719 -2.3126571 3.5849087 2.0066061 -1.8510306 -0.8896786 -4.4450917 -5.5541573 -10.1134157 5.4250011 -5.6855841 0.3829472 -3.2946665 -1.6419826 -7.9022007 0.3369449 -1.5056244 -6.9199271 -7.1358280 1.8560979 0.6206552 3.7478657 0.3770008 -0.0245755 -6.2631850 -10.9889946 0.6537169 20.9138432 4.0462270 -9.3547544 -13.7948503 1.6163464 -1.9578456 11.8829708 37.0822449 -3.2126272 -2.1156304 4.4650130 -9.9852543 -3.4055729 0.3177558 6.2944493 2.6901605 -9.7810984 10.7969313 -1.1202966 -11.3577261 4.7366281 2.2217572 6.3542271 8.2646770 4.6486273 5.7985730 9.8672867 -4.8503194 -3.4190135 -4.3820095 2.2192574 3.4506783 -14.7547426 -3.3901618 -2.3341248 0.3923118 -3.5970566 3.4997048 -6.1296744 5.1317339 -0.2913153 -3.2589388 3.9494295 1.4019064 8.7133045 -4.8983965 -13.7932129 11.1338549 4.5612364 -20.3815403 -1.8366212 -12.5695753 -11.3675900 -5.1213889 1.8721485 -0.6299537 2.5742354 1.0580391 17.4677124 3.0760386 5.1464443 32.8972473 -12.7132072 -19.7838783 -10.3362007 0.5950543 -8.2461567 14.4598675 4.7085357 -0.2474989 -0.5830042 3.5015249 -9.8322573 7.5393491 12.0455465 -6.7064743 2.7241628 3.0927663 -3.4206421 -24.9956150 -7.5217896 -21.7618656 3.6367781 25.2251225 -38.4126740 -0.6789621 37.7863922 0.7064474 15.4331989 1.8775196 0.0587084 -1.9885395 -3.8244619 -8.4212322 -13.7952766 2.0036306 46.0078468 11.7237387 26.5657005 31.9917755 1.5754833 20.9424744 4.9959502 7.6371145 -0.1242833 16.7142086 1.8114481 6.1576643 -10.3142185 -31.5358353 3.9527388 -1.4492177 2.3950338 -1.7128323 11.7581100 15.5868111 -5.9670815 0.8909737 -3.5497892 16.4064007 -2.0293026 16.3271809 1.6557126 -1.7517592 -2.7075140 -11.1839943 1.2563896 -11.5883064 26.3366547 8.4907274 -0.0076655 -3.3940287 16.3511238 -8.0337238 -5.6126328 -39.4502678 -10.9707031 -10.2139950 -4.5154634 -10.9977760 2.1113958 7.0316873 -66.7103653 19.5660229 -2.1011450 -16.9914684 16.9539032 0.7644559 1.6756089 35.7795792 -5.7600002 -42.3758926 4.4297948 -4.3641834 2.0365827 -13.4678097 14.3963680 -19.8275204 0.1483487 15.1558161 -10.6846142 5.8288479 -1.8372730 1.7607569 -182.5538025 -2.0501220 20.9080544 4.3986573 -10.0902319 14.9884462 3.6764138 -4.5364127 9.4354773 -6.4120650 3.0864172 -7.7037897 -8.1235275 12.2575254 -27.7448769 -11.4384813 -0.9490454 -5.0548983 16.5804176 0.4212354 -6.5326548 -25.1255302 -14.2854357 9.4056034 -31.6361637 -8.6783390 25.0893631 4.7305522 18.6222420 57.1810036 -3.0144174 6.2356439 6.9457169 1.4573253 -4.7537317 -10.5240812 -1.5869936 -8.3467598 13.0662355 13.9360437 -1.1161959 -6.2932277 12.8737898 -6.0317030 -21.1350613 7.3858647 13.0327272 2.2415667 21.7142105 -19.5091972 22.6097984 16.0928078 -5.5207858 4.7472687 13.7770338 1.3125036 10.9699373 2.6443377 2.3016191 25.6348915 -16.9064846 22.0230427 -11.7153664 5.0051370 11.2411509 31.5668983 2.0162878 11.2897186 38.1081848 -30.2385464 0.3703834 1.1727078 4.2472706 -24.4240017 -8.0050764 15.9970036 -4.9991860 16.0836391 -3.1389327 -4.1764908 -13.6094494 24.0210342 -14.0148821 -4.9344635 -15.4711161 -28.6206837 -1.1182119 -20.3907452 0.9178460 -2.3173003 -4.7346807 15.1009302 3.2590487 -19.5682678 8.0386982 -8.2280149 1.1512067 -0.5529405 -9.5601320 58.4027214 -2.4522350 -19.8872261 -3.6690626 -8.2187786 2.6785953 18.0148258 20.0278339 -6.1969171 12.8477373 31.9922295 -4.3835325 6.6851273 -0.2331519 4.3167062 9.6939049 -15.4305277 -15.4873142 4.2381644 10.0792646 -14.4006329 4.5050960 -5.5237417 11.5841341 -12.6727180 1.5997841 21.2138386 8.1168652 5.4457741 15.2306871 6.6136780 -4.5913630 22.7642040 -4.7359486 6.1305490 12.8728199 -36.5652275 1.0100420 40.4831085 53.5728111 0.2402241 2.3976202 -19.3626270 9.5767584 5.2692881 -0.6664923 11.6932421 -1.6939429 3.8260372 -9.1106129 21.1049900 16.3310604 2.1635001 13.1705608 -4.9483733 -2.3948321 2.3822067 5.5211477 -22.1448593 15.1555347 1.6521914 -0.0443263 -20.6237984 -4.6705604 6.5468369 2.0649385 28.0210285 -9.4521284 2.0715530 18.6718330 -16.2803421 -3.8017833 7.4079466 -23.7962055 5.6731873 4.0262403 -2.0799022 -15.9737396 -15.1747274 30.5049515 3.0324996 -3.3368037 3.8666112 -7.5691171 5.5447659 -2.3597937 5.8329401 6.1728711 12.8987064 24.3335876 -5.6980596 -8.1679020 7.7096028 -9.9263668 -2.1345215 8.7244558 -2.0108409 -20.5168686 -0.0943572 8.6951952 15.1115417 6.1329117 -31.9853001 -4.2652216 5.4470000 6.4171543 2.9034305 2.8733230 -20.6199837 1.1062132 2.1295927 6.3365612 20.6997681 2.2061572 -17.6151199 1.9986534 -7.8996582 1.2802633 12.7471638 -0.7793919 4.4106898 -5.2660556 1.0160661 3.3430407 3.4303539 -18.3692017 -5.4514670 5.8119283 26.9998531 5.5788674 7.1491499 -4.3039827 2.8375752 4.8253484 -7.2387729 -1.3419093 2.6607442 -1.5937033 20.5012474 3.4483671 1.0155289 5.3339839 -18.3719292 -1.1636496 -14.8313389 -16.7143021 2.9189892 29.3011875 -3.4621744 -2.8325920 -6.1652555 -15.6606445 2.8107185 -1.3782004 -6.1838074 2.4931991 7.6926985 -74.3461990 -2.1771376 -1.5659075 -1.1674232 1.7946589 -1.3048110 -5.9540248 31.9954319 -2.9765172 5.7343774 6.1447926 -1.8357683 -0.8048576 -0.4449444 -12.1476574 21.5669422 3.0474541 10.8556929 7.5417967 -0.5305952 -0.2968694 -0.3572799 1.3981249 1.2762610 -2.8865268 -16.4464664 -10.3026400 3.6177461 0.9514610 -2.9809675 8.8442430 0.4006340 0.4258044 -0.7590917 -0.8000101 0.8475884 0.4858479 -0.5317851 -1.3298535 -1.8710792 -2.1892376 -3.7358229 3.0094912 -0.2558176 0.4755634 -2.5187869 2.6668112 0.9548246 -1.8389920 -3.2692258 21.0880642 2.0157855 -0.6147740 -2.2507877 -6.8693805 0.6181495 4.4105253 -2.8727586 -1.9620856 -3.0477057 7.6723380 2.2029779 5.6363497 1.2998251 2.2024226 -8.9492006 -2.0625319 0.8340572 2.6787050 -9.8746910 4.7622652 -0.7028463 -1.0392214 0.0280209 2.6421816 -1.7365524 4.3903255 0.2924815 3.4945402 -0.9866899 1.3650546 5.2556257 -3.3070252 1.8333937 -5.1765161 11.3934631 -1.5268579 13.6175766 -2.1030812 5.3944926 -2.3505583 -4.8301735 0.6425450 -8.1768961 2.1247482 1.6609221 -4.7158446 -0.3157534 7.9455314 116.3363800 2.7636917 -1.4898499 -2.3901978 8.6144152 -2.1497936 -0.5033379 -3.0933948 -1.5998948 -0.6680328 19.2323265 -2.2270160 2.1474514 -2.4216723 -6.2704477 8.4922810 -1.7472974 -9.1198578 -3.8429484 0.5039253 3.4451735 -0.7805874 -0.3341033 5.7993951 -2.0985610 0.4089534 3.2074594 -1.0238720 3.9537456 -15.9288130 -5.6741586 -5.4274330 4.6681957 2.0243144 3.0179551 -1.2554795 22.7081490 -1.2289515 -6.2546010 -4.4591908 -1.5353625 -2.0752804 -0.5659764 -3.8856652 -2.5586979 2.3364849 -0.0886541 4.1456785 -0.2970732 0.0700551 1.0374709 -0.8580666 -0.6159418 -3.1479485 -0.6123051 -0.0720477 -1.1108882 5.5909519 -3.8418689 2.7835693 -0.3722738 -3.3733468 4.3781147 0.3552767 0.5263500 1.3904008 -0.1233325 -0.6605991 1.9671285 1.4196408 1.8632832 0.5888726 1.9919229 -0.3574065 0.3932979 -97.6135101 1.4209310 -1.0937370 5.6701941 2.2595284 1.1796250 -0.6870194 -1.1607351 1.4922616 -1.2122329 3.2006869 2.6320405 -1.6392986 0.2305039 -0.0812085 2.5216308 -2.0563216 -5.4195218 -0.2028631 -0.8970762 -0.9459296 1.5743141 5.7346358 -1.0213840 -2.4834795 0.1434385 -1.1594958 -3.4612985 -1.4764405 -0.2333340 -0.6836638 2.1361113 -1.7589338 0.3626903 0.4709062 0.3041511 -0.7398092 0.2509437 -1.8810052 -1.1650565 2.3653271 -1.1599619 -0.7555894 2.1169915 1.3531095 1.9116906 -2.1953413 -0.9956967 -0.3006158 3.4229279 3.1600959 -3.4216917 1.2135351 -5.3514023 0.8449407 -1.3293017 0.3513394 2.6457129 -0.3565436 1.9713809 -0.4631470 -2.9904540 -0.7461929 2.5998397 -3.6638191 -0.0506619 0.1411595 3.6123257 0.1744857 -1.6377518 3.8750165 0.6525958 1.9449906 1.3596082 0.3098711 1.6333128 2.3615613 3.8551786 0.0539871 2.4296241 0.5155337 0.4023095 11.0619974 -0.9339786 -1.0413408 2.2404878 -0.6129533 1.3885016 0.7033726 0.5384143 -0.8651243 0.4445402 0.4335695 0.1978540 2.5528286 2.6074457 -5.2070909 -1.6312768 0.1945142 0.0651607 0.3956089 0.2944885 1.0442592 -0.0886508 0.1425416 0.4324946 3.2840862 -0.5181097 -0.3862623 -0.5730556 0.1381231 4.9776015 -3.2627749 0.2854451 0.3757900 -0.9869927 0.3061158 -0.1632613 0.2509023 0.4930803 -0.5818851 1.7117265 -2.0998778 -4.7932310 -0.5093626 0.1113076 1.0482363 -0.6462683 4.8993626 -3.2630064 1.8401190 -2.1631432 11.4207773 -0.7185005 4.5688996 -1.2357225 -1.5464379 1.0394585 -1.8132496 -0.4227238 -0.9306062 -0.4728392 -0.1404467 2.6974347 0.6785454 1.0054594 -0.3291834 0.3977723 1.1182189 -0.5913003 -2.1207471 -0.1734750 -2.0479925 -0.6146365 1.6501224 0.6638745 1.4842067 -0.1203510 -0.1055294 -1.8719023 0.6444775 -0.5695457 -0.7629724 1.0564613 -1.2165735 -1.1609921 -1.8070383 3.5867736 0.1827677 -0.5354115 0.7324222 0.3723293 0.9090444 -0.3016718 -1.1108390 -4.3816257 0.0027481 -1.6502688 -2.7235208 0.2946747 0.3983294 1.0372112 -0.7872549 0.8569052 0.0667952 -0.0182783 -0.2127429 -0.4437838 1.1652192 -1.6835455 1.9053661 -0.3426404 1.5713844 0.1794690 -0.3641889 -6.6526809 0.1984049 3.8711207 -0.1908202 1.3861374 -1.6598252 0.0602965 -0.3447704 2.0105357 -0.7414463 -1.5943404 1.4898607 -1.1162794 0.0799410 -0.4799483 -6.8959999 -0.4364577 -0.3592748 -0.5814337 0.3523720 -1.4083035 0.9793730 1.6277322 0.0252927 -0.5463249 0.2313581 -1.0607216 -0.1433895 -1.8908949 0.2124672 0.3546098 0.3975394 0.2158624 -2.1710489 0.6207348 -0.5743707 -0.2595584 -10.8852501 0.1123322 -4.4827361 0.0526715 -0.8853449 -0.0916273 0.8872612 -1.5296038 2.9924703 -0.4256963 0.5874092 0.1465972 -0.2873334 -0.8527110 0.1291589 -1.1262447 -0.2226988 0.8618647 -2.1689768 -5.1550431 -1.6152856 -0.0503905 1.1535527 0.4514662 -4.4325714 0.4016741 2.0120101 -2.5825882 -4.3800564 -0.8335919 -6.2877808 -2.0877104 -1.1100324 -1.5518422 -4.2412357 0.2407187 5.1708498 -0.1536968 -10.4572010 -9.5159187 -0.9704418 1.5418981 1.3582500 -1.3597004 -0.6345353 -0.3967678 -0.8603559 -3.9006429 0.5188168 -0.0491653 2.3359449 -2.2464256 -0.2904167 -0.0566751 -0.3838193 -0.4480600 -0.4354130 1.2811555 -0.6595148 -0.3404975 1.6125528 -1.3050110 1.1904050 3.5650921 1.1098677 1.6448175 -1.1870154 0.2718401 -1.3143659 -0.0879943 -2.1045434 4.6782146 -0.4840613 0.1187052 -3.6621020 -7.5427513 -0.6648388 -0.4569859 0.4105802 -2.9335105 1.3873705 -0.0226403 0.6673809 0.1915074 2.6790502 -3.8741765 -0.6884632 0.6700712 -0.8998272 0.4651305 0.8590178 -3.4093518 1.1296271 -1.9202639 -4.5180240 -1.3181401 0.1739811 0.4716071 0.6394815 1.1104015 0.8533915 1.2746154 1.1809617 -0.4843034 -0.0661503 0.6906546 -18.6591530 -5.4894948 -0.4600767 0.3219272 -9.0879927 0.6339777 1.3243868 -0.1055830 0.3820729 -0.6473489 0.3301218 -0.0179889 1.6881992 -1.6273316 1.9703361 -0.8779520 1.1334516 -0.0361447 -0.4572099 -7.7111411 2.9788427 2.6688178 13.2955914 -1.1397029 0.7173511 -16.5046158 2.7164226 -9.6951284 -2.6694145 -4.5398068 1.5601175 -8.1575642 -8.1931505 -12.1901445 -3.0478432 3.9938233 -1.3134478 10.6643429 -3.0267537 -2.2156560 -3.0348492 -14.6294317 -0.8349150 -0.5832769 0.5116823 -15.9229279 -32.4260139 -7.0140657 -17.7991810 3.4231153 30.7060986 2.8970525 -9.8583126 -0.4568780 9.2205944 -0.9183519 -3.4347408 -5.0747633 -7.7324033 -1.4231831 22.2215462 15.4257097 -4.0252285 0.9897941 1.4197725 -7.6405306 -12.0879612 0.6806448 2.0780413 -4.6182995 -2.3221111 0.0850485 -6.3240714 4.7817612 -0.2043607 -0.1379917 0.4288167 -2.9630165 0.1258735 3.9051514 0.5889686 -4.7224565 2.7993484 4.0554795 9.3317003 -17.8937244 0.5373847 -4.9817929 -1.0583630 -17.9205189 3.7782972 4.4429088 2.1423090 6.0176554 -4.1353202 -0.9415355 -75.1909103 0.4873028 -2.5394285 33.0190964 -2.1353686 5.9968643 3.2134037 -2.9469862 -15.3591480 9.2179680 -12.6682749 -11.3877916 -5.6980143 -0.1828877 -0.4976006 -3.2193053 -7.0954518 -7.3100920 -1.2109520 0.6453407 4.7540941 8.7067776 2.0877635 -6.1506433 0.6243643 -18.4940968 -4.6931829 -9.5918770 -2.4715579 0.7421371 -6.6461701 2.6531014 31.5256271 -12.3411474 5.1833200 -2.3816323 0.9300764 10.3768005 -0.1251263 16.7348576 -0.6491488 9.7080679 -6.3324351 -14.6755819 -0.5647047 -3.4068913 -18.8543148 4.8647480 3.1202059 -0.6990972 -9.5523787 -5.8853359 -2.2261569 -1.8607317 10.7583418 -0.5468813 2.2141263 -0.4491802 9.5863104 -8.9169483 -3.1331298 -14.2074814 -11.3141394 -12.2528248 2.9844081 15.5279980 6.7493968 0.6295490 -12.4961023 8.8679571 -13.0275640 -0.3518019 3.7217438 2.0381937 -0.9491138 0.7978963 5.0077696 -37.4346924 3.8624246 -1.0933421 31.9276447 23.9666977 31.9833069 4.5594850 -2.4245768 -2.5509682 2.3034146 -4.4489489 -1.7961445 15.6211061 -0.5533625 4.9933243 11.6761570 15.4492598 3.3261094 -10.5242720 19.5981236 2.1056263 -4.3894191 6.4029827 5.1144152 -1.0639409 12.7559710 -4.0845551 -7.9221067 10.6200418 -3.0302014 4.4780507 -5.1933556 2.9649246 10.6364708 13.8264627 5.4325180 -1.6822228 -7.3052254 -12.0381784 -7.9975619 -14.6169119 3.4856095 -9.6435156 4.4892917 10.8177643 7.5730677 36.7049980 24.4013596 -9.3646879 -2.2324073 -0.9983749 35.4862595 15.0164890 -16.5524406 22.2079258 19.4070568 9.1779613 0.7290283 -17.5967960 -0.3186613 11.6187277 -2.3041668 -8.8367243 -2.2406468 16.5715809 -12.3094101 -0.8888514 -4.9494667 9.1616402 7.3831496 2.4347789 22.3158092 4.7847738 4.5661235 -10.0306320 3.8084514 3.8386006 3.8613505 -7.6002669 4.6630106 -4.7889085 -7.8024306 3.6948638 7.6015840 -10.3806725 0.3420832 -0.1047109 8.6009321 4.5604863 4.7775002 15.9991150 -3.0353487 5.1851945 1.8881130 -10.1155643 -3.1036289 -15.9967308 -4.8086243 -11.0532246 -0.7959484 4.7563782 -6.1911178 7.1340790 -0.6318784 -2.1452274 -18.5799332 -1.2324157 -18.8156605 -26.6070518 -8.6612015 13.0510759 1.9428021 5.8023696 10.0383930 7.8032455 -2.3488986 10.3399429 -9.8116722 -3.3665359 15.3683386 -10.1260481 15.9460459 5.3962946 -14.4954538 -27.1932182 1.3573903 -0.7318543 3.6487007 34.3252563 -22.6137352 -15.7423058 -38.0422783 -15.0112162 12.6434469 -3.0646477 -9.1540689 -7.4576163 1.2997328 -1.0289478 -2.3994551 -15.2106314 -3.0113115 -8.4822569 -15.9900179 -29.0379925 -4.1045375 6.5896454 -4.9264727 -18.9784698 0.6471167 -7.0609989 -2.7055736 -12.5017605 -10.9934464 3.3772340 -3.7732801 2.5142705 1.9197917 -6.6505213 -3.7874968 -0.1282669 -6.3807993 -13.7725849 -2.3586357 -2.2778795 -0.1992274 9.8156776 -1.0844465 -4.8468471 -2.5668714 12.5498037 2.8214011 -4.3960714 -25.7404976 -22.2634964 -18.2884598 -2.8940787 -2.5073359 7.4447637 115.8537216 -15.9895554 7.6978493 7.3687682 -16.5072670 -6.9590998 -2.4914420 7.7432742 0.3383231 0.3949900 1.8188876 -25.3203983 1.9931810 -9.0913944 6.4417863 -0.8076758 3.9874494 -29.3202324 -7.8083639 -17.0373268 -10.6545553 -5.9152126 -2.7906282 2.6371605 -1.3913251 8.6972036 -23.0518150 10.2752619 0.5209115 0.5772603 10.7271318 -8.3139706 -7.0139642 3.8870044 -3.7386644 -0.1762473 -11.0207510 9.8473234 -2.2189336 6.8751311 4.5107365 0.1799772 -16.0178699 11.2473927 -1.0844430 9.3501015 7.5162492 -0.5244561 -1.4960699 -1.6828291 -7.8651633 -12.4114695 15.6988554 11.1530762 -5.3938193 4.6996031 -6.6308503 -6.2740569 5.4926529 -19.3379364 -1.1613544 1.5239251 -6.9957919 -4.4149961 -15.9831963 -24.4576817 6.2590098 12.8592491 -3.4619634 7.3712983 -9.7745657 8.8597832 2.7368882 -10.3067093 3.1638784 3.3739846 -7.8910513 -47.6498680 10.8013668 4.0184422 14.2557087 16.6660004 27.3092098 2.7573607 20.8649158 -2.3041384 -11.5080214 -8.6500034 17.1046009 8.7338972 4.7929058 -3.4509695 1.5981804 -3.4984255 6.0854855 -0.4315290 -22.3293037 -3.9488955 -3.2090683 5.3010111 0.7839313 3.0958030 -10.6648808 0.8601089 -4.5529628 -6.3615236 -5.8671336 10.6023474 9.1488008 -6.4581470 -4.2056589 3.1885159 2.0633466 11.1368294 4.0221138 5.8836999 -2.1370208 15.3835831 12.3411112 -7.9915080 -14.7456913 2.2157097 12.4565744 -1.2515635 3.8616185 -8.0826225 11.1838179 -0.4370158 29.5054150 6.5572710 0.1256545 19.9024162 10.9005203 -13.7944498 2.2205555 4.1423512 8.0777407 -0.9960622 1.4090151 4.1416135 -4.7679467 17.6869946 3.5865598 3.3442578 -17.8257961 1.8811259 6.9948010 2.6437654 3.5154035 4.4543352 4.0470896 -10.4598103 11.8440943 -16.8842239 19.3904800 8.3623104 -2.0162928 4.1936674 5.5597930 4.6862736 3.5964105 -2.4534440 -3.2519257 2.3154597 2.1325295 -2.2312064 -11.6134434 10.9483519 -8.3152304 1.9122454 -2.5798705 -16.9388046 20.8618870 17.6082306 -27.2198067 -2.3325059 0.3998581 -11.9772282 11.4471693 8.3572550 -9.4183550 -11.5591497 2.0919194 -2.9500804 6.2825117 -1.1658964 -4.1111751 13.2404385 1.1822232 -0.5042620 3.1653214 7.2260880 10.8382292 23.6061192 -6.5376172 -13.2620926 5.9268031 -7.8410335 6.8914447 -8.3756475 -5.8166733 5.3320932 -6.2722759 -8.8930511 -7.2036633 39.8851891 -14.1769276 -5.4659109 -6.7415428 -19.3241081 -21.3878880 -4.6572976 -8.8956728 2.0543895 4.5930004 8.5181961 -16.4868202 -9.9676962 -11.7476482 -0.2002574 -5.5846491 -2.9449594 -7.9982996 -0.0982480 5.4744644 -0.5965150 9.7441349 -4.0282412 -3.8651865 -0.7585560 7.6669927 -1.6150929 2.0779712 0.2122254 2.4565079 -9.5341635 -9.1876040 3.1491408 -0.1655474 1.0211945 -4.1174808 -8.4542055 -6.2832456 -6.3281474 -2.4541597 -10.1527338 -10.2999487 4.2678118 6.4820490 31.9910221 -4.6769552 3.5174470 -2.3526366 1.3724966 -10.2089510 0.1389349 103.7525406 -4.5444121 -2.7338815 -5.8057995 -8.9399252 8.9359684 -3.1620028 -4.9305835 -4.3335862 -2.3305790 0.8445066 -1.4495966 6.6615210 -28.0641632 -1.7534124 -3.4184217 8.1015368 -3.1486180 -8.6047201 -3.1795285 -5.7679267 -3.3061438 -4.2082663 8.1615038 -7.9034729 9.9574156 -18.2121792 -9.9635744 -0.6093315 -5.0941482 1.9571555 -5.6757665 -5.2301989 2.9752522 -1.1994104 -1.0755368 -1.5267459 -3.2131877 7.8855429 -9.0596075 6.2705841 0.2982851 3.4369738 9.4412260 -16.7165394 -10.7875862 18.5319977 2.5072918 0.5874811 7.3019919 -5.9350739 -2.4526284 4.2640429 -14.6409359 -35.4546509 7.2946773 -1.3926942 -54.8873940 2.0166156 18.6355877 0.9940374 -36.7048645 -44.6582375 2.1503086 -10.2954311 -63.9590950 0.0650233 -7.3269858 -1.3502234 5.0643373 -16.0580482 2.3076129 3.1457462 -26.3018780 -2.1697004 -1.4527754 -4.4787583 31.1468983 -10.9469461 -13.8434772 0.6231481 6.1030178 47.5788803 4.8973107 -15.9691916 -0.8071270 -10.4069319 3.8511648 7.8218193 0.0939509 0.6813096 -1.5472075 -89.6897430 -102.5045395 -7.9955754 -35.1555595 -5.1569324 -22.3381691 -2.0510695 12.7509317 0.9891365 11.3324728 2.5745296 -4.4930305 -13.0475893 0.3365004 4.5478220 -10.1345043 -13.2360086 -11.1569881 -18.3825588 -60.1146240 6.4239936 1.2180022 -29.1744518 -1.7160573 -42.6501656 -14.5228767 15.1072512 -7.9754062 -6.0731602 -1.8246373 11.2941685 -63.7689095 -23.1364555 -56.3153572 11.3704662 8.9329739 3.9558525 -20.6657867 -14.2722549 7.9993496 10.4901934 2.3902259 2.1122789 -33.2897301 3.2014577 -9.5303984 -9.1976633 -2.8403656 -15.6613197 14.0316544 -20.7010136 6.5099702 -3.8586733 -8.1857214 16.7430553 -27.2587299 1.8811052 -1.4470608 -2.7787063 -19.7564240 0.1135144 14.9626179 18.8975258 3.8283365 4.6962476 -12.3493662 -7.2832460 3.4973631 -130.0963135 -14.2578526 -48.6066742 14.4223680 1.7862971 3.6165714 0.2761025 16.3095169 -11.6627359 -11.8031893 -16.8544636 2.2720242 15.9902401 -56.1522522 -8.8261309 -39.6067696 1.4416950 -4.1756487 -3.6089537 2.4400606 0.3969409 -2.6766453 1.4270633 0.1188596 -1.2065321 -1.1132933 0.0935815 3.9054935 6.7446046 -4.5084548 -4.4757929 -1.2156916 2.3921006 -0.6473611 0.5160968 -2.7480171 -1.2236438 -2.1070671 1.6857778 -2.1814156 -2.5767660 0.3731430 -1.6883919 -3.0287380 -5.7119622 4.8696761 5.9297743 1.8242205 0.3533737 -2.1142242 6.7115207 -0.2701930 1.7763218 0.0367052 -0.0209702 0.3559864 0.9923739 -2.3815260 6.0535746 -1.1219456 0.1377660 2.6297128 -9.7013969 3.2914228 -3.9252124 -1.7113314 0.6943449 2.6177382 -0.0152288 -1.9675987 0.0488775 3.2378514 -0.9105520 1.0891069 0.5586813 -0.6468415 -1.6886115 -0.5906662 -9.2593174 1.9397489 -1.9999499 0.5165005 -2.9598734 -0.2972866 0.1055437 -2.6944587 -3.7024462 2.5140269 0.4316297 -1.3253579 -3.5097837 2.2438371 1.2561719 3.6978109 0.0386907 1.5677880 -1.2282768 3.2216189 -1.9086058 -2.1390202 0.8803018 -3.0045981 1.5867320 -0.6292314 0.0711886 -4.2554388 0.5443451 1.8407955 -1.1668302 -4.9555655 -0.8512017 0.0102585 2.2856076 -2.0460727 0.8940729 -0.7199826 1.1818388 -0.9021366 -0.7238072 2.9826412 0.6619859 -2.3847742 -1.9116437 -4.9478250 -2.3296208 -1.1645992 0.0274499 1.6105715 -3.9074528 0.2504461 0.0164879 -1.8205256 3.4394238 0.8152424 1.8512195 1.1692843 2.5538642 -1.8289135 0.2191818 0.5073094 0.1732883 0.4803383 5.2493043 1.1744603 1.2350416 2.4958360 1.1120090 0.5204669 -0.7454005 -34.4155502 -9.0603046 -0.0161013 -3.7564738 -13.7487822 -2.6081612 -1.3120391 -6.7873969 2.0518718 -20.6673470 -3.6977944 -2.9287126 -18.1950035 -3.9891818 -3.3598650 1.5930107 4.2409430 -2.2683480 -1.3667599 -7.9702163 -5.4391046 1.4446288 -1.4593509 2.4103642 -2.2646985 10.3179874 -16.7030239 -9.4417191 -9.4847555 -29.7310829 2.1788814 -2.1792908 2.8346148 -1.4380029 3.8229146 8.6483059 -0.5056326 1.3826596 -6.2983298 -3.4650848 -12.3712921 -1.6997699 -1.5573844 -3.5003078 -8.5510101 -4.2836800 0.8938763 1.2243134 -3.4229386 -4.8164573 -1.5169657 -2.4854801 7.6516943 5.8205523 -2.1212583 -8.4270077 -4.2391467 1.9058679 0.0400367 2.7431197 0.0973756 -13.7997990 -3.2342153 8.7618513 -8.2458267 -5.7899189 -10.3908539 -1.8023667 3.8014486 -17.0345993 -17.1177330 -3.0013993 4.8850989 1.9301023 -2.6835275 5.3288841 -4.4962282 1.3165529 1.5112470 -6.4289794 -11.1559954 -0.5133830 0.4581875 -3.3584330 -19.9375553 5.4669776 0.6626028 -2.4517572 5.6894231 -1.8040495 4.3650084 -2.4372807 0.3811100 0.2560569 -0.2881674 -4.6170468 2.3993042 4.1464276 -0.6251534 -6.5491061 6.6851854 0.5626537 -14.2304010 3.4775696 2.0195005 -1.7642624 0.7197259 18.3071938 -8.0028124 -28.0632000 3.3494320 -10.6835794 -11.9147854 2.3484738 -7.2203946 -2.2001245 -6.6983480 3.1808970 -3.5373743 -15.1755037 -14.6144142 -0.5479683 -0.1361796 -1.8263544 -1.6390449 6.1774402 4.2169604 21.0057220 10.4062796 14.8418922 10.0168648 7.5052066 -10.7133169 -11.9135542 -7.9334273 10.3367195 -6.7493882 -3.2434571 2.8473964 4.2499051 -2.9863701 16.7187481 6.7850466 5.5814786 -15.8253164 6.6256256 5.1049247 -9.6661863 -0.9934963 23.7870827 10.8053875 -34.5215073 0.7697126 -2.5268843 2.3795369 -3.7622671 8.8122702 20.9071102 -6.2577553 5.1921568 -8.1289186 -20.8563309 5.5651231 10.6718788 6.9870052 -1.4411634 -0.4027928 16.0419254 15.1601877 -7.8048916 0.1615484 -16.5618916 -8.4745884 2.6929018 -0.1303685 -15.2038460 -0.2913760 7.1378875 3.5010498 -7.2323585 -1.7189795 13.4593391 -1.2016265 1.8223330 -16.2659645 -6.1030035 4.6390772 13.6568785 24.9969540 -2.9534092 0.3090192 -3.7550149 -99.9758148 0.0697059 -7.9914789 3.1538270 10.1287117 -9.8493805 -21.3613377 9.3484297 -5.0142918 -1.1440607 14.3127108 12.2694206 10.5565100 -2.6940458 36.7499809 16.0142078 9.8031101 -1.3296582 -8.0907097 3.0485101 5.0118394 7.5483356 -5.4124713 -1.2972908 31.9743748 1.2008364 3.4413934 5.3676739 -8.1721945 19.3387280 2.0899007 4.7977099 -1.7967783 1.2495511 -2.2624168 12.2401295 10.9610977 8.3161669 4.4512048 1.2683588 3.4874089 1.9146007 -2.4537330 7.6706920 5.2237148 4.8084488 -13.1164474 9.1209841 -21.3494740 1.7643764 31.0577202 5.8500137 -3.2227731 8.0191031 -0.1564685 -2.9506459 -1.6759992 8.2545519 -0.1204316 7.2719522 9.2454939 -17.3510036 -19.4027748 -12.1243896 -4.6656551 -10.9429207 -2.2309709 -6.2307010 -15.7392311 -3.1955950 -16.1320667 -6.9599218 -1.4285890 -12.1164341 1.6919615 -14.5988398 -6.1955147 -4.0588517 -1.6942787 -7.6298013 1.8486730 -7.1261144 0.4044453 -4.1267948 -1.5469867 -7.4645209 13.2961731 1.8896712 -5.4976382 -9.1335106 -2.0425637 -2.1741061 2.7715523 28.8563423 -2.9203877 -15.9669113 -6.2399149 6.4853439 -1.2587379 -7.3133736 1.8295949 -5.1076670 -2.6751580 -10.0590534 -52.5797958 -15.9857464 -28.6401215 6.9942503 -12.3663378 5.9885120 -0.0849322 -4.6751857 -4.5529575 8.8631287 -2.9521654 -4.2893882 -2.9514680 1.5680166 1.5841135 -5.5152106 -8.3208313 0.7828994 -1.9429262 -1.2189103 -9.7795362 -0.0285023 -5.4013009 0.0494950 -11.9222717 -9.9458036 -5.5894036 6.9960732 -2.1099839 -7.4771743 -8.2026358 -20.1708775 -2.7418268 -3.0266337 3.0681987 -51.2299957 -14.7524071 -8.4380312 16.0014896 -1.6141508 -13.8255529 3.3547199 -22.5864792 -3.6483312 -14.0808525 2.8072083 1.1252733 -6.5774875 15.9940004 -10.7609539 -4.4578071 -13.9333029 -1.4139839 -6.4275622 0.8761520 2.2710989 -0.6991776 2.4850450 -18.1036148 -1.7646912 8.2546358 4.0355787 -7.4841657 3.5216663 -6.9014411 -11.8266525 -0.0858903 15.9801970 0.8071312 -2.5062642 1.1912615 -12.8639908 -2.5283585 1.2402972 8.0515366 -6.2688818 -2.6708589 -10.9466267 1.4288242 -3.4533286 -16.2880707 -12.4456863 -19.2770519 3.9819119 1.6834403 -9.8369341 -1.8442010 2.1734989 0.7930387 -2.5215826 -0.2934915 -3.6862314 1.8879267 -2.8277619 -0.5220409 -0.4745795 8.3379688 -11.2587118 2.5488513 1.2856451 13.5134058 2.2894959 1.7370439 -0.3010025 -3.7415123 5.0317507 0.2507474 -0.8726915 8.6446667 0.7158709 -0.1632569 6.3206282 -4.1165085 -0.0353633 5.1191230 6.6273761 3.9859829 0.6177987 0.0645162 1.5871923 -0.4542075 1.9479575 -0.6919857 3.0753968 -2.8095551 -2.9653454 -3.3250291 -1.3399967 7.0219412 -1.2968196 -1.0182946 3.7861402 0.8762295 -1.5454332 2.3795907 5.8607011 -2.7834580 -3.0619414 2.1458724 -1.5886075 8.1836414 2.7159498 -1.3522648 -0.2045283 -0.4039401 -3.2125926 1.5906266 1.1920972 2.2095909 0.3986323 -1.8138584 0.5156485 8.9936237 -0.0549071 6.4778748 -0.0477950 0.1190921 -0.3510689 -2.7231925 2.0625579 -0.5147778 0.0626060 -1.4599547 1.2432466 3.3912115 1.8244590 2.5904424 -0.1767938 -1.1725162 0.4909482 2.8699920 -2.8249936 3.0969210 -0.9651631 -1.7389268 2.1580908 1.4681530 -0.6540124 0.0335459 -1.9820695 6.2342830 1.8546807 5.6241808 5.9653091 -1.9852035 -3.8771138 1.2856842 0.3287542 1.0708076 4.4652343 -0.5823977 1.0074342 3.8236856 -0.5084445 -0.2543033 22.1908150 -1.1418653 3.0439999 1.7935514 3.5489941 3.3586612 2.1218104 -0.9117368 1.2002026 -3.4054344 0.3629718 -0.1845992 -3.5983675 0.8881900 4.6274805 -4.9892201 -0.1753710 -2.7209642 -0.2982707 -3.9159262 1.9134942 21.2312469 -18.6318893 -2.5990884 -18.5447731 -46.7341957 -11.4771013 4.9122982 -5.5533657 2.4130125 -2.1677804 -7.1607447 -12.8774700 -10.0935936 -3.9632223 12.2635632 -6.4034286 -16.0569000 -4.1643462 -2.7707524 -12.7830915 -9.1506996 -12.3330889 -29.8611183 -1.2539107 -15.1379881 -7.9203401 -10.7650909 -10.0511017 0.3491964 -6.0246711 -2.6095245 -10.2540369 -3.5918977 -12.3022833 1.8354131 9.2723198 5.0092654 -4.4171705 -4.9260654 -58.3669662 -20.8256397 -8.7568712 -8.9710550 -3.0927403 -50.0190659 -0.3078006 -3.3874476 5.3905292 -6.3166685 5.5787988 -3.9963994 1.6653229 -1.4493830 6.5835919 -3.7153239 -25.7801285 -6.6426468 -9.7644491 4.1399074 -1.9315935 9.2904139 -29.0753670 -1.8585305 -33.9457779 -29.7985477 -10.4643564 -14.2792130 -3.0214436 -9.3476486 -0.0051318 -21.8578796 0.1093794 -6.6679759 0.1105467 -1.9415016 -27.8485165 -4.4102244 7.8130617 -28.5395756 19.3754597 -12.5403194 -5.3634300 13.3513145 -2.3487494 1.7040581 -19.6636925 -9.1277761 -3.6158893 -11.4202566 -25.8972836 -1.8324950 -6.5197439 -6.3453517 1.5457714 -4.3129301 -2.8625476 -5.0107985 -43.9988098 18.7405567 1.4288843 -0.4564205 8.5089149 -41.7324562 6.4324369 -2.3200610 -6.5811448 -0.1284701 -11.9505901 -10.6909590 0.7509420 0.4754446 -21.4891224 -0.7603617 2.8785040 7.2667375 -5.2949605 -4.4367137 -37.7869987 -1.2888038 6.8272691 -7.1231031 -21.8926659 -14.1843338 5.3232088 -1.1390525 -2.1111929 -2.0110319 1.0888081 35.0724869 -3.9855192 -0.0706275 -13.0041084 -36.1962013 -16.9101429 11.9696522 -3.3817058 -0.2939318 -12.3539534 -4.8102436 -2.5678284 -5.3431644 -5.0703096 20.9866619 -3.4186988 -14.8097849 -1.0640103 -3.5058856 -5.3281102 -7.6254053 -2.0853186 -2.2694960 -1.7033738 -6.1305447 1.1378990 -7.8283806 -4.1563368 -9.8545809 27.3347683 -0.1166887 -5.4989681 -2.3573024 -21.0885410 1.0221524 15.1985674 2.3086944 -6.4934196 4.9784274 -37.4059410 -4.8762522 -4.6967263 -1.8365217 -0.2491882 -18.0796986 -5.1121769 -3.0608287 1.4963015 -6.2721214 7.6928267 -3.7228806 -3.7970104 -9.1950235 10.3385649 -5.2914553 -10.9433107 -0.9446973 4.2747355 -16.1817970 -1.1094950 12.1900625 -6.1428728 2.1712234 -15.8612347 23.8152733 -4.5247355 -0.7089791 -4.0522518 -0.4184873 1.4691304 -14.9198265 5.7455869 -11.7041397 2.3288028 2.2155790 -50.6709595 2.9552047 9.9200869 30.7053509 26.5398827 -7.5549273 -6.7677689 10.9441166 -1.6039437 -0.1053604 -6.4831181 3.6519117 -4.2772121 6.7471862 -16.8022480 2.8180327 -7.3817620 -3.9263959 9.4460306 -0.7995683 -15.6759243 -10.1858673 -31.7658787 13.4772825 0.5347781 1.8086730 16.4023991 -10.2921486 3.9141638 5.1482744 -5.3671255 4.9476867 18.5863647 -5.8134980 -6.5513525 4.8803244 -2.6112909 2.6966290 1.6395292 30.5392723 -0.9772182 -10.7650871 -23.2753048 -1.9466618 7.9929361 -5.9631677 -4.3451176 -22.3929195 5.6773014 -2.3622305 0.9551033 -8.9418879 5.6943808 2.7472465 -5.8997746 3.0532231 -0.2296053 9.0917473 -0.5299616 -4.1133060 -5.5342388 11.8181162 -111.3043823 -8.4891291 -12.0908041 3.0329964 4.7960491 1.6645235 -11.8175077 6.9078746 0.1656737 0.2220025 -0.4248667 5.4581504 -1.6724193 5.7327032 -10.7815351 -1.5460230 -31.8898888 5.2805271 -12.3518705 -1.9519528 -41.1840591 -0.0728003 11.4558163 1.0423223 -2.7777388 3.1414003 0.5982378 -0.6811811 -7.9932971 0.2872306 -6.0973744 -6.8479395 -0.6210636 -12.1416206 -6.5956788 7.8657241 8.6447716 2.5518672 -0.7766853 8.4310017 11.8001642 -0.1633687 2.1348372 -4.6589470 1.1465170 1.6654861 -0.8136335 -0.2566251 -1.9111472 14.0065641 -0.2506573 4.0518675 -15.0204954 2.2091005 -22.7531719 4.5901375 -5.6807151 -1.9970398 -3.7920606 12.5598869 2.7620611 7.6818619 0.0047643 -29.2038231 0.7566918 -2.0529327 -14.4969616 6.1998539 2.2903621 -23.1625729 -4.4651108 -2.2743883 -0.9310545 -1.0223895 -2.5602882 13.5431128 6.2013535 -12.9207687 2.2289727 2.5564046 0.8061283 1.7864966 -10.5007362 4.0494061 -1.1267195 1.8745019 4.2426953 2.3120844 3.0122182 11.5522738 1.8520840 -7.8950405 -2.0359433 -19.7288666 -2.7342861 -1.7027335 -3.2540996 -0.8945556 -27.5706844 4.1471167 -4.9311910 -1.3043282 -2.3768256 -3.6715095 -1.4861082 5.2482610 -0.1442472 -5.1015739 4.7004752 -4.6074009 -7.4311323 -27.1897144 -29.4406471 -13.4531555 -1.4207613 2.4844306 -2.8298860 -0.6855109 -0.4189578 -0.7173867 -1.1504408 0.3581043 -0.1829870 1.7130265 0.2836143 1.4058818 4.4977746 3.2837338 -0.9424620 -1.8900214 1.2271155 1.6576792 0.9828873 -0.4782645 -2.7079067 2.6474078 2.3287845 0.0844753 0.0979172 3.3060777 -1.1148692 -1.0373956 -0.2923472 1.5006735 29.5841904 2.3466949 -8.3706036 3.2773168 6.8826303 -0.0878009 0.8752571 1.0991957 2.0990539 0.9110917 -1.0290557 1.4165012 0.3738327 1.1891810 -1.9275533 -6.3917370 1.0018134 -2.1337008 1.1181097 1.4010346 -1.0593460 0.9404630 0.4360873 2.3653977 -0.3302800 0.2033389 1.1988158 4.5068336 -0.0091220 1.2707013 -0.5128763 0.0760872 1.2606231 0.9585857 -0.3796952 -0.3712936 -0.8213671 0.5372614 -0.8082125 0.5368838 -1.0035174 0.4538653 -0.3417839 1.4290222 0.1569876 2.2414303 1.7775422 1.2151073 -0.1514886 1.3068472 -142.5008698 3.3753588 -2.2537496 -0.2118460 -0.2185169 0.4581293 0.0685933 -2.6090763 1.8907858 3.6377575 0.9114758 -4.2135153 0.2551287 3.2365358 0.0660683 -0.1113831 -1.4765880 4.9840860 -1.2796502 2.6060984 -0.6571504 0.6581580 1.2504117 0.8145140 -0.1106376 0.0030595 -0.7842841 12.9046736 -0.3032740 -0.8251538 0.3734954 -0.7166020 2.1389790 4.2404957 -1.1391195 -0.4119863 0.8127238 2.8709652 -1.0678545 1.5136818 1.5063050 -0.0788206 0.3801511 0.2835357 -1.0621431 -3.6824365 1.4054166 -0.8847886 -0.2554374 -0.1611863 -0.8882872 7.0952883 -6.0532551 45.4395905 -7.6952004 3.9438925 2.9434841 2.8789806 -2.4699800 -3.4613779 -1.6551099 3.2298446 -4.5365715 3.2025225 54.3017883 4.5071945 1.6308022 -2.5006821 -2.5942216 -2.0902746 1.6789905 9.0407381 63.6671257 -13.0562172 2.8218827 0.0071238 1.9138430 3.2257798 2.3839321 110.4102859 -3.2219765 43.8082581 0.0150778 -11.6371765 -8.2135735 9.4570808 -214.1256561 2.4361150 -4.1808300 -5.8439298 -1.8430927 10.2455235 4.2645574 0.5337445 -97.1633453 63.9918823 -2.3752716 -2.5367866 -24.9779797 -12.2436361 6.1355872 6.8143153 3.8787713 9.0196514 -7.4332924 -122.3755035 1.4674758 -4.4323072 -0.3877145 -4.5795236 5.7217584 -6.4611464 -6.5830655 6.8071752 -5.9631586 -123.9432220 11.7312860 6.7254467 -2.3650050 -15.6708908 -20.7270126 -2.3526604 -18.7590904 2.2176275 4.1203499 -5.1638327 -8.9005365 1.5762001 -3.4916508 -58.5158920 3.1413870 0.2375757 3.4258678 0.4449283 10.3708725 -3.0249231 11.7887058 -2.0774701 0.1727516 5.3988285 -7.6415253 -0.0092904 -0.7319403 7.6131625 6.1233616 -8.8109684 -2.4796152 113.1226959 5.4494052 5.6995811 -63.4556465 1.6515468 66.8383331 -4.6930270 -1.5006788 3.4427512 18.2823734 -17.9341068 6.5082011 4.6360779 -0.0257008 -94.7228622 -89.6569595 3.7297637 3.1280761 24.4344521 -4.9872465 0.0466258 -2.9053059 2.6320558 -137.8753204 -3.8819561 1.4319327 8.3282280 -6.7335453 -77.8998795 -5.1099892 -0.2124712 -69.3893738 3.4459414 -8.7386026 255.9523010 2.8871868 3.7392187 -5.9168596 -1.5105004 -1.5042727 -2.3106899 -0.8084457 2.2128274 -7.4848742 1.0771195 -0.5299710 5.4224296 2.8820903 -15.9051132 -1.6266776 -1.7678221 -0.6215138 1.9823550 186.5039825 -4.1143670 4.5927916 2.2641053 2.3740454 -1.8032595 1.3779783 167.2498016 -2.0822320 93.0290985 0.0092267 -10.9453459 155.1922150 -7.6182394 -14.1288385 12.0722370 -5.3468971 -9.8498640 -0.6078414 -10.6041651 -0.9310953 -0.0349062 -0.4416386 144.1926422 -2.5834496 4.6944323 -7.9881611 -10.7004824 -0.1099701 4.6961403 3.7678502 7.6090956 -14.9357672 2.9273098 1.8704382 -21.5184155 6.0703902 -9.4591446 -2.2662301 -13.9963951 -15.9498653 10.0154943 -15.9859991 -69.3327332 8.0862999 0.5347031 -0.5513783 -0.6533639 -9.6730204 -2.7969260 -12.8633680 0.7296498 -2.4672275 -1.6690454 -8.8756313 1.6584909 -5.7049088 48.7971611 -1.2936211 -17.3150501 3.2276533 5.3260698 3.4353540 -0.7081763 5.4592137 -1.8406838 -9.6155405 2.6884258 -5.6029177 -17.3554783 -7.2385182 8.2194014 3.3303480 -8.4273996 -2.6044104 105.0791626 2.0435450 5.2410879 374.7757263 2.8933311 53.4326630 -6.3279719 -1.5118073 -2.8083594 298.1634521 -7.6950188 3.2519248 2.3077102 -1.7615119 86.7123032 283.5959473 1.2907791 -2.4856138 35.3498344 -4.9505835 -31.9852734 0.0099480 1.9332414 83.2994766 -2.1546988 0.8733153 10.9897480 2.4283907 224.9632721 -9.9075766 -7.3821940 -35.9996490 0.3353456 -10.4764948 0.3498007 4.9448462 2.7312155 -4.9134154 1.0192842 -1.8526851 -2.8127635 -0.4512663 -2.2733638 3.8848197 0.2911067 -1.1742976 -0.4250104 6.2159534 3.9373398 -0.2193946 -0.6795965 -0.9784299 -15.9536428 20.8232727 46.7065010 4.9287181 5.5256257 1.8411599 -0.7804833 1.1504774 -61.5614700 0.0108554 14.0439339 -0.0522583 -13.7101259 15.3235674 -25.8945980 10.1862154 11.6136999 -2.5370569 -27.3800430 0.0509577 -22.4604568 -4.1195130 -1.2769667 -1.0711248 0.3170352 -3.3660409 5.0320892 -2.8418226 -6.2831135 1.3465962 4.4840636 4.4962673 -22.5206985 -14.8107004 -1.3808924 0.1242272 -25.1724415 0.1531164 -7.1062751 1.6286664 -23.2735958 -31.8456535 5.7586541 -41.8766441 -19.0013103 12.1973009 -0.3454933 1.1789225 -2.8348815 -6.4576745 -3.0597472 -7.8718090 0.1606028 -1.7724264 0.7081879 -6.0540266 1.3591634 -2.9510174 -6.7224579 -4.3953943 -17.0740948 2.1964605 2.1561408 5.7473993 0.7332245 2.5041442 -1.7564982 -0.9168524 1.3017840 0.3040889 -2.4013934 2.7069004 6.1707501 -0.4159551 -1.5237840 -2.1245754 -61.8505478 -0.4089079 3.0904248 -3.8289225 3.5224102 -1.9556229 -5.2984881 -1.4829050 -10.8379955 10.1650896 -9.9474716 0.1351314 3.0559049 -1.4879587 5.8653936 4.2398286 0.1018612 -0.8721484 27.3768139 6.4266181 -8.2034559 1.3538775 1.5032434 0.3855485 -0.6136544 0.6405023 4.4030080 5.6583962 30.8981171 -16.6087456 -38.2863007 -12.9288244 -7.9727025 -5.9756846 145.1502991 8.6313181 -2.1880555 -6.6614404 -1.2376351 -0.7006232 -0.3212475 3.3814061 -2.6737792 2.2863510 -4.9280648 523.8550415 -1.9330988 -2.3494611 -8.2016754 2.2698874 -2.0427706 -0.6555439 -7.4720020 -1.7784040 -1.6566312 0.0329619 0.2497839 -1.8447641 -1.6841538 -16.3185596 75.5298615 1.9610568 -31.6725826 -31.9677982 4.8716793 415.7330933 -1.3731045 162.7068176 -12.0096626 2.2245181 3.3717356 3.1538138 2.7206826 -3.4071581 -2.0161955 200.7347870 329.3399963 4.8978558 1.1482227 13.4720640 12.3309879 -3.2882283 -6.5246177 -4.5151381 -7.9585290 -5.3586650 114.7798538 0.2562384 -0.8021319 3.9173284 6.0478172 -19.5435867 4.9202981 1.0402975 -2.1230791 -9.9574909 144.5819550 7.7651672 -9.6704826 3.0973964 233.1159058 13.8558159 0.9002005 15.2347126 -2.8294554 -11.3546591 -1.8948631 4.4257936 -1.3514491 0.4892359 255.9348907 -0.5602262 -0.3935875 -2.7834404 2.7912095 -14.0507450 -0.6220734 -8.9473038 2.2987006 0.0367556 -15.9891472 5.9627104 0.0898814 -13.5095282 -3.3556564 -7.9696164 2.6117060 1.4071026 63.1768265 -7.9951301 -8.2144623 83.6555939 0.7031543 36.4602966 1.9465135 0.6837413 -3.4026120 255.9661713 7.4783564 -9.8744612 -17.3343658 -2.7844989 163.1655884 206.3092499 -2.4770932 -9.8073130 -24.0545292 -4.7109156 -0.0609727 1.4445535 -1.6043971 260.4745483 2.1977565 -1.5228819 -5.7758837 -7.9905405 169.8960571 2.8661292 0.5165113 114.5676270 -7.9599423 -38.7759247 53.9370079 6.7850275 -0.7420580 -1.4229209 0.4156906 -2.5319724 -1.6274458 7.0033889 -0.1179798 1.8844224 -1.6157143 -1.4641545 -1.0018166 -0.8385910 -0.8634796 1.0974230 -22.3722668 -1.4738686 -3.8688240 -5.3920188 2.0849178 3.2404354 0.2560253 -1.1461183 -0.5888858 -12.4607229 3.8094618 0.9077069 -14.2725277 -5.2195625 -2.2604346 34.4589958 -33.9100609 16.3996773 -28.8921070 2.0070710 1.9927123 3.7086794 1.9849833 -0.6939992 -1.4251200 48.0802422 15.5578690 1.4473050 -1.6392938 -15.9834528 16.1966400 -1.1644924 2.8183699 -55.5786476 -20.3473110 -15.8321772 -21.1277618 2.9541380 -12.9685583 3.5925496 4.7749267 -27.2126217 4.1356292 1.1738912 0.7391778 -17.7109814 -1.5950528 10.1507387 -8.7560883 1.9174289 106.7916870 10.0093899 -0.0215312 6.9557967 -3.9916615 4.0197067 -0.3377497 0.2494456 -1.7017691 -0.2619935 0.4996356 1.0682209 -1.8405484 -1.0988691 0.5110134 -30.0439949 -1.0772449 -10.4044800 1.4632548 5.4040685 3.9986742 3.3116095 0.4513017 -5.6962357 -0.0520435 -6.8784842 0.7959760 1.0225949 4.0260358 -12.2805452 -14.0268230 -0.8812830 0.5201601 247.6201477 1.3524513 2.5976303 -1.9049615 -1.0762960 -2.2806189 -24.1357937 -30.5731773 -2.1441450 23.3124962 -1.5682081 -1.4344414 -6.4739981 -32.0577126 -16.6173935 -0.0692216 2.8691843 -0.1524999 67.2096405 2.1537032 -1.1269269 -6.7163715 1.1961223 12.4381485 1.7756443 0.8782820 27.9511070 -23.1557274 -21.6262321 -37.1816711 -20.9069214 -31.9833717 -27.0720882 2.4412143 -25.4783726 -20.8993206 -25.0928097 -19.4390812 -23.7829685 -56.6722870 -25.2471085 -4.9128661 -20.6371288 -61.2343330 -6.3487816 -31.7329922 -11.9391556 -54.7124481 -28.1305714 -5.4151549 -17.1822510 -15.9029846 14.5484276 -9.6851463 -88.8125229 -38.8250313 -5.4043322 -42.7664719 -897.7548218 -35.3249931 -29.6669769 -30.2079201 -48.8729439 -36.8055916 -52.6869278 -28.5538826 -15.9916821 -31.9480095 -55.3332596 -122.9988327 -17.0708275 -40.8404465 -12.6305838 -18.0367146 -58.6691360 -39.8598480 -51.1724625 -20.3527164 -65.0394058 -20.3946857 -10.9384336 -15.9927740 -23.2291508 -60.0850792 -19.5781441 -30.8001404 -20.2179031 -39.2347794 -22.7016907 -32.4506912 -14.9990606 -57.3580971 -17.4002304 -87.8491745 -28.5385704 -8.8502054 -44.5612640 -27.9834328 -29.5153084 -33.3615532 -103.3826294 -22.1095963 -50.7921295 -34.3871002 -157.2249603 -31.9762077 -17.9457531 -851.7008667 -70.1704025 -5.0470228 -20.2832565 -2.8124857 -45.7513542 -13.3353891 -182.9599457 13.6927929 -31.6878281 -553.7094116 -44.1352615 -33.9466476 -14.6404982 -28.5714588 -59.9392471 -27.8643055 -26.1017685 -31.6796055 -62.5260124 -7.8907518 -24.8390732 -27.2812023 -78.0937271 -52.6144066 -31.9859009 -32.8992271 -26.0915241 -39.0254478 31.9591789 -23.7045803 -40.6783752 -50.7788391 -1.9292167 -6.7678304 -18.8207664 -499.4050293 -22.4154224 -9.6653461 -63.9608688 -14.1144161 -55.7514801 -23.5234470 -31.9872723 -35.5654793 -33.2557411 -93.2021255 -39.6347466 0.0613534 -1.0973905 -2.6494110 -1.0177248 -1.7689830 214 128 5 0 0.1000000 1.0000000 3.7800879 -1.7480620 25.2290192 -2.6979253 -0.3597988 -0.8519943 -1.7343618 -0.5358528 -0.2957850 0.0433387 -2.2139492 -0.9219721 -2.2977550 1.5303719 -1.6843621 -0.9521623 9.2753134 1.2901801 -0.3073305 3.2000704 -0.1752745 0.5182328 5.2352200 -2.0462174 -3.0171599 -1.3925563 25.9683361 0.4087674 3.4678810 21.2285442 -2.0769031 4.6307735 -0.3457589 1.4369253 5.1976500 0.1459611 2.5554197 -0.4448529 -4.3025622 -2.7120616 -5.5175533 -0.6838096 -0.7087670 10.5928202 0.6303972 -1.2911751 -1.5099674 3.9876368 -2.1538227 -0.5207398 2.0225091 0.4438867 1.0312260 -0.5918448 -1.3418256 -3.8343689 -3.1307118 0.7298326 -1.4630646 -0.1714287 3.1092288 3.7063594 2.4585929 0.0031891 7.7630901 1.5083357 -1.0157279 -0.8242238 0.3850199 2.4604111 0.9022225 -2.6809893 -0.5124778 -0.8317611 -0.1734135 11.7020235 0.3526541 3.2849181 7.7707186 -8.3969946 0.8967438 -1.3385024 -4.7456837 -0.7544815 0.4968596 -2.2606683 0.8435078 0.2079615 -6.7353549 -3.5800915 -0.8422092 1.6228448 4.8153043 2.0337112 10.8758907 -1.2326909 0.1099554 7.5811443 -0.2814382 -4.5380621 10.0913877 -1.0734162 -0.5199329 -1.1319032 -1.6098071 0.0086309 -0.6922587 0.7488204 -0.5594696 0.6152590 -1.7793281 -0.2576566 1.7821753 -0.3178351 0.0675330 6.4760551 -2.5945606 0.0611481 -0.5457979 -4.6119404 -0.3664577 -1.1287674 -0.6153550 -1.1711287 2.5620577 26.2098122 5.4909525 -6.3708129 5.8472114 -2.9672174 30.5694809 -4.7371187 -1.3373432 0.6886774 -2.4044907 -4.8382511 -0.7422822 -1.2668084 -5.3572578 -2.0265033 -3.2484686 -0.2827791 -4.5051727 -0.5582487 9.2893219 1.7652286 -1.1341763 3.8180621 -3.0718851 0.2649647 7.6601095 -4.9932899 -5.1321778 -2.2217040 33.6535645 1.0392048 5.1673937 27.4608173 -4.4117751 6.5949049 -0.9677512 1.9900137 5.9284720 -1.5256827 2.1214771 -1.1838790 -4.6817374 -4.8215489 -11.5520563 -3.5843041 -1.7357198 14.6010771 0.9516225 -2.0120096 -3.0862873 7.2161813 -6.4284272 -0.9454395 3.9857790 1.3332705 0.9450051 -2.6807630 -2.4610186 -6.0952582 -4.9146690 -0.5490812 -3.7046275 -0.4678329 1.6734898 5.7145500 0.2057820 -0.8163605 12.9292841 2.2667696 -1.5484312 -1.4469843 0.1739526 -0.1631455 0.0948795 -1.4128084 -2.5351546 -2.3725941 -0.3525525 15.3046980 -1.2252736 5.6290221 10.7038679 -11.0819874 -0.0018877 -2.6885796 -9.7939043 -1.4820713 -1.6067045 -4.5931206 0.1925117 -0.2471875 -18.3912048 -8.2209206 -1.3919041 3.9470677 9.0545740 3.3464489 13.7283468 -3.5087049 0.8431054 9.5900087 -1.2419136 -4.6573977 11.8379736 -1.8914416 -1.3191620 -2.1502266 -4.1817513 -5.3005056 -5.9756923 -1.1075265 -0.7415535 0.0892275 -3.0301239 -0.1963903 2.2502735 1.0210953 0.8843392 9.6746635 -4.0356293 0.3384159 -0.9860180 -12.9612837 -1.9759777 -2.7835639 -0.8383719 -5.1798453 1.2030913 30.6464157 4.7688942 -13.4804087 7.5374322 -4.5274658 30.7548542 -6.1970434 -1.1812459 1.6787250 -3.1864631 -9.3132744 -0.9938218 -2.8920000 -4.3623242 -2.9348168 -5.2591696 -3.3588541 -8.4960642 -1.3203241 7.9303422 1.6632882 -12.6838455 3.9176192 -5.7377934 0.2443090 10.3086224 -8.5414629 -7.7241325 -2.9624443 36.9369659 1.7767929 5.9829192 29.7705917 -7.4466653 8.7702360 -1.4529096 2.5459402 6.4933448 -2.1725328 1.6470867 -1.7106184 -4.7053189 -6.9827781 -17.5064354 -7.6733632 -2.5769484 15.9963388 0.7984490 -2.5710566 -4.6514487 10.1500483 -9.4020166 -1.4846075 5.3372741 1.8923465 -0.1602496 -4.8964605 -3.8712342 -9.0110073 -6.8614430 -3.1517315 -0.9366056 -0.5349781 0.0417845 7.4481258 -1.9950608 -1.8169849 16.0036068 3.0766082 -2.0936909 -2.2028229 1.0276747 -1.1947892 -1.2657620 -2.4986947 -3.2288544 -3.9140208 -1.0269631 17.5718021 -3.0853517 8.0715694 12.3883896 -14.5554504 -0.9419048 -4.0301142 -17.1403942 -2.4660811 -4.6035733 -6.5370994 -0.9705349 -0.6051816 -18.8675880 -10.5718784 -2.4314237 5.7430825 12.6929941 3.9594200 15.0311270 -5.2029586 1.4571164 11.4106255 -2.2396495 -5.1565285 12.7926569 -2.7439561 -2.0044718 -3.1518383 -7.4898353 -7.6447616 -10.8832340 -3.3538620 -1.0014864 -0.0655797 -5.3578362 0.1191786 2.7510486 2.0254383 0.3764527 13.0627260 -5.8709679 0.7647683 -1.5303963 -20.9860840 -4.1898522 -4.9939775 -0.7818933 -9.3057909 0.1666791 35.1544304 3.9197693 -15.5407391 2.9923172 -2.4383123 -2.3300390 -6.2256527 -8.9581423 2.1442900 -1.0484003 -8.2689342 -1.7515680 -4.4835725 -13.2252512 -1.6075130 -3.5334063 -7.7387075 -8.7863626 -2.2227564 -2.3678963 0.2463739 -7.0585608 0.0719857 -6.5107789 -1.0218542 5.0871477 -7.3940988 -9.5546770 -1.2286559 3.3308845 0.3766589 0.6216434 2.4047885 -5.9714026 4.0970511 -1.0630834 0.4212454 0.7766664 -2.6141977 -1.8406422 -1.1471469 -1.3898897 -4.1352153 -8.9360390 -9.3484077 -2.5054171 1.0926580 -1.6167110 -2.0076008 -3.6216919 5.7792597 -5.7741008 -1.1526929 2.6956022 -0.1131102 -2.7639952 -5.3820062 -3.1423254 -6.7964377 -4.4242101 -5.9673934 -7.1361012 -0.1644612 -4.0157676 2.8316543 -3.3829896 -3.7223756 3.2418356 1.7442141 -2.0277119 -1.9087309 0.7529396 -3.9447076 -2.8760135 -3.6534042 -3.2169428 -4.4424782 -1.4470943 4.6189237 -4.7872005 4.3847003 2.6138844 -6.7427635 -3.1263504 -3.3441606 -14.1886082 -2.0619519 -7.3308063 -3.7698925 -3.1465170 -0.8710832 0.3864971 -8.5565529 -2.9200630 2.9559314 5.1268187 1.3290290 1.8714594 -3.9238200 0.5562245 2.5335007 -2.2135618 0.0084634 2.1969075 -2.2006783 -1.5088550 -2.8021009 -13.2341375 -2.8878078 -7.6463766 -5.1041760 -1.4552107 -1.0741037 -4.4232373 0.5045918 0.9945930 0.5358590 -2.0961928 6.2791257 -4.6912327 0.8870770 -1.0366160 -14.8204155 -5.3353124 -4.6611714 -0.3473402 -6.5848689 0.5374185 10.1580162 -0.8790798 -11.3346100 2.5347149 -1.5587255 14.7893915 -1.2072184 -5.9727640 0.4049209 -1.4513806 -3.3936946 -0.7678047 -1.1690228 2.6187742 -0.2843833 -2.2208562 -2.3962090 -2.7648463 -1.0243061 -3.5976062 1.0609084 -0.8149194 0.9642218 -0.8552154 -2.3331923 4.1703730 -1.1563725 -3.4252996 -0.9990261 24.5749645 0.2879878 1.5367775 10.0692387 -2.5728505 3.7255635 -0.9542096 0.7939988 1.8800160 -0.5849461 1.4445924 -0.4030118 -5.6743088 -2.1238708 -5.4159961 -3.3376381 -0.6110007 -5.0735273 0.2299716 -1.1345160 -1.6354414 3.5718946 -2.8009250 -0.6592929 1.7213240 -0.2667330 0.0257417 -1.8563390 -1.0958123 -2.7925010 -0.2977251 -2.0205052 -0.9565223 -0.1571438 1.9350305 2.1770792 -1.1656069 -0.5334544 0.1483458 1.2129740 -0.7055104 -0.8300701 0.3357006 -2.1424773 0.3725408 0.0165024 -2.3896110 -1.3299744 -0.4046718 -0.5136158 -1.3375359 3.4207191 1.1446500 -4.2755814 -0.3710840 -1.4005632 -7.0146556 -0.9901294 -2.9120739 -1.8687857 -0.7333940 -0.1258901 -5.8395939 -2.8871891 -1.3866179 1.5164367 1.4447452 4.7298517 5.8635526 -1.5949110 0.0737147 -0.4472785 -0.2314431 -2.6706002 -2.0298162 -1.1675261 -0.6618246 -1.2785488 -0.8098813 2.5693252 -3.1486137 -0.0356670 -0.6351330 0.2182603 -0.5802190 -0.2225597 0.9451532 0.2773363 -2.2551866 5.2319560 -2.4452155 0.1162584 -0.4759040 -5.5510254 -1.8100318 -1.7661432 -0.3752968 -2.8447351 1.0148779 10.9214153 3.1717122 -5.2217803 4.3973241 -2.6942837 16.2853870 -2.9890676 -7.9070201 1.3247597 -2.0600889 -7.5861378 -1.2009988 -3.0692577 5.2449031 -1.1630824 -2.2491341 -5.2999110 -6.1150913 -1.1900476 -5.6198449 1.1607344 -1.6848360 1.1913750 -4.5396128 -2.8600538 6.4346271 -4.7059598 -5.7966108 -2.0890760 29.9144135 0.9775951 2.1438622 13.1616678 -5.3519526 5.6289153 -1.1899314 1.1879648 2.5068381 -2.1919208 0.7162286 -0.9585336 -6.3777947 -4.6231079 -13.2246075 -7.8851151 -1.5801361 -7.8331256 1.4871889 -1.9727603 -3.3722177 6.9627800 -6.0362091 -1.1586429 3.2457550 0.1930711 -0.3992960 -4.6257153 -2.2037685 -6.5807867 -2.2643642 -4.9664865 -2.1151996 0.0387997 0.0013888 3.7233405 -2.8991337 -1.5216643 0.5174541 2.0906754 -1.3316104 -1.6783746 0.8359636 -2.4042616 -0.9677219 -1.6407955 -1.4980086 -3.9220450 -1.5375538 0.7500805 -3.6074893 5.6714926 1.2957895 -5.8972640 -1.9325680 -2.8384018 -9.2215462 -1.6198453 -6.1071706 -4.1443000 -2.2003412 -0.2048606 -14.6469841 -6.5926828 -2.6056707 3.2925041 4.6794043 8.8369904 7.9547324 -3.7382061 0.6477538 1.3228142 -1.0505892 -2.4112837 -3.4770269 -2.2164168 -1.3709054 -2.2535658 -2.6065478 2.4390328 -9.4161339 -2.5377557 -1.1173055 -0.3439189 -2.8833020 -0.2382443 1.4947665 1.1107078 -3.2689788 8.3823872 -4.5287075 0.7043594 -1.2438835 -14.9308443 -4.3890419 -4.2509446 -0.3628905 -6.7281399 0.6974422 15.3556099 2.2237556 -9.2194958 5.9182224 -3.9602733 14.9374619 -5.0133162 -11.5349636 2.4864767 -2.5663450 -11.3738890 -1.6851580 -5.3559232 6.7461987 -2.1843677 -3.9642754 -8.9522495 -10.3346872 -1.8402361 -6.4321837 0.9053594 -10.7873363 1.0696479 -6.9492121 -2.4343343 9.1477385 -8.2053270 -12.6012316 -2.7182660 31.7448750 1.5043119 2.2658768 14.3977709 -8.2386608 7.7986927 -1.5873113 1.6181512 2.7106328 -3.2138915 0.2356954 -1.5044342 -6.5830193 -6.8193674 -17.5853462 -12.1840363 -2.6443498 -9.8349247 0.6804122 -2.7949328 -5.1516209 10.1961584 -9.1012421 -1.7571756 4.7104549 0.8282495 -1.5409535 -7.2839875 -3.7110679 -9.1393852 -4.1178508 -6.9179392 -7.2163038 0.1130893 -1.8973842 5.0802822 -4.2490888 -2.7204595 1.1676618 2.8827765 -2.1744454 -2.4864249 1.5835414 -6.1364107 -2.1499674 -3.8027675 -2.6194363 -6.0607944 -1.9516560 4.0238075 -6.1499863 7.9347019 2.9248345 -8.5697765 -3.5379088 -4.3172793 -13.0640535 -2.6061363 -9.5364475 -6.1410012 -3.8515475 -0.5101303 -23.9311218 -10.6741142 -3.5164120 4.8512764 8.0174427 11.2703819 9.5490599 -5.4281898 1.1700269 2.4534411 -2.3709409 -2.6438153 -2.4899800 -3.1291656 -2.1559396 -3.4042292 -5.4570508 2.8498678 -13.3089218 -4.6047955 -1.4770378 -0.8035367 -5.2413197 0.0118045 2.1735361 2.6555591 -3.8883183 11.6880455 -6.4018321 1.3264637 -1.5775547 -21.9846039 -7.1277919 -6.3042407 -0.1969663 -10.8497190 0.1802064 20.4066715 1.3364372 -12.7948036 3.2014756 -2.9709725 -3.8561416 -5.0153503 -2.6819944 2.3540537 -1.0086199 -9.1085873 -1.5934235 -5.1857762 6.7007942 -1.5199808 -3.0540781 -7.4730315 -9.4064331 -2.5821133 -2.8123393 -0.0506191 -1.9850101 -0.3088237 -7.1077290 -1.4680551 4.9560046 -8.1722660 1.5146551 -1.5523956 0.4275394 0.6248803 0.4013484 1.4646790 -5.9896317 4.1127877 -1.0603390 0.2505044 0.6543602 -2.8799675 -1.9063774 -1.1220827 -1.0132281 -4.5239401 -12.2796021 -9.6770153 -2.4729984 -4.5838108 -1.3916426 -1.9342699 -3.6454394 5.9133630 -5.0933414 -1.1192856 2.7701149 -0.1202886 -3.3657110 -5.6248202 -2.9744277 -7.6617370 -4.7717056 -6.8403940 -2.5707517 0.0022047 -3.9740996 2.4038200 -4.0765805 -2.9043095 2.0363545 1.7716210 -1.6235689 -1.9109576 0.4507709 -1.2417150 -3.2100375 -2.7219274 -2.4684544 -5.0380139 -0.6157554 8.3952513 -4.9355545 4.3715134 2.9703059 -5.5827274 -3.1953990 -3.2429748 -5.0955472 -2.6991429 -7.6729474 -4.2978730 -3.5085804 -0.6480073 -8.2832127 -5.7916179 -3.0408597 3.0620401 7.8189039 2.1573770 1.7404301 -3.9183686 0.5846748 2.5557678 -1.9626296 -0.2466621 3.1877961 -2.2657475 -1.2262042 -2.6136992 -20.4355774 1.2416794 -8.3843641 -5.6110048 -1.4228168 -1.1750209 -4.4132891 0.6279736 1.0401442 1.6544715 -2.3741832 6.4175839 -4.5422344 0.7608477 -1.0469291 -17.3173409 -5.6422915 -5.0272450 0.0870263 -7.8904676 0.6341878 9.8447514 -5.4623423 -12.4339409 2.0686655 -1.2646167 6.5261183 -2.5124850 -5.3221927 1.1480622 -1.0329844 -3.6240025 -0.7817852 -1.9526417 2.6717429 -0.7269601 -1.2555758 -2.9335730 -3.5252318 -0.7383771 -6.3369727 0.3084113 -1.2822310 0.1889298 -2.1462824 1.3477684 2.8362882 -2.6063194 -3.0301974 -1.3060910 7.4039736 0.3410955 0.5838094 5.1571612 -3.0232885 2.6814647 -0.7228655 0.6462950 2.0051148 0.1439147 0.4032757 -0.4285527 -4.3410211 -2.5216007 -6.8930292 -4.2990818 -0.4998170 -0.9244863 1.8258202 -0.8964356 -1.7538317 3.3392482 -2.6905632 -0.7738016 1.5387555 -0.2666964 -0.6173583 -2.5503945 -0.9651231 -3.2967911 -0.4547931 -3.3858666 -3.1544874 -0.0707042 -2.0303917 1.7477156 -1.0794828 -1.6540389 0.8968200 1.0411141 -0.7451937 -0.8666031 0.1103150 -2.2709758 -0.6349491 -3.8917506 1.8886852 -2.0278814 -1.1362612 13.7589674 -2.1939819 5.6421657 -0.8334354 -4.7838788 -1.2283574 -1.5994843 -4.5941114 -0.9796267 -3.0935681 -2.6145375 -1.4723444 -0.0127443 -2.1827137 -3.2936692 -1.6616532 1.7694806 1.5059386 0.8394797 -5.1084471 -2.2933991 0.3210906 0.3041117 -0.5933793 -1.3669196 -3.6165557 -1.1718276 -0.5542618 -1.1632944 0.2458086 1.6386368 -3.0255566 -1.4289171 -0.7492860 -0.0193999 -2.2028823 0.0426098 1.1784198 0.1308970 -2.5775990 4.1342421 -2.2998054 0.3494542 -0.7103946 -7.5644016 -2.5815518 -2.6904728 -0.3124344 -2.6081905 0.6757454 9.9191170 1.1200619 -3.2384653 3.7095180 -2.6534064 5.7525020 -4.6477318 -9.5115089 2.1126723 -1.4514471 -8.0753384 -1.4137985 -4.4200993 5.1840096 -1.7308218 -2.8470552 -7.1198440 -7.3999653 -1.1551185 -9.8657980 0.2368582 -14.4031343 0.1954239 -5.7476263 -1.3439999 5.2285833 -5.8360181 -5.5087786 -1.9787101 8.8360920 0.8312302 0.8066335 6.7836981 -5.5196047 4.6576309 -1.1793342 0.9148012 2.4115348 -0.4585559 -0.6141577 -1.2193912 -5.7904477 -4.7369084 -13.6329126 -9.1871319 -1.3239230 7.2965212 0.6136783 -1.6658328 -3.5783403 6.3148589 -5.8442526 -1.4099439 3.1880093 -0.0257998 -2.0503321 -5.4500847 -2.3294499 -7.0391660 -1.9390559 -6.3256707 -2.5353539 -0.0641951 -3.9676614 2.9085729 -3.2227142 -3.0785112 1.4883057 1.8425733 -1.5880588 -1.8942573 0.3673042 -6.8416171 -1.9814701 -8.1369371 0.5725793 -4.5127883 -2.0165865 20.5868893 -4.7538738 7.9863977 -0.2891366 -7.6240373 -2.9765091 -3.2044208 -5.6408062 -1.7397761 -7.1777654 -5.5033331 -3.2253759 -0.3495320 -8.5579834 -6.2469316 -3.0101976 3.5822089 1.7067945 1.9906250 -9.6561460 -4.1726594 0.8624737 1.8491384 -1.4705532 -1.2150275 -6.2385411 -2.3115375 -1.3911899 -2.3211410 -0.1078125 1.3898758 -5.9045529 -4.0730286 -1.4011167 -0.7670819 -4.3440919 0.2708737 2.0793283 0.5280415 -4.5616999 7.2124791 -4.8046088 0.8444644 -1.1571132 -16.4346142 -5.3980036 -5.4784193 -0.3290699 -5.9207072 0.9452223 14.5914574 -0.7660777 -10.2323513 5.2257147 -3.9175944 3.5453556 -7.1803360 -10.5201559 2.8016472 -2.2760406 -11.5229206 -2.3320544 -7.0024834 7.5258098 -2.1188087 -4.7695885 -10.1861210 -12.3362007 -2.1493762 -10.8933563 -0.2006714 -16.2781773 0.1371112 -9.0996723 -2.6280007 7.8057208 -9.2976837 -4.9981651 -2.6740940 9.2270308 1.0635680 1.1316502 7.2965913 -8.6806831 6.7746482 -1.8308276 1.2545469 2.7530994 -1.2919594 -1.4187373 -1.9833890 -5.9168730 -6.7617044 -19.2530842 -14.9172802 -2.2317178 10.1783848 -0.4558992 -2.7290998 -5.4458861 8.9451876 -8.0878487 -2.1927624 4.6630411 -0.1095945 -3.5985177 -8.2280569 -3.8477263 -10.8404036 -3.6371303 -9.3128700 -8.8990602 -0.0096155 -6.0104985 4.2662215 -3.6740167 -4.8565440 2.5954113 2.7240522 -2.4323704 -3.0446432 1.0530019 -11.4010134 -3.4487181 -11.4881439 -1.6488168 -6.7064118 -1.5544695 24.8010483 -7.1026573 10.2090960 1.4279547 -11.4683666 -4.5010858 -4.8254237 -9.8004446 -2.8358924 -10.3752041 -8.1612301 -4.9521122 -0.7537045 -14.0209761 -8.0512047 -4.4856863 5.2494745 2.8251073 3.4745295 -10.3018360 -5.8802781 0.8571211 3.2591300 -2.6926930 -1.2299711 -4.4713302 -3.6208780 -2.2672825 -3.6927497 -1.1755364 0.9503025 -9.4909277 -6.9587574 -2.4319313 -1.2944810 -6.4922118 0.6586875 2.5890982 1.1701869 -5.6554494 10.4394627 -7.4966035 1.3276033 -2.0035906 -24.9840908 -8.1932964 -7.4538059 -0.3470182 -9.5198832 0.8981198 19.3628864 -2.8165281 -8.8069935 3.4040284 -2.4929476 -5.2319155 -4.7094064 -5.7108855 1.4504682 -0.8506739 -8.5082846 -1.6669521 -6.2192206 5.9758935 -2.3145263 -3.8835928 -9.0536604 -10.6124830 -2.5798311 -3.2389860 0.7430446 3.9061596 -0.0334074 -6.0869203 -5.6037202 5.0221853 -7.9039569 -5.0058985 -1.2054576 -1.1673671 0.5925310 -0.0596717 0.1945289 -5.9791975 4.0909190 -0.7794085 0.3956027 0.7211973 -2.8338366 -1.1772799 -1.2458410 -1.2991894 -4.5254059 -12.3713121 -14.1559114 -2.8852594 3.6550102 -1.7675118 -1.9760680 -4.0160689 6.1316619 -1.8946130 -0.8372598 2.6363518 0.3247871 -4.2105746 -5.8640108 -3.1722310 -7.0050473 -4.6578979 -7.6665363 -3.1615171 0.6994978 -3.7269580 2.3638859 -4.4572301 -3.0491712 3.8981280 1.8167856 -2.3549113 -1.7825904 0.5033365 -1.8421309 -2.9292564 -7.0634775 -6.1960735 -4.6825142 -0.0924721 2.7986286 -5.3723755 4.5824499 2.3638685 -5.2289696 -3.5008168 -3.4122694 2.3132355 -2.1676409 -9.1049509 -3.9666843 -3.7521081 -0.6886365 -9.0216551 -8.4401445 -2.9115579 3.2702701 -6.4480572 1.9910555 -8.1768847 -3.0156422 0.7516788 2.9069884 -2.1859443 -0.0208916 4.1265955 -2.1427627 -1.3416892 -2.7513428 -5.4003839 -0.2102616 -11.3423929 -4.6227474 -0.9933940 -1.5556949 -4.4795241 1.0712502 1.3352638 1.8173553 -3.1841424 6.4210029 -4.1076694 0.8568047 -0.6330929 -15.9999495 -5.9810824 -4.3605042 0.7210627 -7.7068753 0.7933359 9.2046328 -4.2215028 -7.5198193 1.4542211 -2.0995553 0.6040736 -2.5284324 -7.9647727 2.2729738 -0.7014198 -4.6529536 -0.5659459 -2.7164299 2.1043649 -0.5822963 -0.7198759 -5.1511765 -3.9772425 -0.9901749 -10.1191969 0.1226116 -3.5503011 0.0482493 -2.4789083 -3.4153612 3.0347903 -2.2423837 -2.2030337 -1.1935797 2.5773187 0.4557127 -0.1912254 1.7594397 -2.4285958 2.5683064 -0.5115293 0.1769739 0.8806241 -2.0207472 -0.1957533 -0.8068938 -5.9880080 -2.2164037 -6.9555702 -5.1497808 -0.6010464 -3.0626307 -6.8014593 -0.8026057 -1.8779025 3.2856102 -2.4851263 -0.5977901 1.8299434 -0.1884500 1.3754919 -3.3206210 -1.3165152 -3.4996405 -0.7404989 -3.5812848 0.5450671 0.0430784 -2.3380876 1.3301889 -2.7984810 -0.4944904 5.2812390 1.1053822 -0.9789923 -0.9041520 0.0620662 -6.6019659 -1.2079513 -4.6143460 -0.6383966 -3.1259434 -1.3506016 3.9429071 -3.1214077 3.0403237 -2.8755960 -4.0008259 -2.2351792 -1.7166440 0.3861715 -1.6091219 -4.8522062 -3.4632118 -2.1301529 -0.2509806 -4.1746416 -2.9870379 -2.0941293 1.8119842 1.3965858 -2.8784666 -1.0547318 -1.7584802 0.3825279 3.0502732 -1.4249535 -0.8314489 -9.0699110 -1.1531755 -0.9124000 -1.2025869 2.5806568 -2.4585674 -3.6236920 -1.8332745 -0.3766056 -0.3200118 -2.1603942 0.3659511 0.2506931 0.2370819 -1.3960955 3.8025784 -2.0882540 0.2775454 -0.7793860 -7.7079782 -3.3204365 -2.8140824 -0.1404959 -3.5445025 0.2764651 6.2202597 -1.1551335 -4.5294209 3.1668506 -3.2383795 -1.2484409 -4.8999329 -15.4207115 2.8720727 -1.2353507 -9.2430925 -1.2921046 -5.7789063 4.7896590 -1.8133030 -1.8168702 -8.4953413 -8.6503716 -1.3385429 -22.0372086 0.2775688 -13.7995710 -0.0273852 -6.0781951 -3.2550602 5.2761564 -6.5031781 -5.4679570 -1.8787497 2.5542777 0.7134632 -0.0046919 2.1588397 -5.5291772 4.4601822 -1.0800849 0.5183818 1.0862094 -2.5779612 -0.7961977 -1.5592912 -6.6005487 -4.4799094 -13.9021111 -11.4949083 -1.7569656 -7.0822778 -6.7262177 -1.8493288 -3.7883046 6.1529856 -5.3654971 -1.1860796 3.5878425 0.0552441 0.3520100 -6.3120871 -2.5647235 -7.2940702 -2.7945101 -6.5873785 -2.3725016 0.0759350 -4.2691445 2.2744777 -5.1202707 -1.6070035 10.0100641 1.8828121 -1.9497763 -1.8294100 0.2487289 -8.2570839 -2.7169950 -7.1886368 -2.5206332 -5.3197103 -1.3247910 3.3504028 -5.7291541 5.0306487 -4.1308675 -8.5607224 -4.0671372 -3.4630706 -0.6508642 -2.6458268 -8.4690161 -7.3905463 -3.9747717 -0.6048093 -8.5065079 -6.0873775 -3.3780141 3.7741582 2.2425575 -6.6752043 3.9411185 -3.6152797 0.7148923 4.5220251 -2.4906340 -0.7116976 -19.0134430 -2.3248012 -1.7812567 -2.5927360 3.6796260 -2.1656799 -7.6951342 -4.4587340 -1.2228293 -1.0488646 -4.0422769 0.7507183 1.0669140 0.7879311 -2.8380673 6.9216523 -4.1994362 0.7838770 -1.2652836 -16.6556644 -6.1800175 -5.0820403 -0.2337355 -6.8690648 0.6904279 10.5410662 -3.8222492 -8.4467564 4.7740951 -4.8657565 -4.5268664 -7.4742632 -15.5175734 3.8511124 -1.7817876 -14.3343410 -2.1835160 -9.4019213 7.3876433 -2.6557527 -3.4037311 -13.4038239 -13.8069773 -2.5821240 -22.9519806 0.1881893 -8.4237194 0.1217966 -9.5357590 -4.2757215 7.7885671 -10.6223536 -11.3403616 -2.6427159 1.8446987 1.0056036 -0.0023967 1.4362017 -8.3592043 6.5762787 -1.6631385 0.7295286 1.5168710 -3.4755726 -1.6230243 -2.4078648 -6.8985481 -6.8336396 -20.7124176 -20.4279518 -2.9680140 -11.6907349 -6.5583482 -2.8988137 -5.7699728 9.1751804 -6.8714528 -1.8346943 5.0771823 -0.2222021 -1.2611684 -9.9565935 -4.0953941 -11.4665747 -4.9783692 -10.2264404 -3.8009062 -0.0098468 -6.0856314 3.6020868 -7.6133099 -3.2488918 12.2646236 2.8195372 -3.0297198 -2.8110535 0.4166602 -10.5523939 -4.2515969 -8.1269503 -2.2082043 -9.5294151 -0.6962322 3.6213002 -9.0809231 7.3529854 -4.1681705 -12.7644815 -6.6165204 -5.2233081 -6.6285000 -3.7306850 -13.6986933 -10.8903074 -6.4094944 -0.9394255 -14.9440308 -10.8174582 -5.7816596 5.5695400 3.9202864 -7.6979084 7.2038689 -5.3608007 1.0111564 5.8602643 -3.7197011 -0.6697428 -13.2249689 -3.5545115 -2.6092446 -3.9280262 3.7820647 -4.5574360 -10.6500254 -7.0754051 -1.7903336 -1.9043380 -6.3767743 1.2400968 1.6403100 1.5090985 -4.0693312 10.1639271 -6.3721137 1.1878240 -1.8447568 -25.2920589 -9.7593107 -6.9198694 -0.1575901 -10.7188721 0.8878792 15.3728924 -6.4261842 -16.4027843 3.4081845 -2.4784935 -6.1043067 -3.6216443 -3.1377709 1.9710324 -0.5030141 -8.2233496 -2.1559067 -6.6609864 7.6123624 -2.0062463 -3.3410714 -8.3816042 -11.7628307 -1.9017645 -6.2506585 -1.2027102 -8.4303131 -0.4938592 -5.8805494 -2.9344499 4.6600227 -7.6020994 -7.4455647 -1.2196200 -1.5654924 0.2988480 -0.2513755 -1.7982727 -5.9299307 4.0492725 -0.9525197 0.8050912 0.5467396 -2.3001378 -1.2250701 -1.3306807 -0.7857680 -3.6422353 -10.3675270 -20.1558514 -2.6942730 -13.2672968 -1.5200378 -2.0136082 -4.3375354 5.1559353 -3.4406822 -1.1740913 2.5379663 -0.3070000 -4.6512828 -5.3246646 -3.1499264 -6.5254288 -3.2545097 -6.4843483 -4.6461034 0.2738855 -3.9836392 2.4634790 -4.1497335 -2.1066730 4.4871922 1.7009723 -1.9475244 -2.0700145 0.0656600 -8.2606773 -2.7813513 -3.5909331 -6.7955155 -4.6473842 -3.3967609 -8.8646402 -5.0131178 4.2780561 -0.7569331 -6.1932778 -3.0523167 -3.7399757 -6.4035091 -2.2379065 -8.1882591 -4.9688892 -3.5474520 -0.7599884 -12.7544250 -4.1036696 -3.9977911 3.3393750 3.5566280 -14.6396618 2.4885554 -3.5667057 0.2630456 2.8342345 -2.1152813 -0.3751998 5.1439562 -2.1029716 -1.6740086 -3.0252888 -4.2599349 -5.7890701 -7.3359861 -4.8007264 -1.8222411 -1.1854607 -4.8244195 1.0047327 1.2679676 -1.6698823 -1.9756124 6.3416004 -4.7917681 1.1514909 -1.2344412 -14.8232021 -5.6689758 -4.9372287 0.4863677 -8.0123463 0.3494625 9.5945625 -1.5264080 -6.3419971 1.7253720 -0.8387747 -5.2721515 -0.3538731 -3.5912471 1.4343120 -0.5565592 -4.5028605 -0.5756434 -2.9964328 2.2059529 -0.5295264 -2.7611735 -4.1062636 -5.0466585 0.1870022 -12.1999474 -0.5182810 -8.8270063 0.1486932 -2.5135722 -0.6746709 2.6047032 -2.6654782 -2.2689042 -0.7640668 -2.3345871 0.2258459 -0.3037328 -2.3908815 -2.3804533 2.2664254 -0.4718129 0.1364801 0.1239384 -2.0284777 -0.1021800 -0.8165092 -4.0504007 -2.0369539 -7.2958112 -5.7317114 -0.5043195 -0.0088247 -0.2413372 -0.8528985 -2.0667615 3.2658591 -1.7576470 -0.5340179 1.6941051 0.2246030 0.3023808 -3.6884892 -1.3031539 -3.6631131 -1.5446768 -1.9989337 -4.5026574 -0.0834554 -2.0493114 1.0978966 -1.6852341 -3.0537512 -3.2782788 0.9697465 -1.0121871 -0.8439010 0.2460043 -4.3743415 -1.4526782 -1.3112917 -0.2467657 -2.6605477 -1.1580664 -0.8721756 -3.5081775 2.4725459 -3.5619557 -3.8013778 -2.3323381 -2.0376253 -3.2238431 -0.7381397 -4.0985994 -3.5406542 -2.5082605 -0.4940962 -6.9447408 -2.3713980 -1.8926423 2.1595695 1.5729121 0.2239310 3.6648903 -2.1286333 0.5627469 1.1199636 -1.8098594 -0.5696495 -13.1081762 -1.0451896 -0.8905542 -1.4629695 2.0889542 -5.2804117 -3.3728774 -2.1348779 -0.4183835 -0.6300108 -1.0984359 0.6658184 0.1454270 0.8997487 -0.2410450 3.6529899 -1.8803321 0.5311592 0.0372587 -7.8505411 -3.6844223 -2.8228209 0.0392029 -4.0462847 -0.4708895 5.6038799 -2.5053637 -5.4118433 3.1540346 -2.2390666 -9.4648857 -1.9995393 -5.4658546 2.3745697 -1.1399645 -6.8064260 -1.3779643 -6.8371401 4.6444983 -1.4200621 -3.8514094 -8.8269253 -10.9523010 -0.6983203 -25.9409065 -1.6938672 -4.1887059 0.4660236 -5.6316428 -0.7357910 5.2096958 -7.1747651 -3.7625530 -1.4305515 -3.1731362 0.6227956 -0.6779749 -4.1818681 -5.6339397 4.3958650 -1.1582093 0.3331194 0.6342043 -2.3278863 -0.9605791 -1.6779773 -4.8714447 -4.2383370 -12.3250875 -14.1431112 -1.7349900 3.0002089 -0.8673214 -1.8479010 -4.1763005 6.2373152 -5.0453353 -1.3352479 3.5302885 0.2679669 -1.1307975 -5.9503284 -2.8871133 -7.2492990 -3.7934232 -4.4429069 -8.0470676 -0.2402529 -3.8981752 2.5077634 -1.1869315 -3.4696598 -7.7015052 1.8378857 -2.1678381 -1.8937968 0.2346854 -3.0252452 -2.8310783 -3.1624296 -3.2860231 -6.2966785 -0.9549705 -5.9203467 -5.9327121 4.4593768 -6.2256818 -9.0173998 -4.4951549 -4.0484200 -6.0950575 -1.8761101 -8.1094065 -7.9636698 -4.0879483 -0.8084803 -12.3544254 -3.0726111 -3.5207317 4.1122785 6.4284010 -0.4902683 3.9949679 -3.6540058 0.7341204 2.8462636 -2.8062620 -0.4637384 -13.3379354 -2.2866514 -1.6797147 -2.8561902 3.0693159 -6.0981770 -6.8518553 -4.5967870 -1.1548725 -1.2541660 -3.2503994 1.3131218 1.1314690 0.8915852 -1.0172799 6.8009553 -4.2376099 0.9054949 -0.7775504 -15.4660873 -6.4556422 -4.5870843 -0.0619990 -7.4081459 0.0627103 10.5235252 -4.9540744 -7.5050335 4.9337535 -3.8356681 -13.2736921 -3.8626242 -9.0971632 3.3808403 -1.7261547 -10.4173222 -2.3800223 -10.2806377 7.5010285 -2.4625118 -5.5536270 -12.3153210 -17.2665443 -1.6398134 -34.2736740 -3.0529084 -10.6734648 0.6057125 -8.7283669 -2.6129224 7.7597370 -10.8057661 -5.9812613 -2.1922617 -2.4335246 0.8012688 -0.3156510 -6.4988737 -8.6978111 6.4322867 -1.9416037 0.6949916 1.1823937 -3.3986933 -1.6820471 -2.5061457 -5.3850417 -6.6258059 -17.8979454 -28.8925743 -2.9555335 4.7804976 -1.4180099 -2.8560545 -6.3872051 8.8177652 -7.7670541 -1.9186777 4.9999957 0.0049356 -3.1142938 -8.6664791 -4.3236523 -10.5383005 -5.5408301 -8.8838053 -9.9095182 -0.1167932 -5.7360935 4.0005307 -1.8857273 -4.8918805 -10.3284187 2.7471657 -3.1288626 -2.9144194 0.6005158 -4.5930896 -4.4323306 -4.7046504 -5.0149317 -9.8213034 -1.6235323 -11.2165117 -8.3611269 6.7076707 -9.2360382 -16.2685833 -6.0173655 -6.0345969 -6.5845628 -3.0662498 -12.5673447 -12.2403097 -5.8541751 -1.2726438 -13.2844381 -6.3877921 -5.1964431 6.0868516 10.5435505 -1.2739422 3.6857607 -5.3531857 0.9192855 4.2417488 -4.3203835 -0.2647176 -8.2107153 -3.5218432 -2.6086345 -4.3081141 3.1692078 -7.4957676 -10.6964970 -7.2695608 -1.9789847 -1.9595257 -5.7001910 2.0262959 1.3791294 0.9731758 -2.3704658 9.9481030 -6.7533560 1.2855250 -1.4374480 -23.4138374 -9.2805176 -6.6979823 0.0385104 -11.4780493 -1.0137713 15.3683577 -7.4752030 -12.3140078 3.1142898 -3.3959293 -4.0539827 -3.1441097 -7.8244615 1.1856391 -0.9629335 -3.9340808 -1.7733326 -6.5399251 6.4653711 -1.8954740 -2.1160173 -1.6075776 -13.7763567 -2.7924519 -3.9617116 -1.8940655 -4.5412512 -0.4974888 -5.7753329 -1.6488204 4.7689638 -8.2286644 -1.6408534 -1.3675534 4.1083879 0.2349920 -0.7309752 -2.2746892 -5.7477660 3.9237411 -1.0936962 0.3336678 0.4089433 -3.3067775 -1.4588974 -1.7522185 -1.2092288 -4.9923005 -12.1626329 -16.4468365 -1.7879853 0.8375210 -0.4920205 -1.9797713 -4.5406909 6.1161661 -8.4960089 -1.2590539 3.0214486 0.3810987 -5.3181577 -5.9846497 -3.3107498 -6.9284148 -3.7404809 -5.1169896 -5.4276195 -0.0769420 -4.4372067 2.3053067 -3.7998209 -1.0156089 -14.9346619 1.8534036 -2.2986708 -2.1112201 -0.3362754 -7.7953744 -3.4370520 -6.5938859 -0.8427004 -2.6631181 -4.1065345 -14.0051937 -5.9117231 3.9863019 -6.1929207 -14.6496696 -2.5144765 -3.9458609 -8.9821072 -3.0748951 -3.3211730 -7.2434120 -4.7603731 -0.8934074 -14.4007320 -7.6843328 -3.0506394 3.7688274 9.1576738 -4.9629078 -5.9058833 -3.0653048 0.7033934 2.5951035 -2.3685203 0.1695900 3.6747003 -2.7292645 -1.6336966 -3.0107188 -1.1452179 -15.8209887 -6.1164064 -5.1963429 -1.2714883 -1.7939104 -4.3210750 1.6109102 0.5638976 1.9778022 -3.2138393 6.1979146 -4.4308767 0.6800684 -1.0066241 -15.2779951 -7.0275536 -5.6653576 0.8513085 -7.4161987 -0.9826052 9.8929815 3.6408298 -9.2247076 1.4137664 -1.3112469 -11.0804281 -1.1513178 5.5893669 0.7566758 -0.7134586 -6.0708652 -0.7910845 -4.4154634 2.6766858 -1.6606113 -2.7120345 -2.5573690 -6.7836165 -0.0184932 -22.3862915 -2.5476241 0.0041561 -0.0839787 -2.5869040 0.4863444 2.4469287 -4.5548191 -1.3287277 -0.8662707 -4.8346868 -0.2577651 0.0984074 -8.8483200 -3.2618847 2.0868001 -0.5347716 0.8085992 0.2734594 0.4347477 -0.8919557 -0.6974536 1.5861052 -2.3476942 -2.4775445 -7.3881822 -1.3342516 -2.0296152 0.0688660 -1.2226630 -2.3804917 2.8486700 -2.4283051 -0.5223776 1.6543226 -0.0504655 -0.8966864 -1.3851677 -1.1631539 -2.8551607 -1.3831453 0.3516333 0.5518987 -0.4751473 -1.2705731 1.2557384 -5.8117433 -0.4994543 4.0048637 1.0310266 -1.5383503 -1.0533490 0.9787748 2.5807922 -1.3844399 0.0747946 -0.1630004 -4.0978565 -1.6586990 -5.7272649 -2.3183188 2.3811312 -5.6415443 -3.0625312 -2.0236769 -2.0902832 -1.7945303 -1.1339861 -2.5166883 -3.3642950 -1.6162522 -0.4507241 -9.0403023 -2.8310862 -1.6394941 2.1525238 4.0046196 8.2270250 -4.3554058 -1.8494198 0.2205280 1.7310869 -0.6014906 -0.3152918 -18.4370937 -1.1939681 -0.5621920 -1.9041038 1.6901630 -5.5552306 -1.0357978 -2.4635344 -0.7322099 -0.2131232 -2.6599047 1.0379910 1.1617062 1.3276271 -0.1658536 3.2882047 -2.2791417 0.7613021 -0.6291773 -6.0833435 -2.5381935 -2.5854189 0.4032714 -4.4211102 -1.3025297 4.6956053 -1.3761249 -8.4149628 2.9625766 -2.2404909 -14.3966751 -2.3102818 -9.3702307 1.8733449 -1.3638698 -6.1502228 -1.8026792 -6.6781344 5.5103426 -2.5152857 -3.7345934 -9.4410315 -13.8287773 -0.1091123 -16.0474491 -6.6111536 -8.6630182 0.3396504 -6.4959936 -1.1967236 4.9362564 -7.2705197 -2.9209015 -1.5204127 -3.3692861 -0.0639444 0.0257503 -10.2403059 -6.0336423 4.1590886 -0.9654235 1.1102711 0.9430274 -1.1853513 -1.4052765 -1.5401379 1.0201403 -4.2571683 -11.0239773 -13.6418571 -2.4399192 -5.9812078 -0.1648195 -2.2668452 -4.8940868 5.4951892 -7.3752313 -1.1755263 3.7603705 -0.3283268 -3.1724818 -3.9101334 -2.5476279 -7.2375593 -3.5487881 -2.5132530 -0.0332393 -0.7560975 -3.2071359 3.0960896 -2.7663019 -1.0465055 8.8297424 1.8936834 -2.5300107 -1.9494704 0.9736274 -4.7941332 -2.8024123 -1.5680646 -1.2727295 -3.9217834 -0.9727795 -5.9431658 -4.4068103 4.9457984 -9.6040230 -6.1182146 -2.5099199 -4.2403154 2.3042772 -1.6972002 -8.2807837 -8.3073750 -2.7231815 -1.0017509 -15.3795500 -5.1089807 -3.7680779 4.7478485 6.0705147 10.7539482 -11.1606865 -3.6553047 0.4645765 3.8377535 -1.9144174 -0.2442933 -3.7710037 -2.2291858 -1.5286075 -3.4399874 2.0259879 -5.9801669 -4.7330256 -5.0268235 -1.5271872 -0.7862268 -4.2047057 2.0955343 1.2505245 1.5177474 -0.8515087 6.5782146 -4.6277719 1.2893032 -0.8458128 -16.4836197 -4.7576804 -4.4711995 0.8824189 -7.5914445 -1.0685370 9.7866459 -2.4519303 -15.0905895 4.8123589 -3.8476384 -20.4553375 -3.8787096 -12.3170624 3.7155244 -1.9720541 -11.1010752 -2.8301959 -10.4325075 8.0391989 -3.5630324 -4.5872526 -7.5683856 -20.9061203 -0.1165908 -27.4655857 -10.6169033 -7.3877382 0.6264672 -9.2864208 -1.9211913 7.6399016 -11.8522015 -4.5809159 -2.2856836 -5.1290011 0.0712965 -0.3184316 -14.2206507 -9.0935125 6.3361092 -1.4267823 1.5360947 1.5544739 -2.2841120 -2.2150702 -2.4367626 1.2547476 -6.6452694 -16.8132248 -17.9282722 -3.9624565 -11.0242205 -0.0000816 -3.3224869 -7.3772144 8.4835491 -13.4465027 -1.7592165 5.8281598 -0.0962126 -6.0179873 -7.8037095 -3.8665361 -10.7642317 -5.1890874 -4.9441705 -4.4149122 -1.1612635 -4.7577720 4.6725140 -1.2966124 -1.8340325 12.1379881 3.0035746 -4.1023173 -2.9344697 0.4313015 -7.6852055 -4.0600262 -0.5393113 -3.4478605 -4.9236817 -2.3091817 -2.9966428 -6.6325665 7.3068895 -12.4300299 -9.9131794 -3.5882952 -6.4097152 3.8602960 -3.1315103 -11.4353485 -14.3706722 -4.2442203 -1.4540001 -15.4585361 -4.7120447 -5.9125409 7.2897449 7.7781134 13.9990950 -22.4101677 -5.2174106 0.7123384 5.3472424 -3.0257940 -0.5230536 -2.4049940 -3.3340397 -2.5403914 -5.0580611 1.8751297 -11.5330811 -7.9994273 -7.4484043 -2.1524792 -1.4334627 -6.2013202 3.2205751 2.1758544 0.8839241 -1.6191136 9.8897409 -6.7508011 1.7699877 -1.3337927 -24.0983887 -8.0100489 -6.2392349 1.3973924 -11.5892925 -1.2252481 14.5990562 -2.9994524 -10.6437340 3.0737581 -2.9818118 -14.5730753 -3.7610929 -9.1601067 1.6080822 -1.0157502 -6.3055844 -2.2891612 -9.0374107 5.7818489 -2.0575852 -3.0616970 -7.5345817 -14.9659319 -1.8839269 -17.1089134 -11.3205328 -8.2659159 -0.5390161 -6.6970892 -2.1744466 4.8905549 -8.6862478 -6.1145778 -1.4922645 -5.0397077 0.4141569 -1.4168662 -6.0841660 -5.5697355 3.9931486 -0.9478587 0.3329532 0.2960843 -3.2290370 -1.9819129 -2.0262325 -1.5730276 -4.6463614 -12.4032097 -13.9254503 -1.5924892 -19.7607079 -1.1215824 -1.7561187 -4.9901633 5.8082719 -6.6922765 -1.1638339 3.6020310 -0.2968075 -6.0076485 -6.0036602 -3.1432514 -7.4143844 -4.3654981 -5.8547893 -1.1283711 -1.0718035 -4.1153579 2.4294980 -3.6701612 -2.1582847 4.2738957 1.9094369 -3.2388294 -1.8590517 -1.6930956 -2.2844019 -3.2227592 -4.0779934 -2.0705607 -5.4578094 -2.4358730 4.1877069 -5.8692083 4.1061516 -7.3366075 -11.2684364 -3.4891720 -4.4267139 -3.1860137 -2.3963885 -5.7833858 -12.9364653 -5.2686033 -1.0095015 -10.9326506 -5.5455637 -3.4025035 3.9208059 2.8449490 4.6287384 -16.3900433 -3.4582901 0.9864538 2.6583703 -2.3170006 0.1473354 3.3591402 -2.1881084 -1.9232357 -2.9230328 -0.7604684 -8.9859171 -6.0095320 -5.2794766 -1.2605982 -1.3016442 -4.1070323 2.2544930 0.3404688 0.1379759 -2.7069242 6.1876760 -4.4034953 1.4570353 -1.0522126 -16.6191940 -6.3284869 -4.7929945 0.9757985 -7.3152533 -0.7979336 9.1238756 -2.9976702 -10.2193165 -1.2054110 -0.7651691 -12.5585413 -2.7859120 5.3527699 -5.7658386 -1.2166524 -0.9773972 -0.9586761 -2.2755227 2.1611724 -3.0583794 -0.7392406 8.5042830 -2.5527353 1.0001119 -41.4868851 2.7202232 -2.5988743 20.2604389 24.0173893 -3.3588998 -43.3952255 -0.1255267 -0.4147664 -1.7137560 -1.9188042 2.5989838 -0.0841359 -43.1244583 2.3397093 -25.7060051 -0.1610032 -0.0719907 -7.5377336 1.3393997 0.1877333 -0.3886430 -0.3238384 -1.8439620 16.5304413 -1.6034924 -3.4019372 1.7098036 -1.5127401 -0.2597378 -1.2305163 5.1320086 -16.7511024 -0.1061350 1.6286687 1.9203132 -3.3324316 0.6858128 -9.6998920 9.5213203 -2.6687660 1.1723659 1.7529678 0.0370198 -18.7332020 14.3172760 -1.2397878 0.8303286 0.9043230 2.2962873 -0.3206272 -0.2091262 -0.1326583 -4.1664362 4.1266041 -5.2196941 -5.3944654 -5.6131291 4.5069242 2.6823297 -4.2997718 -7.5159721 -3.2740083 0.2698973 -4.8745804 -1.1980634 -4.2206035 0.0433589 0.5711111 1.2543386 2.5215597 2.2484434 -6.0787354 -5.6562915 -2.3814075 2.1459262 1.0404928 3.8077736 3.2668440 -0.6724758 0.7795640 -5.1750679 -3.8000767 5.1486592 -20.3231678 0.0738347 -0.4844659 -1.1557308 0.9364845 8.4129839 5.8763151 14.9436779 0.4631178 0.4088891 -1.4184345 0.1208293 4.1765666 -0.8536115 0.4817796 -10.3671207 -1.3601304 -0.2401373 -0.5367809 31.7645187 0.1211081 9.3803244 -0.9332608 -3.8821168 -0.5457968 -41.4664688 15.2195406 7.7215457 0.5230163 -1.7313836 -2.9265721 -2.5183203 5.6827602 -2.3492765 -2.0518556 8.7072487 -2.6584220 -1.6850225 4.1449819 -4.1199684 -1.5952992 3.6955106 -6.1170149 -0.7117147 0.7704641 4.3762474 -0.5399284 -33.8799934 9.4606514 0.6291459 27.7917843 -4.0101194 7.1135950 -3.8085005 2.3372238 5.1959615 -5.1000190 3.7090580 3.4017973 24.5252590 0.2757807 2.8714783 -16.4049015 1.7521949 19.6150341 -0.2633304 -2.9101474 -3.2436182 -12.5220919 0.3715519 2.4491758 2.3702235 5.3568530 -0.0895880 -2.7950706 10.4182568 -15.5232077 -0.3963615 2.6647887 2.7795613 -5.5096540 4.1212516 -18.8461895 -8.7346869 -14.0491724 -6.3656774 3.5074811 0.0787299 -16.2560463 27.1707344 11.6450138 5.2635546 2.7356267 3.7426209 0.2837019 -0.1617701 1.6321781 8.2604904 7.8633862 3.5814319 -7.5162754 5.8869438 7.8142319 4.3845220 -8.3639135 -14.4416018 1.8894210 -1.4228851 5.7874889 -2.4510505 2.2085621 -1.8604462 0.5288956 -1.6173707 2.3573558 4.7623372 -4.6633162 -1.6149857 0.4683812 4.3354769 3.1625955 4.8842645 2.1693878 -0.0305669 1.9532849 -11.5792236 -5.7159963 -26.3177814 4.1289668 0.0964323 -1.2619290 -2.2613754 0.7824109 -7.1515393 -0.6542808 21.5825405 1.0645813 0.7734914 -1.4044949 0.2943949 7.7239647 0.4238208 -4.6358957 25.1026669 -1.6939003 -0.0617132 -1.2137727 2.5656650 -0.1650662 15.1265745 -1.0645239 -5.2930951 7.1464643 -10.7823792 18.2690315 -2.9478710 8.6604500 -1.7043310 -6.2033663 -11.0472975 15.2911654 1.1613966 -2.9819441 5.9178348 -2.7475238 3.9219921 6.4899807 -4.1205516 -3.8799915 15.4483671 -11.3358564 4.5138612 0.4962367 6.4623713 -1.4471284 27.1467018 25.5458908 -5.9499998 -25.6337318 2.6590288 22.2567387 -4.0076003 7.1018033 6.9874163 -6.5545120 -14.8900557 3.1595552 -8.1562691 0.2971195 0.8866734 -17.8767700 1.1427149 15.5668249 -0.4648922 -8.7307663 -4.9544988 -2.8404567 0.9932276 7.5607572 4.6417332 2.9380248 0.1392996 -4.2896137 16.9978580 -9.2608147 0.0941481 4.0033841 7.1671023 -7.4751878 -0.8043830 -14.2226486 -4.5772057 -8.5423384 -5.9040356 1.6420527 -1.4929260 -15.2801189 5.5461545 13.7087326 -0.7665660 5.5894871 4.3295393 2.2534027 0.1633692 -1.4747531 7.1290779 6.0916982 -2.2673879 -17.7880573 9.8584089 13.5644569 8.1574850 -3.2563138 1.7556471 1.9678371 -3.4571919 -6.4071398 -3.8090119 6.6623826 -1.3412545 7.2265606 -5.2839689 3.3193703 6.2571197 -0.7702702 12.8074322 -3.1185782 9.7381039 4.9957771 7.7464271 4.9931731 -2.2743952 3.6834965 -5.6509838 -14.5968170 -10.9689302 5.1668100 0.5823076 -1.7918470 -3.7251706 0.9580075 0.8508374 -2.5456209 25.1952133 2.5072207 1.7887341 -2.3128030 0.5229741 12.4305983 -0.2032974 -22.1728668 8.7108135 -2.6039379 -0.2675186 -1.3676956 26.0287495 1.6688123 8.9152765 -1.5157689 -6.4150825 7.3034635 -3.6282570 5.5510464 -3.1085100 5.6739082 9.3443422 -7.5226107 4.0798860 30.9837894 7.2332821 -1.9843252 14.7582359 3.1387305 -0.1366976 1.3877401 -1.5090613 -10.1364365 -6.1213884 -5.5321155 -4.0916467 -0.2775871 6.4174590 -1.0989932 -22.1268578 26.0395985 -0.6218462 -53.5287209 -5.5608253 23.0930271 2.9249291 3.7703414 1.7611810 -2.6402042 2.5350447 -7.2887793 -66.9689178 -0.9954088 -5.2674928 -4.4173851 -0.3506331 -37.1532860 -1.6897418 -5.1680880 -0.2364212 21.0438595 -0.1384481 6.6014013 4.5258036 5.2419572 -3.8223996 -2.8504791 11.7652168 -2.3488276 1.7083563 3.0337248 2.8402076 -4.6361351 11.2291775 3.1827121 3.7479413 -0.2592720 -2.7006934 1.7377257 -10.3376198 3.0003552 -11.8027401 7.8348927 -0.3454202 2.8203351 0.0580091 -3.0838177 -1.0399703 14.4956474 34.4736595 -2.1603286 1.0191586 27.2527599 3.7555053 12.6315756 0.5996396 7.2655711 -1.4960064 -6.2872744 -3.2709117 -4.5079746 -2.6758015 5.5043993 9.3831453 -5.7861838 -0.3068511 3.4663334 2.7149613 0.9445269 17.2544689 1.3187418 -0.2505435 -0.1923140 4.8164439 -0.1087908 4.4515376 1.5141667 22.5956402 -3.8132808 27.8967838 6.4499011 -3.9817898 -2.0448332 -9.7238445 -1.7145128 -0.8937567 -3.8624070 -2.5041332 -0.5438405 -3.1540866 -0.9059902 0.9222789 12.3430996 -2.4797053 16.5594597 -38.4029770 -2.2077529 -1.3400084 -5.9666739 42.1758308 7.0544634 -0.2870647 -0.7156761 1.7513528 15.2728252 -5.3920703 -1.8715090 23.2357445 -3.0363619 -1.8866068 -10.0081940 -6.1647897 7.0888567 -14.6698799 -0.3867908 1.9482853 -1.4683332 0.6332594 2.0800846 -1.9144245 -16.4473000 8.9524593 -3.8304956 -1.1567566 -32.1638756 2.6293857 8.9510670 -41.9470825 17.1967087 -5.1450968 -50.4419861 3.8644762 5.0146365 -1.1661644 -1.4713579 1.9240108 -2.6489675 -43.0141182 0.9809224 -31.1321411 -0.3826966 -0.2768855 -10.3145628 1.0784944 -5.8798079 -0.6723684 -1.4882171 -1.7358257 18.7020931 -0.8517736 0.3659887 -7.4471331 -27.6186638 -0.0226203 -1.5767497 4.6017537 -10.7499838 -0.0152436 1.1409253 0.5537969 -3.3460417 0.4665214 -21.1051311 9.8986998 4.4560256 -6.3232222 -0.9389985 0.0907444 -31.7086926 12.7765160 0.2122664 -1.9355826 -0.9705619 1.7224379 -0.5240757 0.0429877 1.1468006 6.7519751 -0.5756404 -12.0329752 -1.9191961 6.2574081 3.6739669 1.2408937 -0.0408727 -26.3574333 -6.0584273 3.7817507 8.6855707 -1.4125654 3.7778642 -1.9173161 6.2127538 1.4313176 -1.1251258 1.4790106 -11.8937082 -5.4838319 -2.1827354 1.3834859 -0.3568622 0.3637639 -1.8245411 -0.6472703 1.0834494 6.6270571 -3.2628551 11.5831261 -20.7873230 0.0873497 -0.9609025 -1.6412119 0.5558430 8.4315777 3.5300164 4.1633940 0.4352375 0.6472612 -2.0627961 0.5231205 3.4212317 0.7086614 -3.2178535 -15.4761429 -0.7770165 -0.1580798 -0.7191367 24.7367229 -2.6442859 2.0573394 -0.5350158 -2.1354551 0.6683037 -7.8102179 4.0158067 15.4817972 -7.1666160 -3.5128946 -1.9751544 -5.0709066 -5.4306865 -11.5162573 -1.0579439 -4.4421511 -3.7822978 0.3360686 4.3975821 -3.4167645 -10.6701670 -1.1542187 -7.3313680 -0.8502899 -16.6015453 4.9034734 -0.5044050 1.3944135 1.0133994 -0.5362895 15.3049107 1.4465388 3.0281887 -2.4608817 2.1044996 3.3460648 -5.3220263 2.7965539 1.9366399 14.9902906 -0.3201746 2.5024004 -20.5784912 1.7148411 9.7870121 -0.8240437 -3.9492121 -3.5115609 -3.0490863 -1.7697608 0.0411745 -9.7285223 -19.5220337 0.1811066 -3.2708635 8.8965054 -2.5837214 -0.4254137 1.9582896 -0.2602967 -6.5303278 9.8765965 -14.3951626 -4.5474062 2.9031594 -4.6567168 -1.6764439 -0.8849137 -29.4940281 14.4106770 2.7153363 -1.2382925 -1.1262609 2.9164336 -0.9687464 -0.1004834 0.7726317 -1.4318618 2.0262725 -18.2430325 0.7285997 7.8976045 6.8655939 0.7311502 -8.7785511 -20.4406185 -1.2343735 -7.0983324 -19.2297649 -2.9678414 5.0497575 -4.5247054 -1.0443223 0.4302143 0.0974539 3.0030162 -9.3371468 -2.5485876 -7.2555866 3.9336731 -0.3807778 0.9413562 -5.6045117 -2.1888800 2.2836053 -6.2555737 -5.8789296 -15.3402023 -1.5253260 -0.1964379 -1.7010822 -4.0040002 0.2560799 -0.2907146 1.5747001 8.3779373 0.8086422 0.7132974 -3.3573365 1.0529063 5.4829683 -0.4988357 -12.9593992 15.3694201 -1.6461537 -0.0556625 -0.9015210 -4.6953626 -3.0721130 3.4277961 -0.7334426 -2.6892817 4.9045396 -27.3665848 -12.9576759 -1.7373445 7.9856677 -5.2263174 -9.0839891 -2.7736495 -3.3731899 -4.8207898 -1.2354101 -6.9822574 -4.6812024 2.0536201 6.8639870 -6.4789739 -8.5631075 -2.8802991 -12.8684711 -0.8502456 0.3654366 6.5608120 -2.7635739 -25.8125610 14.1929874 -7.4354892 -39.4493942 7.0839825 0.5114711 -3.0489793 2.0235958 3.1378727 -4.8081374 -12.9540834 0.7624828 -19.4230328 -1.1615796 2.6353152 -22.6425571 -0.6136321 0.5248494 -1.9549302 -8.3708534 -4.5694585 6.5819559 -1.6911756 0.1882279 -11.5629921 -10.4609156 -0.2637761 -4.8410535 12.4066124 -4.4758053 0.4804605 3.8910820 0.8999341 -8.9344387 17.1158600 -9.9899483 3.2700970 7.3476381 -0.4958412 -1.3691969 -0.9018642 -2.0075443 11.6945400 5.2395973 -1.7382436 -0.4032021 4.0633469 -1.9887648 -0.2779913 3.0082941 0.9982946 -1.1324905 -5.9233088 0.5672401 -0.7157720 10.1311283 6.5010347 -8.6523409 -7.8437300 -3.3206944 -6.2490625 -8.3338690 -4.4436598 9.8222189 -8.0098171 -7.3047390 -4.9240360 -7.3122597 3.1635509 -4.0593896 -5.0449853 -3.5270984 5.8692842 -0.1142352 3.2492971 -1.9034461 -5.4084129 3.2569246 3.3644881 -14.9014654 -0.2812644 -8.4895935 -0.6727277 -2.8363752 -7.6713600 0.3685037 1.0912800 2.0206954 8.3150005 1.1658564 -0.1648554 -5.7426076 1.5034912 6.9112163 0.6824948 -12.4661465 -3.3000035 -2.5000424 0.2716011 -2.7796326 13.5505991 -3.9086819 -5.0593543 -1.1644077 -7.3774419 7.7416220 12.4386272 -0.7047005 7.7042818 -3.4604785 1.8166912 -6.6965480 6.0846982 -6.6750588 6.3305793 -1.7121522 13.9791536 -2.5424545 0.6883425 4.5932360 2.1326599 -4.3821154 16.7019005 -6.6405506 -2.4823816 -1.2151723 4.8241363 -1.0169818 -2.1100457 23.5252705 -4.0279045 -46.1029701 2.1561220 21.0389595 -1.5939035 1.7712597 1.1711831 -4.7630863 1.2204462 -2.0116646 -58.7368011 -5.2476993 -5.5471301 -8.2182894 -4.0496264 -42.0413589 -3.3769317 -11.3874626 -2.5974634 26.5403461 -1.4011887 3.0978377 -1.1128317 -3.9859746 -1.5607226 -3.3704014 7.1562266 -0.2734278 0.0094397 0.2111873 -3.8340442 -6.7779002 7.3834400 -10.1308002 13.1123543 -2.0143425 -5.6172614 -6.2788763 -8.6288567 5.0002432 -0.4344354 -3.7916431 1.4830316 -0.6353425 2.2838984 -1.8163261 -1.4773895 6.5248122 2.8018546 -3.4371829 0.6665537 -4.4975424 -0.9014915 3.6234925 6.1501265 -6.3164673 0.3444807 1.5672584 -2.3749335 2.9746587 -3.0642354 4.1850777 -2.1094081 -2.4979677 -2.8697941 -5.5202804 0.9399951 -2.9268677 -2.9518704 -2.1103413 5.3352470 -0.9921756 3.6697760 -3.3133028 -7.3040724 -0.6069696 5.1505847 -12.4602499 30.1237411 4.7194290 -2.2105885 -2.2139878 5.1697536 -1.0846850 0.9797871 -14.0071545 -0.0632757 -0.2997214 1.8496670 -3.1835155 1.1384183 3.8893697 -1.5611055 -4.7048683 -38.7165451 -2.8904276 -0.2292912 -4.7138038 38.1191139 -9.1049442 -10.8532696 -0.2339512 -4.5705795 16.1371422 -4.6140647 -6.6290627 14.8006029 -4.4299965 -1.2125945 -11.0932140 -5.5943165 6.6527014 -6.6325021 0.0331005 2.0738132 -1.6811889 0.6300332 1.7933459 -1.7009214 -2.4717331 24.5263786 -4.5937142 -0.8548935 -14.8840055 1.0644168 -5.3714781 -46.0994453 14.5925531 -1.1893575 -54.0754471 3.8044724 8.5256939 -0.9748067 -3.3218570 1.9099444 -0.9431590 -37.1158752 -0.2003941 -33.8491707 -0.2571509 -1.4190285 -12.2256918 1.6201034 -8.8013411 -0.5864284 -1.1728164 -1.4104917 14.8030252 -2.6712930 -0.6859537 -0.8288150 -2.2547979 0.1064464 -1.8444130 3.6671684 -8.9382105 -0.2533911 1.0383128 0.5064873 -4.0416870 -18.9781094 -14.8483868 8.4146585 4.3834243 -2.9343648 1.4719497 -0.0225925 34.3650818 12.8748102 4.8509154 -1.8403995 -0.8092517 1.3211517 -0.6653120 -0.0716048 0.0307149 6.8066173 -2.7008560 -22.5563564 0.8287743 4.4734449 2.5837445 -3.5327969 -0.9117205 -30.2563400 -8.8841038 1.5476376 11.4300013 -1.6336209 -7.3949494 -1.9932748 -12.7595444 0.1616801 3.2218471 1.0290878 -7.4888144 5.6264901 -4.0575361 1.8804142 0.6358927 -4.1183491 -7.3632193 -1.8737941 1.2449728 -27.3293133 -2.7573292 15.1350412 -12.2094202 -0.0815382 -1.4418449 -1.7156764 0.5864190 0.8455272 1.1236404 0.7388340 0.2459296 -0.2438439 -2.1714742 0.9206485 3.2609589 0.0287331 -0.5146461 -18.3147430 -0.5317591 0.0042446 -0.6260064 21.7156467 -1.0838826 -3.3344009 -0.1351772 -3.3327219 -0.8832536 -22.5096722 -2.0349352 11.5363483 -18.3429356 -3.8086486 -5.8593683 -3.5361238 -10.6101179 -11.8627853 -0.4837055 2.2459004 -4.9052396 0.8278593 3.6975987 -1.8154545 -4.5064569 2.4905434 -9.6500826 -3.6915183 -10.2390985 1.4218565 -1.6722002 -1.2286376 -3.8691459 -1.5620931 9.7359581 1.9497660 6.1902275 -2.1394832 -4.0011020 2.2126894 -2.3818581 -1.1509043 -0.3090367 10.4305267 -1.0016623 0.9358540 -27.6709347 0.6156663 5.0471025 -0.6618978 -2.8777752 -3.2004392 -3.7949684 -4.3550920 -0.8818673 -1.2722241 0.0193994 0.4486867 -3.7409711 6.4111185 -2.1606534 -1.0387515 1.4146234 -2.6261923 -7.9611030 -19.2332058 -8.1206226 -4.9919653 3.7058873 -3.2001667 4.2773972 -1.5894086 -1.5368190 7.4936132 -10.2944994 0.4504928 -1.1695253 2.1624274 -1.9583448 -0.5330724 1.5931456 -5.0626678 -3.6678193 -1.8086089 3.1841896 6.6767435 2.6157360 -0.7784282 -3.9521623 -17.0001183 -3.6909196 -1.1822340 -4.0681825 -3.3159382 -3.1825960 -5.7159333 -1.8607277 -4.7130294 2.0665376 1.3107750 -3.1345227 -0.0987355 -9.0809517 3.7605171 0.8116587 -5.7613406 -11.0502291 -2.5574846 2.2127483 -7.9548283 -4.4126196 -9.2206802 -6.7171450 -0.7895893 -2.3577940 -4.9370103 0.6666332 -6.9453182 -5.1457467 1.0009778 0.0609586 -1.0211362 -2.8972502 1.8745296 2.6640582 0.2819023 -1.3910259 10.6087313 -1.8093913 -0.2156381 -1.5744836 -9.7643328 -0.6704524 -5.3503752 -0.0719802 -3.5675118 3.8785601 -33.0249062 -10.9106007 2.9991350 3.5686646 -1.4967867 -7.9207053 -1.8027388 -4.9112649 -5.2642655 -1.4281989 1.7953521 -4.6922121 -5.2283106 6.0495696 -2.1906352 -4.1443496 -1.2154146 -13.0840502 -4.5504637 -2.5855956 3.9802499 -0.5225953 -4.2590823 8.1502209 -6.5830693 -46.1163330 4.6718574 -7.2772098 -1.5874280 -3.1884143 4.1326847 -0.9027741 -2.2677405 -0.6458391 -24.6679840 -0.6697522 -0.0168737 -19.9418030 -6.0110345 -5.5343299 -2.9938207 -5.8811440 -3.6127362 3.7780650 -4.5620933 -0.7825063 3.7059639 1.1747476 0.1303364 -5.4625010 11.1221514 -0.1461278 0.2956032 3.3985157 0.6687078 -12.2866240 -2.8207958 -6.1934657 1.3259424 4.7864041 -4.1365738 -4.8271699 -1.1319035 -1.6432815 6.5958290 1.6955297 -2.7117376 -0.2352274 2.6090024 -3.9169571 -0.0286435 -2.4885402 4.4864984 -6.6664200 -5.5520949 4.7154446 -5.6403470 5.8259263 5.8599944 -7.2469735 7.7869158 -4.6554208 -2.4244504 2.7709703 -5.0662470 -2.1607192 -4.4661403 -3.4343789 -5.6199837 -1.1554717 1.1829538 -4.0454116 -1.9923142 -2.1145451 7.3874674 1.3293047 -6.3709731 -7.6837015 -1.4595250 3.8237817 -4.3125777 -14.7889442 7.5722928 3.7181091 -0.1094588 -3.1743965 -5.4400396 0.7290044 0.3095854 1.3677427 -0.2718657 1.8380882 -1.1675453 -3.8324206 2.6525364 -1.0862859 -1.2826775 0.2612461 -9.0714607 -1.9935716 0.7533208 -1.8198254 7.3765755 -4.6701145 -6.1057005 -0.4456629 -7.4743085 4.4316740 -3.2296708 -4.8413053 0.7280149 -0.7302611 0.7715515 -1.7496798 -0.1037782 0.0446875 -2.1011870 -0.4318684 1.9785570 -1.9109223 4.3357310 3.4457564 2.7043924 1.2200789 0.2170458 -5.7837148 -2.8534305 -0.1865613 3.6202986 -0.4115836 0.4703591 4.8781047 0.6816424 8.4875917 -0.7296465 -0.7650129 -0.1870997 0.6681735 1.2697550 1.7904202 0.4486068 -9.1961660 -1.6989267 3.9420803 0.7178164 -5.5379162 -1.9252337 2.0588448 1.1741652 -4.5480595 0.6164696 -5.6561584 -1.1422646 1.0631641 1.4853326 -1.9889703 2.4017735 -3.8520708 -1.4290022 0.0987773 4.8116117 1.4355737 -0.5582271 -7.5882053 -0.8969593 -4.7243929 2.9969516 -1.3791088 1.2944613 1.1446199 -3.4781477 0.3859693 -6.0028000 -0.1455707 -3.0861275 1.5283407 1.5858181 -1.4027554 -2.5558581 -1.9505932 -1.7171797 6.3972592 0.6142597 0.2170038 1.4754517 8.7016287 3.2577953 0.1241923 1.2253381 -1.4369770 0.7760882 -0.5818722 -3.7322972 1.5692024 -2.1727102 2.5085475 -0.8654504 -2.7841370 -2.7950711 -0.5132403 -0.0754292 -1.1182528 2.5005829 0.1116206 -0.3573620 -2.9521942 -0.6257508 -0.0479851 2.7174807 -4.2574825 12.2393885 -0.5480219 -6.4602747 -2.0662858 -2.9625771 -0.8941336 1.2907000 -2.3458991 -9.8341160 -2.5439599 3.6242144 -0.0058954 1.9385929 -1.6627346 -1.0323650 -3.9222927 -14.2703133 -0.5259050 1.3787068 -2.9727333 5.9226613 -5.5394917 -8.6599340 0.4777078 -3.1452503 0.3743185 -0.6098187 -0.6587847 4.0656362 -6.3771377 -0.8662136 -12.5976839 -11.8831615 3.5653272 1.0896589 0.1438841 -4.3445892 -1.7396390 -1.2838491 1.7662110 -0.8563811 -5.7563057 1.8311154 -5.5577493 -2.4243600 -13.1560812 -1.4696444 7.8008180 -47.9527512 12.6479731 -1.0041966 -54.2384834 -0.3020983 8.3992052 -0.4275139 -4.9186301 1.8203659 0.0147361 -28.3545284 -1.3513465 -34.7766914 -0.4060802 -2.8436844 -16.1581421 0.5709914 -11.0636940 -0.7180118 -2.6098881 -0.8604647 14.6782694 -5.5611567 -0.9911911 -5.2672901 -1.4397597 0.1136626 -2.0871267 2.4726858 -2.8358300 -0.1854893 1.0586786 -0.0995049 -4.8717346 -0.7143786 -21.1830921 7.5137558 0.9190178 -1.8206831 0.3178113 -0.1620305 -28.6488247 10.9169359 6.3005543 -5.4636331 -1.1774539 0.7258117 -0.7014428 -0.2186437 1.0925243 7.9312963 -5.8183846 1.4069428 1.9274124 1.1793530 2.6765885 -10.4931908 0.3539634 -4.3397136 -13.2566223 -0.5649271 4.7961211 -1.8725563 -3.0215259 -2.4986315 7.3002143 -1.8497094 -1.6095512 0.1761838 -3.8009620 5.8055606 -4.8609400 0.6284972 1.4351007 -5.0647235 -1.0603362 -2.4285202 1.0725373 -35.5636711 -2.5016408 17.6503487 -13.0667925 -0.3040813 -1.3361065 -1.8735170 0.4532290 -7.8899994 0.3086296 -2.1177485 0.1392504 -0.7801651 -2.5510304 1.2563767 1.4527829 -0.6540182 5.1917343 -19.8734112 -0.2667648 0.1269588 -0.7584680 20.0619526 -1.6418517 -4.8634405 -0.0151628 -2.7205555 -2.6707520 -27.3056087 -11.9004345 12.5670481 -15.1866608 -2.3788538 -12.3148336 -5.3754520 -0.2541822 -11.4615908 -0.2118169 0.4063844 -5.4695406 -6.6078396 4.1094689 -0.7407641 -2.9609349 -3.1840682 -11.1579504 0.5174938 -13.9636707 -4.1854258 -2.4517970 -9.6052628 -7.4979877 -5.7631264 9.1338749 -7.2877779 6.9005284 -1.2832133 -6.7406521 1.3990027 -1.7247480 -7.9865355 -1.8894351 8.9224644 -0.8983776 -1.2594620 -29.3775215 -1.7942505 3.2463806 -1.4215080 -4.9292455 -1.7849268 -4.6935477 -10.9520426 -2.2062297 -5.7108088 -2.8402071 0.0616181 -4.1570721 3.1012418 -1.9540732 -0.9638132 2.8431358 -2.1996114 -10.0809803 0.5106871 -4.6072931 -9.5508318 -3.5071282 -3.1637542 2.3025990 -1.4007145 -17.2401333 1.7379122 -7.3577847 -6.0211821 -0.2757933 1.2589831 -2.5535662 -0.8961089 -3.0799308 -2.0301549 -8.9368773 -6.4669156 -2.6742945 6.2626877 3.6650906 -12.6432514 -0.1565446 -10.9712734 -9.5019579 -2.2673070 -5.5503888 -3.7610469 -5.1652412 -6.5799041 -0.2262821 -8.6126041 -7.4135704 -0.5475628 -4.9352269 3.7071900 -7.7284288 4.7796049 3.2842898 -9.7561245 -0.8316061 -5.4980235 1.5623014 -5.0108719 -3.5743732 -5.4744310 -10.7192020 -0.8380271 -2.5394728 -5.4165020 0.4188726 -8.3958979 -4.7519336 -1.8253757 -0.5354182 -1.6129081 -2.6058831 2.4492011 -2.3832743 -1.3591503 3.2482302 8.3277540 -1.8343202 0.0850908 -1.8588372 -10.6512384 -6.8078723 -7.0095081 0.0825506 -4.0209131 -1.6602489 -15.6343536 -8.6135893 -7.4009614 11.0764236 -4.4524169 -9.1875029 0.3883840 -3.7966745 -0.9450971 -0.8680277 1.2496061 -6.3386264 -5.4446912 5.9769764 -2.7080870 -3.8466246 -1.0484904 -15.4153347 -6.1785388 -1.1873466 0.8432109 -1.3551971 -1.0188563 5.9793572 0.4110191 -44.8663750 -0.0341048 -0.7520399 -0.9964716 -5.2529554 3.2328987 1.8832115 -3.1129384 -3.9547973 -26.2508030 -2.6050103 -3.6536469 -23.4948483 1.1285754 -13.6974230 -2.8825741 -9.0400753 -3.8418055 4.3132129 -4.7367959 -8.2642241 -3.9330091 -1.9780856 -2.9076469 -6.2348146 5.9739599 -2.0912325 -1.9501982 4.5479832 1.7469941 -13.8331413 -2.1345737 -11.2393999 0.5723420 -3.0794880 0.3826764 -1.0987018 -2.1804743 -7.2287750 3.4649839 1.3988822 -5.7311273 2.1025343 1.2341546 -3.5716653 -0.8979104 -2.9656844 -4.1238809 -11.1222200 -0.6351681 8.9964485 -3.7172804 1.0992823 -5.9443464 -3.4257128 -1.2974383 -6.2827325 -3.6309719 3.4739885 -5.7205243 -4.1469455 -11.5872374 2.1903307 -3.6366630 -1.1064321 -0.7558125 -3.0244191 2.2862875 -4.6437140 2.0634480 4.6588855 -8.5805807 2.7265778 -7.9537535 1.0356392 -1.5163230 -8.8617096 13.6866426 3.5333998 -1.7910880 -3.8151295 -6.0764251 0.5951777 -2.8625109 -2.9956057 -3.0083261 -0.7247199 -2.0978863 -4.9993305 3.6498990 -2.5343168 1.7907370 6.9892955 -12.9020004 -2.4154797 0.0005358 -3.0350306 6.0213413 -6.7939830 -7.2587729 0.0014527 -1.6820068 2.1096685 -6.0476542 -5.1467819 4.0495987 -0.2516521 -1.3149561 -3.5296149 0.0992260 -0.2467518 3.3039474 1.8595146 -1.3811649 -0.5907007 1.1793681 4.0785108 3.0238178 -0.0566004 0.3278925 -8.0922003 -2.8352334 -0.6778054 1.3576453 -0.6705986 -0.9944131 -3.0900626 -0.7275287 9.6337633 1.1964221 1.8913115 -0.2457859 0.6191122 0.1140682 0.2034327 3.0096848 -2.5639312 -2.6611590 -4.5957284 -5.6469173 -5.2246690 -0.8876629 -1.4361341 -0.4329377 0.4507768 2.3428617 -2.0649500 -2.1014366 -2.1064341 0.7291766 1.3530089 1.4409243 -4.2968369 -1.3840396 0.0582287 -4.2072697 4.0357909 0.0524083 -6.7731771 -1.7430022 2.5599601 -1.6449841 -2.3850853 1.5271844 -0.6924688 -4.2259583 -0.3995549 -4.8758307 -0.6315823 0.0170222 1.1960756 0.2446892 -3.4887586 -1.2376570 -1.2605579 0.6357301 4.9895983 -2.0947595 3.7610078 -1.2282232 2.9000893 -0.1860062 -0.7508592 -1.4508866 -1.2206527 -0.2727012 1.5948474 -4.0030670 0.2932359 -0.9914787 0.8432717 -0.6413282 -3.2243590 3.0646498 -0.7735497 -0.1539664 -0.7578244 2.0988140 2.3801973 -1.0938427 0.6211168 -0.2369830 2.7409320 4.0450044 -2.6326673 9.4497175 1.4513419 -0.1861882 -2.4158401 -0.5310329 -1.0719479 -1.2025700 -0.5156744 2.1695263 -1.9307666 2.0382924 -1.9935083 2.5125210 -0.0207559 -0.1706792 0.2673128 -15.8558617 -0.7575534 0.9950118 -2.0915670 0.9429385 -2.7958000 -5.4379907 0.6313425 -0.0969612 -0.0057029 -0.8450597 1.0203608 0.7811711 -6.9276948 -1.4881707 -7.7504888 -10.7917252 -2.0239389 -2.2040086 0.6492125 -0.3288126 -2.2420566 -1.4124502 1.8421576 -0.9900495 -2.6481736 -6.0290856 -7.3066249 -3.3953667 -8.0304337 -3.1129119 -4.9480758 -30.5381451 9.7621937 -4.1457505 -56.0127029 -2.3094673 8.5069914 -0.1328950 -2.0438383 1.2115655 1.2461244 -9.8731260 -1.2957145 -36.7262001 -0.2477064 -5.0879498 -20.0526810 -1.1115682 -15.2633200 -1.1350983 -2.2425852 -0.6814324 14.0350285 -7.1401486 -0.3250130 -0.7756125 3.1578810 0.0739441 -2.3412728 1.0167756 -1.1701081 0.0106307 1.4814843 -0.1238135 -4.9557877 -0.7531123 -46.5187988 6.1032948 -2.7808902 2.6363535 -2.0756416 -0.4366575 -21.3228092 8.9376249 4.6181836 -2.5011704 -3.7711573 0.3557933 -1.5549088 -0.3968020 0.9547739 0.5659333 -8.8884315 1.6671429 -1.9026914 -3.1474931 2.4611063 -8.4179955 -11.4320364 -9.9904165 -9.6127453 -4.0590515 -1.2936019 -2.0837665 -0.5425406 -3.1530070 1.5690274 -3.0644634 -1.2009996 -0.7673617 -1.4045693 0.3147759 -4.2971067 0.1755491 2.6128554 -0.3610709 -1.8126571 -2.0001233 0.9994749 -25.7466965 -1.0649726 22.0406914 -6.1495223 -0.2574200 -1.2702818 -2.4089620 0.0423881 -7.3584952 -1.2783098 -4.6970091 -0.0990069 -0.9627888 -3.0521538 1.5605112 -0.1793540 0.2268947 1.6849340 -22.6771431 -0.6275855 0.4868065 -0.7247624 17.4743061 -0.8601246 -6.7816243 0.1751231 -1.9499748 -0.2402394 -37.0909500 -2.3648360 11.2641373 -20.2400990 -3.5091791 -11.7732821 -2.2516694 -7.2759719 -9.9043417 1.1731727 -4.6260133 -4.9534144 -3.6181183 4.0798402 -2.0226870 -6.7733259 -3.9624884 -13.3210306 -2.3827665 -9.9059038 -4.2069764 -2.1127677 -24.8211060 -10.4389095 2.5595150 5.6767249 -11.1342926 6.7267628 -0.5440137 -5.2422242 0.9445106 -1.0672576 -7.8688259 -3.8587959 5.4046621 -0.3793954 -3.0231616 -33.6204758 -4.3300104 -1.7731742 -2.1008079 -2.7482691 -0.9687556 -6.9218612 -6.4421091 -1.0070356 0.3414541 -3.9398451 -0.2847884 -4.6922226 0.2069820 -0.4652169 -0.3650517 3.7972550 -2.2939730 -9.5656385 -0.5874380 -4.1347342 -8.1846094 -6.9051890 -2.1247404 -2.0823247 -0.9595286 -11.1369495 1.5943117 -3.7663534 -0.5744037 -2.2755728 0.4496800 -4.4233890 -1.2026124 0.7043763 -5.8072987 -14.0557480 3.8809180 -3.9173107 6.8253117 1.8210130 -9.0267992 -2.9850719 -9.8387794 -9.1324673 -4.9415283 -3.9618392 -4.1502275 0.4747777 -7.7379088 -8.3856640 -8.3434763 -9.6061144 -2.2209265 -7.1756010 -5.1498351 -4.5499363 2.4579020 5.3817425 -1.3945329 -6.2450275 -4.7088571 1.3709385 -11.9619780 -1.6869569 2.3760998 -7.1032233 -0.8793832 -2.2676070 -6.0375128 -0.1719664 -8.0761452 -7.1346450 -7.2319922 -1.1115897 -2.0572641 -4.1777577 3.1302722 -5.4876552 0.8478952 -0.8370881 3.1340907 -2.2437396 0.7829475 -0.9302596 -14.4080105 -4.4446559 -9.0617161 0.7152081 -4.6690397 2.0827019 -16.2316513 4.4855843 -0.6829149 -0.5831781 -4.6543069 -5.6526289 -0.9857863 -6.8899803 -4.9586248 0.6591011 1.7950537 -7.7924280 -4.1746807 5.5266514 -3.0935392 -7.9439225 -0.6851237 -16.5330048 -1.7351019 -2.1035526 -2.3372905 -1.3318909 -0.9070973 -1.8602170 1.2772207 -8.9741344 -2.1533759 4.7661099 -0.8033921 1.1295028 -0.5289987 5.0979190 0.2202209 -5.5628362 -6.3452163 -2.2385094 -4.2212763 -15.9127035 0.1572282 -17.9191055 -4.2369089 -4.0960145 -1.4911169 -5.7963820 -5.3575759 -3.0555279 3.5813494 0.7252239 -0.4382452 -6.9451799 -0.5582153 -0.9769725 -0.9282333 6.0361066 0.3310126 -14.5476809 0.2695314 -8.6507530 -5.4835353 -7.9524856 4.4084425 -2.8134298 -0.5053995 -2.7415249 -2.3776844 -3.4615514 1.6674714 -3.9511292 0.5017293 -8.3619413 -2.5103319 -2.4326828 -7.1061649 -15.3632030 -2.2050185 -1.2191137 3.0048211 -10.5850458 -2.7498264 -5.3058743 9.1575089 -5.0168166 -3.2342858 0.8707596 -6.3033500 -0.6287065 -7.8960547 -4.5064650 -4.3603082 -4.1155519 -4.7706017 -4.0788689 -3.3796499 -2.2635534 -2.6430714 7.5321684 -1.4700218 -2.2723858 -6.6803236 1.1532967 2.0484014 -5.1458874 11.5251818 2.4630077 -1.9989083 -4.1822968 -4.5618248 -0.2500387 1.3749470 -5.4579740 -4.9499192 -2.0634727 -0.8663262 -6.9367185 4.6484928 -5.7284579 0.0447090 -3.6730988 -6.7910228 -3.8160238 1.2122936 -2.5487685 -2.5698328 -5.8805361 -7.3956242 0.7062009 -1.9801255 4.3609667 -7.3338819 1.2179829 1.0913370 0.3634361 1.4552644 -0.9829863 -1.8107152 -0.7338359 -0.0107566 -0.4271284 -0.7808632 -0.5947464 1.4196553 1.6633391 1.1538640 -0.5867206 -0.1513640 -8.3953190 -2.2961199 -0.3730302 0.7478997 -0.5678181 0.4033635 -2.5387321 -0.0542564 -1.9378107 -1.4961243 1.6890330 0.8825439 -0.4776104 -0.3706255 0.3096261 0.4459722 -2.1501641 2.5254469 -3.1295624 -0.1809146 -5.5055242 0.0683043 -0.3808987 -0.9070046 -0.2470254 -3.2104609 -3.0090148 -2.0124614 0.4791473 1.0889784 0.7954005 -0.9812546 -5.2631745 -1.2888608 1.2735250 0.8090528 3.6470520 -0.5299125 -5.6787949 0.4928069 0.2903442 -2.0878298 0.2203359 0.7843702 -0.2115622 -2.1947918 -0.0774848 -5.0302024 0.3420317 -1.2805645 -0.5003766 -0.8292794 -5.1119118 -2.0245199 0.2262696 0.2283402 0.5792730 -0.3096730 2.0644169 1.9755007 0.3246483 -0.2060793 -2.3576949 -0.1449635 -0.7053168 0.0312776 0.2348376 -4.2939711 -0.8093063 -0.9608767 0.2487349 -0.6448444 -0.6735920 -1.2291670 -0.7016434 -0.1105504 -0.8447322 0.9942154 1.7549845 0.9997965 0.2203070 -1.8030882 -0.9885741 2.5559492 -3.0558960 1.7750647 0.8403401 -2.2264166 -1.8745886 -0.9640622 -2.2430854 1.1638612 -3.8560088 0.8011556 -2.4924173 0.5638091 -0.6301486 3.3999691 -0.3562384 -0.0138852 -1.9847790 3.7769098 -0.4336348 3.0702207 -2.5602140 -5.6971073 -4.1196742 -4.0697865 0.9359572 0.6720480 -1.6702586 -0.9369240 0.8695045 0.3818386 -8.6845341 -2.6743507 -5.3412695 0.5137768 -8.3356247 -8.0785065 0.6532292 9.1528559 -3.0046012 -4.0317669 2.3309231 -0.8929453 -5.8793859 -0.0203012 -8.6772709 -3.0071654 -7.9373593 -3.5171685 -3.1417954 -20.7003212 3.2877333 -6.1760192 -60.6036415 -7.0833535 7.0878530 0.4028051 -0.8423032 0.5914502 1.4593812 -4.6514473 0.6650307 -42.0254707 -0.2481871 -7.2548485 -23.7465324 0.5425910 -41.3785515 -1.2089064 -2.5035665 -0.6605407 13.2839041 -11.9826746 -3.4945207 -4.2357135 -3.7068639 0.0991599 -2.6087646 0.1812267 1.7738067 0.0090480 1.6608230 -1.3979981 -5.1405907 -3.2505043 -24.2660732 4.7749624 -8.2459459 4.9690804 0.3283720 -0.4638037 -21.8432541 5.5932980 1.4098322 2.6288853 1.6959260 -0.0596857 -2.8805323 -0.0228706 1.0376513 -2.6634791 -8.7616644 -3.7360928 0.2392159 -7.6861458 1.9836233 -2.8795860 -9.2839479 -18.1177406 -7.9109421 -6.8349094 -5.5478320 -2.3224843 3.4787161 -4.9062934 2.8845766 -4.2021337 -0.1373652 -1.6256816 0.3862621 1.0296651 -7.1588888 0.3246827 0.9541529 -0.0685624 -5.8584957 -1.0207170 1.2688386 -20.0493622 -1.4790519 31.6330471 -5.1230664 0.0046128 -1.4450499 -2.9463973 -1.0872554 -6.3508534 0.6274366 -8.9790421 0.0552713 -0.3319845 -3.0134699 1.9163235 -0.5602870 1.0739620 -2.9849682 -29.7535572 -0.1327763 0.7232720 -0.7472124 10.6951485 -2.5350702 -4.0605640 0.4114721 -1.8856491 0.0689778 -62.5499992 11.1306887 1.2260586 -16.5805588 -4.5564446 -9.7235336 4.9405575 -1.2454109 -14.8674603 1.5428699 0.4860660 -6.4294152 -5.3649597 4.1658888 -2.4831922 -4.4338050 -3.4940763 -16.9632492 -13.5625648 -13.4471493 -3.6757884 -2.1100752 -14.1870775 -11.3016491 -1.4318634 0.4709728 -7.2651558 6.1891599 0.8948979 -2.7906199 -1.3191605 -0.9244586 -6.3775206 -1.2611258 -0.0420848 -0.1494487 -6.9606838 -32.2726364 1.0593275 -12.7251034 -2.1118028 -5.1787028 -0.4521389 -5.9358931 -11.7915936 -3.0022249 -5.7089405 -6.6612563 -0.7093479 -5.3446803 -1.5628638 -3.6662190 0.5216613 4.6662941 -4.1944709 -9.1931143 2.3225973 -3.7281196 -9.2872143 -15.8385792 1.7089677 6.0509772 -1.4140002 -11.6408501 -3.5253689 6.9633989 4.5299292 1.7068447 -0.6152279 -6.3872843 -0.6280544 2.9973805 -6.2274265 -13.4559202 -1.4078131 -0.6530595 -4.9747434 -0.7688862 -5.3749003 -5.8202353 -13.1973667 -9.6592569 -0.3149168 -7.6606264 -4.6360154 2.7696159 -9.7210302 -3.3679895 -7.5139060 -5.3781524 -3.9828060 -1.3141285 -6.2618575 -5.6005712 -4.9961247 2.2073298 1.1827176 -7.3405232 -3.7328200 1.6969869 -12.1376495 -1.1646117 14.1656342 -5.6752648 -0.3778716 -2.2661254 -7.7944989 -1.7209400 -1.8601114 -7.3494315 -13.5509596 -0.4802985 -0.6105715 -4.6746860 3.8012111 -2.3180556 1.6239544 -7.3203688 -5.1895819 -0.6787312 1.4548596 -1.1342419 -11.8953714 -5.1463561 -8.8338299 1.0995660 -4.1283150 2.2582786 -20.6503048 11.8881264 0.4218026 0.2295511 2.3887548 -3.4700258 -0.9569197 -2.4375575 -2.8559623 -1.4891053 -0.6852707 -2.6483073 -0.6709113 4.8348074 1.2577529 0.4600581 -0.2653533 -14.2792130 -4.1158609 -0.4729373 2.5700202 -1.1230690 -1.1427622 2.1611183 0.3934297 -0.0613522 -1.8393974 4.9486165 5.8562632 3.0316756 -2.2737510 3.0994422 1.8153312 -3.9407413 0.3591914 -4.9521041 -1.9612855 -15.3400154 -0.6226093 -9.0745687 -4.1490469 -1.2855948 -0.3987159 0.1771199 -3.4781270 2.0375915 -0.2325675 -1.3381917 0.5891377 -8.5960379 -3.7125666 -0.2369569 -2.5092738 7.3430014 -0.2754810 -11.9809484 -2.6687009 -3.5134227 -2.4780474 -2.1577826 -3.3595920 -0.8214635 -0.1306561 1.6501210 -9.4664526 -0.8680029 -4.4465103 0.5941024 -2.1261039 -4.9058800 -0.3280379 -0.9490948 1.0133946 -4.3151150 0.2415796 0.1529709 -0.9515422 -2.4953349 2.0977173 -0.3385995 5.6772728 -2.2477379 -0.0304155 0.3350323 -7.5473723 -1.8367910 -1.5811094 -0.7822652 -1.7950228 1.7112867 -5.1740465 -1.2031080 -1.1487378 -1.1439365 -1.9665947 -1.8671291 3.4359703 0.5926658 -0.0391839 1.8828056 3.5540311 -8.3836384 10.0264654 -0.7373896 -1.6206173 -3.4915154 -0.0736998 -3.3519998 0.7522185 -5.8948445 3.9977570 -4.9617028 -3.9501960 -2.5974572 6.1154194 -2.0379350 -0.1987497 2.2671504 -2.0438020 -4.3159623 3.0557857 -2.4033048 0.1489392 -9.3378925 -2.2652972 3.1370690 1.3790427 1.9984709 -3.0237787 2.3837631 0.5427482 0.0726998 0.2343939 -2.6613328 -0.2104178 -0.5890955 0.3759238 0.6002613 -0.1148028 -0.9082296 0.9734590 1.7387242 0.4764141 -0.4584759 0.1908822 -3.8269060 -0.4695088 -0.2903613 0.9206018 -0.3238207 -0.6030741 -0.1450120 -0.4582611 0.4350118 -0.0127012 0.9554429 1.3458208 1.0855870 0.5051412 3.4585662 1.9413370 -1.8108395 0.9301820 -0.3747806 0.5907027 0.4232589 -0.3690087 0.0190501 -0.6746423 0.2400285 -0.1620407 -0.5098915 -1.0501657 -0.8600648 0.0454507 0.6791954 0.6791859 -6.4873710 -1.2337375 -0.3969997 -0.4261763 1.1210586 0.5798646 -2.8431585 -0.5260026 0.2906169 -1.3745233 0.4079162 -0.6250612 -0.0318622 -0.0382793 -0.4362829 -1.8452252 -0.1755242 0.8691199 -0.2516883 -4.0321035 -2.0343492 -0.1402612 -0.1083516 0.9610767 -0.8036448 -0.3057204 0.9577877 -0.3202949 0.8382226 1.2617344 -0.9024476 -0.7206079 -0.7943605 -0.1048790 0.7551919 -4.2124224 -0.2668722 0.1701050 -0.2890140 -0.2487222 -0.8335181 -2.2729733 -0.4652458 -0.3479773 -0.9801038 1.4938885 -0.1118825 0.1235327 0.1416568 -0.0451781 0.2012175 -0.5280121 -0.2371730 2.0886073 0.5140134 -1.3284864 -0.3810738 -0.7145180 0.0953214 0.3104552 -1.0889401 -0.5101218 1.0223520 1.9524002 -1.3395393 4.1704068 -0.0847260 -0.1094441 0.7380258 1.2676454 -1.2167168 3.5882599 -1.1773118 1.5356152 -4.3982882 -2.4917657 0.1960865 -1.2277187 1.4610294 -0.5228631 0.9201234 0.1445444 -16.2829647 -1.7420902 0.0330056 -4.1740532 -1.3013430 -10.5704250 -0.0763292 -4.6021657 -2.5170591 0.9895589 0.8098668 -1.0949918 -3.2266231 -8.6348028 -2.8021522 -5.4774585 -6.1817765 2.3667622 -0.2537134 -3.3734565 0.7523825 -4.6855488 14.0759230 -0.4962124 1.9820489 -1.4773979 1.7141616 3.6549325 -2.4159937 1.9523722 2.7212031 12.8934631 0.4888993 -0.1781371 -22.8648682 1.0800263 8.1596165 -0.0200990 -0.0586062 -0.8097219 -5.0575843 -7.4564905 1.2666589 -1.8789926 -0.0920309 0.9249671 -1.5603054 3.3304782 -1.1987009 -0.2306636 1.3217794 0.1305756 -4.1097507 0.0514555 -7.1370792 -4.4039278 -4.1230378 4.6122260 0.2205281 -0.8832639 -11.4336300 15.7921515 -2.8448861 -0.5987992 -1.3125037 1.1327723 -1.1199825 0.3060721 3.5209112 -5.4404926 -1.9846419 -3.9267871 -1.2513834 4.8819118 4.2795868 -0.2886651 -3.1162090 -9.2608385 -2.5553558 -9.3768454 -9.0806532 -1.3768966 -1.8797171 -3.4653296 0.1750460 -1.7025145 4.9787126 1.7684373 1.4208332 -3.5307422 -6.8115921 -1.8165998 -0.5171275 0.3939100 0.1513362 0.0748933 1.2619328 -9.7502527 -0.2537729 -11.5792494 -8.9096279 0.8915511 -0.6390558 -2.1081524 0.3388630 -10.2973213 -1.8023553 6.1430621 0.9831465 -0.1044353 0.0478518 0.9801276 3.2537935 -0.6077790 -1.7585117 10.4317923 0.5719870 -0.5418407 0.1092136 -2.0104680 -1.7123066 4.7528934 -0.5642132 -0.9130064 1.7022492 -37.2905083 -4.4163647 0.2072489 -3.4538112 -1.6250869 -4.0860996 -0.8427927 -1.4937880 3.2870717 -0.6859944 -7.9959903 -5.1438422 1.9397472 1.2497740 -3.2736759 -6.7264104 -6.2937584 -5.4958787 -10.3381815 -9.0571795 7.2043681 -0.2508310 11.1642599 0.2756745 0.1862903 24.7066364 0.2028265 -1.2409135 -2.3774834 -3.1129014 5.5467401 -3.6576278 1.5692718 4.8353062 23.0182266 0.6817079 1.2607535 -28.4586945 1.4765805 13.8879948 -0.1404734 -0.5773265 -1.0047991 -11.0474405 -7.2251730 1.2785560 -1.0210724 6.1609559 1.3281945 -3.1129320 6.8919859 -5.9885201 0.5535313 2.3561301 -1.1161951 -6.9337754 -1.4535360 -5.5577774 -7.6316428 -5.2443171 7.3908763 5.5895243 -1.9810344 -1.7296993 18.5038719 -4.3468461 -0.8994423 -1.8175634 2.0284750 -2.2630780 0.8784765 8.0089865 -10.7133760 -3.0521748 4.6809683 -2.4121251 2.9676480 7.1527538 1.6754183 0.0190553 1.3927503 -3.9224448 -1.9561018 -7.5452638 -2.6969080 -3.8011858 -5.0603685 -0.6754695 -2.0138535 2.0297301 3.3976648 -1.7850109 -3.6213248 -6.0482259 -3.3377922 0.3928447 1.9940894 1.4222111 -1.5072476 2.6186368 -4.1747246 -1.6957277 -20.9478245 -7.3263063 1.7032231 -1.3690634 -4.6083207 1.0807581 -3.1546056 -1.2331644 11.1511230 2.0626645 0.6756325 -0.2788273 2.0386174 2.1635976 2.0383172 -1.0017853 18.5369320 0.9795012 -1.2840166 -0.6418912 -5.4337072 -1.1999497 8.3717155 -0.9518506 -1.6324364 5.2860174 14.0736961 -6.7271357 -5.6604223 -3.2017465 -0.2704483 -2.5651832 -4.4770756 -5.3068342 0.5318174 -0.8700202 0.6991638 -8.1296082 -0.5909389 2.4075558 -5.3225956 -3.6616473 1.2595682 -5.0194535 -6.4292855 -0.0909920 11.3655376 -0.7474027 0.3862298 0.1328807 0.4912356 33.3235512 2.3580275 -6.9095922 -3.5634081 3.7800462 4.2876158 -5.4825950 -0.9213265 6.4578023 32.1565857 -0.2836204 1.2695526 -9.7226410 2.4333134 19.6297684 -1.0653901 -2.5534000 -1.9974798 -12.8912859 -1.7464507 3.4731071 0.4496516 7.9223623 0.9031798 -4.4338126 12.3084126 5.0738206 0.0439277 3.2054949 -2.8747425 -12.2946291 1.4555303 -11.1600809 -10.5265865 -4.5126686 6.6903882 -0.1234719 -1.0591127 -0.6584480 20.9953098 -4.6849661 -5.1319280 -0.5456693 3.1532822 -5.9758611 0.9222770 3.7654860 -0.6466213 -4.6775203 -0.7234232 -0.1523989 1.7496346 9.8578463 4.9019799 -1.7884709 -1.9066266 -3.8759902 1.0743561 -3.8648975 -4.0043931 -10.8416986 -0.7977795 -3.9652567 -2.7943370 -2.6745951 5.3967276 -6.4296331 -7.1819692 -1.2248359 -0.2673486 1.4542314 2.3988910 1.7071140 -0.5860731 2.9185150 4.0668674 -4.8150878 -30.6373634 -4.0110612 1.4857020 -2.9727240 -8.2529421 1.5619519 -1.0250442 -0.4764992 15.8248835 2.0774715 0.6687385 -0.7082546 2.9015262 -2.4493458 0.3671005 -2.8204739 26.3177719 1.2194365 -1.0646433 -1.2048227 -7.4262781 -4.8586464 13.6603060 -1.7492582 -3.5292935 12.5080166 0.6539762 -2.3194978 1.9469075 -0.1096447 2.5122731 -1.6567922 -4.7758341 0.7867064 0.3137241 0.0249214 3.2157772 -2.2294066 2.6402645 1.3528049 -2.5810184 -0.6382453 0.6312048 -0.8524691 -0.4547705 0.0049400 2.0419419 -0.1031668 0.3996307 -5.1516247 -1.6585697 12.9198332 -4.5009050 -5.5677519 -2.1586218 1.7650865 -0.2641138 -2.4698391 0.7767656 4.9005961 14.1916790 0.8101765 3.0925717 -0.2695072 4.3883710 6.8461533 -4.3042288 3.0668883 -1.5566424 1.6628963 0.2425638 -1.9105469 0.8358744 -0.9241743 -0.0497067 -3.6127577 1.7667390 1.8681581 0.5627487 2.4949470 -0.2868118 -4.9406662 -0.3572246 -1.6340976 -2.8634486 2.6125827 -15.8623934 0.1028534 -1.0474578 0.0578120 6.8640361 -0.1854410 0.4875432 0.3462804 1.9273330 -1.2633489 -0.4970249 0.4523146 4.8004785 -0.3549376 -1.9254028 3.7479556 -0.2968468 4.6501303 0.9555360 0.8855838 0.0648090 -0.8015788 0.4831185 -1.7592514 -2.7297578 4.2365694 -1.4506944 -2.3382859 -0.8616362 -0.6431194 5.3504243 -1.4892428 0.4937115 0.4972176 1.6369997 0.9943135 -0.1792751 1.9082770 1.1062182 0.6687139 0.2842776 -6.3073845 -9.1708708 0.2426351 0.2724127 -1.9735594 -2.0870061 0.4982822 -1.0516020 1.0336257 7.3373389 -0.5728852 1.1709912 -3.8312056 2.0664191 -2.1480134 0.2126239 -3.3452938 9.6725531 -0.2461433 0.2800257 -0.2146228 -8.9756508 2.8657365 5.1174588 -0.2266923 4.0405998 10.7438993 0.1331620 -2.2927687 -0.5793465 -21.7128048 -2.2705986 -4.9496713 -2.3671215 -7.1202588 -10.8597078 0.3978525 -5.0404711 -3.4963634 0.6119196 1.0993700 -0.6051467 -1.0429035 -13.1472263 -4.0419488 -5.2078390 -9.7705879 -0.0914241 -0.2872258 -5.0547018 -2.1096497 -5.2905812 9.2439709 -0.5894731 -0.8077105 -0.9041629 -1.5903174 2.8366597 -1.8421719 -3.7233586 1.5568349 8.9379740 0.1399183 -0.9382609 -27.2071190 0.1978980 4.5934653 -0.3966821 -0.5789685 -0.8449113 -1.9029987 -8.8575554 1.2365544 -3.4211764 -0.1861562 1.1874197 -1.8255441 1.9697784 -1.6517485 -0.3705987 0.9385544 -0.7352264 -5.1650147 -1.8156756 -5.1591787 -3.9777546 0.5611734 -0.1699910 -0.7200451 -1.5773956 -18.2987652 9.4192419 -8.0766563 -0.4167610 -1.9233598 0.4426075 -1.1733959 0.2820774 3.2567105 -6.1060390 -5.0739241 -11.3791285 2.6349831 -0.1971585 4.6735358 -1.3491285 1.3746867 -8.7004013 -5.6828065 -11.0820732 -12.9320278 -1.6483188 0.9715304 -4.5938816 -7.2209110 -2.5714262 -1.1890330 0.8452678 2.3191526 0.2622301 -7.3163619 -1.1463051 0.1820441 -1.5818394 -0.9159387 -0.6973172 1.5280890 -17.5731888 -0.4113140 -7.3965740 -14.5052261 0.6526254 -0.8390276 -2.6204314 -0.2358400 -13.3713617 0.4397238 2.4595048 0.8436207 -0.6276432 -0.5045014 1.2577676 0.9179019 -0.5814583 -5.8803968 6.6083083 0.6732449 -0.2718542 -0.2870084 -3.9932117 -2.5952840 2.6465516 -0.5217510 -0.8991922 1.5281366 -34.9422035 -11.3169117 0.0631476 -1.8426720 -3.1824214 -5.5391335 -2.1715364 -2.0601037 0.1175834 0.8183125 -1.5625826 -6.0730467 0.9309543 1.3132677 -1.6350539 -2.7857935 -2.5593901 -7.3290172 -3.4487917 -3.8831236 3.1356018 -0.7992205 9.7814207 -4.5980558 0.6628630 16.3122559 0.6533807 -0.5156439 -1.4555495 -0.3468870 4.0332880 2.3805840 -2.3190320 4.1054549 16.2409897 0.8369457 0.5314848 -21.2434978 -0.4834159 8.5624819 -0.5539014 -0.6674148 -0.8806390 -10.1704531 -2.6082680 0.5331160 -5.4161153 1.5525705 1.3559275 -3.7737424 4.8300905 1.6288235 -0.2926313 0.9474339 3.8226597 -9.1339235 -4.4293509 -5.6233754 -6.2836809 2.9545500 -5.3285723 -1.1017699 -2.5448923 0.0484090 10.8976765 1.9607351 0.3837806 -0.9341264 0.4518701 -2.3758736 0.1286760 -2.1857755 -0.1103254 -6.8722496 -3.9103210 2.8867211 -2.4512022 1.8377587 -0.4956308 -0.2853843 4.8377819 -6.4299626 0.8837512 -2.0541365 -3.1692524 2.6122303 -3.8209531 -1.0383115 -4.1134853 2.3936341 1.0227187 1.5346786 2.2544777 -3.1025767 -1.4888234 -0.4276212 -0.8633702 0.3832183 -0.1156862 2.3176584 1.1030900 -3.2589419 -14.7198563 3.0561190 1.2167021 -1.5453329 -7.3583708 0.2428567 -0.0865367 1.6395713 5.1432266 1.4805317 -0.8161434 -0.7263225 2.9266131 1.9195167 0.8888128 -7.3586287 12.2844534 0.4581961 -0.9381682 -0.0034812 -10.1958628 -0.4298058 7.1875410 -0.0075800 -1.0590382 1.1837463 0.3819601 -4.3185697 -9.8823824 1.1700003 0.4182885 -1.9459924 0.1002452 0.4459377 -1.4063675 1.0838510 0.6582192 -5.1020546 7.6498713 -3.0623116 -1.6121817 4.2459173 0.9624187 -4.1215625 -2.4103103 -0.2828175 0.6946387 -0.0869264 1.0210307 0.8060324 2.0013781 9.0836391 -2.5796981 1.1512015 1.4509283 4.2720752 2.2973638 -1.0021863 0.4076501 3.4352674 11.7593508 -1.8471490 2.4097450 -8.9766493 -1.1742462 -1.0661918 -0.8002769 -4.8741374 -1.2270384 2.2632654 -0.8910152 1.6290375 0.9409518 0.8327951 -0.6030296 -6.9690580 -2.7594502 -0.2698476 -0.3795306 -7.6529164 1.0186524 -6.3533130 -1.6073383 -0.1772221 -0.0614211 2.4406235 0.6314926 1.1669210 -2.0052533 0.1110014 2.4128630 0.3926355 -4.4760437 2.3635838 2.3920448 -3.2521806 -0.7143843 -0.5048318 0.9947464 -2.5634069 1.3510005 -2.2389438 -1.4463305 4.0392408 0.0917348 -0.3030224 0.1710996 -3.7659779 -0.3441837 -1.0259820 -5.2679300 -2.0018680 -2.4258943 0.8414689 -1.4328685 -1.9425917 3.3219666 -1.1949301 1.2730691 -0.2455841 0.8016310 0.4666615 -0.0067428 0.7253920 3.2137196 2.0977626 0.8569505 -0.2549510 4.0620165 0.3432552 -0.2150451 -4.1564322 -0.9679809 -1.8896025 0.4870199 -0.4306757 -3.4926775 -1.4492828 -1.9302666 -1.2671012 4.9841695 -1.5334345 0.5454786 -3.7002354 1.4344747 -4.4220829 -1.6331822 2.6058514 1.1469369 -2.1591926 1.6520398 1.7757751 1.1202796 4.2405086 -0.2048392 -0.4556395 2.7546203 0.0712276 0.2941422 -0.6433728 0.0576313 0.0894464 -0.0660637 0.0461069 0.1344660 -0.0083527 -0.3137356 -0.3595057 -1.3799525 0.1294906 0.0809529 -0.3725871 -0.1419545 0.0581007 0.1152162 0.0453776 0.0589250 -0.2233947 0.1285414 -0.3848444 0.1149105 -0.1886659 -2.1789975 0.4495342 -0.1261565 -1.6479012 0.2648808 -0.1907417 2.1314387 0.1122176 -0.0875147 -0.0962528 -0.0572978 -0.3616914 -0.0500932 -0.2273986 0.8437790 -0.2122324 -0.0166193 0.4963401 -0.0175697 -0.2106505 0.0886577 -3.3244355 0.0633852 0.2377991 -0.0078522 -0.4492695 0.0311143 -0.7013151 0.0640522 -0.0787743 -0.0462033 -0.1089955 0.0719966 0.1318953 -0.8587652 -0.0113346 0.0309287 0.0284034 -0.2072698 0.3729019 0.0768577 -0.0270119 0.3152426 0.0956960 -0.1955080 0.0789947 0.0181473 -0.6455362 0.1241988 -0.5454192 0.0964016 0.1591972 0.0192582 -0.1640784 0.0739617 -0.1165657 -2.6190331 0.0986657 -0.1517880 0.1038597 -0.0816679 0.1523715 0.3216367 0.0182717 0.1018976 0.0484338 -0.2618298 0.1738843 -0.0695859 -0.0076590 0.0204243 -1.0790977 0.1301920 -0.1926124 -0.8776996 -0.0906102 -0.3867821 -0.0673589 0.0793254 0.0687927 -0.1461104 0.1741262 0.3479254 0.2433560 -1.1862081 0.4674681 3.9611635 0.1440243 0.0066151 -0.1598713 -2.0369680 -0.0747593 -0.3969164 0.2496687 0.1729445 0.2910430 0.5147177 -0.2446033 0.1684944 -0.8803003 -0.0090639 -0.1024216 0.0549924 -23.2519760 -2.4637229 -7.3240833 -8.0761480 1.2732965 -12.7056055 0.9124032 -8.8379021 -3.9275491 -0.7862248 0.9288164 -0.6518846 -3.2202532 -2.1036906 -6.2562561 -4.1591768 -12.7420740 -0.7107075 0.0157230 -9.1225491 -4.9088087 -16.8532085 6.7340059 -1.5036391 -1.8772641 -0.4709587 -2.4960623 2.4705644 0.2211530 -7.0765662 2.1606779 6.5263891 0.0407489 -1.6894400 -27.4844227 -0.9291946 1.5102316 -0.8100259 -1.3302803 -0.3492334 -6.6506100 -15.4637814 -0.2940110 -2.8790402 -9.2620287 1.2121228 -2.1133802 0.1631480 -3.3091002 -0.2001118 1.1584821 -0.8895563 -5.3569489 -1.3900390 -4.4751387 -5.0006223 -2.0954676 -3.8971350 -2.0126481 -1.3163891 -29.3178711 6.6956406 -15.1842279 -3.5554435 -2.0652454 0.0561818 -1.9363543 0.1399891 2.6133220 -9.3245602 -8.6415625 -5.7671399 1.4711300 -0.5077901 3.6270809 -2.8438478 -7.0229168 -7.5584450 -6.6755471 -7.2412844 -8.8585386 -1.8811648 7.6872892 -5.6051860 2.1834757 -2.0931242 -9.5083704 -0.3528254 0.5646165 -1.5740254 -6.4355812 -0.7963875 -0.2933955 -4.3069239 -2.2290466 -1.3150848 1.5197408 -5.0477500 -0.8338370 -4.0976734 -15.3000879 0.5278347 -1.0302117 -2.9458427 -0.9772487 -10.8811312 -0.0469332 -0.7853240 0.6911886 -1.7043933 -0.8991109 1.6616012 -1.7896771 0.0697111 -1.1082859 3.7957458 0.9436508 -0.0295362 -0.2166907 -7.9936118 -2.2876058 -1.2024477 -0.2933947 -1.6731386 1.6634394 -28.7088642 -10.4669027 -6.8042350 -5.5099478 -2.6514792 -6.3992500 -1.2839453 0.3849418 0.9576423 0.8910277 -0.2791084 -7.3533149 0.6054100 2.4817481 -1.8391403 -5.3568563 -0.8942996 -5.7713165 -6.0935488 -7.6223650 0.8205542 -0.5343507 -1.4265838 -10.2980671 -1.1415311 11.5747499 2.3910861 -5.3848572 -0.3205316 -1.5703171 1.4735677 2.5722730 -4.8204932 3.7218318 12.0312233 0.3811599 -1.7827537 -21.2722454 0.9405234 3.5295432 -1.1854300 -1.9351219 -0.5436285 -9.4007196 -2.3630307 -1.8845533 5.8343577 4.9023418 -0.7377303 -4.7020459 -1.0594488 -3.0084884 0.3287157 3.0700366 0.3812898 -9.7702322 4.1812501 -3.7960150 -8.0974112 -1.2311974 -4.9844255 1.3802122 -2.4678338 -5.5691833 2.7923117 -0.2197116 -2.6959021 -0.2236757 -0.3121179 -2.9069123 -0.2043329 -4.4414577 0.3912016 -15.3925762 0.5798921 4.5684099 -3.9718444 0.7827452 0.0792729 -1.8119289 9.3093596 -7.5073643 0.7372828 1.2509425 -3.6634488 -0.2116540 -5.5698071 -4.1954722 -6.2925935 -4.3410621 -1.5751277 -4.1291790 0.3473021 -0.4485103 -2.5042894 0.7512605 -2.9625411 -0.1114403 -1.4966242 0.6642557 9.3453016 -2.2551255 -7.4696555 -1.8009715 0.0494676 -1.0013902 -8.7613354 -2.1305702 -1.8778449 0.2199561 -1.8042773 0.7096236 -2.0769470 -0.4294909 3.5074441 -4.0575199 -2.8190274 0.2048883 7.2828856 1.4107822 -0.2928042 -0.3742890 -17.2652893 -2.4944160 -1.0576369 0.7980425 -2.0778074 1.9974084 -3.4681187 -3.5450323 -6.9927793 -0.0193866 -0.3956660 -2.8168495 0.5426177 0.3307792 -0.1330214 1.6048843 0.2276046 -4.8066349 1.9757617 0.6455786 1.3307966 -0.0999225 0.1068172 -9.3802013 -1.3016078 -0.7778687 2.3967800 -0.1834376 0.2830682 -4.3363485 0.5945074 3.2257907 0.0260517 1.2742920 0.3714370 1.9433390 2.3152120 -0.1116938 1.9337775 0.6469027 5.1859908 -2.8752337 2.4599826 -3.5368779 -0.0446351 -3.9028933 -2.0052493 -1.6753360 -0.1153311 0.7641197 -0.5283808 -4.3958111 0.5405470 0.5995463 -3.6170862 -6.7491746 -2.0990345 0.9328979 0.2313073 -3.5279329 1.9090726 -6.5146403 -1.0737554 -1.6269993 -1.5022249 4.3539801 -0.6714973 -0.4662890 -3.2721255 -0.3998964 -2.7519405 -0.1898937 -0.9822209 0.7844795 0.7662550 -5.1847582 -0.2188538 0.1366753 -0.9213644 -3.8773108 0.7197308 4.6669412 -3.5502193 -1.1479714 0.6524717 -1.1009731 0.5596303 -1.0854441 0.7241439 1.3780954 -7.2537651 -2.0589468 -2.2773511 -0.1724834 -5.1914568 0.7437968 -0.8635212 -0.0908935 -1.5582662 -0.7254212 0.7700275 -0.4153197 0.1012638 0.6359559 0.2391785 -0.6678451 1.2268978 -4.2409630 5.5664148 -0.2190347 1.3120482 -1.5996689 -4.1045671 -1.6640306 0.1506150 -0.6201023 6.5806565 -0.0332973 -1.7599558 -2.4551556 5.9520698 -2.1848900 -0.2522172 1.2077347 -3.4043036 0.4570754 4.3485646 0.9792367 2.1065035 -4.4087634 -0.3222511 4.1305809 -2.5913153 -0.3884709 -0.6850309 -0.4442263 0.2382815 0.0447177 -0.0507656 -0.1591530 0.0282140 -0.0670017 0.0263427 0.0443628 0.0077726 -0.1961137 -0.0671137 0.4015667 0.5349934 -0.1973704 -0.0380347 -0.0745400 -0.0240474 -0.0244373 0.1065201 -0.0398251 -0.0479324 0.1144605 -0.1459980 0.5080636 0.0273889 0.0204318 -0.7437084 0.1294738 0.0941717 0.3780768 0.1217205 0.0474218 -1.3007227 -0.1238602 -0.0927788 0.1434717 -0.0042267 0.0434083 -0.1383857 -0.0190863 0.0169990 0.0823493 -0.0132787 -0.0313964 0.0808708 0.0937459 -0.1289908 -3.8133435 -0.0971399 0.0525617 0.0124073 0.2779675 0.1646447 -0.5528227 -0.0106633 0.0616187 -0.1172598 0.0993553 -0.1083012 0.0212010 0.0661744 -0.0456900 -0.2317251 0.0483057 0.0242381 0.0059642 -1.2471006 -0.4268721 -0.0123712 -0.0227859 0.0524935 0.2186047 -0.1060296 -0.0063005 -0.0314719 0.0675350 0.0169700 -0.1479836 -0.0722322 -0.1636217 0.0184864 0.1542134 -2.9490380 0.0305692 0.0347908 -0.0667673 -0.0008179 -0.0370702 -0.2520986 0.0283341 0.0080477 -0.0495000 0.1643105 0.2653542 0.1030659 0.1758882 -0.0274909 0.1081499 -0.0690829 -0.0680317 0.2652594 0.1590230 -0.2061492 -0.0513463 -0.0436470 0.6324339 0.0349318 0.0391330 -0.1010023 0.0486535 0.1996702 0.0438985 4.2055302 -0.0274894 -0.0440044 -0.0149551 1.2735590 -0.1684698 -0.3010418 -0.2015126 -0.1601107 0.0263898 -0.0116369 -0.5803149 -0.0846143 0.0502338 0.0232744 0.0796402 0.0454365 -26.4278374 -2.9037645 -10.7746792 -0.4131922 -9.7008066 -20.8269520 1.0138721 -2.0029278 -5.1598911 -1.7508740 1.2037258 -0.7646222 -4.1280437 -3.7932041 -7.7697802 -3.7491229 -15.8060131 -2.2573657 -1.0136400 -22.4511700 -7.0404587 -8.8022575 5.1541710 -2.8782983 -1.7146623 -0.1726302 -3.4353960 1.2508904 1.7842873 -11.9101648 -0.5098331 4.6861544 -0.0609659 -3.7508736 -32.5155144 -0.7861336 -1.2740109 -1.2687494 -2.2219644 0.4005253 -6.5406847 -14.9001188 0.5215776 -2.3496406 -16.2177315 1.0050368 -2.4941423 -1.5021579 -3.1574903 0.0311821 0.9909564 -2.7984746 -5.4424906 -9.4644537 -5.7663264 -5.5573988 -6.3845968 1.0560719 -0.8946927 -1.0815336 -13.6385517 4.5287137 -14.7486372 1.5549803 0.5995919 -0.3728532 -3.1322460 0.2985122 2.9638686 -11.2557669 -13.9814920 -1.5861428 0.0642586 0.3097081 3.4207919 -4.9598341 -10.8476992 -15.7508860 -7.9098468 -1.9262420 -6.6313124 -1.9783605 0.1019180 -6.6376858 -12.3932533 -1.4487720 -5.8361249 -1.6268241 0.1185684 -8.0453634 -9.3296232 -0.3238586 0.4395561 -3.1247385 -1.9696641 -1.2943381 1.5379386 -4.6568289 -0.0709275 -0.1622991 -18.7693710 0.4686665 -1.5013872 -3.9184904 -2.1898484 -3.7221894 0.1562024 -4.6433482 0.3364147 -1.3200362 -1.8566767 1.9652323 -4.4779487 1.2183167 0.3811849 1.1596550 1.1651282 0.3841234 -0.5445464 -9.5501356 0.7255034 -5.9743738 -0.0623478 -3.1119525 -1.1995146 -24.2522469 -0.1019311 -11.2265568 -6.5517874 -0.4445710 -6.6610041 -1.6453283 0.6433384 -0.9880848 1.7676070 -0.5963693 -6.0088239 0.8758460 2.1332524 -0.3223296 -0.2016688 -2.4536879 -11.1704273 -3.0579350 -4.0507364 -0.9668854 -0.2321387 -3.1237247 -5.8235521 3.0258586 8.2440662 1.0204970 1.4846704 0.6150779 1.1276459 1.1133426 2.3853741 -3.7432277 -0.7598137 8.6792297 -1.1194304 -4.2825680 -22.3605747 -0.2744391 -4.3552227 -1.4717855 -5.6648264 0.9181923 -1.0319527 -4.7204576 -0.4370098 2.2963979 -1.5151896 0.9569702 -5.3323627 -3.2809484 -2.3315556 -0.0702111 1.5065064 1.1123705 -8.4265738 2.6076632 -4.2998848 -1.5869651 -3.9930687 -0.8774651 -2.8311834 -0.9230167 8.3146200 -1.3020508 -0.4564107 1.9784091 1.1256403 -1.5985179 -3.2351851 -0.4294113 -0.7217622 -3.8741481 -17.1563339 -4.0143781 2.2526805 -0.5463837 -8.8663187 -2.7643242 -4.0959749 -4.8124080 -7.5955620 1.3732529 -5.0086703 -4.1732078 7.0369301 -5.1781373 -4.6718135 -4.3184962 -6.8366203 -2.9172108 -0.9184508 0.0700233 -0.5552403 -7.0235081 -0.2512171 -1.6801869 3.3891902 -3.1485617 1.6724813 15.0805702 -2.0350726 -1.0200245 -0.3359814 -0.3370675 -1.5807507 -5.6054025 -1.5187899 -3.5746574 -3.2090073 -11.4373074 -0.0795807 -3.1383109 -1.5337546 4.3416204 -2.8139627 -0.4371551 2.5202758 2.6207860 0.8554113 1.0749989 -1.1441114 0.7515211 -1.9041899 -3.3628514 1.5744016 -2.8514669 -0.4920706 -5.7982035 0.2974455 2.2145824 0.4767424 -0.7919900 -1.4356877 -1.5755486 -0.2117340 0.5532308 2.0965662 -0.2367838 -1.9140730 0.3286259 -2.0733221 1.6592032 -0.7000213 0.2667468 -5.1313510 -0.0999392 -0.4814005 0.0489706 -0.4665415 -0.5367557 4.6526408 -0.3912967 0.5196298 1.1642753 -0.9938693 0.5073079 0.6330208 -3.5720811 1.1538614 1.5172379 1.6714586 4.1766210 0.3394179 0.0904048 -0.7912670 -0.1675468 -1.6173612 -0.5396191 -1.4319377 3.2894683 -5.7592807 -0.8003820 -1.0401138 -0.3311883 1.5212040 0.4253749 -7.5848331 -1.7251363 -0.1769591 0.4917773 3.5579431 0.3138765 -4.9933610 -0.6121820 -1.2793022 1.2491473 -2.3626418 1.3550161 -0.8861733 -0.3737236 -0.6403485 -7.1694698 -0.6615422 2.0644076 0.5780377 -1.3268778 -5.0550280 -1.8177536 0.9543725 -0.0448397 -4.4286013 0.0826549 3.2463887 -0.7628899 -0.8945488 1.0862623 -4.5313587 -0.9981476 -1.5275680 -0.4323394 1.0440663 -7.9862342 -0.9121106 0.5518482 -0.6222988 -0.3427185 0.3693994 -3.0366890 -0.1206326 -0.7685989 -0.3269975 -1.1555240 -0.5886487 0.4476877 -0.3341651 0.3626014 0.6251792 -0.3070689 1.5973635 2.2746625 0.4818699 -0.1139579 -0.0034148 2.8177030 -2.0269556 -0.2465181 -0.1705599 3.0069535 -0.9890718 1.3486241 1.9278586 6.6565905 1.1775949 -0.0939758 1.5116289 -2.5287826 0.3858106 -1.0575198 -1.8166492 -3.8302042 -8.6733780 -3.0194254 1.8963022 -3.6114180 -0.3304440 -1.0710293 0.0193262 0.9904341 -0.0774595 0.1274298 -0.3119788 -0.1888913 0.0358228 0.1557562 0.6296452 0.0466025 -0.5453555 -0.2885845 1.0876781 1.6189709 -0.1435475 -0.0371306 -0.5614960 -0.4696342 -0.0940309 0.0744645 -0.0389119 -0.2848773 -0.7341481 -0.4922366 -0.5359731 0.1576288 0.4502521 0.1993625 -0.0289172 0.3372310 0.7449063 0.4101074 0.3302849 1.9021502 0.3558974 0.5686526 0.3356382 -0.0498063 0.1539584 0.0871814 -0.7712013 -0.2588051 0.0311987 -0.2172712 0.1170022 -0.0108937 0.3518840 -0.9805381 -3.7720914 -0.4005523 -0.2053185 0.2566850 0.8254316 0.2061335 -0.4590714 -0.3821432 -0.2236970 -1.2824800 0.2104431 -0.6486716 -0.0397023 -0.8403319 -0.0979256 -0.7403986 0.0255950 0.4294473 -0.0920027 -2.7398586 -0.3193082 0.5077831 -0.1998424 0.1862848 -1.4001808 -0.0089327 1.6587613 -0.1854418 -0.3819838 0.2533579 -0.8376006 -0.2120771 -0.0785344 0.0048419 0.1282514 -3.1735070 -0.0671208 0.1935896 -0.2170676 -0.0304783 -0.3647375 0.5734946 0.0628036 -0.0725946 -0.2461178 -0.0499624 -0.0784526 0.0828356 -0.0663592 0.0868819 -0.0860687 -0.2770499 -0.3068531 0.8633417 0.2512876 -1.1240585 -1.1712067 -0.0809573 0.7196240 0.1113713 0.1775291 0.3498180 -0.0726260 -1.7029744 0.3530433 5.0495963 -0.0563064 -0.0409713 -0.3152143 -0.9069853 -0.4954232 -0.5497300 0.1881143 -0.0449735 -2.6997511 -0.1222775 -0.7593315 -0.8859962 -0.3765358 -0.1271931 0.1824116 0.0913600 -16.3161564 -2.6149893 -7.2772660 1.6880269 -11.6676245 -17.3360233 1.6155186 -5.2332730 -5.5638971 -1.3864297 0.6507314 -0.8377435 -2.5677814 -7.6962147 -8.2630224 -7.0516686 -13.3763151 -1.8611395 0.6642629 -25.1050262 -11.6764174 -10.8718023 -0.1443490 -3.2483044 -1.6770817 0.3399817 -1.5970324 0.4440040 1.4400716 -9.6090851 1.9755162 -0.0551838 0.1009853 -6.0374465 -29.9167080 -1.5287247 -9.9097919 -1.3424604 -2.8398094 0.8351825 -9.2103596 -11.6919270 -0.9606103 -3.6714139 -1.4837894 0.9827017 -2.7789073 -1.9090052 -3.0349078 0.4034692 1.5816007 -1.9010303 -6.2680907 -2.9204726 -4.7361927 -7.3472023 -9.0736818 -4.1868730 -6.3221717 -1.0593683 -10.2903957 -4.4950485 -1.9824896 1.6846910 -3.8816130 -1.1981261 -2.7982543 0.4117842 1.8723463 -15.4005222 -19.0029888 -0.7597471 1.0474296 -2.7883470 3.4414799 -5.1647949 -2.7929289 -11.1983080 -8.7622557 -1.4083145 -6.8188653 -2.4925337 4.5498438 -6.6464787 -2.8323872 -2.0378249 -8.6744890 -2.3258929 0.4924079 -6.4856005 -7.2631812 -2.9259925 0.3312101 -0.4810287 -4.7632322 -1.7253771 1.6492063 -5.3897614 -0.1381141 5.9999433 -11.5931444 0.6781388 -1.6996384 -4.6692300 -3.1735759 -3.3235619 0.5393769 -11.7793264 0.4824536 -1.2857603 -1.6462080 2.1283443 -4.1304588 -0.0563287 -5.2955265 -4.1236534 1.5021230 0.7778311 -0.5067180 -14.7960033 -1.1036112 -7.9571195 -0.2569050 -2.3850942 2.8376164 -23.0666695 0.3570313 -13.4008417 -4.2220359 -0.7724772 -4.1951661 0.8588166 -4.2589121 -0.1104200 1.9616176 -2.8557153 -5.0680399 0.6778616 0.9017909 -1.1982845 0.1105833 -0.2838190 -9.7222662 -8.2098427 -1.3974793 1.2727464 -0.2370676 0.8554488 -3.8692060 0.8418747 0.4643401 2.5567098 -5.6008530 1.5193696 2.4801764 0.9695543 3.3608396 2.2918193 4.1488180 1.4920627 -1.1197441 -6.7322321 -22.8631859 2.5596054 -10.1552820 -2.3423934 -4.1025691 0.1121294 -3.4623210 -6.0558529 -2.8096752 1.3038676 -1.0345960 2.0960038 -4.7750702 -2.2228179 1.7400843 -0.3179611 4.4537630 0.5465252 -7.4230642 -3.4284306 -6.2474155 -3.2695692 -9.1598568 0.4861445 -1.2173055 -2.3315825 1.2321618 -6.4666166 2.7531302 2.8390119 -1.5468166 -2.6073854 -6.1117582 0.5232805 -2.2862554 -3.0325227 -15.2053537 -4.2149057 2.2287700 0.2875564 -1.5019207 0.8929961 1.0719972 -1.9121495 -3.4472115 1.5727555 -3.7908604 -4.9952273 3.6804965 -3.7375314 0.9434361 -6.2348537 -3.8115568 -4.8822527 -2.9791939 -1.9984024 -3.0854199 -3.1048038 2.2820148 1.1372434 1.8886775 -3.6826112 3.0113091 7.3949642 -1.9566363 6.4961495 -0.9501339 0.5291058 -3.2124586 -8.9574862 -0.9071885 1.6892928 2.8684952 -3.5477240 1.4374584 -1.9886127 -2.9001887 4.8735981 -4.8835139 1.1504854 -4.2769098 -5.0449100 2.5792890 0.4608634 -0.9976445 -4.8888469 -1.7900341 -1.1460426 0.6766942 -2.9969389 0.4270522 -3.1073055 4.2318606 -5.3293247 -1.2900434 -3.8291297 -0.4509541 -1.1381729 -1.2567121 0.1206370 3.5856533 -1.8068204 -2.4125800 1.4096245 0.1816377 -0.4145071 0.0531853 0.7780014 -3.4963670 -4.4109020 -0.5525740 -0.4653790 -0.6247677 -1.5332162 -0.8455289 -0.0104916 1.6173445 -1.2441843 -2.1681595 1.6823425 0.7040500 2.3958473 2.0390315 1.0481137 4.2511325 5.4751472 -2.5368218 2.6844270 -0.7182373 1.9789174 -2.3413260 1.6027931 -0.6581783 -1.2123667 1.1263981 -1.5350382 -1.9575788 0.0338839 -0.4426100 0.2262909 2.5542674 -2.7189524 -0.6416185 2.5267277 0.3989478 -0.0199736 0.0559469 -1.6853433 -3.0168839 3.4929228 0.9175478 -1.4200628 -0.7143547 5.6609359 -0.9363824 -10.0679665 -0.1347813 1.3955324 -0.7195917 -4.2111850 -3.3586984 -0.1852682 -0.4624959 1.2295425 -3.5394239 0.2778448 1.5220553 -0.7594118 -4.2655950 0.9224133 -1.2838254 -0.3718105 -0.1314208 -0.2747757 -0.6470181 -5.3902087 -1.3266858 -1.4346080 -0.4452572 -0.2517900 0.1339198 -5.8525090 -0.2562866 -0.8814906 -0.8459080 4.0573759 0.6165826 -0.4469816 0.0750585 0.1924700 1.0340562 -0.6842030 1.3374444 2.5216513 0.6216815 -1.9394816 -0.0209630 -0.7582986 0.1897013 0.9656022 -0.1895275 1.1857960 -2.1119671 -0.8274179 -1.9308686 12.0775766 -2.3952219 0.0075160 0.0478371 -1.6591647 2.2270942 1.3947539 2.2686377 -2.3746445 -0.1379884 -2.5811434 0.7309048 -0.8264115 -0.9940202 -1.4366468 -0.0839532 -0.0165604 -0.1474174 -2.7548687 0.0604816 -0.4613120 -0.6674199 0.4308849 1.3627901 -0.4720857 0.3881939 -0.9562645 -0.0419198 2.9512641 -0.1128093 -0.5351156 -0.8150474 0.0321537 -0.0707162 -0.0880427 -0.1453888 -0.5468107 0.2403983 -0.3659678 2.2930121 -0.2090267 0.2349409 2.4529777 0.0985237 -0.9703116 0.0047707 0.2771870 1.5462184 1.4795111 -0.5629820 0.3175362 0.4204167 1.7329026 0.8630044 0.0675858 -0.3685586 -4.0264525 0.9433088 -0.3262806 -0.1916712 0.1008263 0.4448204 -0.1739188 -2.2611420 -0.3119976 -0.1464002 -0.5312606 1.4196779 -0.4631914 0.0141783 -0.4420943 -0.0812703 1.1517781 1.2227396 -1.9382008 -0.4255190 2.2190924 -0.3616069 -0.7183067 -0.0019043 0.3080566 -0.3007379 -2.8185542 -0.2545095 -2.5706253 0.0896070 0.6228686 -1.5509259 0.1051109 1.6037152 -0.3022236 0.3583939 0.2028558 -0.0094260 -0.4335075 0.0759289 -0.0622278 0.0901360 -0.4067418 -0.7714858 0.0602288 -0.5828075 -0.0102396 0.3762725 -0.2433937 -0.0407168 -0.1987379 -0.1440448 0.8649287 0.0546115 0.0392419 0.2659230 -0.2626073 0.9414888 -0.6972366 0.0795345 1.1379455 0.4543779 0.7447765 -2.1116333 0.4591991 -0.2702913 0.1164790 -2.1537826 -0.4656843 -1.2921158 0.5763707 -1.3752990 2.1969960 -0.8055911 0.1520156 -0.1812411 -2.1777408 1.0292583 1.3337127 1.4447091 -0.6284925 2.0444119 0.0280792 0.1394796 -0.7040797 1.1057411 -0.2388960 0.2044862 -0.1834590 -13.4123669 -3.3926280 -8.6353827 -0.9581879 -15.0652952 -17.2142849 1.8971633 -9.6435661 -5.2939053 -2.9347110 1.2180058 -0.5597101 -1.0589415 -6.3199143 -10.5160179 -8.9133415 -10.9883795 -2.8312521 -0.6397265 -23.1216545 -8.6292048 -7.4160881 -8.9273710 -4.7516217 -4.5694652 0.8954417 -2.5803719 0.0766925 1.7736391 -10.3250351 1.2237426 -7.2501006 0.0331772 -7.5998669 -31.2322350 -1.3673022 -20.2638454 -1.4237573 -3.5511911 1.0291649 -5.3015118 -11.5605125 -1.4318658 -2.6052094 -2.9809949 1.1951640 -2.9701343 -4.1632047 -4.3509822 0.2119637 2.2028964 -2.9676344 -6.9693022 -4.5930591 -6.2250166 -4.4866672 -9.2557297 2.3509932 -3.9051287 -1.8089215 -20.3112259 -9.1967249 -8.4669065 0.0550397 -1.4797754 -1.5928657 -4.4935870 0.6318420 1.8583051 -15.7038212 -19.3297005 -8.5056648 1.7190346 -4.0449438 6.6491899 -3.7530842 -6.4178095 -12.4546499 -9.6472149 -2.1703866 -5.0892057 -2.7690566 3.6528206 -8.2379665 -9.2939510 -3.0340962 -12.3763599 -3.8284380 1.1373851 -1.9226500 -8.5469122 -4.3277397 -0.5417920 0.4836087 -4.4805837 -2.6061738 1.9115956 -8.4062986 -0.4789029 11.4926796 -8.2377644 1.0678165 -1.6076534 -5.0604811 -3.6651077 -2.8676462 0.4745583 -33.4397163 0.5312236 -0.6262735 -1.9086515 2.4141738 -7.2335510 1.4379115 -7.7413802 -10.2554169 1.6903912 0.6785629 -0.4854724 -11.5330477 -2.4994888 -5.7711658 -0.3348249 -2.0835729 -0.0808226 -23.0350380 -2.0523221 -6.2445374 -8.0738401 -4.1114573 -4.3613176 -4.1130776 -3.0657842 -3.7576573 3.7530329 -4.4152446 -4.9397268 -1.4769052 -0.5525042 -0.0271317 3.8699119 -3.3895378 -14.7654982 -13.3708401 -2.0147371 -0.9123124 -0.9345382 5.9023676 -7.3539438 0.3627593 -3.7007885 1.0279257 -6.2531939 1.4899863 0.4370973 -0.4127215 3.2859178 2.7136333 0.9463091 -2.5087359 0.7770138 -10.4158182 -21.9935017 -0.1407130 -11.8752975 -3.5751302 -5.4203668 0.7730181 -8.1707134 -6.4080243 -1.9994392 3.2435560 -4.9317889 2.0288811 -5.7243295 -8.5696230 -0.4268451 0.5843101 3.4293485 -1.1792762 -9.3785830 -0.5952177 -6.0956688 -3.7420244 -10.9037561 2.1030405 0.8230255 -5.2383761 2.1884267 -9.0870771 1.8689162 4.9797502 -0.2779654 -3.3638747 -9.2345543 1.0061276 -3.8018806 -2.5721827 -18.4256992 -5.7465048 4.5503216 -1.3256915 5.1170444 -0.9479768 0.9893491 -2.6380908 -5.8891582 3.9786606 -2.0466633 -4.2881908 0.5196072 -8.7015648 -3.5636053 -6.6834936 -5.0107551 -7.8913150 -2.9854054 -2.2639048 -2.6148846 -2.2253332 -1.4424001 0.3877691 -0.5135584 -7.3238354 4.0333786 11.4886665 -0.6484696 14.8522997 0.0139009 1.8937906 -2.4070253 -3.1075454 -0.1264705 -1.0003316 0.5723063 -10.0369520 0.5168244 0.6020550 -2.5981262 5.9249730 -7.3655519 2.3439853 -6.5026073 -10.7288551 2.4941764 0.3266391 -0.9142597 -13.2874241 -2.0065415 -5.9023881 0.3327927 -2.3805270 1.5405108 -7.0884218 0.3329043 -1.0657229 -1.2496259 0.3843385 -0.3357792 -2.2770526 -2.1634021 -1.2253760 6.1199622 -0.7666922 0.0079842 -0.3934599 -0.1220162 4.9469585 0.9640561 -0.0764550 -5.0073347 -0.6241813 -0.5093546 -0.9397191 -1.0287173 -1.6166354 -2.2038147 1.8505251 -2.0949690 -1.9284874 1.1799763 -0.0880076 0.9387379 0.6220447 3.5115540 0.8450942 4.0050554 0.3324810 -2.2495675 -0.9292919 -1.8020655 0.9202850 -2.9523821 -2.0614016 -1.7781214 -4.4687567 -0.7509371 -1.9339851 -4.7061486 -0.0207072 -0.9400768 0.0531060 -6.7547507 -3.6215603 -1.2035242 -3.1009452 -0.8136635 -1.1770898 -1.8358238 -0.6650490 -3.3205280 -0.9652154 1.4748795 0.4253862 0.7230515 -1.1985512 -0.8852732 -17.8689289 2.0359271 3.9787555 -0.2302362 -5.6883264 -7.6727886 -1.6420459 -0.7207387 0.1182902 -6.5213819 -0.2330854 1.8980960 -0.3964788 -1.8247062 1.1548994 -2.1309648 -0.0680900 0.9773146 -0.4054077 0.3417330 -5.2570996 -0.9755373 -2.6406572 -1.0815803 -0.4501218 -3.0084424 -9.5954199 -0.9234188 0.6438778 -0.9752811 -3.1472399 -0.0803840 0.7508441 -1.2786673 -0.3916602 0.7221611 -2.3915701 1.0063165 5.8130708 0.9934322 0.9092715 -0.7152042 0.5980987 0.8464695 1.3937057 -1.1623778 3.5808659 -2.4099874 2.8900082 0.1012138 10.4042578 -1.6094435 0.0028159 -2.7736936 -7.5054960 1.1070265 1.2778583 -1.6732479 -1.8677361 -1.6870333 -6.9008493 0.6801491 -2.6361659 0.9969319 -1.9463207 1.3625131 -0.4940445 -0.2469200 0.6622530 -0.1679276 -0.4137868 -0.6528209 0.4252709 -0.2638735 -0.3695618 0.2975929 1.2823912 0.0129794 2.5663702 -0.5496129 0.0360048 -1.5075772 -0.1840293 -0.1518424 -0.1367632 -0.1749358 -0.6951161 0.6645831 -1.2828133 0.5951242 -0.6046839 0.4912582 3.5232136 0.2358706 1.1905805 4.3683944 0.7928337 0.6353037 3.1898158 0.6944073 0.3103400 1.0154884 -0.0148478 0.6876298 0.2907105 0.9673915 -0.4690689 1.6452581 -0.4803338 -0.9612967 0.1411020 0.5576359 0.3147514 -3.2121539 -1.1079202 -0.7031299 0.2476609 1.2356834 -0.3404340 0.4325020 -0.3669792 0.5847928 -0.4036481 0.2293846 -0.3136564 -0.3079475 0.7496827 -0.3621961 -2.1668444 -0.1604367 1.1166286 -0.2502283 -1.6621599 -2.3496802 0.3600181 -0.1978902 1.5156026 -0.7093660 -0.2470079 1.4012973 0.0539800 0.5235680 0.3516327 -0.4505881 -0.4758094 0.0748584 -0.1951099 0.6066676 -3.3001945 -0.3475665 0.2534546 -0.4925163 -0.1030534 -0.9123650 -2.6446550 -0.1574550 -0.2594474 -0.2632973 1.3656571 -0.0203355 0.4786124 0.0738130 -0.1158543 1.1891323 -1.0700582 2.1564515 2.9105964 1.2041047 0.4476061 -1.9308610 -0.0118781 -0.1631999 0.2129379 -0.2933293 -0.8360503 -0.1045704 2.7835784 1.0274130 2.6293006 0.2488292 0.2768285 1.2505800 -2.0698218 -1.1200966 3.8131797 -0.8728936 -0.9157879 -4.2170882 -1.4207784 -0.2214124 -0.6959686 1.5195067 -0.3605855 1.2982248 -0.2265653 -7.5276313 -2.5293710 -4.2349763 1.4035287 -10.0048494 -2.7422216 1.2537251 -2.9394073 -4.8288736 1.2343276 -0.2279700 -1.5431105 -3.9225514 -1.3422413 -4.1086845 6.1426239 -5.6685686 -2.2799230 -2.1254914 -4.6633511 11.7962580 -1.5373913 -45.2759285 -1.6739658 6.4441733 -0.7235039 -1.3081368 3.0398626 0.6858150 -5.3844061 3.3975549 -27.2465553 0.3836382 -5.4880095 -36.6496620 -0.3872705 -8.7372522 -1.1676761 -1.3888409 0.9471540 14.6131582 -14.0639267 0.5039804 -2.0315819 -0.9039839 1.6320151 -2.7167015 0.2874044 -3.4423492 0.2124482 1.1961437 1.5843511 -5.7994094 -0.6465158 -20.7327271 5.9010434 -4.1640244 -2.4010918 -3.2571268 -1.4449012 -16.9674721 9.3601799 -3.6972287 0.6007407 -0.5878441 -0.1080282 -1.5931927 0.6500384 4.8562021 -2.4135511 -12.4329443 0.0672784 3.0362401 1.7684145 -31.7573032 -4.5871449 -9.7892942 -15.8358202 -7.5222883 -5.9523206 -11.2650061 -2.9691346 -0.7438209 -7.2073250 2.0942047 0.1728538 1.2336167 0.1145169 2.1679387 5.3791385 -3.8011093 2.0413151 0.0756425 1.0334728 -3.7618582 -0.6360963 1.6871682 -11.2724962 0.0054573 11.9944696 -10.1051540 1.3621004 -1.9696259 -4.1068883 0.1669498 -7.6726861 3.5301089 1.3931657 1.3929162 -1.1218134 -1.1530913 -0.2680861 -1.4219785 -1.2747427 -3.4664023 -17.1311188 2.1498833 1.2269793 -0.3627309 21.6184864 -0.3606200 2.4648240 -1.9315904 -1.0005416 -0.6764756 -22.3261795 -10.3976669 2.6813304 -0.3231961 -1.2877963 2.0254107 -0.4352059 1.7895970 -3.9830425 1.2370732 -2.4613099 -5.4164224 2.3446403 -3.9251881 -0.3315412 -0.3228419 -0.6711373 -7.1090989 -20.1396084 -1.3185656 2.4607472 0.6984317 1.1021259 -5.3285389 -0.4636645 23.0763569 -3.7317171 -2.5902929 -2.2591004 5.7444091 3.9934134 4.2895789 -0.4575122 9.9680452 22.2845497 1.1829956 -0.9133602 -12.3693476 -5.0063052 11.3878479 -1.0423238 0.1541407 0.6350456 -3.2831182 -0.2779170 0.7057795 -0.0939005 1.6776160 3.3739207 -5.5390272 1.5490497 1.3312789 -0.1729679 -1.9202750 4.0296683 5.7061567 -0.8972468 -6.2149014 -3.6479349 -3.5823793 -1.4260782 0.4650989 -2.2510483 1.6631923 3.4941349 -1.3732334 -5.6018019 1.8571725 -0.8000943 -2.4664338 1.1078253 1.8293115 -4.2890501 -11.7520809 -1.6805655 5.4907608 2.2349553 1.6285384 -0.0480669 -1.7177435 3.2411442 -2.1147633 -2.4156747 1.6698329 -10.6933088 -2.0363040 -3.6807282 1.6678867 -0.5919970 5.2275910 0.6359211 -0.5851492 -3.1736269 0.0214869 -13.8597660 1.1000004 1.0244863 1.6192021 -1.7350250 3.2105541 3.8401527 0.1653908 -18.9386444 -0.1761476 2.5243313 -0.7844645 -7.6534991 -1.7556670 -2.2606156 0.0925209 9.1951151 2.4905341 -1.4468695 -0.5105504 -2.7577109 -7.6739731 -0.1989030 -2.1044531 13.7049417 3.5186527 6.6206007 -0.5122635 -8.2542219 2.2018886 5.8712125 -4.9211397 0.0896905 -1.8454716 -0.9540201 -0.7633605 -6.3363724 0.4076885 1.9346244 0.1905366 0.9173329 -0.1330840 -1.1209435 1.3195986 -0.3825177 0.1491427 -1.7488446 -0.2324073 -0.4231541 0.3062756 0.1881263 0.2357727 3.1821711 0.0236549 0.1086331 -0.0514188 0.2052120 1.6741086 1.0781639 -11.6064405 -0.7442052 -0.8291364 -1.9303514 -0.4860847 -2.2304163 9.5904732 -0.3850241 3.3594699 2.2420597 1.4632831 2.1428008 -0.9460707 -0.8873838 1.1361847 -0.1189201 -0.6908811 2.8397284 0.9071310 -0.0118553 0.5557802 -0.2409081 -1.3388510 0.1359278 -1.3001735 0.2900624 2.1218524 -3.3814459 2.5752451 0.0591871 -1.4716859 0.2796996 -0.1413000 -1.5211715 0.1228874 0.1152817 0.3305258 -2.9795096 0.3126301 -0.9760024 1.4042459 -0.9320220 0.7656023 0.4782146 -4.7956014 2.1645653 0.8894360 -2.7539985 -4.2096348 0.4001056 7.7850437 1.2554104 -4.3458157 0.0347801 0.1298611 0.0466892 -0.0616427 0.3405434 -0.3073259 -2.7795680 0.5409149 -0.8872243 -0.2471622 0.2137169 1.9277769 0.5147882 -0.3700848 1.4759059 -0.0422805 1.3317204 0.7746987 -0.1664838 0.0985348 0.0144394 1.3942021 1.3034790 2.1507294 -7.2601757 -0.8871171 2.9149029 -1.2387141 2.3306241 0.2587926 -1.0009457 1.6700424 2.8025656 1.6172014 -2.4746752 -3.5996544 -2.1117537 0.2451828 0.0525940 1.6607282 -0.5775242 3.7894065 6.6895103 2.3956122 -1.1575890 3.0544245 3.2879815 -0.2589035 2.1524127 -12.3533344 -0.0260085 -1.5329542 -0.6121554 -0.0007512 -0.0902793 -0.0275680 0.1365289 0.0672683 -0.1529804 1.0623622 0.0136239 0.1054219 -0.3808365 -0.0604822 -0.6922979 -0.0812242 0.0399198 -0.0600172 0.0467748 -0.0442808 0.0123731 0.0360786 0.0399103 -0.7726055 0.1396140 0.4002925 0.3075750 -0.1561397 0.4405016 -0.0114453 -0.3461356 0.8555699 0.0626076 -0.0192064 0.2729844 -1.0507809 0.2779522 0.0687338 -0.3477984 0.1662207 0.8445267 -0.0463217 0.4189113 -0.9390706 -0.0203188 -0.1200564 0.0226041 0.1696569 0.1107403 0.3973965 -0.0507052 -0.0034352 0.2814111 -2.0373840 0.0331449 -0.2563670 -0.0774897 -0.0276223 0.5286238 -0.3287178 0.0094798 0.1167211 -0.3344882 0.0748210 0.0073864 0.2270324 -0.1329063 0.0657733 -0.2620256 0.1272652 2.6806898 0.1451955 -0.3688619 -0.0573825 -0.0026473 -1.4063979 0.0915106 0.0988936 0.0024541 0.1005162 0.0805478 0.0545004 -0.0728321 -0.0241168 -0.2567847 -0.2294762 -0.1204137 -0.1006888 0.0086139 0.0208463 0.2052723 -0.0106409 0.0862121 -0.0558647 -1.0205413 0.1075240 0.0013056 -0.1033889 0.0264373 -0.9869907 0.0906636 1.0945570 -0.8835344 0.0562170 0.5911226 -1.2198995 1.0414659 0.0284790 0.1317847 0.0196796 -0.1169835 1.0705899 -2.4347315 -0.4600926 1.1623714 0.1153464 0.0636273 0.0334461 -2.3497996 0.8897749 -1.4781584 1.2471260 0.8867357 0.2396651 0.0594848 -0.2209702 -0.0342018 0.3802297 -0.0611123 -0.1112461 0.1577522 -3.2322116 -3.3970857 -2.5904546 1.3487362 -5.9504533 -3.1391659 1.8067216 -0.7993308 -7.2456965 -0.1568482 1.2572027 -1.4401498 -4.0011482 -0.1910071 -5.6584945 -0.1203423 -5.8549085 -1.4896387 0.4756433 -6.7924542 7.7412653 -8.1289482 -48.9256477 -6.3458443 5.4045677 -0.2998142 -1.3212640 2.2055082 2.1687455 -2.4037228 3.0430715 -30.4192333 0.7205519 -7.4651303 -30.2548523 -3.1645453 -14.4408894 -2.1001110 -2.6349952 1.0409087 13.5214796 -6.2673659 0.5296541 -3.5309846 0.4971373 1.3223007 -3.2411871 -1.2751986 -4.0202475 0.6185231 1.9374349 -0.0164132 -0.8919114 3.0520551 -26.0942879 5.2621427 -3.3140781 0.7132355 -3.0803657 -1.9250480 -10.8665295 6.4131942 -1.3950034 0.9393018 2.8172545 -0.5398058 -2.6951327 0.7859102 1.4477035 -10.5705709 -18.5408764 -4.9044237 5.5773854 -4.4552469 -30.5297241 -2.0850534 -9.9983397 -6.8487859 -7.3156481 -0.4426461 -6.0889754 -5.3855448 -0.8959418 -8.6352024 0.9256810 0.9409679 -1.3378013 -1.0801611 1.7652578 1.4025630 -6.2079029 -5.2619028 -1.5668679 0.4583636 1.2826126 -1.0220591 1.6147118 -7.2312889 -0.1504498 15.2977791 -6.9285183 1.5020087 -2.7795529 -4.1656466 3.2019677 -4.0279698 2.0419314 -2.3618057 1.2594402 -1.3930367 -1.4888012 -1.9573524 -5.2215033 -4.9446783 -6.7220607 -20.3374920 2.5322552 3.1068349 -0.2105089 17.1908169 -1.4786845 -3.1754026 -6.6440439 -1.4124051 -2.0243771 -18.3043995 -2.8324366 2.7155826 -1.6222187 -2.9387450 0.6856448 -1.6945328 2.4372234 -4.7383180 2.4229913 0.3950617 -2.4376616 -3.5219579 1.5188578 -1.8561926 -0.2492484 -0.9473314 -5.9489059 5.2853098 -0.7109069 -0.0157063 -0.4613958 1.1450322 -7.3089786 0.1853954 14.6840630 -5.5545049 -3.0968945 -0.7716819 0.8763232 3.0894682 5.3094249 -0.3870368 8.6047468 15.7315598 1.3255874 -2.1042223 -14.5519381 5.9867616 4.3786263 -2.0013292 -1.4595822 0.5171161 -1.0090964 -1.7960491 -0.8895781 0.9326519 -1.0980855 2.1702888 -10.2663660 -4.5459118 1.8008790 -0.4540470 1.4611557 5.9754009 1.5395572 0.9517490 -5.0888324 -4.5710201 -4.0871778 3.1449528 0.0142460 -3.1030557 0.4038712 -0.1465476 1.0190895 -2.3042669 0.6631762 -2.2369564 -3.8459725 0.7990128 -3.9721575 -0.8389199 -18.1372585 -0.8478070 11.5389404 -2.7383270 -18.5927620 -0.2438231 -1.9326971 -0.2424866 -3.0955379 2.8918726 0.3585581 -10.8956995 -1.7734140 -7.4830599 2.0871544 -3.3265150 -1.1180468 -2.9659054 -0.1370085 0.4657961 0.3262459 -7.2496514 0.2696460 0.0264098 -2.0519950 -1.0636863 2.4031641 0.3241766 0.2739710 -12.3238392 -0.2383248 1.9826796 -2.2914941 -9.9471731 -1.4447718 4.0974603 -0.6826478 3.4126022 1.8454459 -1.8290281 -2.1784034 -7.2271910 -2.4015536 3.8292482 -7.9308100 7.4359298 3.4935303 7.2328625 -0.2867791 -5.7698231 -0.4683338 3.6335580 -4.9119077 -3.3912687 -3.1146934 -2.3998766 -2.3738582 -4.5313406 -0.1249077 -2.5766571 -0.2633151 0.5827929 -0.0102638 -0.4675201 1.1197441 -0.2634287 -0.9810774 2.1178784 0.0240199 1.7966956 0.4486583 0.6958126 -0.5592176 0.7143757 -0.2308202 -0.2057951 -0.1695755 -0.1884696 0.1524629 0.4318085 -0.7340412 -0.3757761 -0.2018428 1.3456241 0.3472595 2.2938006 3.4002869 0.3547116 1.3902000 4.9148612 1.2608790 -0.4909512 0.2261951 -1.5480191 -3.2674530 -1.2904224 0.9380157 3.7049270 -2.8954718 -0.2636299 -0.2491706 0.0429993 -1.9147912 -1.1243407 -4.4608679 -0.5711940 0.2909312 -0.2874681 -2.2197828 -0.1868961 -0.1213937 -0.3738415 -0.1248211 0.0977516 0.8562511 0.5393513 1.3627771 -1.8543321 -0.2820470 -2.0323913 0.2916196 -0.2940783 -0.2373090 -2.5389802 -3.2904749 0.1572880 -0.3732952 0.6292738 -2.1845279 0.1350910 1.9240508 0.3715656 -3.1876569 0.1646337 -0.6088069 0.2006577 -0.0150909 -0.4441674 0.4740311 -1.7266496 0.0180674 -0.6572212 0.4401225 -0.1878517 -0.2524693 -0.4355834 -0.1396877 0.0550074 -0.1925609 -0.2516395 0.0898888 0.0846063 -0.3928412 0.0337045 0.0820120 -0.5271019 3.5371125 -2.5813932 0.9434291 -0.2566399 2.3882284 -0.3222601 0.1242741 0.8639933 0.8624133 0.8548640 0.6617858 -1.0582361 -0.8082041 0.2144688 1.0025942 0.1443437 1.5017653 -5.5424042 2.3278840 -1.6295186 2.1870461 2.4686630 -1.3312199 0.0451411 -0.7905246 -0.1877859 0.0209118 -0.2523426 0.6146771 0.2999980 -0.0107269 0.0981331 -0.0321946 0.0270462 -0.0259292 -0.0118601 0.4682398 -0.0383226 -0.0836610 -0.2209502 0.0371973 0.6564331 0.0847704 0.0817372 0.0045585 -0.2173324 -0.0548910 0.0202611 -0.0136947 -0.0044441 -0.3063887 0.0004424 -2.0280807 0.0349874 0.0953196 0.1606619 0.0135715 0.1847503 0.2833286 -0.0201945 0.2586319 3.8393552 -0.1301654 0.0726724 0.1022688 -0.2124913 -0.0439796 0.2836218 0.0740972 0.4565484 -0.1461185 -0.0713599 -0.1248173 -0.0218281 0.0443511 -0.3200964 0.5830702 -0.1174910 0.0165006 0.0951628 0.2610878 0.0203642 0.0181004 -0.0179711 -0.0714640 0.0004931 0.1609273 0.0868199 -0.0044473 -0.1663203 -0.0093576 0.0002889 -0.0003348 0.1787268 0.0107497 -0.5786875 -0.2642264 -0.2903223 -0.0636490 0.1124149 0.0149458 0.0535091 0.3443199 0.0642157 0.0327608 0.0799331 0.0189601 0.0229411 -0.0084383 -0.0084653 0.0181651 -0.0979015 -0.0109543 -0.0210922 -0.0274706 0.0481488 0.1441308 -0.1403372 -0.0644397 -0.0084871 -0.0520606 0.0716123 -0.0008158 -0.0359933 0.0032231 0.0351632 0.9699090 -0.0734550 0.4568501 -0.3387708 0.0567462 -0.6990073 -0.0033069 0.0052053 0.0536267 0.0292696 0.0864594 0.1064844 -0.2481527 0.9073180 -0.1180353 0.4786535 0.1217053 0.0202913 0.0953674 -2.1578226 0.6153037 0.7806525 0.4316314 0.1701435 -0.1372688 -0.0305231 0.0884112 -0.2008203 -0.1564242 -0.0254393 0.0483122 0.0933959 -5.2375908 -2.8861392 -4.9702172 3.0911498 -4.8089070 0.8603559 1.4895865 -3.0678844 -10.7631989 -2.0127139 4.2576475 -1.4485056 -5.7504830 -2.8125823 -8.6889753 -4.1925473 -2.0287800 -2.2261019 0.4933807 -4.7819204 6.0728383 -3.7807477 -52.2121735 -3.4426169 -7.3699083 0.6957636 -1.7006308 2.0694838 2.1687489 -2.3738508 2.3179448 -33.6088066 0.8893262 -8.7561111 -24.3579445 -1.8300079 -18.8091335 -5.6021290 -3.1019783 0.4304942 16.2661629 -4.6572194 -0.1084687 -2.7561791 -0.5319909 0.4164639 -4.4203663 -2.5664916 -0.7007174 0.7009003 3.0212946 -0.3302842 1.5551152 -7.1257229 -20.1555004 7.0335240 -4.3428879 5.7828727 -1.2213671 -1.3351549 -14.3628998 3.9249828 -5.6322951 1.6120391 0.8727090 -0.9617823 -3.4990449 0.7130517 -1.2264053 -6.4612122 -17.6097355 0.2039550 1.0608712 -3.3463531 -25.8502560 0.9387711 -2.0807710 -0.1268839 -8.6496601 -3.3355134 -0.3625455 -5.0883017 -0.6798175 -7.8792114 -0.1746651 0.9263111 -6.1660709 -1.3615183 4.4886580 -6.3465915 -5.0744944 -7.7954612 4.2269893 1.2718039 -4.4697046 0.1234098 0.7792508 -10.0499277 -0.4600905 20.7610798 2.6482852 1.2036600 -4.0227170 -3.7673388 0.4897391 -2.9045994 3.1201835 -6.3035259 -0.2233889 -1.3261135 -3.0561452 -1.6230297 -2.8727036 -0.4967648 -6.7620716 -24.4891319 1.6710927 3.1537282 0.1687525 15.2972145 -3.7971756 -2.8764365 -3.0013595 -1.4212106 -11.1017361 -11.8575954 -3.9120784 6.3304982 -0.2576952 -0.1004794 0.7596916 -0.2244040 -0.1093295 -1.0044523 2.5794556 -0.0480789 -3.9350836 1.6208833 -1.4639589 -1.4766074 -0.4823118 0.9388589 -3.4583187 19.6713448 -0.1398788 -0.4345915 -0.3477088 -0.7815750 -4.2033458 1.3564619 6.9951673 -0.8844977 -1.0055721 1.2832747 -0.8420368 1.0024925 6.1021075 -0.9046868 4.9563131 8.3111324 4.4264917 -1.5287484 -7.4091620 -4.5008202 -1.4930451 2.4946940 0.0657190 2.4631624 -2.9398944 -0.6289389 -0.3264770 -0.1663569 -0.8580079 -2.7419810 -4.4353380 -2.7757850 -1.2538058 3.4348979 4.7621636 5.4856300 -4.0404673 1.4252834 -5.0022182 0.0431406 -1.1380365 -1.4838300 1.6553702 1.9769377 -0.4511542 -5.6317863 0.1712033 -5.0610218 0.0519625 -3.4699233 -4.2822518 1.9366316 -1.9791768 -0.3691685 -10.4390717 -0.7766237 1.7874916 1.3511523 -9.3704138 0.1502425 -0.0733551 0.2103251 -0.2108355 0.0173496 1.6378195 -6.9869924 -0.9890974 -2.7488704 5.5454760 -0.3580631 1.7174535 -3.3734705 -0.9892028 0.9566746 -0.2759559 10.3206205 1.3044815 -0.4081397 -0.7769527 1.5857191 1.6240749 0.5544574 1.1013175 1.1237600 -0.5635561 2.0999367 -2.1990690 -3.4324589 0.1665262 -1.6415998 2.6947622 1.4472625 -1.7152395 -1.6368082 -1.9334615 -4.8677855 -1.7288681 1.1588154 -5.2181830 -2.0040576 3.0353270 0.8119161 0.2781351 -3.7273526 -0.8049981 -2.3875618 -4.2524037 -0.6808268 -7.4182215 -2.0896461 -2.9412708 1.5747083 -0.1502217 0.5276759 0.0082601 0.3080880 -0.0665850 0.0350966 1.0862949 -0.3567851 -1.5598443 0.7014297 1.0979054 0.1780576 -0.7473863 -0.1367017 -0.5749516 2.3684218 -0.1864838 -0.1726867 -0.1607224 -0.2188067 0.6594474 -0.2417127 0.4631378 -0.4521298 -2.4311924 1.6233894 0.1777303 0.7581421 -0.4648223 0.5833182 -2.2030432 3.1719539 0.2667055 2.6940503 0.3712637 0.9660332 0.0750631 0.7926187 1.2155075 -0.2323462 0.4239601 -0.4868425 -1.6429570 0.1224148 2.1972160 -0.6723076 -2.5241499 0.1434933 -0.8972561 1.3789172 6.6877494 -0.4687901 -0.1089353 -0.3211627 0.1841050 0.3243982 -1.2793636 -0.5888627 -0.2815343 2.1836197 -0.0752629 -1.4004849 -0.2389414 0.1256529 -0.3752684 -5.5496874 -5.9528294 -1.6063184 -0.4406793 0.6151813 -2.9939811 -0.2636888 -1.9964770 -0.2928286 -3.9683876 0.3439159 -0.0786297 -0.0215480 0.0062624 -0.0726835 1.0348228 -3.6308336 -0.3796632 0.3726776 -0.2125787 -0.0386692 0.2277291 -3.7829764 -0.1550695 -0.2310608 -0.1236004 2.6234856 0.1986173 0.1918195 0.1841764 -0.1581630 -1.8326945 0.3378488 0.0961512 -2.5388832 0.8020549 -0.4446724 -4.5030146 0.8623773 -0.5121753 0.1654362 -0.0862902 -0.1832581 -0.2505657 2.5836780 -1.2727581 1.0478178 -0.7600110 0.0164463 1.5554070 -9.6063070 -1.6384413 3.1083541 2.1726601 -0.7476462 -1.6742749 -0.2249296 -0.2008566 0.5749042 -2.6787570 -0.3384526 0.3623639 0.4513468 -0.0122557 -0.0573512 -0.0683135 -0.0334900 -0.0601799 0.0534098 0.7491255 -0.0262290 -0.0623313 0.2120880 -0.0696942 0.7820339 -0.0673136 -0.0861434 -0.0661329 0.0579689 0.0257090 0.0101797 -0.0071019 -0.0872075 0.1339272 -0.0519342 -0.2864373 -0.0610206 0.1324099 0.2261655 0.0768708 0.4359205 1.6366464 0.0285848 0.1627170 0.7066023 -0.0266788 -0.1152651 0.0992618 0.1129509 0.1171538 -0.1227058 0.2432617 -0.0626220 0.2729228 -0.0653202 -0.1501485 -0.0289082 0.2187806 -0.0945949 -0.2524701 -0.0796201 -0.0502542 0.2093131 0.1028645 0.0000423 0.0769065 -0.1176412 0.0827132 -0.0651428 0.1422089 -0.0278778 -0.0348578 0.2973427 -0.0294428 -0.1032725 -0.0359135 0.2446783 -0.0796275 -0.1893528 -0.1559840 0.8140917 -0.1341283 0.1299631 0.1785766 -0.0445511 0.5183620 -0.0934166 0.2537285 0.0513431 -0.0469167 -0.0465138 -0.0403468 0.0178513 0.1292710 -0.2765153 -0.0284857 0.1058964 -0.0758154 -0.0238170 -0.1263215 -0.1813064 0.0337478 -0.0115155 0.0129960 -0.2342513 -0.0725962 0.0393330 0.0528087 -0.0823852 0.3095395 -0.0751051 0.2944116 0.2779206 0.1772929 -0.3532604 -0.1792663 -0.2623303 -0.0956494 0.0462648 -0.0668880 -0.0983899 0.2623432 1.2518077 -0.0956270 1.6918572 -0.1267214 -0.0150874 0.2922495 0.0375747 -0.2201172 0.6162744 -0.2202619 -0.1382442 -0.1990818 -0.2463420 -0.0400512 -0.0830351 0.5095297 0.0044555 0.1626091 -0.0426764 -5.7329264 1.3535995 0.1960057 0.4899553 2.0128992 -6.5118866 1.7077829 1.3146244 -6.2618151 -2.8339674 -1.2005950 -1.0949633 1.0552971 1.6661378 -1.1805359 10.9729795 -1.1657708 -1.1449385 -0.4677442 -1.2508072 -0.1321033 -1.8100245 -14.9621458 4.5868335 6.6565690 2.5990324 1.2157607 -0.2224818 1.6775117 0.8219866 1.6660736 -13.7316771 0.4021138 -10.2091637 -18.8992634 2.6156769 -13.2226267 -4.7358680 -4.4244547 0.8791288 5.1384530 -1.4779580 -2.4485211 0.1991626 -0.1194479 0.1259557 -6.7490907 -5.0191593 -0.2520251 -0.4743612 0.0791776 1.2979100 -0.4475564 -2.9920766 -8.0729876 1.0392332 -10.1325703 5.4487405 1.8187975 -2.6033146 -1.8717504 -3.0400288 -2.0798771 3.6901770 0.9064040 -1.3790972 -5.4938660 0.8302031 -1.7593707 -6.5600815 -16.3083439 5.3070936 19.0100155 -0.0412090 -20.3634033 0.5008726 2.8102937 -0.7792552 -7.3281064 -0.2821772 -0.0385069 -6.7319789 -3.2460124 -8.5225935 -3.5442595 0.9083712 -3.2080817 -3.2184629 -1.2642151 -1.7634363 -1.1981586 2.7848268 -0.8830817 3.0232468 1.1746985 -0.6352356 0.0683830 1.8379709 -0.2551870 23.6681347 -1.3227406 1.4658194 -6.3335352 -10.6421480 0.5526839 4.1167159 2.7414284 -10.2336807 -2.6835997 -0.3714256 -4.8314829 -2.4037004 -2.5860145 1.3206044 -4.8944120 -21.6338749 0.8860834 4.7607880 -0.7686963 9.1745920 -1.0152423 -2.2136157 -1.3390321 -2.8285475 -15.7539320 -1.3619487 -2.5235875 -3.5140800 -2.2402289 -1.0843099 -0.6020510 0.0990157 0.4397512 -0.7102028 1.8375094 -0.3441994 -3.0294826 0.8233774 -0.5492586 0.2384323 0.7927989 0.3301882 -2.2628272 7.2486572 -0.3626696 -0.3632125 -0.3970028 0.7028610 -3.7728906 -0.0044664 2.4446230 0.5887486 0.0920285 3.7837541 0.7200469 -0.8479402 4.0336246 1.6565328 3.2104070 5.1139822 4.6660547 -1.5146648 -4.1387324 -2.4671991 -2.3622904 0.2799580 -3.5181580 2.6804655 0.3249692 -0.6626521 -0.4955037 0.0043194 -1.6435297 0.4646824 -2.5994678 -0.6044612 -0.0795785 3.5680115 -2.2423663 2.7953010 -6.1297483 -1.2283367 -3.2126348 3.3164525 -1.0372813 0.3936899 0.0796308 0.3695662 -0.0129723 -8.0949278 -0.0425152 -2.3999166 0.0820303 -4.5711164 -2.9411418 -0.6706640 -1.9066042 -1.1449314 -5.7779198 0.4134691 7.9780049 -0.2187235 -1.5347018 0.2099342 -0.5249209 -0.2208030 -0.7909708 -0.2090906 -1.0524899 -7.3160205 -0.3281332 -1.0414371 -0.2202145 0.0533220 0.2997119 -4.4198422 -0.1910419 -0.4180379 -0.4441088 4.1234450 0.3880723 0.2291138 -0.3816346 0.3673771 0.7933039 0.9422148 2.3457763 5.2395973 0.1571903 2.8003049 -2.8245680 1.8905324 -0.9663528 0.7836693 -0.1492587 4.0360713 0.0130353 2.7558517 1.2759498 1.8253499 1.0269928 0.0441347 3.4405663 -5.2562718 -7.0566573 12.2559614 1.3413063 0.1282875 -3.4985983 -0.9198121 -2.2775319 -0.3100076 -1.9824977 -1.2321826 1.3098874 0.2656158 -0.0748615 -0.6317893 0.0605915 -0.1806889 -0.4284171 -0.0103636 3.4373968 -0.1493514 -0.2324900 0.3017739 -0.2828013 0.0491752 -0.2278127 -0.0759252 -0.7486235 -1.0593313 -0.1288147 -0.0739560 -0.0502977 -0.2628570 1.0099250 -0.1802609 -3.5141499 -0.2606152 -0.2403178 -1.1402538 0.2103848 1.3841771 -4.6200728 0.6037201 2.5207739 4.6088233 -0.0561066 -0.0051010 0.6800472 -0.2913496 0.3847526 -0.1334768 0.3808167 -0.1712333 0.4376192 -0.4817136 -0.5858625 -0.1607902 0.4497007 -0.3606421 -0.6390776 -0.6513732 -0.1120965 -1.3510265 5.5455728 -0.0961502 0.6276868 -0.4833226 -0.0899848 -0.2584890 0.3029596 -0.1186725 -0.1872065 1.7201921 -0.1419802 -0.7873895 -0.0409729 5.2837806 -0.0929442 -0.4677009 -0.3772097 0.5287036 -0.2403368 0.4432954 -0.0095679 0.0267369 0.2939082 -0.1841248 0.8431963 0.0941588 -0.2217198 -0.1876026 -0.1616098 -0.1175509 0.4802921 -0.3855579 -0.1774579 0.1619803 -0.2098476 -0.1253478 -1.6235878 -0.2930399 0.1654364 -0.0955898 -0.1894717 -6.7442822 -0.7088709 0.0146981 0.1148340 -0.2422530 -0.2449305 -0.3414072 -0.3139189 1.7188839 0.1555677 -0.3026395 -0.5815805 0.7659687 -0.1834642 0.5640656 0.0410555 -1.4606092 0.1523317 8.9061661 -0.2070766 2.5101891 -0.3809749 0.0035136 0.5661937 -1.5991871 0.3441024 16.3940849 -0.1822207 -0.3368097 -0.3887983 -0.7161968 -0.1268917 -0.4526135 -1.9534187 -0.3586910 1.4578992 -0.0939247 0.0185214 0.1141876 0.0228670 0.0150831 -0.0665795 0.0506825 0.8974792 0.0196877 -0.0496231 0.0402681 0.4842262 -0.2584017 -0.0597423 -0.0568374 -0.0075614 1.5613158 -0.0468430 0.0387116 0.0441440 -0.0536164 0.0967783 0.0196258 0.3061781 -0.0346863 -0.2642477 1.6814703 0.1269223 0.1446847 -1.6068147 0.0410920 -1.1299783 -0.6786871 0.2837283 -0.0540909 0.0567171 -0.2627859 0.0584378 0.4984631 -0.0037856 -0.4862310 -0.0184969 -0.0225209 -0.0137365 0.1719105 -0.4944912 -1.7644603 -0.0343032 0.0085586 -0.0452347 1.5627615 -1.4420898 -0.0136471 -0.1447103 0.0302041 -0.0078682 -0.0181186 0.0886795 0.0271207 -0.0423617 -0.0277911 -0.0101333 0.0419511 -0.0309053 0.4107232 0.0221982 -0.0295099 -0.0631366 2.6919332 -0.0325640 0.2784608 -0.0129503 -0.0497508 2.5174620 -0.0485266 0.2332572 -0.0678309 0.0045472 -0.0346028 -0.0349279 0.0037376 0.3889861 -0.0865446 0.0108298 -0.0349181 0.0111736 0.0128780 0.4089845 -0.0380282 -0.0461140 -0.0663787 -0.0091375 0.2737458 0.4909604 -0.0980516 -0.0197257 0.0010216 -1.5457208 -0.0270279 0.1548127 0.0767604 0.0480996 0.7573826 -0.0247329 0.0280031 -0.0354008 -0.1413803 0.0244872 -0.0139036 0.1487667 8.4015808 -0.0097641 0.8832787 -0.0885881 -0.0502487 0.2015598 0.4691496 -0.2658325 -0.2370696 -0.7151536 -0.0828274 -0.0373928 -0.0219146 -0.3469535 -0.0633927 -3.6046190 0.0009027 -0.2890187 -0.0991686 -2.9437621 -0.8258052 -1.5676882 0.4180974 0.2966196 -2.2979460 0.9644591 -0.2142506 1.4781343 -0.4243855 -3.8741450 -1.8305459 1.5039244 -0.2007972 -1.8397371 8.3384485 -0.2623054 -0.2515377 -0.2635742 7.4093747 -3.0851228 0.6311681 8.6755133 1.1290051 -0.1226220 -0.0392827 -0.5244292 1.2454519 10.9369993 3.0387053 5.1933446 6.5600567 0.8458862 -3.6366742 -17.0279064 -2.4613311 -1.3558633 1.6608582 -2.2554233 3.4660776 0.5931596 -0.3655145 1.2014469 0.6608077 -1.3031784 1.2900714 -4.9033365 -0.9001068 -0.9209139 1.2787861 3.5205250 1.4904045 11.9978161 -1.3147351 -4.4449821 2.3661242 -3.6181855 -0.2036301 -0.6868568 0.3258563 4.2389169 -6.9967065 0.4781048 4.1123157 -0.4619678 -2.4482448 -2.2063284 1.1951839 -2.0764344 -0.9103580 -4.4272833 1.0408663 -2.6267445 0.1154196 -7.2420478 0.5312340 1.1016489 4.5792732 2.7862182 0.2041633 -1.6632789 -3.0586865 -0.0723179 -0.8760569 0.4344079 0.7147062 -2.2809865 -4.6411414 -0.4803234 -0.0684522 -0.3105997 3.9843969 -0.6113014 -0.4684303 -0.4432026 -2.0241287 1.0898355 6.5424151 0.9965019 8.4926643 -0.7866200 2.6549549 4.2077012 -2.3882639 -0.5874478 -0.3825210 -0.5651182 -0.4807315 -0.4543911 1.4288938 0.0007269 2.2346575 -3.0223196 -0.3042166 -4.1707783 -2.6627555 -1.8113387 5.0089931 -0.2291697 2.7023199 -1.2841107 -1.5405546 1.9925201 -1.9837301 -12.1031284 0.9191225 -2.4437919 0.2736303 -0.1316282 -2.0411935 0.3711395 0.2608912 -0.6700687 -0.0728770 4.5118098 -0.4164869 0.3192448 0.1563302 5.6412678 -0.7404453 1.5671353 -0.0126142 -0.9156610 9.8445902 -0.1048976 -0.0635343 -0.0971195 -0.4236564 -2.3803687 0.0899614 -5.5635524 -0.4910661 2.0003018 -2.9573479 0.3054476 1.7511545 -3.9623966 0.4986256 3.1410770 4.8229795 -0.5271758 2.9154360 -0.9499019 0.6190221 3.7260811 0.4715143 0.1326838 0.9274328 1.3190634 -0.4845545 -1.4709233 -0.1342633 -2.0720878 -1.5846753 -0.7617089 -0.5736744 -0.2623895 1.3072644 6.5944920 -0.2660395 -6.7463470 -0.6843635 -0.8780469 -0.1081212 -0.0264704 -0.0644531 -0.1826907 -0.5674591 -0.3750592 -1.4536041 0.0925991 -0.6527364 -0.0094537 -2.9160111 -0.9577935 1.9736567 0.1559133 0.1406820 -0.8925554 -0.0641396 2.5672522 -0.3192873 -12.1069756 0.2592662 -0.2731000 0.0836613 -0.7392156 0.0044728 -0.4712690 -0.3302216 -0.4472059 -0.0547802 0.1779952 0.0203625 4.6534729 -0.2523909 0.2750027 -0.1264364 -0.2359166 1.8058962 0.2347652 -0.0381631 0.3791784 0.0803383 0.4257610 0.0811259 -1.2850361 3.9582775 0.4213125 -0.3913043 0.5599412 1.2506834 -0.2393339 -1.9304688 0.1373983 0.0521999 0.8914339 7.9276237 -0.2014821 8.6479340 -0.2328795 0.0486920 -0.5455945 2.8066394 0.0589685 14.3217993 -0.5777289 2.4780023 -0.4937586 -1.1461198 -0.5228316 -0.7749129 -9.1591663 -0.4620694 -0.4246069 0.2971985 -0.3561531 -1.3686264 -0.0450859 0.0965734 -0.4341270 0.1549716 0.7923570 -0.2280920 -0.2735922 0.1807462 4.4434919 0.5692052 -0.1513635 -0.0712561 -0.2453779 5.4743237 -0.0709186 -0.0820962 -0.0161752 -0.2588194 0.9783770 -0.1173083 0.2649139 -0.3065661 4.5140734 -2.0161767 0.0273738 1.7700520 -5.2348213 1.5688574 2.4869695 -0.0872884 1.3989154 -0.5452262 0.5035691 0.9401807 0.2923341 -0.9935617 0.5355800 -0.2714604 0.3371569 -0.0952592 -1.1470122 0.0068729 0.4738999 -0.2146496 -1.0511984 -0.3781667 -0.1981395 -0.3497308 6.0903869 0.1585640 -1.5398049 -0.2694964 0.0094444 -0.1960396 0.5483417 -0.1260695 -0.1390775 -0.1753748 -0.2435279 -0.4127706 -0.1228177 -2.0017788 -0.1746895 -1.3417779 -0.9836789 0.7965214 -0.2383221 1.9193991 0.4870440 -0.0712252 -1.4634405 -0.1960739 2.5395505 0.0317615 -0.1971333 -0.2404716 0.0617052 -0.0442961 1.5890179 -0.7763902 -0.2106365 0.0347269 -0.1672146 -0.1278308 0.5996057 -0.4975534 -0.0523659 -0.0975537 -0.1790493 -3.5625501 -0.6835815 -0.0892841 -0.0185950 -0.1769083 -2.5416441 -0.3368521 0.8860483 1.6225933 0.3234122 -0.7535644 -0.4183370 0.1401421 -0.1255782 0.0596241 -0.2416939 -1.1845893 0.4277512 9.9521303 -0.3554896 2.5991335 -1.1399573 -0.0300027 0.7271241 3.8080461 0.4080400 16.4975796 -0.8770337 -0.2570585 -0.3768653 -1.1138510 -2.0378363 -0.6681331 -0.9379542 -0.0895563 1.5484184 -0.0615296 -0.0225544 -0.0286470 0.0211852 0.0127758 -0.0335603 -0.0386669 -1.0190660 -0.0262637 0.0027641 -0.0567584 -0.2155286 -0.4920657 -0.0755084 0.0188329 0.0112603 -0.2636721 -0.0077508 0.0028424 -0.0210340 0.0205013 0.2010670 -0.0299337 0.2739488 -0.0526390 2.0392592 -1.1186676 0.1296530 -0.0007939 -0.5979991 0.1595827 -0.8700871 0.4294785 1.5056974 -0.0092424 0.0542575 0.0028361 -0.0026908 0.1529933 0.0098332 0.2756010 -0.1532247 0.0040423 -0.0351908 -0.0885927 -0.6119391 0.2135462 -0.0593743 -0.0128680 -0.0627047 0.5459074 1.2785765 -0.0149321 0.0695518 -0.0215248 -0.0120250 -0.0105479 0.0303696 -0.0082679 0.0141292 0.8310845 -0.0506027 0.0099798 -0.0210767 -1.2902638 0.0319132 0.0067534 -0.0312876 -0.3189922 0.0317610 0.3560936 -0.0181680 -0.0039734 -2.1302531 0.0011139 0.1939042 0.0343520 0.0011239 -0.0381428 0.0027111 -0.0293923 0.5112433 -0.0356475 -0.0533330 -0.0758003 -0.0341119 -0.0087197 0.1021186 0.0271860 -0.0475452 -0.0448162 0.0264464 -0.1123514 0.0313216 -0.0542534 0.0210533 0.0322888 -0.1961697 -0.0130860 0.0931583 0.1354744 0.0570037 -0.0788242 0.0557732 -0.0411116 -0.0019649 0.0891902 -0.0250626 0.0365929 -0.0136311 5.1266747 0.0471283 -3.7005289 -0.0216123 -0.0333429 0.0365926 -0.5304936 0.4637747 1.5087703 -0.1257123 -0.0133588 0.0463485 0.0135183 -0.5552767 -0.0218324 0.0841444 0.0081841 0.0387794 0.0244219 -1.7662222 -4.0642099 -5.0071869 1.0570664 -2.4474123 3.2620227 -1.4284297 1.6389083 -1.8892517 -2.3382273 3.0713296 -2.8599193 -2.4036407 0.8509195 -0.9183984 3.9632301 22.6708584 2.0260828 0.1678346 -5.6036096 11.5450716 -0.0269610 -10.0163536 1.2395284 -2.5963879 -2.8134177 6.3749819 -0.4486980 -11.2945318 -25.6046295 -1.2879261 -0.7000679 -0.5991331 0.8031512 -5.3191018 -1.6146562 -5.6463943 -0.2643670 1.0937226 6.6340270 3.2451303 -1.3335922 6.0047836 0.2292063 -6.6123896 1.8759540 -0.7859423 -2.3229878 1.9571521 7.8606019 -1.8348391 -1.8335261 -1.5249568 2.7508729 -3.2799838 1.0823357 -1.1092811 6.2417998 -0.9035324 -1.1830444 -17.2924995 -9.3259678 2.2425065 -2.5308437 2.3820596 2.9204485 -0.0415543 2.2388554 1.8055577 5.4430146 -9.5986280 2.8590286 -0.7471439 -3.0248709 -1.6057730 1.4520628 -2.0081899 -4.9228439 -17.1018887 2.6465394 -4.1555567 -0.6473525 2.5304940 -5.9965496 1.3087283 5.1149931 -1.8436958 0.4474337 -11.6647663 1.2565196 -2.0817950 -1.8693877 3.0951602 1.8141270 2.3602107 8.0201674 2.2103794 1.3854973 -1.4437466 -3.5456841 -5.9447069 5.4629583 -0.2266517 -2.1484208 1.3430508 0.3197209 -4.9037933 0.4331827 2.6700461 -3.7586684 0.5693695 -0.7024121 4.9541531 2.3558621 -2.5477264 -17.9454479 11.5686626 -1.1000177 -0.8136791 4.4878044 -2.1263800 -2.4373493 -0.6759446 4.2771955 -1.4137613 -6.6116548 -5.5411315 -1.2559549 -2.1165552 -6.9338326 -4.7467656 0.7060584 8.1717033 -1.6712912 -3.9023919 1.8405881 -2.2706199 -2.1762512 4.0124578 -3.5884759 -5.4785166 -5.2242913 -1.6744602 1.5792344 -20.9416561 1.8635398 -0.6050773 -4.6954036 7.1426435 -8.3836546 -9.3145819 1.4040573 -3.6832771 -2.6061847 0.4497293 0.1238363 -9.9989910 1.2425938 -2.5431409 -7.4337158 -2.1284008 -2.4234073 -2.5758724 -1.8992406 -7.2180910 -1.0364410 -1.1257386 1.1965958 0.3772071 -4.5542698 2.9986370 0.7656724 -2.5707188 0.9216698 -1.6045402 -0.6429143 -1.9968358 9.0794077 -0.9076270 -1.6227449 -2.6073253 -1.0111330 -5.2364907 -0.8580986 -2.9866292 5.4048748 2.7941456 -2.6714988 -9.1832495 -8.3910227 -4.3406119 0.1070518 3.6634912 0.7401295 -0.9759423 0.8472233 1.8806213 -0.9862729 -4.0373878 6.4414668 -1.3716892 -9.2813931 -2.6787682 4.3672419 -5.3492641 -3.1218619 3.0100613 -3.5240591 -6.9042745 -1.5785912 -4.8029814 -0.7660633 -4.1764450 -1.2890102 -3.7998524 1.3042153 -12.7508173 1.6311809 -3.1390028 -2.3874028 5.6651807 3.1250699 1.5486995 6.8251114 2.3279972 -1.8396482 -2.9927917 -5.7526393 -1.2717619 4.2524753 -0.7969689 -3.0856695 3.3221617 -2.2044842 10.1311731 -1.4776403 1.7714177 0.5655284 2.8710909 -1.5478435 4.1734610 -0.4949091 -0.8842567 -12.5122023 17.0203838 -2.9508958 -1.7925483 3.4418495 -5.2412672 -2.6847332 -2.3728895 20.4245262 14.7678337 -8.2058611 4.3873005 4.5294232 -0.1708955 6.4682584 -8.8541727 5.4309473 -0.6688756 1.0344735 -2.3065095 1.8207417 -2.3268366 -0.0834174 8.0900021 -4.4695687 -5.0215654 -0.8355051 -3.0187247 2.3982010 22.0648613 3.5460172 3.8776670 -4.6721954 0.9272070 9.6684628 -2.3552299 1.3249196 1.1779009 -6.0780005 8.7792940 1.2718642 -5.9886255 -31.9676285 -0.1037399 0.6258452 -3.0252638 -1.8482161 -3.2946587 -5.9745975 -1.5898961 -1.2549767 0.0588976 0.9285979 -0.8950540 -5.7318826 3.8942721 0.6981517 -0.3912514 -0.5813212 -2.3824503 3.8485129 3.3456194 6.2259908 -2.6462576 -0.8669998 -4.4344659 0.8715473 -0.5935267 -1.2711726 -4.6374044 4.7909274 -4.8569169 -2.9022717 -4.8286743 -6.0487170 1.1347252 -2.1145904 4.6320782 -5.2098660 0.0755480 0.7889217 3.1844659 5.7586536 -7.5292439 6.0247793 -2.4299724 -3.6639369 -3.4103720 7.9486370 -2.9392939 1.5296267 -16.4781094 1.1031778 -2.2675099 -2.2191327 3.6056771 3.1569495 -1.8351555 4.5746698 -1.5178941 0.8220492 -11.4590883 3.3360457 -3.9274347 -3.0875964 7.0846047 2.7478492 4.7595625 8.8511009 1.9282596 -3.9060953 -4.7695885 -2.2012403 -1.4196130 3.2920525 -1.2130738 -3.8409479 3.6307247 -4.4599862 5.8340688 3.3853288 2.9220645 -4.6623840 0.0110102 -2.1841772 2.2527370 1.9600637 2.6474867 -13.8039312 16.7034321 -3.5672975 -2.4310939 19.0094624 -3.5341761 -8.1744871 -2.7962229 14.8352194 -9.3462076 -11.5774775 0.4345464 -3.5629649 1.2161329 -2.5134411 -9.5322561 2.0765789 10.9858456 -5.2551560 -3.2758036 -2.4536078 -2.7287192 -1.7443013 5.5420766 -5.2719250 -3.8363984 -3.4107111 -3.5396097 -0.0024560 -27.6494904 3.8609059 0.6540873 -4.4555087 -1.5663501 5.4885888 -1.8818723 -0.1959415 -16.4518661 -9.0729084 -2.0649779 2.5411816 -5.0027194 3.0002534 -6.4833722 -6.1829653 -4.4627428 -1.4104047 -1.3399168 1.4848596 -4.1986718 -2.3550360 -6.1712303 4.9361339 -1.3924634 -9.1454411 2.5301347 1.3656402 -10.6281281 -1.9901689 -3.2355096 5.2703915 -2.0220683 5.6664104 -1.0431089 -0.8672089 -4.4934692 -0.7600541 -1.8096949 -0.3602600 -4.9323473 5.1338410 2.0016253 -4.0977592 -5.8471737 -3.6675386 -5.2455244 -7.9351540 5.7875938 -6.1645608 -1.2224606 -0.5543066 3.3030512 8.0725832 -1.8569767 5.2253437 -16.3573914 -5.7834134 -4.7358556 10.2523117 -4.7369075 0.6548753 6.0115027 -3.8997610 -3.2005596 -3.3831789 -10.1067905 -0.8720360 -4.0519691 -0.9509301 -2.2563057 1.6616700 -14.8604183 -3.6868458 -5.5199461 -4.3250279 8.8150492 4.6961341 4.4147491 6.1583395 1.4760033 -7.7089705 -5.9188457 -15.5282269 0.0379501 3.2102880 -1.8483863 -4.2911534 5.2101169 3.9295008 7.2824464 2.1361914 2.6786323 -1.5290838 3.2728002 -2.9849336 1.8156019 -0.9756717 3.3088837 -3.7842543 14.0047617 -5.6472964 -3.1939590 0.4599388 -5.3108468 -4.7275014 -4.4196100 18.6996880 14.4857683 -9.7777987 3.0348368 -6.3043542 6.1444983 -1.9951568 -11.4032774 -1.9175946 -5.7007737 -3.7405541 -5.3407831 -8.5523758 -3.5776222 -1.0950286 12.0741463 -7.8321447 -3.7454081 0.8344638 -5.0099859 -0.8730492 21.4216499 3.8081474 12.7479439 -3.3783329 -1.2566894 0.9750347 0.8755464 5.7284193 -10.5474110 -0.7136948 11.5601273 2.7779696 -0.4851323 -34.9520493 -3.3420017 2.5417383 -5.5233526 1.7495549 -8.4629745 -1.7659003 -3.8758702 -2.6420515 -1.0459063 3.6220400 3.4602041 -3.3853197 2.5326493 1.7793821 -7.8376117 -2.9254284 -4.0763903 5.5758147 6.7820673 4.8938918 -2.4909494 -1.5587552 -7.5819511 1.6138828 -2.2212005 -1.5423261 -13.5935335 2.6220291 -2.0286143 -4.8825469 -3.1906576 -0.2119775 -17.3363781 -6.3430395 5.8316584 -4.9314542 0.6983223 -1.1297724 3.6664307 -3.3476768 0.2848696 -3.7097616 0.2211912 0.9111466 -4.8709869 14.6804657 -1.5801526 -1.8772991 -18.0701885 -1.5218401 1.7166591 -4.0972953 -10.3324146 -9.8678198 -0.7918494 2.4878848 0.6603547 1.0213557 -7.5338812 -4.3708792 -7.1512203 -4.1291528 8.0325556 1.1088998 7.1747551 4.5079918 1.6661106 -12.0445566 -7.5842834 -1.0672750 1.6295674 1.7672400 -2.7954330 -5.6903872 5.0118313 -7.5382266 -5.3586659 3.9076648 1.5498501 -5.3647490 5.1984763 -3.5923505 -0.8382165 1.2946687 10.9668150 0.0973753 11.7527351 -6.5065579 -4.2019324 3.8483450 -3.2114277 -2.2628231 -4.7404976 14.9423885 -15.4275255 -8.4198570 7.2134261 3.4876983 2.7576509 -2.0187612 -13.4146652 -1.2372689 3.6485102 -5.1875215 -8.6747913 -7.8715334 -3.9717021 -2.8813798 4.6732330 -11.2126999 -2.5746818 -1.5689600 -4.9105382 -2.3654604 -29.2187977 5.1573110 -5.0595059 -2.7933521 -7.6221957 3.3331087 2.3335242 -2.6355276 -3.8299930 -1.5348382 -2.7606299 5.0284042 0.1499500 5.3965821 -3.3373299 -1.3264720 -7.1374702 0.5634471 2.3525980 2.7741873 -3.0135064 -3.1287272 -7.4278727 -0.1973765 -0.9878579 -7.7969708 2.1041296 2.6257944 -13.6298599 -4.3492646 -5.2147961 -6.0581765 3.3418918 3.3539243 -0.0771626 -2.1919422 -5.9565444 -0.2056055 -2.1549165 -3.7057347 -12.4166870 1.3258193 -3.9252524 -6.5212245 -4.2422228 1.2852898 -4.0082579 -8.1644135 5.2269154 -7.6408596 -1.3294997 -3.1711287 4.5599427 -12.4369402 0.0659797 -3.4004188 -2.9124653 -1.9742883 -1.7097207 13.3461447 -3.3259277 -0.5158346 8.6769171 -5.2618575 0.6051787 -5.3344545 -6.3375092 0.5572616 -3.1915507 -2.2395916 -0.2670569 0.8106752 -14.1751184 -7.7289748 -8.1443768 -6.6905699 11.4193554 4.4290090 5.9690118 4.0305896 0.2892665 -11.7657471 -7.6777978 -3.5832202 0.2940756 0.8173257 -3.1262856 -5.3607140 7.3211980 7.9423776 1.6894804 5.2293139 0.2649180 -3.8642843 2.8597224 -4.6383028 -0.2097632 -2.0918121 -1.0074449 0.7647159 7.6497469 -8.5784616 -5.0971823 -1.7404804 -5.1853194 -4.1348586 -7.4954329 16.9340897 14.2267141 -7.7901912 1.3950328 -8.6086550 -4.5016069 -5.4270196 -11.4790354 -2.5811718 -7.0836353 0.9606227 -5.9439216 7.0754042 -6.8400588 -1.6571586 14.8586445 -7.9763889 -4.1669054 -0.7324411 -6.8061590 -2.9199042 21.2288151 2.9794912 1.8817992 -0.1850094 -4.1894617 2.8412144 3.6299887 -1.6279184 4.1070170 -2.4744473 15.5572052 3.7007773 4.8096862 -25.4080162 -4.3522043 -0.0095736 -7.6089659 1.8564080 -7.9380679 -1.5013629 -3.1800907 -3.6760747 1.5404389 4.5864496 0.8102773 -1.7904775 2.8215997 0.7195874 -8.3545837 -6.1543674 -6.2235651 6.8698368 6.2531476 2.5405509 -1.6601713 -2.0803239 -9.0468121 2.2982435 -3.5849743 -1.1667904 -7.1595774 4.0071039 -19.9459419 -6.7820826 -0.8377301 6.5697150 9.9509506 -2.8503768 1.2713871 -3.3292654 1.1614845 -3.7486746 4.0704160 -6.4619918 1.2111291 -5.2241430 3.4431911 2.2761376 6.9655342 24.7261810 -0.8619550 -1.6591368 -20.0270958 -2.6069860 4.4627995 -5.9779201 -7.1788483 -6.9718885 -1.0197479 0.6163404 3.0343812 0.3404124 -2.3790817 1.9501462 -8.9577188 -4.8169284 6.8692541 -6.0469456 10.4613714 1.6445628 0.2026711 -6.8757305 -8.2307482 -3.2298973 5.0642276 -0.2249359 -4.1456265 -8.0314293 5.6791496 -12.0653467 -4.2004023 4.3888164 -0.3404537 -7.5684404 4.0966496 -5.4317832 -2.9340634 1.9428791 1.1356994 2.7722328 4.5175138 -8.8319464 -5.7369795 -2.8548310 -2.8746195 -5.9623451 -7.4481559 11.9195032 -17.9200020 -4.4707327 8.5136757 -0.7873330 -1.7912624 -3.6690993 -17.0452843 -4.9836907 -5.0980062 0.2877248 -9.0471411 0.0503480 -7.3697309 -3.3794580 -0.8046383 -11.5567007 3.0493834 -2.7470877 -6.1182861 -3.4622138 -28.4191017 6.0559134 -6.5607529 -0.0523371 -7.7509737 2.7528133 5.6308470 -7.7022905 3.0608737 0.7734367 -5.2440071 5.0576162 6.1859708 8.0291109 -5.3371992 0.9067662 -9.3064766 2.0641983 5.3421240 -5.2713728 -1.4800857 -4.5647845 -8.0660820 -1.6859584 -1.4040507 -6.7840247 2.7743962 2.5110414 -10.5172081 -7.6236649 -7.1720462 -3.3337171 3.5710075 0.9699402 0.0661309 -0.0576257 -7.2973099 0.3347032 -3.9394948 -2.6762211 -8.4974003 2.0364289 0.8042263 -8.1220427 -0.7431934 8.4827185 5.5220113 -4.2704606 -2.2898610 -9.7729979 -0.7628044 -5.4842167 3.9966772 -12.6290894 -3.4740136 -10.6219587 -2.1125648 1.3230892 5.6788564 3.6268647 -2.3297391 7.9466014 8.4906168 -4.4481902 4.0809565 -7.1436810 -3.5186193 -1.8655562 -3.4019628 -1.5690863 2.2887127 -0.7892473 -9.6364031 -2.3877389 -8.0958080 -8.0838156 -0.6457844 6.8601785 4.9000487 1.1652398 -0.8877103 -3.9775379 -8.2284250 -0.9565594 0.6374779 -0.2464200 -4.3580770 -8.6363592 12.9893036 14.1804285 -0.9648667 8.7604685 -0.7921626 -5.6745853 2.1256771 -5.9200397 -3.0021830 -4.0736456 0.6659829 -1.6805645 -0.2438311 -11.4996595 -6.8224030 2.1617849 -4.5849047 -7.0575719 -10.4107399 13.2562237 10.7382717 -6.1372743 -15.2761669 -13.3145943 2.5311289 -2.6247497 -10.5253572 -6.7595310 -1.2202797 6.0910177 -3.0414441 8.3791857 -9.8682489 -0.9811649 15.6739607 -4.3270860 -0.6429479 -0.8791050 -6.6299043 -8.1997709 20.8011265 7.4343586 -8.8712664 5.2980142 -0.6689299 -0.0799094 0.0872908 -2.7411909 -1.1264178 -3.1622632 20.2638474 3.1754222 12.8335896 -16.2250252 -8.1424141 -5.3775935 -9.3468742 0.9851265 -2.5437698 -8.2359371 0.7809063 -3.7339685 2.2564225 1.9836301 -4.6706176 -0.5757421 -3.4767144 2.0241103 -5.5589128 -8.8667927 -8.0548220 8.2628365 1.2080450 0.7826297 -1.3117599 0.9254554 -9.5992651 5.1478844 -4.9735222 -2.4263997 -6.2455692 2.5417001 6.4300580 -8.8446312 2.0523489 13.5040112 14.7882471 0.0874944 -0.3829092 -4.3558168 -4.2934875 -6.4155793 5.0531521 -12.8709126 18.1463451 -9.2522669 3.3379624 6.5590787 22.9650669 33.9936256 2.7204113 -4.6583295 -18.4043484 0.8078451 9.4031353 -8.1537552 4.9035363 -6.3271079 -0.1808422 -0.3633386 7.3864660 1.8034055 4.4340925 -1.6001188 -7.4005547 -7.3787460 -14.7621737 -3.0214257 12.9896221 0.4974648 -0.2723637 -2.0112793 -8.2074757 4.8317299 7.9141088 -0.9701375 -4.0996823 -11.9582157 -8.8310318 -26.3380585 -2.3486984 -4.0070443 -1.4632515 -7.6098752 8.3208952 -7.2799439 -4.8843508 4.6072025 11.8637991 -25.3567047 -2.3817134 -11.3223066 -6.4121175 9.5324755 -0.5699246 18.0553112 -8.8364553 7.1651158 -9.0130587 8.0663576 22.5451107 9.6374731 -1.2852384 -2.9071026 -16.8054676 -7.8965931 -1.5932595 9.2896538 -3.6368678 3.4845581 -12.7586002 -1.4020395 0.2003284 -5.2578349 7.0771217 -4.1718564 -6.3899622 -9.5548534 -23.3204002 11.3025703 -11.0673456 6.2629986 -11.8162966 4.1306071 -0.1593582 -8.7400913 -3.7081997 -1.4939053 -22.9499779 3.1847005 14.5103426 13.6843472 -4.8400102 -6.9512939 -11.2083836 2.1901331 3.1269672 -7.0162592 -2.9836862 -5.8104396 -4.5776124 -2.4436231 -9.5914316 -3.9091549 -2.6016111 -0.2111100 -4.4449272 -11.0687332 -9.0417976 -0.8813118 -0.7617542 -0.8291354 0.0651253 0.2757224 -7.3658633 3.6170502 -4.2133479 -5.3010812 -6.3751163 -0.0414672 2.2087970 -8.4496183 1.1425529 15.5075417 12.1724634 -1.6848391 5.6776323 -8.6034393 -7.2647786 -8.0198545 5.1657553 -12.0520439 16.7101803 -12.8490276 -0.0035612 5.9870043 23.0040436 -21.2390919 1.7445966 4.6455169 11.0410585 -0.6941456 9.2211781 -8.0897608 -15.8312263 -4.0159478 -2.7330468 -1.8888493 6.9055591 -0.6110986 -5.8210473 -7.4419394 -8.5661831 -11.3342094 -7.1733789 -2.7389979 -9.1674452 -1.7324966 -1.7277306 0.8489020 -7.8170352 1.0706180 3.2766278 -2.6747010 -7.4386926 -13.1720018 17.5383663 20.3235912 1.8927604 -8.8606043 -2.4055083 -8.1413174 0.4824921 -7.5490289 -4.8867416 0.3555307 12.1730967 -25.4582672 -5.6422811 -13.0921192 -8.6447897 -1.0886847 -2.0938764 16.5563316 -12.9795189 9.5871906 8.6222610 12.4654665 -31.1405983 2.6230798 -11.3091269 -3.2605777 -8.7835503 -1.7011944 2.9924991 5.7503729 0.9792013 -4.6619654 -7.1224804 2.8699508 32.6494217 -4.2329860 0.7385224 -7.3526592 -6.6454120 -2.3466601 21.1140957 -9.7254934 -17.2149906 7.7002296 -5.4287877 5.9489126 -1.6025431 -10.7741222 -0.8528514 -8.5822353 26.7733459 5.5789981 20.1927185 -23.6332932 -6.5193434 0.4303003 -12.1380978 -0.9274604 9.2677927 0.2194593 6.6535549 -5.0748138 4.4470792 2.3931346 3.0903094 3.4398496 3.7483566 12.8225813 8.6809845 -11.5978727 -9.4492092 -2.8415627 -7.4774804 -1.9151442 -0.9072504 7.4865127 -7.6633644 8.6108065 -0.9458771 -7.3706670 0.1531160 5.1975121 -2.1842449 -9.5689344 8.9729414 21.4908981 4.4018145 2.0367360 24.6905441 -10.1041288 -6.3276501 -8.8079920 -2.6206973 -19.8089943 -7.8742118 -2.8691669 -13.5469456 10.4677153 -5.9811654 46.6750069 6.9384413 5.7693391 -17.1572895 3.4842117 15.3119717 -10.3181849 12.6921930 -0.9665936 -1.9159173 -0.6070514 12.4122667 -0.2753015 12.0111160 -12.3525162 -3.0428767 -13.1282043 6.4611669 -3.0195646 22.1919422 7.0817819 -0.1487696 -6.4953380 -1.8782372 -37.9221382 11.3282757 -2.6302524 -6.7477522 -13.8510609 -9.6555939 -23.4243965 -1.7193213 -2.5475800 -2.2025499 -7.2680049 2.1671426 -9.4598007 -6.6100278 -0.0626922 8.5562172 -2.8614895 -8.7802572 -15.5949373 -7.4829650 10.6056385 2.4076774 0.3373754 -8.3720427 0.6250901 -17.7618122 -1.3665166 36.9646759 -8.6770544 -9.6552925 2.9577551 -10.0385551 -0.8153612 -5.7839155 -7.7405643 1.4455794 -15.7418137 -6.9308472 1.9134638 -9.0661249 3.1489317 14.8162346 -7.9468884 -8.9192476 -1.9304430 -19.5144806 3.6452081 -13.2469587 9.1888123 1.1442083 12.3431625 1.4590406 -13.6578884 -0.7679132 -6.0106115 -22.7947979 4.3496418 21.5139313 22.3821278 -0.6058629 -2.1346011 -13.6189709 2.9003277 -4.4487858 -3.9186738 7.9210896 -4.3019533 -12.2434435 -3.9921794 -4.2890611 -1.1406424 2.9058654 -10.8205757 6.2626557 -15.8176670 -10.1966648 -2.0280948 -8.2615070 -5.2767801 0.3359416 7.7938685 -8.1629391 7.3352184 1.4046829 -3.7336726 -1.1973739 3.6769564 4.5275416 -12.6319933 6.4553723 23.2699699 -15.9319792 1.0620064 4.1915245 -4.4686422 -10.2769156 -12.7312984 9.3993549 -16.4713650 4.0951748 -4.4742818 -14.9224205 9.7783356 -7.4765849 -9.2303534 5.9122753 1.0988339 16.5315361 0.7252992 14.9795265 -9.7407770 2.2463129 -3.4864893 -3.6036892 -1.3486843 12.2444201 -0.2609667 0.3249192 -15.1429224 -4.5837317 -18.7823296 3.4161050 12.7714138 -1.9457550 -9.2538795 -4.4664216 6.3611627 -1.5625468 -34.9922218 6.1069469 -5.9796333 -7.0395231 -16.8785973 26.0636864 28.0608559 -4.0291486 -14.5263710 -5.2504516 -7.7943053 -0.2423908 -8.9659042 -5.4902744 0.3718460 6.1919384 -0.3601552 -14.8840504 -16.0146904 -9.4721775 6.6974831 0.9677572 -5.1171098 -11.8679533 4.5309558 -2.2440464 1.6040440 -28.0603561 -18.4079838 13.1036377 -3.7204068 0.5139511 -13.9831228 2.4135146 0.2233606 -2.2591393 -5.2610297 -11.0331211 -8.1758108 16.3737717 -9.4363289 -9.9414511 5.0865421 -5.2140265 -11.0065479 18.1722145 14.7101727 21.2403278 -13.9111795 -7.7009578 -0.7865391 -5.0455890 7.2979183 12.0322571 2.8601048 41.2445030 5.4485559 -12.7693653 1.1356366 6.6223960 -8.8211031 -14.2175207 -7.9210711 -6.9978194 6.2266393 -4.5858893 -6.0752072 -3.3068807 9.4577436 11.2822151 8.2073288 6.8895798 31.7798290 14.1283197 -18.2888489 -11.3555260 4.8436093 -4.3404226 -6.8981352 -1.0983883 5.4728575 -10.2006474 16.2021542 -5.3024344 9.3185377 15.5805445 -4.5816531 1.5947963 -11.9354544 -2.8396721 31.5835743 0.1471615 3.2514315 3.0773597 -4.2824092 -8.1346655 -14.1639528 4.8778086 24.4756355 -9.7068567 -0.4335846 23.5238743 -1.6746755 -4.0348186 0.8472965 3.8088753 -0.7243130 -13.5722151 4.5587802 16.6712074 -9.8036156 19.9328728 5.6602602 -2.5211165 -3.9073505 13.0805006 -13.1231241 -8.5651407 7.4202561 -8.5688543 -8.7534475 -2.7195647 -2.9396300 24.2540550 0.8752427 -5.4800992 -5.1221395 -13.1550217 -4.2609620 -4.3519530 -8.5505476 -5.5574975 -17.6010876 1.7955893 -7.0493059 11.0590553 3.2780483 -5.9928946 -13.5590925 -0.5818788 -10.8235464 -6.7762303 6.3001409 -4.9665260 9.3150225 -18.2756996 -17.8388023 -11.4498625 -0.5121593 -0.6837397 -10.9031715 -9.6222897 -17.9530582 -1.4849865 44.1774559 22.2894382 32.0137367 3.8078005 2.1934094 -10.7956495 4.8904634 3.8396833 3.4576659 -2.9663913 -6.0647292 -7.8196216 -4.6747947 9.8570929 -3.7611442 5.3617148 14.8557730 -10.3002176 -6.7027411 -8.6575003 -6.3615384 20.1106510 6.7746935 1.0661088 -6.7067270 5.9761024 2.3372686 13.1746321 -8.1920404 -1.3878105 7.8024163 -10.8416815 6.5852032 2.5310097 -3.4218152 -11.5785351 -2.7101371 -4.5803289 12.0096073 -3.5415533 -2.5783494 -2.0309186 0.3413336 8.2971497 -10.0644493 1.7226332 -5.9297194 19.3082504 -19.6163864 -10.3416147 7.0346723 -2.3144736 -7.4277015 2.7810135 11.8333702 -9.3760176 5.2848840 -1.2715163 4.1463146 13.1341848 7.4372921 1.4880352 -6.2614331 -4.3022404 24.7440491 14.9543839 4.6130180 13.4244337 -2.2615573 -14.5472403 -15.5704861 -1.7733489 22.0229397 -10.6524458 -0.1251269 4.8606949 -0.3888856 -4.9404049 -4.4511790 -4.1853962 -4.3241081 1.0097306 0.2472879 -4.5214047 -14.6745434 7.8001285 5.1100750 -5.7925677 2.5115383 7.4037390 -5.1609197 15.1721439 4.4809995 -1.3565425 -4.2668271 14.4820614 14.3894367 -4.3105521 6.8361320 -5.1596756 -0.0029916 -5.6515894 0.9663838 5.5679078 -8.3480043 -2.0371525 -15.5891829 -1.0488513 15.0979185 -3.0352442 2.5238914 -8.0267715 -14.0991154 -6.5605326 -5.6848235 -4.6577802 6.0442839 -19.7848263 13.0467348 -26.3901272 -11.9223986 -5.0719128 -10.9756413 -7.0592728 -22.7367458 -6.1827898 -11.1940918 0.4498825 0.5567388 -8.6270695 9.8448257 -98.5486908 -13.8258972 -37.9648895 -7.9996986 -25.7499771 -48.6935501 18.1942177 -10.9647388 -12.4792185 -31.9926643 9.7906084 9.4039364 -20.8972607 -10.0850105 -58.4252281 1.7267705 -53.7836227 -38.8501816 -13.5233507 -157.1907043 10.6611824 -20.2825947 3.0323679 -9.1542540 7.5235190 20.7563343 -18.9512177 -40.2296638 13.8515139 -44.5626297 22.2704830 -8.0037947 2.7226145 -33.1041183 -30.1857224 2.8108089 -5.8995051 -6.0809989 -31.9927406 5.2621593 -9.5510111 -47.1122055 -5.7652693 -21.1921864 -10.0016155 1.4115523 -14.2606335 -45.4441910 -12.5648422 4.2595806 15.1081886 -30.0658760 -16.1879654 -27.7309494 -28.5144539 -12.0654087 -21.4448318 -6.9379830 -5.9060130 -2.8836656 -79.2191391 -166.6674652 -9.5786963 -5.6236253 -11.1449127 -24.4994011 -18.4943905 3.8317399 -31.5552177 -18.4642887 -28.4220486 -20.5188026 19.3095798 -1.3591300 -33.0531998 -24.6060028 -31.0088787 -65.0910492 -32.0025444 -17.1826820 -26.1372604 -12.1455183 -1.8659779 -23.4808025 -8.2820921 -29.6014080 -53.7980499 -46.0197983 -11.0273924 -6.7106137 -27.0373688 -3.2485700 0.5654177 -10.2449636 -25.4693165 -15.9979839 10.5060740 -60.7413254 -10.3731356 37.4907761 -35.3063545 2.0186288 -3.9551368 -17.8615818 -17.6302261 -24.7737713 -5.5259585 -16.3570404 -4.0792804 13.1410065 -15.9999161 13.3163605 -58.2504883 -3.2572181 -27.9393139 -0.6312712 5.8126125 16.5908031 1.8418213 1.7925206 -31.8089619 -70.1489487 13.7723417 -7.9993567 -10.6098785 -219.0742798 -17.5753403 -1.8259368 24.8287926 -2.6576529 -0.9023304 -1.1645594 -0.8603347 -3.1996479 1.3729153 -1.1164171 6.2263737 2.4588969 2.8357713 -3.5776176 -0.1413022 -4.2153158 1.0716715 2.9704201 -1.1323327 1.9876378 -12.7911844 3.4914665 -0.7945138 -7.7778416 -2.3670988 1.6351289 -0.0988807 -3.3602188 1.6235969 11.3353910 4.8820243 0.1852072 -1.6123512 -0.7219141 2.1544766 1.1977760 -4.4645309 -3.6263809 -0.8467234 5.1440048 1.1775123 -4.9933877 -3.1861660 0.2271943 1.4463129 0.8030506 0.2613739 16.4796944 -0.5974382 30.0318108 2.0778594 20.9431801 -1.2066630 6.5727077 -1.3024729 5.8641605 0.6553774 1.2515306 0.3881082 0.9277686 -7.7061496 -0.9967832 -3.1884677 6.9660029 -0.3873934 -0.3557217 2.0534606 0.0222954 -0.9479523 21.0255547 1.9842660 -5.4465599 2.1785951 -1.6099185 9.9416561 2.1433244 6.4571471 3.6073198 2.2957478 -2.0355203 -0.6500152 -3.0432196 0.9689332 -0.3582297 -4.4390821 -3.3045895 -2.7161286 0.3438101 5.4262729 4.4452438 -1.9400345 -1.7429893 8.1169624 1.0696133 2.1591928 1.9908665 2.1729808 -3.2657275 7.8328629 -4.9650679 -1.5486276 -2.7276206 -1.2201898 6.0925269 -2.5779302 12.9517775 2.1453209 1.8743341 -1.4177276 0.8288434 13.4714165 0.5166160 -1.5858500 -1.2802248 -2.2113533 1.3486378 4.3409657 -0.0082631 24.0159454 -0.2412198 1.9930856 -1.0710233 4.5917311 8.7141943 -2.9615974 -0.6116609 -0.0201331 3.1903040 4.7881732 -7.5429082 27.0259113 -10.1009207 -2.2956653 -3.8182559 -2.2470217 -6.3929605 2.5890496 -2.8816583 8.8575335 3.5943496 5.4693928 -5.4082894 -1.6555054 -11.4171448 2.6959908 3.0348537 -2.3148506 4.4283490 -11.1550503 5.3204956 -3.3383319 -9.9412746 -6.0047488 0.9659646 -2.0966439 -6.3547745 2.8599937 17.6461983 6.5504465 0.1860081 -4.7965097 -2.6422112 3.2781818 1.0369016 -8.3721247 -0.2724409 -4.0336599 8.6388206 1.3793068 -10.0277519 -5.2458286 -0.7498321 1.8532883 1.7935078 -1.4645249 17.9105721 -1.0366197 39.5087776 1.1565580 24.1392498 -2.9389143 7.4119740 -2.5172279 9.8855247 -0.0634159 0.1192668 -0.9544196 -0.6814160 -7.6973200 -2.8558841 -7.2937965 11.5467701 -1.4627974 -2.9661205 4.2837162 0.8764745 -0.8371322 22.4052219 5.2519040 -6.9925361 2.3615906 -5.5278416 5.6726532 1.3050486 6.9198985 5.6960726 2.1061742 -4.4848576 -1.1554294 -5.3405418 -0.1957396 -0.6172678 -3.8891554 -13.2051125 -8.4213104 0.3269504 8.2013817 6.5606370 -3.7583244 -3.1717007 8.2838202 1.0323337 4.6987157 4.3363113 3.9072461 -5.2816882 10.0910625 -10.3995790 -1.8942528 -2.2530220 -2.3138161 7.3877697 -6.0014052 18.3143139 4.3940430 2.0370958 -3.1454754 -2.1455612 15.6976614 -1.6643986 -2.2055905 -2.4644089 0.8115676 -0.4858986 4.0481396 -1.8453827 26.5399876 -1.1455336 4.4975572 -3.9248393 6.4353604 12.8875618 -6.2933064 -1.3577535 -1.0270811 5.3373895 6.3416138 -6.6535358 24.5559483 -14.2528896 -3.5338681 -6.2724347 -7.8510790 -9.8653316 2.5453341 -4.8244691 9.1720324 4.8176270 7.9698963 -6.8425369 -4.4451642 -19.4807396 4.3426623 2.7821610 -3.5088258 6.4421339 -16.6894493 6.9612241 -6.3116121 -11.0669193 -8.7399254 -0.1296531 -2.3713832 -8.8653078 4.0951462 19.4018707 7.7910032 0.2573279 -9.3481054 -4.3772144 3.0273592 0.3788996 -13.3974409 -1.4354197 -8.0152569 9.9255581 0.8223407 -12.5126753 -6.8749499 -2.3197455 2.3078918 2.8979838 -3.8264842 16.9941444 -1.3200244 43.3599434 0.1342771 23.2823677 -4.3487282 6.5326314 -3.5708334 12.6637173 -1.0023948 -1.1913300 -2.8140237 -2.2862639 -10.1363163 -5.1339202 -11.0081654 15.9859047 -2.6671691 -5.6102524 6.2020173 1.8829591 -0.4433641 19.5217781 7.0988574 -13.6936846 2.3038490 -8.4525995 3.3113937 -1.6377271 7.2969527 8.5937729 0.8402032 -6.9974866 -1.6345240 -7.4404917 -2.6270921 -0.8331098 -4.3173141 -17.7599640 -15.4277191 -0.1662903 10.3873367 7.6110058 -5.4302659 -4.7369184 6.4912219 0.8466475 7.0159960 6.5748272 6.0250659 -8.1465082 10.4582748 -15.2725773 -1.8910707 -0.9277476 -3.7423832 6.9473391 -10.3291864 18.8565788 6.6048121 1.6093556 -3.9248097 -5.3345013 13.2204189 -3.8688288 -1.6470348 -3.8091466 2.2165020 -5.1500459 3.9112887 -4.2280707 23.0540237 -3.0131063 5.0297375 -6.5046682 7.6682010 16.9616070 -10.0906734 -1.5782108 -2.2273607 6.9292951 7.3758206 -10.5358629 -1.9234999 -4.0488381 -3.3100681 -6.0052228 -4.5658908 -11.5514030 -2.7215545 -2.9995539 -1.0862997 1.9161949 5.6398697 -2.6018803 -7.4740562 -13.6008749 2.6221166 -1.4689192 -2.5564399 4.2553043 1.3017284 3.6123495 -6.1568789 -16.8820496 -5.4399571 -2.6383374 -0.5751078 -5.0677853 1.7973557 -0.1791219 2.4425740 -0.4605429 -9.0623121 -3.6509693 -3.2995958 -1.9062080 -9.5315580 -1.2450428 -9.8095398 -1.9223586 -1.0274248 -6.4136887 -2.6933992 -2.9234841 0.1552174 1.8774347 -5.7827048 -2.9277730 -0.3307755 2.8976016 -0.6914846 -2.7660334 -2.6066883 -1.2896649 -2.2451990 6.6493835 -3.3792393 -2.5460424 -4.1062403 -3.4709282 -9.6100397 -3.0648770 -8.4580441 8.1258650 -0.4330494 -6.4763880 4.1027637 1.7070943 0.4893543 -7.7402930 4.3527737 -3.8129709 -0.0243310 -7.9133325 -8.9911251 -4.0345035 0.5951272 4.9913435 -1.7330199 -6.7581911 -1.6301929 -3.3185060 -3.9611142 -0.3913156 1.2872699 -11.7306414 -12.5610924 -1.2046230 4.5387998 3.0126867 -3.3928661 -3.6158037 -1.6877333 -0.0355633 4.5402966 3.6017103 3.5087202 -5.6220078 -0.3344889 -11.4094391 -1.0677884 2.6410296 -2.7403195 -3.3999736 -16.0393047 -2.8706450 4.6440654 -0.8595686 -2.9388943 -6.6131206 -7.0616860 -6.4645600 0.1862208 -3.6262095 3.9161661 -18.5146618 -0.3540872 -5.0314322 -6.8912807 -5.0278296 -2.3767242 -5.4175858 2.7266829 8.0839081 -11.2357159 -0.6575687 -2.1667616 6.4760809 2.2191024 -5.5351214 -1.1903138 -2.6912906 -1.1319685 -2.0724332 3.4014053 -3.0660863 -0.3871762 -1.4324980 3.5513988 0.4065484 2.9142699 -4.0315409 -2.5211742 -5.8113770 1.7842469 1.7677890 -1.1457523 2.5262299 7.0402279 2.9235942 -1.9543855 -3.8090830 -2.8120763 -0.2554498 -2.9345644 -1.8625985 1.5485351 6.0243979 3.4960046 0.0472834 -3.0155780 -1.5736779 0.8844497 0.0123091 -4.4172230 -6.9680705 -2.6999266 -2.6188407 -0.5705625 -1.9901317 -1.9644976 -0.5902340 0.5050808 1.1206285 -1.7266698 0.8480519 -0.3633853 27.9870129 0.9005486 -5.9293385 -1.8490849 1.1612694 -1.5451986 5.0166903 -0.0676746 -0.2599799 -1.1685727 -0.9011059 -9.6391754 -1.4849763 -3.3361478 5.9257364 -1.0529872 -2.6670234 2.1638896 0.3946398 -0.4100258 10.4880905 -0.2753513 4.5049810 1.1037891 -2.5653889 -9.2880297 0.9938403 3.6681118 2.8622837 1.2175499 -1.8107851 -0.6298012 -2.3991928 0.1232865 -0.5004264 3.3626103 -4.0073137 -4.5509653 -0.2611721 4.2722373 2.9771369 -1.7046074 -3.9433463 -0.1188184 0.6909806 2.4720094 2.5982471 1.9882904 -2.5330529 3.5353453 -5.2554526 0.9916478 -0.0463855 -0.9971835 11.9522161 0.7491936 5.3511028 2.3285580 1.1171060 -1.2876551 -1.6227734 17.7832642 0.2681102 1.9140280 -1.3600110 -3.0693614 -1.3691604 1.9263377 -1.5922855 6.7296009 -1.2999860 -5.5967445 -2.4513857 3.3556333 6.5538349 -1.9449990 -0.8644571 -0.1385720 3.5032716 3.1708710 -5.4787788 -3.4195137 -7.2258992 -2.6618252 -4.1904750 -1.8890864 -7.4851685 -0.3545476 -2.7372541 5.1990657 1.4748520 5.7460279 -5.6954026 -4.5608683 -13.1045847 3.3595285 2.1822002 -2.3894603 4.6168451 5.2893591 4.5458875 -5.0618711 -3.6704648 -5.7461677 -1.1373339 -2.8221018 -4.5503626 2.5500669 8.7444944 4.6217489 -0.0874415 -7.4216847 -3.4127302 0.5524765 -0.6136037 -9.3678589 -8.7972155 -7.1184797 -4.9452515 -0.7663203 -6.1426177 -3.9096465 -1.8852793 0.8236386 2.1332769 -3.9810486 -0.4364706 -0.8646721 33.0161972 -0.0565499 -8.8785830 -3.7741902 1.1421481 -2.8140860 8.0937223 -1.3504460 -1.4403737 -2.6425054 -1.7695844 -10.4316845 -3.4109237 -7.7363944 10.1748486 -0.8754107 -4.6271234 4.4686117 1.2844069 -0.2250085 8.2088156 -0.0090268 2.0239062 1.1985006 -7.3437901 -14.1961126 -1.6187967 4.1989784 5.2083888 0.1372872 -5.2967696 -1.3161191 -4.3256974 -2.0215390 -0.7234077 1.8417464 -10.1868944 -10.4843912 -0.5068713 6.4872446 4.9031343 -3.4512734 -4.8834786 -1.1585766 0.6707907 4.9338117 4.7934232 3.4955227 -5.0061059 3.5856562 -10.8383160 0.4776540 0.7653181 -2.3728917 13.0613289 1.0366608 6.6245341 4.5635338 1.1494722 -2.7836981 -4.7964778 15.9133406 -1.5174448 2.1858337 -2.7798541 -2.4555984 -1.5735532 1.6635120 -3.8966520 2.4207447 -2.9863305 -9.7595682 -5.4798388 4.6374049 10.7379808 -4.3969183 -1.1975182 -1.3344769 5.5753045 4.7008295 -7.6262641 -7.5310225 -9.7514133 -4.0683069 -7.1629343 -0.2141813 -12.7887526 -1.2540333 -4.0095124 5.8192148 2.2974551 8.3959064 -7.0258760 -7.5429688 -20.1714497 4.9536753 1.8311399 -3.5640111 6.7335234 4.5725002 6.3746476 -8.2527704 -9.3588724 -8.8145180 -2.5116498 -4.9646983 -7.2640171 3.6392691 9.9134893 5.8728766 -0.0939444 -12.6154041 -5.4875007 -0.3564672 -1.4859982 -14.6014090 -7.8160009 -12.2821131 -6.8370471 -1.0402199 -10.3933916 -4.5661950 -3.6816721 1.0189707 3.2092750 -8.1471500 -2.5190005 -1.1804817 35.3957977 -0.8345174 -9.3366451 -5.4395676 0.4798009 -3.9259214 11.0423861 -2.9170649 -2.4814413 -4.9763250 -2.7068062 -11.6413937 -5.7235913 -11.9406900 14.4404135 -0.8913551 -7.6686239 6.5078487 2.2193899 -0.0305496 4.1476588 2.0007136 0.8620797 1.2532940 -10.6760979 -12.4925261 -3.5025496 4.5793195 8.0136690 -0.9665932 -8.9728651 -1.8418766 -6.4334016 -4.3468504 -0.8903160 1.8778744 -12.7352867 -16.7541237 -0.6761885 8.7226391 6.3215446 -5.0764284 -6.7787075 -2.5855567 0.6079648 7.4233046 6.8570762 5.2326818 -6.8914051 2.8905690 -16.1572762 0.0272505 2.5889378 -3.5464787 12.0213766 0.4755241 6.3490906 6.9987106 0.8860199 -3.4524422 -8.3586884 12.2176409 -3.8740685 2.1445503 -4.4357429 0.0117085 -4.2048788 1.3505208 -6.7062159 -1.9410875 -5.2310038 -14.2284136 -8.1046915 5.9139538 14.7975769 -8.3191004 -1.4034042 -2.3926318 7.8138080 6.0019565 -11.3866224 16.1252689 -0.4825712 -3.1701055 -7.1891394 -5.5494676 -5.6112909 -2.9392471 -3.9925780 -0.7809393 1.3759573 5.3236938 -2.2840519 -4.3197498 -18.9499035 2.2283230 -2.1715064 -2.5361469 4.4296827 -0.4845247 3.3975401 -6.6909699 -11.4857988 -5.8265500 -3.3033342 -0.1792142 -5.3910565 1.9004778 -0.6299451 2.5891702 -0.4355760 -9.8097563 -4.2045712 -4.2221236 -1.9972717 -9.8895378 -2.1901336 -10.3233747 -6.6660581 -1.1236888 -10.0919294 -3.5816314 -3.1364882 -0.0300357 1.6025896 -8.9185047 -3.3739200 0.0097349 3.1398425 -1.1796463 -2.9665289 -3.0674100 -1.1650314 -2.1881502 5.9520612 -3.3308957 -2.8838663 -4.6415911 -6.4137859 -8.4064646 -3.7261527 -11.3379784 8.6491575 -2.8178720 -5.3201222 3.8626473 1.6887593 0.2525983 -7.8471560 4.8307981 -6.4947968 -0.3312512 -8.1795588 -3.6938977 -2.4370956 0.4404216 4.9107633 -2.1072726 -7.6641865 -1.5686175 -3.6495383 -4.3997011 -0.5855423 1.3407605 0.8252357 -14.9737606 -0.7405843 4.5327373 3.1283028 -3.2672310 -2.8643312 -2.5627904 0.0525880 4.3953762 3.2780778 3.1739142 -3.0753846 -0.3168685 -13.7532015 -1.5343053 3.8996820 -2.7207160 -3.4328308 0.4277851 -3.3433311 4.5497136 -1.0280776 -3.0833476 -7.1548986 -6.4963999 -6.7421951 0.7438855 -3.7628162 4.2524195 -15.5148602 -0.6785088 -5.8165522 -4.6914086 -5.8682547 -12.0948296 -6.1149659 2.6691954 7.8185701 -14.9993830 -0.6084327 -2.0002515 4.8207574 1.7701380 -6.2537055 -3.4237843 -0.2198774 -1.5547591 -4.7596054 -1.2729083 -4.7368183 -0.5143255 -1.3678151 0.1347567 0.2898919 2.9339607 -3.0795481 -2.7750573 -6.9728007 1.3794087 0.3333046 -1.1447214 2.0609424 2.4577751 2.2014182 -2.6436548 -7.5727358 -2.6138275 -3.2327538 4.6871495 -2.0167019 1.0294870 2.1068068 2.0860274 -0.1768618 -5.1196384 -1.7748796 -5.7145281 -0.6224309 -5.4218292 -8.5028429 -5.2821021 -1.5320756 0.0137650 -0.8044074 2.0066824 -1.3130029 -0.2696811 1.1491714 -3.2622404 -3.3296986 -0.2030123 8.0985479 0.2771873 -5.2126989 -1.8450564 -1.2268895 -1.3854247 3.8324437 -1.6110376 -0.3649617 -2.4302487 -1.3987447 2.3541582 -1.2238629 -4.6085892 5.2529469 -0.1624413 -4.6075311 2.3359838 0.7309630 -0.3625708 -1.5480726 -0.4292320 -3.0865140 0.5118740 -4.3366566 2.7668688 -0.8893930 2.5519576 2.5219131 -0.1693109 -3.6769354 -0.6366047 -1.6598570 -1.3825284 -0.3856175 4.0648170 -1.4173812 -5.4326019 -0.5424563 3.1942859 2.5737133 -1.8347481 1.3479739 -1.7340889 0.2717310 2.3639517 2.2147183 1.6757451 -2.9688983 -1.1548977 -5.8091941 -0.0987684 0.8960255 -1.0718621 3.1886520 0.4162178 1.1129764 2.2122958 0.6116749 -1.5873357 -3.1998765 3.2759111 -1.4578373 -1.2518698 -1.5511373 -3.7378225 -0.4860775 0.7625816 -2.5113378 -3.2815771 -2.2984118 2.7363176 -1.3064308 2.2272530 5.5151591 -1.1297561 -0.3122354 -0.5681674 3.2686596 2.4977701 0.5555581 -11.4327831 -0.9866384 -3.0380027 -8.5429497 -5.2458382 -10.2522306 -1.9577683 -2.9863486 -0.1224296 1.4404485 5.7174501 -4.9484324 -5.8197718 -14.5128212 3.0021942 0.1882912 -2.4468732 4.1809983 1.2453818 4.0531254 -5.8138928 -13.1805696 -6.0816126 -4.2567019 4.9991870 -3.9766736 2.1762810 2.6645000 3.4764888 -0.3984638 -11.1066914 -4.1944900 -10.8652964 -1.4818060 -10.8681479 -12.0170851 -10.5915880 -2.6635017 0.0151025 -1.0127236 1.5505811 -2.8333046 -0.0038469 2.0539181 -7.8231559 -7.8803658 -0.3994597 11.5057449 -0.1912106 -17.1281319 -3.9324348 -1.7192789 -2.6821918 7.1388602 -3.4167156 -1.4370569 -4.2653704 -3.6495719 -7.1683292 -2.1264942 -9.1630363 9.5472488 -0.9652456 -7.7208562 4.1585488 1.7420937 -0.2969529 -3.2003007 -0.6354724 -6.9746995 0.5555596 -9.5687227 -0.0915667 -1.8912373 2.9945736 4.9788127 -0.9897393 -8.0269499 -1.6375296 -3.7089622 -3.2075253 -0.7037128 2.0246959 -3.7939453 -11.9028406 -0.7132453 5.5693421 4.7062430 -4.0342064 -0.0731656 -4.0595288 0.2813591 4.5171437 4.1257811 3.2394414 -4.2859564 -3.0735972 -11.3124943 -0.7154632 3.1605766 -2.4999325 3.0940118 0.4534565 0.3647012 4.5470777 0.3359700 -2.8741095 -6.9665384 -0.3513147 -3.4966435 -2.3453467 -3.1673560 -2.9396026 -0.0757719 0.6242890 -5.6852984 -6.0967817 -4.6184759 4.4865894 -3.6771564 3.6825056 9.6348457 -2.6106100 -0.5602078 -1.6430948 4.8906193 3.7027893 -1.9980091 -23.2746830 -0.5212864 -4.4805613 -11.0348473 -10.1768227 -16.4323502 -3.4860911 -4.8231773 -0.7708758 2.3225751 8.5217934 -6.8393025 -9.6831961 -21.6200485 4.4120264 -0.6713499 -3.8605192 6.3142710 1.3645129 5.3224730 -9.4842358 -16.6222954 -9.2067184 -5.7713070 5.4228091 -5.7353086 3.2532408 2.5638051 4.5645313 -0.5308201 -17.4423752 -6.5835385 -14.7321844 -2.7016425 -16.0070248 -15.4894409 -16.1947823 -3.8183970 -0.7706802 -0.9145354 0.5615758 -4.4381752 -0.1698176 2.5431399 -12.9432659 -10.9463100 -0.5538343 13.2809982 -0.8715170 -23.9818649 -5.9304595 -2.6096950 -3.8114114 10.0267429 -5.6325421 -2.7423964 -7.0136619 -5.8160744 -10.1877270 -3.7024486 -14.7074499 13.5472403 -1.7197207 -11.0556183 6.1272731 2.7452488 -0.0699599 -6.7261367 0.6665951 -8.7424698 0.3745865 -14.5490723 -2.8354647 -3.8684056 3.3791349 7.5593901 -2.1211438 -12.3024988 -2.5522957 -5.1890116 -5.5767560 -0.8833828 4.0685487 -4.3615427 -17.9646530 -1.2004045 7.6895337 6.0965505 -5.9054565 -1.3329278 -6.2798758 0.2369495 6.6877685 6.0056386 4.9362297 -6.1905513 -4.1536207 -18.3135109 -1.1347033 5.9192867 -4.2021785 1.0386299 0.6633514 -1.1568428 6.9416833 -0.0503222 -4.3512135 -10.8904428 -4.1193972 -6.5957360 -2.0019798 -4.9046979 -1.5687188 -0.1653200 0.5782758 -9.0746479 -6.6238527 -7.3463516 4.8143868 -6.8993864 4.9045224 13.7095518 -4.8863811 -0.7872142 -2.7582810 6.7884917 4.7823839 -3.8078039 1.2375343 -0.9318109 -3.5132496 -4.9712191 -9.6960421 -7.2201667 -3.7392895 -3.2012036 -4.5036879 1.7771310 5.7559385 -3.3410773 -3.9826000 -18.8942833 2.5044081 -1.4548819 -2.5620244 4.4877672 -4.3165607 3.5957034 -7.4258852 -10.0814199 -6.6601014 -3.0523441 -0.1567127 -4.5428681 1.5468285 -2.6791160 2.4879549 -0.5813590 -16.3421936 -4.7377415 -7.4503856 -2.6515796 -7.9963293 1.5013916 -11.1700296 -0.7782506 -0.9849013 0.5193306 -3.3221633 -3.3950636 0.1357918 1.9411068 -6.7516241 -5.0801888 -0.5114907 1.5098197 -0.5979358 -12.5933084 -3.9022012 -3.5615504 -2.4058561 6.3705025 -2.9796674 -3.0431702 -4.5169644 -3.9200840 -6.9798603 -2.3173227 -8.1901426 8.2374992 -1.0454012 -8.4069901 3.8531938 2.0362799 0.3692936 -9.2932234 5.5525546 -12.0665970 -0.0147121 -5.0360699 -9.6426506 -3.7152195 0.7449477 4.6760583 -1.8597082 -5.6677837 -1.6919641 -3.5256786 -4.1698833 0.0710828 -0.8964011 -3.8856089 -14.8961411 -1.6649562 4.5989904 2.8829386 -2.7374728 -4.3791499 -5.4337564 -0.0333458 4.3948321 3.5660908 3.0644770 -4.6783276 -2.1732495 -8.8368492 -0.8771194 4.7753086 -2.6498163 -6.7080207 1.8807093 -5.1698799 4.7313552 -0.5970924 -2.4534414 -8.2041941 -8.2092018 -7.4550838 -0.9545054 -3.7369914 4.5382752 -4.4345946 -0.3583424 -6.4853754 -4.9204578 -6.2716131 -0.6169898 -6.6571636 2.7461562 8.1744547 -6.1902013 -0.6176558 -2.0480750 7.1428108 2.3772459 -9.0343390 -7.9431033 -0.4399938 -1.5393509 -2.2316380 5.2415338 -4.8192940 -0.8637809 -1.6694912 -3.1915674 1.0879656 3.2376490 -3.3809607 -3.2335632 -7.6418705 1.7079026 0.7575755 -1.2816854 2.4460094 0.7095562 2.1137438 -3.5182064 -5.2062173 -3.2509811 -0.8954192 0.6758490 -2.1877313 1.0364186 -0.7436093 1.9133004 -0.1242013 -6.5276122 -2.3935726 -1.5472786 -0.4062907 -5.4929433 -1.4255608 -5.4526043 2.8856199 0.0178329 0.7294756 -1.4713961 -0.9465635 0.0391668 1.6911222 -4.0763707 -6.3124909 0.8754753 5.1575103 -0.4163328 -5.8707500 -3.2844236 -4.9101048 -1.5107452 3.6391821 -1.7405689 -0.6548495 -1.4231086 -1.3790294 8.3582878 -1.4093163 -4.6442566 4.9249129 -0.9079016 -1.9996215 2.2139654 1.1272829 -0.1031405 -7.5301814 -1.5189451 3.2882056 0.3282028 -4.1573172 -1.5140048 -0.9282486 1.6175621 2.2233009 -0.4451928 -4.0948086 -0.8214577 -2.5063639 -1.4394244 -1.1154331 0.7027749 -2.4083917 -6.2132053 -0.3644201 2.8634782 1.4817600 -1.7478683 -0.4480746 -5.9618988 0.2317905 2.0003257 1.8456520 1.9956272 -1.2171034 -3.1331291 -6.2075853 -0.0050460 2.2505183 -1.3071799 -1.8846453 -0.5697193 -1.5862269 2.2649634 0.1284767 -2.0662639 -3.7430980 7.9117613 -2.1233847 -2.5028863 -1.6731404 -4.0185623 -3.9313452 0.8606189 -3.2390754 -0.8421597 -1.1947207 -4.0136566 -3.3244236 1.9126353 5.0151830 0.2111981 -0.4319105 -0.8400063 2.6122189 1.8517129 -4.1639824 -18.7088776 -1.3318145 -3.1539195 -5.4089384 -2.6239750 -9.1214828 -2.5287945 -4.1583896 -5.1262221 1.6948719 5.8861156 -6.0131197 -4.7104068 -16.0294533 3.2497060 -0.1358230 -2.5250349 4.6677809 -0.6852703 3.6376367 -7.3238540 -6.6645598 -6.4336057 -3.0513778 2.0281861 -4.3922672 1.9476545 -1.1199397 3.1858711 -0.4023554 -13.7078810 -4.7322235 -2.2979357 -1.2484772 -10.4379959 -7.0125008 -10.9644852 3.6387439 -0.0622668 0.8291118 -2.7728450 -2.9120917 -0.1026742 2.4344385 -6.4561849 -13.3605928 1.4222447 6.5593419 -0.9958024 -15.8308697 -6.7153769 -7.6191773 -2.8459969 6.5334115 -3.6388628 -2.6209815 -3.8667009 -4.2782254 -1.0124804 -2.2565110 -10.2200394 9.0316782 -2.8834119 -4.8029194 3.8894215 2.4609582 -0.1506844 -12.2909479 -4.2731266 -0.4523615 0.1982016 -6.7151976 3.0534902 -3.0298479 1.9998097 4.8777051 -1.4836866 -8.6613865 -1.8171388 -4.5234904 -3.8083856 -1.9601693 -1.6165378 -5.0551033 -13.2550440 -0.7032451 5.0682130 3.4185574 -3.8856955 -0.3191320 -15.1062469 0.2975867 4.3798513 3.7862582 3.8385339 -2.0132406 -5.7271218 -11.8734560 -0.4264184 4.5573773 -2.8376606 -4.4551482 -1.6070384 -3.3407500 4.6274581 0.0792076 -3.2521203 -7.7751603 5.3275218 -5.3408275 -4.7071018 -3.4404714 -2.4051735 -6.5413899 0.4745409 -6.4078121 -2.1853621 -3.0753646 -8.5873194 -6.6032066 3.2104459 9.0174294 -0.2546323 -0.8721948 -1.9340147 4.5749068 3.0227268 -4.2576818 -22.7002811 -1.6420499 -4.8545375 -8.2510233 -5.6079307 -15.1764774 -4.5181131 -5.3107510 -6.5327301 2.4114490 8.5744524 -8.9975576 -7.9290204 -23.9935493 4.6420422 -0.9928801 -3.8006372 6.9049253 -0.8863268 5.0445089 -11.5617914 -13.6076469 -10.0870075 -4.6762352 0.4758134 -6.4722633 2.8241270 -2.1429653 4.3612380 -0.7016755 -22.4020939 -7.4785461 -3.3906677 -2.5912521 -14.8336134 -5.6828246 -17.7074337 3.1966949 -0.9592460 0.8333001 -5.0721517 -4.4739141 -0.2347040 3.3646319 -9.4410801 -18.2753544 1.7190106 6.8406878 -1.8623714 -25.7757454 -9.6522551 -8.6306839 -4.0166087 9.5321493 -5.8167410 -4.4067311 -6.8982029 -6.6427584 -8.1896229 -4.1379175 -14.9483967 13.2244625 -2.6611862 -8.7975283 5.7863336 3.6526496 -0.0026037 -16.7289715 -5.2108893 -2.8448625 0.1786020 -12.2956915 2.0557666 -5.1931396 2.6201315 7.5215917 -2.5404081 -13.0292711 -2.6848042 -6.3843136 -6.0020690 -2.4907348 0.4693005 -6.6310387 -19.8907700 -1.0578959 7.2380571 4.7454796 -5.4828391 -2.0616770 -19.6717682 0.3239579 6.5965419 5.5697479 5.4953995 -3.2524464 -7.8687601 -20.2329006 -1.0575211 8.1774349 -4.2424588 -8.6498747 -2.1530795 -5.8511152 7.1391673 -0.4202281 -4.7256784 -12.7128935 -1.1272252 -9.0597134 -6.0324988 -5.3265247 -0.2820081 -7.9998484 0.3513039 -10.3719034 -5.7652445 -5.9544940 -13.4116726 -10.3842564 4.4652457 13.2085495 -1.3763156 -1.1025136 -2.8610294 8.3939199 4.2754221 -6.5898523 -7.3981419 0.6769087 -3.4425166 -6.4997101 -4.8093567 -10.1502323 -5.4833984 -3.8007078 -2.9296372 1.5100367 5.0573177 -2.7925487 -5.5649986 -11.3544550 2.1449699 -3.1689136 -2.5743558 4.4010391 -3.5855055 3.4526477 -7.8240995 -13.6832991 -7.4001570 -3.3993409 -0.3567183 -4.8174310 1.7591373 -2.1825733 2.5426781 -0.6196806 -19.0878410 -5.2045193 -3.0037246 -1.8661091 -8.1579056 1.8550851 -10.6801643 -1.1083446 -1.2525846 -0.8458688 -1.9098361 -2.8226495 -0.0851675 1.6221683 -7.2168036 -5.4518614 1.3626641 -7.2975345 -0.6377364 -12.0345869 -4.8982558 -1.9771050 -2.0395160 5.7928691 -3.2208958 -1.9622802 -4.7335167 -4.8689318 -7.0996509 -4.8356328 -10.2144928 7.8681736 -1.9820611 -4.9290953 3.4660208 2.1607325 0.3223422 -12.4467897 6.1600537 -9.0439806 -0.2062332 -7.7372031 -9.6791449 -2.6404409 0.1238976 4.6033039 -2.1786664 -3.3775234 -2.1172833 -3.7739034 -4.4157066 -1.8711485 -0.7069861 -0.1772123 -11.3507299 -0.9123214 4.2979116 2.4045837 -3.3360169 -4.3830681 1.8442291 0.0870578 3.9569387 3.6733274 3.8274350 -4.1720753 -3.6588151 -12.0333195 -0.6880349 3.4607513 -2.5901814 -11.5173540 0.2671129 -5.2726703 5.8019042 -0.6954017 -2.8084409 -8.4984188 -14.1506977 -8.4839878 3.0225813 -4.1258030 4.0079947 -1.4512951 -0.6363424 -6.2740827 -11.0303621 -7.2721972 -11.5055304 -7.5089431 2.5096333 7.8058882 -3.8860962 -0.7447608 -2.0948188 4.9609461 2.1079106 -8.8380728 -7.8251152 -1.1530341 -1.7023005 -2.6932957 -3.3223679 -3.3270397 -2.0458403 -1.0032986 -4.2834082 0.9640188 2.6196091 -2.1896794 -1.2581968 -7.1939731 1.5618393 -0.8626359 -1.2723302 2.0449138 -4.2609253 1.8138947 -4.3244786 -1.7429450 -4.2001014 -2.0002058 1.6123377 -2.2488890 0.8689636 -3.3139203 1.4961947 -0.2649394 -8.4155722 -3.0966268 -0.7331974 -0.5069959 -4.9654799 -3.3938539 -6.9414806 -6.1085410 -0.9783921 -0.1469153 -1.2684793 -1.3928860 -0.1294058 0.7896456 -3.3015373 -10.6376715 0.0787954 -1.1538626 -1.1405222 -11.4546890 -3.0539901 -6.0733142 -1.2180594 3.1684840 -1.6346496 -1.1169504 -2.8722725 -1.7292149 -7.6015372 -2.4457266 -4.7276478 4.6408625 0.6075218 -2.2025928 1.8975675 1.5538486 0.0998748 -9.3828230 -1.0586096 -7.0932393 0.0260203 -4.2318377 -2.8502619 -1.7086955 1.0909134 1.8375261 -0.7795017 -3.5702817 -0.9228307 -2.3130157 -2.0806847 0.0278673 4.0327168 -2.9590116 -5.8483372 -0.3990635 2.4936054 0.7053087 -1.6650647 -0.1033667 -9.7192144 0.1132636 1.8070579 1.9517245 1.6978961 -1.4525050 -4.6604772 -5.7313733 -0.8721684 2.9303491 -1.3734047 -5.7348752 -1.0802698 -4.1153083 2.5624962 -0.2091627 -1.9104924 -5.1596894 -3.9758270 -4.0231738 -2.9928575 -2.1440065 -2.5195818 -4.3075089 0.3694797 -4.0365767 -5.2515755 -2.3293142 -0.0394637 -4.1802640 1.5268918 4.5551691 -0.2903966 0.0225993 -0.9817595 2.1179466 1.4825987 -1.6524676 -13.4454269 -3.6224885 -3.1460736 -5.3685145 -1.4497523 -6.4791794 -4.3154564 -2.7859640 -7.1492753 1.3069584 5.2408729 -4.9292645 -2.4158387 -16.1420536 2.7698689 -2.2763133 -2.6038697 4.1437211 -3.9576805 3.2592497 -8.5696411 -3.4705160 -7.2979779 -3.4924588 0.8088624 -4.7475166 1.8595282 -6.1474071 2.7703094 -0.4752414 -18.7918415 -5.6940713 -3.2139518 -1.8080451 -9.3112650 -2.6129861 -12.4631681 -13.5767555 -1.7092415 -1.5979471 -3.0371726 -3.5125177 -0.3080311 1.8133028 -6.7411985 -17.1476955 0.2660850 -4.4606462 -1.8787754 -25.1638622 -5.8902931 -10.1619358 -2.2578290 6.1633205 -2.9797466 -3.1998005 -5.1541810 -4.3144941 -16.0707359 -5.7020135 -9.9640265 8.6829224 -0.2548063 -4.8565440 3.6297982 3.0278215 0.1808724 -22.4983673 -5.6549072 -8.1291952 -0.0298713 -7.9431477 -6.9977984 -4.0849185 1.4989355 4.4989457 -1.7346010 -6.4896684 -1.8738241 -4.0031109 -4.3404169 0.0333982 3.4119880 -7.0482788 -13.2526398 -0.5984003 4.6847396 1.7737145 -3.4050043 -1.9953831 -18.7249680 0.1771016 4.0533504 3.3713431 3.2835581 -3.5416689 -8.6719847 -10.8035393 -1.3587023 6.7286863 -3.0479667 -13.6151838 -2.9583683 -8.0636063 4.9680600 -0.3829775 -3.3078761 -9.2834187 -10.0953007 -9.1550865 0.0866602 -4.3161869 -0.6981358 -3.7218595 0.0364783 -7.9917560 -14.4629860 -5.9557033 -0.5107365 -7.8335767 2.8288243 8.6223278 -0.8314787 -0.2354447 -2.0385735 3.8301709 2.7433183 -6.1569200 -5.3944278 -3.4171762 -4.7391334 -8.5874891 -10.4700184 -10.9861059 -7.2783756 -4.2203579 -9.5065212 2.3285134 7.8000121 -7.2066245 -5.0454683 -24.5408440 3.8793688 -2.6094098 -3.8707280 6.2717915 -5.5359201 4.8107195 -12.0399714 -7.2730432 -10.3061295 -5.0271425 0.6947196 -7.4689603 2.8168902 -9.0910969 3.9184213 -0.7056993 -26.3498688 -7.9834561 -6.1343284 -2.5740936 -12.7113161 -5.8988533 -17.9763336 -18.1839886 -2.7665200 -1.9183838 -4.2839136 -4.9996443 -0.0110130 2.5938888 -7.6079354 -18.0812187 0.4179343 -7.2651858 -2.1143539 -31.6524811 -9.2394257 -11.2891979 -3.3792586 8.9868793 -4.7686434 -4.6674819 -8.2406445 -6.5821595 -17.2942295 -9.2123451 -14.1043549 12.9058599 -0.5813619 -9.0147552 5.3613839 4.3234797 0.3947630 -36.6855431 -17.5475788 -13.8077030 0.0053348 -11.4904461 -6.9966631 -6.0066090 1.9376042 6.9724741 -2.9183278 -9.4998055 -2.7570541 -5.9847331 -6.4785967 0.1096216 4.3312068 -7.2029934 -20.2743874 -0.8536853 6.7733946 2.7323029 -5.1684680 -3.8494885 -12.0666704 0.2560767 5.8951373 5.2755413 5.0102654 -5.9652867 -11.0773821 -16.0398140 -1.5265268 9.3810396 -4.4265537 -22.2585869 -4.2996368 -12.4341869 7.4588952 -0.7227840 -4.9128575 -12.9180861 -18.7296429 -14.2509022 1.0846852 -6.4964190 1.1898634 -1.4543351 0.0311252 -11.2028761 -25.7784538 -10.1929226 -1.9266994 -10.7635574 3.9840600 12.7574301 -1.7250950 -0.3684487 -3.0760841 7.9540114 3.8276775 -9.1453648 -0.9211451 -0.6936105 -3.5650730 -5.9032784 -3.6795747 -8.7129822 -6.7607307 -3.3467367 1.7355937 1.1734276 5.2347927 -4.5837698 -4.1906548 -15.7282391 1.7214445 -2.0168424 -2.3650112 4.1102796 -2.2256720 2.9015830 -6.4016347 -6.0581079 -7.0079494 -3.3183916 -2.6052723 -5.2219634 1.4704001 0.8128074 2.6135297 -0.6911356 -12.4740229 -4.9164515 -5.8951578 -4.1180296 -5.4703274 -1.7645491 -10.2711582 -23.4065361 -2.0608156 -1.3460118 -1.2290167 -2.6616936 -0.0889902 1.9103687 -8.2155485 -0.7917264 0.7792390 3.6765623 -2.3958333 -2.2479148 -6.1067028 2.1599338 -2.1506782 5.9171610 -4.9765792 -3.3938162 -5.3424597 -5.7269793 -7.1388783 -7.1027198 -11.9125338 8.4634762 -1.4020430 -5.7776976 3.8068728 2.6607203 0.3362328 -4.8975592 -3.0525393 -3.2795815 -0.4776759 -10.6036882 -14.6392155 -3.8850284 0.8224096 4.8240957 -2.0642350 -2.7127123 -1.8543876 -3.8436587 -4.4592419 -0.0113400 1.9390162 -5.6685357 -13.6174307 -0.8072351 4.4403882 2.1150100 -3.4484816 -1.9613999 3.6806872 0.1526562 3.7059417 3.4890385 4.2405734 -5.7157974 -2.2119606 -7.2177277 -0.9007365 1.3692528 -2.8758936 -8.7840624 -5.6653762 -3.2459092 5.6729631 -1.5202837 -1.9779245 -6.5127578 -12.8907137 -9.8980312 4.8465304 -4.7387366 3.2955165 0.9654830 -0.2515388 -5.3842120 -9.1124401 -9.2102880 -1.5778559 -4.8290281 2.6704133 8.0493364 -2.9579942 -0.7513492 -2.3720200 0.3464262 1.6218574 -3.7757494 -8.8970261 -0.5985667 -1.6815714 -3.4023426 -2.3048477 -2.6122272 -2.1785052 -2.1598721 -4.6091709 0.3566803 2.8917108 -2.7903471 -1.9422015 -8.2287140 1.9912703 -1.8355147 -1.2343444 2.1574435 3.2967036 1.4190173 -4.5886550 3.1267536 -3.7690620 -2.8857222 -3.5062630 -2.2074480 0.8150090 -6.3285098 1.5830165 -0.3021128 -8.8890972 -2.9770212 -5.6318855 -0.8246307 -4.9957833 2.2593288 -6.1259432 -0.2798786 -0.5414751 0.9459335 -3.0385501 -1.8555398 0.0247658 1.2416027 -1.8530858 -27.6721439 -0.0619446 -4.1603770 -0.5891420 -24.8170490 -3.8891444 -6.9225197 -0.9306503 3.0207815 -1.7520922 -1.9807980 -2.0353572 -1.8713996 -12.1846828 -4.5686221 -4.5700765 4.2891808 -1.2574813 -4.9858594 2.1920712 1.7234453 0.6236193 -22.2989483 -1.6321391 -1.6613044 -0.3814895 -2.7990582 -7.9941301 -2.5660846 -0.5271138 2.1464083 -0.7685075 -3.3970792 -0.7727641 -1.6296542 -2.1869600 0.6170602 0.0834682 -2.3927348 -6.3119445 -0.1312508 2.3973973 -0.7970694 -1.2782912 -3.9621382 -12.5011787 -0.1116058 2.4543974 1.9485418 1.7634397 -3.3088834 -9.4235868 -6.4819679 -0.1681636 2.5312572 -1.4172565 -10.2402763 -1.7575588 -7.6938767 3.0197532 -1.1073228 0.2608969 -3.7895110 -11.2776155 -4.6204567 1.7393756 -2.7123177 2.7366259 -1.9105946 -0.5875852 -3.8539431 -15.0569725 -3.6122272 -5.4217339 -4.1791792 1.4653599 3.4430413 -1.1453055 -0.7276118 -1.0304509 1.1833953 0.4531289 -6.1558051 -16.5784550 -2.0172720 -3.1189890 -6.2940893 -3.3232641 -7.1233406 -5.9102988 -3.6954122 -5.5765190 0.7818862 5.3335948 -4.8925242 -5.2679958 -16.1889019 3.5199435 -2.8654101 -2.6489556 4.1173496 -1.7756827 2.9046583 -8.2381525 -2.9212120 -7.1030264 -4.6559343 -1.4148263 -5.1121044 1.7711983 -8.3970556 2.7607315 -0.5248531 -15.6781645 -5.4438019 -13.0407839 -1.2317275 -9.0953550 0.2690516 -12.3865471 1.3787856 -0.7347345 -0.3741269 -4.3633165 -3.4859037 0.1528325 1.5494617 -6.3010445 -13.4236660 0.2635483 -3.2211645 -1.0329639 -20.2387333 -8.1079979 -7.5798798 -2.1332269 5.8064537 -3.8258352 -3.5736549 -3.2774253 -3.9700544 -13.2399931 -10.4016819 -9.3003998 8.5406876 -1.6167420 -7.4184575 3.9501033 3.4438057 0.3372936 -28.4262638 -1.6672206 -6.5057878 -0.2764509 -6.1440673 -16.7675438 -4.7467370 0.0277475 5.2706752 -1.9596888 -6.7470961 -1.8783035 -3.3942404 -4.5326900 1.0406941 1.0757390 -4.4693408 -13.3674974 -0.2835188 4.5140610 0.9664210 -3.0855269 -4.6787577 -8.7685108 0.0215804 4.6272659 3.7164152 3.3895006 -5.0027528 -12.7609539 -11.8562326 -1.0415235 3.3496380 -2.8386078 -15.1921453 -2.0476699 -11.0881538 5.9169798 -1.7628968 -1.0982416 -7.0290470 -20.7722912 -8.8702488 2.7123864 -5.1784463 6.0198178 0.1525171 -0.8954638 -6.7153597 -25.2839813 -8.4616127 -11.1754684 -6.4858179 2.6684222 7.6096330 -2.1602170 -0.8831406 -2.0554194 5.2585649 1.7157427 -9.2919254 4.8160367 -3.3233650 -4.5927501 -9.1773787 -5.7384601 -13.0696602 -8.8244781 -5.4267197 -7.8318715 1.6306735 7.7796073 -7.2163820 -7.4332414 -24.4678993 5.2711768 -2.9048152 -3.7761660 5.9539952 -0.7459844 4.4435530 -12.8068552 -6.3398256 -10.8791752 -6.0539479 -1.7960044 -8.8909760 2.8290627 -11.7125063 3.9634242 -0.6935868 -28.2476215 -7.7968450 -21.8475189 -2.8154159 -14.5760317 0.9059537 -16.6820202 0.9270546 -1.3562768 -3.0309162 -4.9759231 -5.1674175 0.3058580 2.2395430 -11.1285334 -16.8903255 0.5657930 -4.8631873 -1.8490477 -21.1662235 -12.1184120 -11.3229151 -3.2186019 8.7935944 -5.2674708 -4.7152300 -6.0083570 -5.4659824 -23.9778366 -16.2385406 -14.2899866 12.5921612 -2.5524743 -10.1834717 5.7485747 5.5536847 0.2106522 -37.1602974 -8.0911207 -11.1834612 -0.3649530 -10.6811972 -24.4315109 -6.5624881 0.4927920 8.3875151 -3.0236785 -10.9634647 -2.7736347 -5.8330059 -6.7312880 1.4456847 2.0364404 -6.9839439 -19.9637165 -0.1805020 6.7320757 2.3192029 -5.1636376 -6.4367108 -9.9107761 0.1883337 6.4439359 5.2560911 5.5598059 -7.9088659 -16.4643364 -18.7011909 -1.6306232 3.5335746 -4.3090725 -20.1742496 -2.8787270 -15.7831793 8.7356319 -1.9346775 -2.1931713 -10.3203878 -26.3225765 -14.6254721 2.1818304 -7.7623620 8.9604063 2.0879233 -0.6828700 -9.3207579 -27.6629753 -13.7094078 -18.7809887 -10.5812922 3.9653165 11.8210506 -3.4298666 -1.2591072 -3.1088414 8.2062407 2.8168330 -9.5976448 -1.1468563 -2.2487707 -3.0322959 -6.5745058 -7.1827989 -7.3270278 -6.7194901 -3.4732699 -0.7497321 0.8751922 5.1806936 -6.8891926 -5.3112116 -15.8943157 3.0258732 -1.8398606 -2.6245239 3.6783764 -2.5025294 3.0865912 -5.5603971 -5.7793527 -5.8038068 -2.6385691 -3.0323799 -6.0987597 1.9891883 0.0497119 2.2441232 -0.3937703 -8.3174200 -5.2844143 -23.8178120 -2.9865525 -6.0412569 -4.3352003 -11.3183737 -1.5971813 -1.8014377 1.3513552 -1.8665792 -3.1446931 -0.0390945 2.1075003 -7.2450805 -11.2432079 0.7209379 -6.2399039 -1.4907620 -9.7739639 -7.7109027 -2.8508730 -2.0156753 5.7348824 -4.2317696 -2.9192071 -4.7635646 -4.8115988 -12.7889719 -12.3279896 -10.8593111 8.0239420 -1.2465835 -6.0313740 3.2993941 3.7494206 0.0225649 -13.0568838 -16.0603046 -4.8597679 -0.5931127 -7.3743382 4.4294496 -3.6791377 0.3032465 5.2511201 -2.3704629 -8.5898418 -1.8920574 -3.5487194 -4.6406369 0.7408652 -1.0654771 -6.2243023 -13.1984758 -0.8849539 4.1942735 2.0698009 -3.6837974 -4.2374201 -7.8148913 0.0717948 4.1873827 3.2821267 3.8017359 -5.3316612 -8.7159166 -11.1082764 -1.4358728 1.3940917 -3.0977948 -0.2841595 -0.4603183 -2.9698055 5.9357562 -1.3221284 -2.6173184 -7.9184909 -4.9063039 -7.1987686 0.3114745 -5.3347745 3.4251833 0.8721745 -0.6856839 -7.1134081 -5.3519077 -10.9283504 -23.9875164 -3.9408231 2.3737271 7.6723228 -3.1269848 -0.4494141 -2.2023103 6.2388153 1.6085775 -7.5674086 5.1283946 1.4156672 -0.0263798 2.4689765 2.0684738 0.5586315 -7.2208652 4.7982326 1.7628728 1.2071182 2.2422941 2.2259364 2.5003443 33.8255768 -2.0930424 6.9946985 -0.4288756 0.9954088 9.3518019 -18.1639061 -3.8423710 1.6055906 1.5846910 -2.9015954 8.6840286 3.3533514 2.4338868 -11.2615223 -19.4223614 0.6998547 -4.6938715 -2.7108784 -0.8429135 -0.0493173 -0.7596276 -5.1248398 0.1916806 -1.3644538 -3.0701723 -3.6442435 -14.4827557 2.1406994 2.1446793 0.7360308 6.6267819 -39.5580597 -1.3121744 -1.7655292 5.5516911 -34.4447098 0.7504468 7.8598337 -1.3307673 -40.1273384 1.5043325 4.3349934 4.9645534 9.4470940 7.8328567 0.8117120 24.6828785 0.2711740 11.1371346 -16.7058029 1.1437640 2.2844176 -1.4531013 -27.9358101 1.5827239 4.6552787 3.4894509 -0.3184833 3.9058714 -0.4503199 10.8175497 2.2964234 6.9308586 9.3855667 0.1169588 -2.8536198 28.6534863 -1.2880267 8.2316542 -1.6151205 25.2374477 -0.0235529 -13.5278664 -0.4349131 -2.1915388 -1.5207663 9.0253868 3.9599509 0.7862741 0.9249783 1.2739449 0.8077328 -3.4658163 3.3902771 -0.0494533 18.5352383 0.6307436 -4.3626995 0.6436913 -39.8669815 0.9717772 8.6203527 -4.0080633 -3.5504363 -18.5234051 0.8066840 -5.8465571 1.1347332 1.4006168 -2.3832910 9.7159758 5.1328521 -11.9096966 -1.8534369 0.3198284 -6.4994760 -35.7433510 6.1829557 -0.6951606 1.1656051 4.4528809 -19.9193993 9.9295702 1.7751205 6.0551682 -2.9893382 -0.2679474 0.6628116 -1.5400953 -1.8163527 1.2406597 -8.4956627 2.2047200 1.3420634 4.3475757 -1.6042757 2.6629355 6.2052765 -4.1665483 12.8875046 -0.7851211 2.6230617 -5.6579847 19.1120377 3.2728264 5.9829140 -6.9445586 -12.2410040 23.0785809 5.7576423 4.3459177 8.1841564 21.2815723 1.3061895 -5.1971178 -14.0587044 -1.8091080 -14.1828241 6.1414623 -7.6421990 4.0453138 -1.4394735 0.2680860 -5.7992339 -10.5886412 3.7726312 3.3387270 2.5061038 5.7984657 -2.6127262 -2.4009097 -3.2175975 7.4788289 -3.1810253 0.8936450 2.8324015 -2.0866048 25.8391647 3.3099482 14.7107153 -6.7325535 11.8274097 9.4904585 0.6444762 -16.3490734 0.0651397 -8.2454481 -0.6139124 3.3027680 2.0548639 -2.6621189 -1.7000738 3.0377533 -7.9323235 5.1218343 0.0139657 12.2932177 22.6499462 18.2367649 4.7681208 20.6931114 9.3103943 0.3497445 -4.4229555 0.4154378 -2.6070065 8.3986225 1.6789951 11.2954559 -2.6668792 25.8898926 -1.2736611 -3.3955948 6.5799246 -2.7121594 7.4774146 3.3328004 3.0833437 2.8531909 2.0832875 -0.4600173 8.6022806 -4.3014245 18.0252171 0.7223534 0.9924376 0.6974679 9.1108532 3.1672518 13.5477514 -5.8166556 0.7243080 0.9834962 0.6529734 0.3876524 2.0559521 1.0403239 -6.8508501 15.6694689 10.6096935 -1.9832814 -3.8943391 0.1045673 -1.3339437 24.7295742 9.6050177 -2.2630122 1.1330370 8.5904303 -11.9842672 15.7669163 7.9925809 5.5612240 -6.8346386 -0.9518747 1.1287469 13.6299772 24.0171986 3.4416370 -7.3767943 5.6762300 -1.4057947 6.6107244 3.0776241 1.9744160 34.1669884 -5.5998874 16.7238026 -1.4420371 5.5296397 5.1871076 -6.7256231 11.5590944 6.0701523 13.2332602 0.2730152 23.6100636 5.8705516 5.2905326 3.4464197 -3.6935923 1.0942811 3.2058632 -21.4420204 -2.3885458 -6.1488590 -9.0875978 -7.2603607 -13.7561846 -1.0679812 -0.5361999 -1.5635409 0.9323800 3.0047591 0.0594253 1.6080469 -5.6747742 -2.6522410 -3.6240559 5.2070460 8.2132607 -1.6009743 0.6935992 11.9990349 -3.2209816 -15.9713306 5.8202262 17.7199974 25.8486691 20.5046921 9.0803509 1.4399703 31.1035995 22.1648560 -6.6716719 0.9521623 5.3013444 4.9908123 -3.1537437 -1.8214928 5.1137366 15.2620344 4.2819567 0.9524429 11.2886038 -4.2043538 21.0573921 3.5944161 20.7365856 -1.8024588 -1.2859952 -3.0148685 42.1423492 -3.8635061 6.6040606 10.1169901 28.8233128 -2.1763020 8.8820229 -6.0814881 -4.2927332 -1.3518366 -4.7122140 10.4394102 5.4187469 6.1249895 0.0229280 2.4731240 -2.3672376 29.5333710 -12.0690813 -0.7979580 -0.1521055 0.9726566 1.2255145 -7.3265009 4.9287286 16.0726089 0.5857423 -3.0561237 1.1495303 -0.6030444 -1.7996422 2.9681838 -8.1604986 -10.1658669 20.6915359 1.9266844 -6.6050916 -4.9468145 0.7492645 3.2667415 -15.3149805 9.3977118 -3.5491979 0.6911902 11.1830845 0.3606917 17.5894661 -5.1944060 7.8234644 -0.7254246 -6.7500443 14.5108500 10.7386951 19.7577438 0.9484286 1.6727884 -1.5561228 -3.1407149 4.8598390 7.0125227 -6.2266221 46.5934868 -3.9866793 6.3746123 -1.1138093 0.1619487 33.5634117 -16.5255070 17.5990696 -16.8967915 -3.0898116 7.8376112 19.4103794 0.2205370 -3.0747657 -1.1933889 13.7639494 -4.8052030 5.1550126 -1.8917929 1.3176842 2.8385582 -2.6660259 3.5031083 -9.6994667 1.5436857 2.3809192 4.7633200 -2.2961462 1.3294390 9.6701822 -10.2859840 -7.0899301 3.1086509 -3.3042457 7.0079489 7.6941094 -0.2225776 0.6674870 1.1731771 -1.7677245 17.2501488 -2.8104084 -1.6044343 15.3768568 14.0760508 -5.2560563 3.3435445 6.3134775 -21.4531670 6.3966379 -1.3467321 -1.6075342 3.1130998 3.4608116 -1.3269540 2.5002842 26.0234451 3.2054422 19.2207870 6.2057209 4.5805726 -2.4257259 7.1049662 -37.8257828 -6.7043166 -7.3276439 -1.6434443 -7.4011831 -2.1156480 1.6665354 19.6723633 34.1645813 7.1804786 -66.2248306 -11.6120110 -3.6069000 17.4128189 -5.6127396 3.0196548 4.2997952 4.3748374 16.1993599 -1.2692130 -4.2695975 24.4647408 -1.7731115 -13.7558746 2.2198851 2.8186316 0.5859233 5.2630324 3.7715206 -3.0955894 9.9700537 1.1644852 -0.0523883 -1.3834172 -3.9141083 1.4254001 -4.8072686 -2.6056149 4.0198369 7.2208200 -1.2425481 -2.0402627 -0.7281010 1.0878853 -6.9635873 -3.6196766 -3.0997097 -6.0335078 1.3879863 -2.6921482 -1.9516271 -4.1714206 2.3751936 1.5751019 -0.5313390 -0.2558135 7.5040293 1.8262229 -3.9727423 5.8168664 -0.2362845 -1.3411334 2.0065629 2.2217269 -0.5115330 28.3798161 -1.7550189 8.1207685 -0.5277892 1.9282805 12.3669062 -5.8557315 0.2693326 7.7764783 -4.9664326 -8.7471313 8.3596849 2.4442639 1.7191610 -10.7965384 -20.2934494 0.4009621 -5.1838670 -4.6883755 -2.8476775 4.2648654 -4.0755472 -12.8494806 2.6043000 -2.5040448 -1.2256091 2.3445289 -3.1408992 1.5564650 2.1744020 0.3986779 14.0414772 -27.6274185 -0.9719446 -2.4779966 2.7847376 -29.1788025 0.4423443 6.3052449 -1.2091446 -17.5057201 1.0221020 1.5865116 -1.6241518 10.8466721 0.5065616 1.2286065 10.3407021 -12.5611629 12.4214039 -10.9272432 1.4161167 2.2478373 -0.5541070 -41.1041374 -0.9515378 8.0293283 2.4050546 1.3844861 3.1440618 11.2275963 6.8088388 2.1188340 -6.4126468 5.2098489 -0.0944723 -2.3464031 3.7948163 -1.1913265 7.4846482 1.9419165 21.3527126 -1.1392016 -24.3384018 -1.8872118 -1.5403767 2.5604122 6.3972683 3.0431533 1.3777264 1.7781824 0.9889411 -3.5926938 -6.2615886 5.7154999 4.6633339 14.1623898 0.3822878 -7.3923769 0.4090338 -31.6131420 1.8127201 5.7973046 -2.3257384 2.3223383 -18.6489353 -2.3700981 -7.7058039 0.7338836 -0.2971079 -1.1607206 6.8562002 7.8450751 -17.9734077 -2.3350539 -3.3992121 6.2220807 -43.4089546 3.1966410 -0.7030546 0.4780077 3.4832103 -21.8326588 7.1172123 10.8619995 5.5287147 -4.7466049 -1.4096398 -3.7308469 -0.1049085 -0.0402747 -6.7401581 -11.8783016 -3.6335781 -5.7942033 3.8859134 1.8378661 -4.1552052 -5.5059733 -3.3334124 10.0556841 -1.2151726 3.8944914 -7.4219632 8.9095163 6.8757124 -1.5965869 -4.1371474 -7.1698661 0.4927607 4.1387134 2.8993318 1.5344402 19.3871078 0.3019382 -3.6817334 -20.7632236 -4.2127681 4.5785809 6.8905277 -2.5072947 -0.7016344 -3.9152701 -0.6504323 3.1199965 -8.5568924 1.0632015 2.3356888 1.4144288 12.0971937 -2.0208018 -1.9743552 -7.2129230 1.1666296 -20.0661583 0.6044415 0.5303367 -2.0370851 14.7577753 -1.8578089 7.0938525 -0.1526169 7.7780757 8.7530727 2.2758873 1.5128294 16.1016731 -15.3289709 -15.6616411 3.0481508 2.7980247 -1.3585725 -3.9303648 -0.8859757 -3.2013416 0.4244873 -3.4377894 -3.1900983 7.4062295 7.9465556 2.9726379 10.0506392 -2.8617160 -1.0023214 -2.4082248 8.0066605 -2.2904129 7.6140103 4.2140446 -1.8862642 -2.9297566 17.5282745 -3.4441779 -3.8342874 -5.7776351 -1.2907131 5.8345990 3.2276950 3.9729950 1.6423589 3.1541398 -0.7978278 4.1599298 6.7336197 5.1032257 -0.5370300 -1.7965266 1.0480593 2.5941200 3.8145840 8.3325233 -3.3786674 3.0742855 -8.9332304 -4.0885129 -1.6507980 1.3147111 -2.8916283 -3.1361303 8.9063177 -3.7024953 -5.4129643 -5.0397897 -6.4817433 4.2766662 15.5887861 1.5791960 -2.1119835 1.0676607 6.4387608 -2.3690577 7.5000339 -0.4526916 -6.7152352 -9.7564192 -2.4864359 -4.7918162 7.9723692 -3.9694605 -2.9257643 0.6964802 -2.0984008 -10.4568758 5.9126606 5.9638109 -6.3411350 20.4823360 -3.6310406 13.3474579 -1.6967671 6.4090872 -1.2938825 1.9291526 1.0943710 17.3623028 -10.9873857 -12.5972099 12.5529280 8.2835455 3.9853585 -0.6696982 -9.8994589 0.5339339 -1.7880839 -26.1615276 -4.5159230 6.5514135 -6.8737278 3.2562044 2.3494618 -4.4073863 -0.8021546 -1.0593566 -2.9473176 -0.2757954 1.8523543 5.2799425 19.6138000 -9.8377857 -2.9458914 -2.2675555 0.7965095 -2.5224466 -0.0070417 2.4523714 -3.0780396 -11.3148184 -0.6117995 3.0621717 2.5950763 12.4798336 13.3905773 2.4801888 11.5516243 3.0841730 9.1048031 4.8787217 5.6481128 4.9258232 -2.2637324 0.9831557 1.0936111 8.6210403 2.0835724 1.7287958 1.0684944 15.3220453 6.7749510 4.6194444 1.0264215 10.8546638 -1.3162469 -4.0124960 9.3213577 -3.4374909 14.4035044 4.3125567 15.4400749 -8.3657627 -9.2949018 -4.8568130 -6.1613107 2.8503947 -6.8027029 8.2852478 4.9432955 6.0613990 4.4188294 2.0160544 -6.6636362 -5.5852671 7.5144076 -12.6152306 -1.3349155 -5.9659262 2.1906998 -4.2062054 5.8718066 8.1033163 -7.6472621 4.2266402 -4.8417182 -5.8275695 0.2132680 2.0425100 -5.4228735 -11.4777498 11.4643726 -11.3639088 -11.7122602 -7.6750784 -7.0130877 5.8049107 -35.8726959 -0.3199109 -3.3524530 1.8508587 9.1146526 -1.6679026 10.4333925 -3.6948469 -0.0203987 2.3939660 -4.6253686 0.3639374 7.3374057 2.7044332 -0.1614995 7.6462312 0.6698105 -0.7947898 4.3233938 8.6341305 -7.6138916 39.1949730 -3.7501485 2.3677044 0.8211951 3.9116399 -5.1495328 -7.9138393 7.2914257 14.5416861 -9.0770931 5.0487785 17.3403320 1.9386342 0.6324672 -1.7128414 -17.2978992 -1.1732948 -8.2501554 -4.1377993 -4.4410758 17.0038509 -6.3806400 2.5692861 10.2201786 -1.2983389 -2.7177401 1.7999945 -5.0037899 -1.2457165 -2.2286501 -2.5015869 12.3836784 -2.8804753 -1.9820186 -0.1338871 -0.7245036 -0.8633795 -0.3751829 2.9641371 -2.6391759 -31.7810307 -1.1730816 -17.5578346 -5.1192880 10.8359423 19.2984905 5.9754229 0.0893184 -42.2806816 20.4604969 -2.0767446 2.3731840 4.7576218 -0.6104618 -0.2360311 2.9697182 -2.6556888 -5.1925821 14.8760710 -7.1173677 -1.5280318 -2.7496908 3.6538272 -35.9265366 17.3929443 0.4286090 -10.3692198 -13.5339022 -2.2335601 -5.2968426 11.7553806 27.5338192 2.6490624 -66.6109848 -4.5781913 -1.2949865 -2.0079243 3.4691133 4.4337010 3.6867349 1.7265395 -9.1490479 9.7338181 -1.1204364 1.7367598 -6.8209853 -1.6055075 7.4055915 -0.7235523 2.1123106 4.4166632 3.8843181 -4.3750572 -3.3195229 7.0832944 -0.6409875 -2.0636892 4.8814502 0.9600161 -7.4952736 -5.9097352 -9.1748905 0.7018318 -4.7004042 -3.5791497 -1.5650493 14.1566668 -7.5352631 -16.7739010 -3.3107042 -0.0843526 4.4064484 -2.9723606 0.9358721 -9.9127951 16.9262848 6.9382992 -0.8902888 -8.0397854 6.8748684 5.4124565 -2.8877566 5.3816161 -2.9164579 -0.1529281 1.8996359 3.4454372 -0.0878252 23.0820541 -1.7788171 3.4581034 -0.6127883 1.4104296 -12.2007217 -8.3164854 8.9313898 5.6547890 -9.9187164 -10.1182814 6.9094830 0.3480394 1.2871121 -12.5272331 -32.9044685 0.1744326 -8.7551537 -6.5912170 -4.0643220 5.5829520 -6.7516322 -14.1534014 -4.9288197 -1.9775146 -1.0862895 0.4406215 -17.6070461 -0.6525180 0.6453679 0.9989738 4.1135406 -13.3836184 -0.7135140 -2.1179612 -0.8483055 -13.2680635 -0.5381604 4.1365633 -0.9132850 -25.2907391 -0.6830073 -0.3567548 -2.8201864 5.9123282 10.4376850 -0.1330851 4.9793711 -14.6838722 12.2261677 18.2520599 1.1769360 2.0641832 -0.4348533 -37.0401840 -1.1870104 -5.1865878 0.7022351 5.2527146 10.6537142 6.3626862 2.2246747 2.0163579 -10.5918961 -1.0657824 -0.4672826 -1.2619908 -0.4930945 -1.0195481 0.6803161 3.4126406 16.8717861 -0.6200653 -27.7414322 -1.0467362 -1.7449260 7.2801943 4.9322495 2.1451342 1.0843655 1.0846494 1.4461991 -2.9424791 -7.9565511 8.6833944 -0.7378912 3.5174425 0.1031871 -12.9631777 -1.1574696 -31.9735165 1.9791560 2.9034801 -1.8774107 -1.2712533 -19.7472534 -2.8103142 -10.0841188 0.2782328 -0.4849197 -0.3908572 4.2635121 8.9132185 -21.9810905 -3.0367901 -1.0326079 5.7973614 -52.7563820 -0.3312619 -0.7531838 0.6646154 2.3646941 -17.8562737 3.7836802 22.3852329 -1.8586905 8.2590647 -2.3446019 -13.5876350 1.1612760 1.6418281 -9.0932541 -16.2851200 -9.4319077 -2.0159972 3.4063556 -1.4218291 -2.8807943 -8.0880709 -3.5228355 0.3476179 -1.6282802 2.3066401 -14.1368484 5.6330495 6.5622549 2.1544733 1.0054750 -11.2622499 -9.3409119 3.5452094 1.8009789 -5.8777246 14.7804203 -0.2989930 -4.1999683 -15.3915176 -7.4358926 8.0584021 -4.1550345 4.0172091 -4.8260279 -3.6287854 0.2737384 1.9376671 -4.2218609 -2.7126925 -0.6365828 1.1681271 1.2734936 -7.2544785 -1.4586123 -5.3210645 -3.2305801 -10.5916042 -2.6946056 -3.6567416 -1.7608683 9.3556023 -3.0503750 2.7691600 -3.2718029 0.7950153 0.0045690 -0.0574573 -6.1498995 12.6739769 -15.6800194 2.8637486 2.3336685 2.9941514 -0.9856229 -4.6434674 1.2347231 -10.9686375 -3.7926211 -4.9091420 5.3835611 0.3452848 -2.2875304 2.4051721 4.8761578 -1.0960674 -1.6700337 -1.3885226 2.5104532 -1.9756384 3.6423225 4.3128738 -5.3856869 -2.6708493 12.6179409 -1.2421986 -3.5488992 -4.3065004 -2.3379889 3.9089098 2.9217012 1.9564540 0.4816772 0.4654822 -4.5794077 6.2324290 -1.6924629 -16.4798679 -1.2584805 -4.6941018 -1.4162202 -5.2559247 3.9416902 2.6196542 -0.5318796 -1.5859361 -7.1771193 -2.4054282 -5.2590919 0.5485918 -3.2217796 -1.7529492 3.4025404 2.8283877 -6.4693933 -6.5541596 -2.4900708 3.3670440 10.5289049 -6.3270540 -2.2316775 0.9766282 4.5038309 1.6540622 -0.3530079 1.4495481 0.5179163 1.9683022 -3.2615335 -8.0983438 -0.6279932 1.4953700 -2.2228868 -6.8725948 -9.6659813 -2.9764609 5.8594532 -3.7289293 -3.6174338 12.2104731 -4.2736588 -0.5496873 -1.6623044 4.2818918 -5.1230235 -4.1056952 -12.7885551 1.9287744 2.1166975 -11.3813581 -0.6815327 4.4359913 3.0598848 -5.3783274 -9.5375881 0.1545086 -3.3935156 -14.5914249 -11.3627958 8.0093555 4.2155704 1.8213868 -4.2192197 -2.6866028 -2.8553026 3.9486711 -3.5678163 -4.2830563 -2.4796462 5.2539096 7.8275251 -7.1207209 -2.3966503 -3.9910102 -5.3618259 -0.9102010 -3.6934659 -3.9147644 -3.5006714 -5.9505215 -5.0836201 1.8538268 6.3310084 3.9506826 2.7349305 3.1693110 4.0120854 -0.6671401 -0.7237675 4.7668996 3.7904770 4.7879839 -0.8188723 -0.1124203 0.9144442 1.9207811 -3.6756039 -4.6166291 -2.2510281 3.0952778 -3.7164550 5.3598304 -7.1901684 2.6062276 -0.6261731 -3.8232193 1.4688997 -2.7622514 1.4496236 -5.9964194 8.0248919 -1.6743629 -16.1862812 -1.6437851 -3.5247815 3.1996009 -0.5555996 5.2244124 3.9531639 2.8838255 3.5138123 -7.1706519 -2.0491560 -2.4431705 -4.1122980 -6.8353014 0.8357009 -3.1607006 -1.4138912 -3.3762248 6.0926700 2.2110605 0.1106064 -4.7946763 0.0107576 -5.3270869 -2.2890799 0.8095887 -7.5968490 -2.9949546 4.7550740 -0.7254586 -1.5910501 -8.5958662 -0.6196445 -3.6612160 -31.3910007 -9.1257639 -3.1120379 0.2690374 6.1909180 -2.3302889 -1.0048016 3.3970551 0.0696624 -1.3105997 -2.4240501 0.2595035 -0.0787416 -1.1097895 -0.6755338 -0.0012605 1.8450645 -1.8295034 4.0467272 0.3856658 -1.3499099 5.6345849 -2.3116901 5.2053075 0.6286426 -1.5371573 -0.0712112 1.2305897 -1.0464575 1.5938057 -0.6765728 -0.8825433 0.0386758 -0.3229724 1.3194302 0.2693738 -0.3778139 0.0510946 -0.1746364 -1.7828593 -1.0551414 -2.6748652 0.7406007 0.6785895 -4.6799254 0.7278211 -0.1283249 0.7266810 -0.1824171 2.7048995 2.3471854 -0.9906165 -1.1215410 0.6156561 -1.5896717 0.3015383 5.3722873 -0.3104323 -0.9714224 -2.4433362 -0.7946708 -3.4029276 -0.0338692 0.7253326 -1.4302781 -0.9482661 -0.3469606 -0.7296578 6.1563511 -10.0133982 1.8837644 -0.0978005 0.4352189 1.0560594 -1.2298688 -0.1566500 0.2669453 -0.5543978 1.1027652 -3.0160201 -0.1882198 -0.4508967 -0.2832312 -3.3064501 -2.1078246 1.3105724 3.8514993 -1.0489954 -10.0120926 -2.0191231 0.1645162 0.9351901 -1.4498416 -3.3618474 3.0417538 1.6047924 -0.3359959 -0.1283861 0.7373772 2.6126132 2.0007393 0.1936965 9.6319218 -1.2531862 -0.9510913 2.0325043 -4.1785426 -1.0955452 -0.3817516 0.4349849 0.8409608 -0.6461185 3.7788703 -1.0558590 -0.7309286 2.0135293 -0.0284732 -4.1869426 -1.4633507 0.1387579 -2.3205130 0.1757074 1.0033761 -0.0872730 0.3766339 -4.0382347 1.5642712 -0.2611831 5.0205278 -5.4024677 -2.5272026 -8.0851736 2.1599505 -0.7007972 0.8363811 0.5779384 -6.1844177 -0.9808510 -1.0448720 3.2256424 6.0267711 6.4354100 2.0568035 3.9576361 -6.5384221 -0.0751250 1.5138035 2.5649691 -0.9699683 20.1317177 -1.7650516 -0.4720780 -0.7120091 1.4760395 -21.8940868 -10.3448267 6.7438979 -1.1796962 -11.4972973 -5.6451712 4.7771177 1.0767108 0.9731802 -15.0029221 -28.2113419 0.0278695 4.7704186 -5.1671209 -2.7494745 3.6182723 -4.8841772 0.9534918 -1.1394032 -2.6358097 -1.2955122 -5.3887696 6.9870586 -1.9872353 -0.8466809 0.5557936 -12.0962477 -11.8882771 -0.4341502 -2.8679764 -2.2738328 -13.6702213 -1.3024031 -0.6224128 -0.7395837 -22.8859463 -2.9283929 -1.9385935 3.4869428 3.8743417 4.8736658 -3.5037491 2.4259861 -17.3658504 10.7031937 -17.7597752 1.0537601 2.2161019 -0.4017940 -23.3468685 -2.1483080 -12.7511072 -1.0544091 -4.5187230 6.5356464 3.0078528 -2.5214770 1.7943916 -13.0045404 0.0885642 -0.4391412 -0.9179190 -3.0915499 -0.8037439 0.8800864 -0.5981265 14.1546898 -0.7814002 -30.0171185 -0.2862594 -1.3094594 1.3702053 -0.7846514 1.1680027 0.8511488 1.0024270 1.2364268 -4.5485625 -9.7952127 8.8802271 -3.9188778 -9.8180532 -0.3941015 -11.8466597 -1.7757797 -27.0992546 2.3313661 0.5283502 -0.8115103 -0.3378791 -16.9056187 -1.7242831 -4.7680902 -0.1371987 -1.2537283 -0.8157203 1.7261460 9.3904667 -21.7517719 -4.4871330 -3.6081066 18.3678570 -48.6726494 -3.8220356 -1.2696060 0.3915709 1.3922019 -33.2247086 0.5021604 11.6144905 -0.7094356 -1.4266349 -1.9212527 5.9523053 -0.4644405 5.0944777 -0.8304015 -12.6443567 -12.0283060 -2.2908044 3.2816849 -0.6272511 -5.0100546 -12.6391287 -3.7538607 -7.1540213 -1.2864052 3.2079840 -8.7570705 2.6353967 5.5863042 -0.7604370 0.5342890 -12.1482382 -10.9504290 1.5722860 2.0056381 -10.8787804 9.9725027 0.2510206 -8.3236246 -16.1202545 -4.7398391 2.3115826 -8.5652561 1.0304208 -3.1211853 -3.8721375 -1.0529245 -0.9412329 -4.2852468 -4.2560277 -3.6605799 1.0887184 -9.3152618 -13.5181570 -0.9012513 -3.1753457 -7.4830241 -8.1254311 -2.6977665 -2.6772363 -1.2388916 6.4429936 -8.3597584 1.4448951 -0.0568573 -0.3362932 -3.8114650 -4.6148806 -5.6889467 8.0344582 -10.3435879 -6.9522228 2.0692310 3.4042382 -0.7125479 -5.7403679 -3.2836971 -2.2310729 -6.0668826 -5.2134252 -0.2175944 -8.7341118 -11.0044203 3.6964705 1.0739025 -7.4766130 -0.3876601 -1.2858273 -1.6805223 -1.6274545 1.9474106 0.8651593 -9.5849400 -0.9135899 8.8069563 -0.3316862 -2.2035847 -7.0763907 2.7152510 2.3979836 2.5696692 1.5469739 1.9046965 -3.4928501 -8.9102211 8.5570879 -6.8328185 -16.3732548 -0.5642882 -13.9891186 -2.4126132 -10.5825491 4.5523300 -0.6819664 -1.7042972 -4.2514834 -7.1502423 -2.8674281 -1.7680048 -0.3564220 -3.9335070 0.2961648 -0.2298331 2.2877789 -2.6621478 -8.5734978 -7.9944930 1.7665269 6.8331232 -11.7124481 -2.6614478 0.2824961 2.8951070 3.1268063 -5.3385406 -0.5559046 1.2777152 -3.7016668 -2.5995119 6.5144243 -1.8846962 -1.5255411 -3.2468946 -5.6966438 -12.1013021 -2.9244974 5.4734311 -5.5239263 -4.4094615 6.0609350 -6.9158592 -5.0661912 -2.0927780 3.4946873 -7.2624631 -2.4221041 4.1102772 -0.9407370 -2.9180210 -5.7045951 4.2923861 0.8520194 3.5704606 -2.4185433 -6.8705831 0.2158802 -1.8633859 -15.2669477 -3.2156522 -0.0320320 9.3261557 -0.7411395 -3.7040946 -3.4502330 -1.3292344 -3.7276437 0.4586361 -6.3624310 -3.1257615 6.0681024 -0.6713728 -5.3195906 -1.5706751 -3.9999952 -10.3987360 -1.3976225 -3.0706961 -5.0705328 -1.5948818 3.6175008 -9.9177380 -1.9653496 3.0823190 2.5000203 0.2532973 -7.2412014 0.6916978 -7.7343121 -4.9291883 -6.1468778 1.1929753 6.1894817 -0.7791557 -0.8815213 0.2398882 -1.7094334 -6.6435905 -3.2378886 1.0218548 -3.6386662 -7.6265602 5.4901199 -10.7384939 -1.8788075 -0.8610553 -1.1544886 -3.5176213 -2.3424540 0.8642781 -2.6929920 2.6370749 1.7175133 -15.5002880 -0.1450193 -4.0766587 -5.5892978 3.8182359 3.2152863 4.2823758 2.6807604 5.1539979 -5.5334716 -3.1695108 0.0599914 -7.6239614 -0.8817030 -1.0686287 -6.3977332 -1.9022087 -0.9791996 6.7741981 1.7615042 -8.7539253 -1.6940931 -0.0568248 -5.5518613 0.3273161 -0.5831202 -8.3663435 2.0703816 0.4250537 -3.0663898 0.4250346 -11.4305315 -7.7027984 -2.6944644 -18.9245567 -15.5830727 -3.8083947 1.9095162 3.5202165 -9.1491337 -6.7789989 1.1365314 0.0309684 0.3222765 -2.8255825 -1.2172052 -0.6537793 -0.3383951 -0.3861119 2.0534778 -0.8712467 -2.4790843 2.9657302 -2.1986825 -1.5541396 -0.6379833 -0.9222924 0.6891505 -2.6661594 -0.5962877 0.2502265 -5.9121971 -0.1075455 0.5105692 -2.5833733 3.5546172 0.1596971 -0.9596587 -1.3890766 1.1883801 0.8333946 0.6049650 0.1219174 -2.2932050 -1.9929541 -1.5892268 -1.4234899 0.8049061 -1.3928368 0.4008769 -0.7752981 0.3175082 -0.3449124 -3.8042157 3.4855697 0.2612852 -0.5945981 -0.7405496 -1.1098601 0.1986585 0.9474016 -0.4735588 -1.5762579 0.1997969 -2.6046591 -3.8626397 0.6629178 -4.5357900 -0.4960335 -0.3633398 0.2835985 0.2000743 1.0774493 -2.4732251 -0.1934103 -0.3848662 3.2642636 2.4367840 -0.6584745 -0.4048572 0.8142846 -1.4182605 -0.5239255 2.4890006 -0.6591688 0.2225580 -4.9652653 0.6121947 -4.2375903 0.8622354 1.9079286 1.9505374 0.6090805 -1.4168200 -1.0827466 -0.0186836 5.0095587 -3.5240152 3.3402576 -1.2791086 -6.7368512 2.7870500 0.4524963 0.5247370 1.9444431 -0.5370981 -0.4343227 -0.7028121 0.0458746 0.9965529 -3.2801464 -1.5405929 -1.8319609 0.0209039 0.1087262 -0.6396425 5.0869441 1.1528753 -0.1695038 3.9634535 -0.2348188 -3.8581502 1.0461596 -0.4702040 -1.4774451 -0.2994042 1.1152339 -1.3925503 -0.4320480 -5.2477345 0.2259142 -0.3104829 2.3757238 -1.2805338 -2.9246438 1.6366377 -2.7087650 0.1558136 -0.4268618 0.3888534 -6.8831234 1.1420568 -1.2481314 0.2417381 -4.5789752 6.5989079 -4.9349146 3.5614183 -5.9700460 -1.7961131 1.4780097 0.6029658 -3.9101548 17.7498417 -1.3935752 -5.0748558 -0.7822378 1.2642415 -16.0258427 -12.4540129 -2.4778497 -0.9122599 -11.4681053 -7.4685402 -5.9481750 -0.5217112 0.6215793 -8.1362391 -35.6393967 -0.1006754 5.5936661 -7.3925009 -3.9999743 -1.7770764 -10.7264538 6.0308819 -0.8709002 -4.6144443 -0.2639290 2.1091614 -2.6879227 -2.5476973 -2.2856162 0.5753048 -15.8499298 -8.3754215 -0.4792547 -1.9814126 -3.7442899 -10.6756973 -2.1187932 -3.9268377 -0.4810202 -21.0822639 2.9887772 -4.1167870 0.4138560 1.9133821 -9.4569397 -5.6237402 1.7482970 -21.9018478 10.8563347 -9.5126429 1.1016861 2.0406294 -0.0801345 -12.2359066 -1.1914327 -1.6614276 -3.2651365 -4.8608346 -2.6505022 1.1355342 -7.9254866 2.2360215 -14.9506502 2.5381086 -0.4644425 -0.3030307 -4.7945333 -0.3068669 1.0943938 -2.2165940 11.6604481 -0.6260000 -32.7135887 0.1357918 -1.0038488 -5.9083071 -4.1546769 0.4043499 1.1164421 0.8977953 1.3404469 -3.1709340 -7.6976452 9.0825853 -3.8893058 -1.8001869 -0.8121107 -7.8064523 -1.3664172 -9.7261572 2.5376191 -1.1089680 -0.3678837 -1.9218041 -10.5598774 -2.9122562 -1.3751405 -0.5557380 -0.8136243 1.2036918 -0.9497757 -0.4223731 -13.0303240 -5.2900829 -1.7878829 0.2671797 -50.9420128 -7.5641875 -1.4790027 -0.0554539 0.4659275 -35.4090805 -2.9429564 3.3772633 -1.3998523 0.9416754 -3.4692390 -5.5417347 -4.2675819 -1.6454782 0.8553107 -10.2096481 -9.6055737 -2.9607031 2.8897111 -3.1407690 -1.9334673 -15.2141829 -3.6456335 -11.9957800 -1.5637493 2.5698228 0.9201006 -1.1044886 -9.6120205 -4.2654481 0.7717633 -11.4689350 -9.1399889 -0.8843893 0.2973388 -10.4306803 3.4682822 -0.8013203 -4.4575329 -16.2596703 -7.3153377 -8.6930428 -6.3544569 4.5195479 -5.2868581 -6.5566201 -2.0435855 4.5565801 5.7828808 -4.2286844 -4.6535754 0.6745756 -10.5668659 -10.6582966 -0.8065888 -4.3558192 -9.1592932 -5.7313552 -4.0736070 -4.1139064 -0.7562938 0.4837428 1.9395292 -5.5529761 -8.3192053 -4.0117579 -8.0923786 -6.3422527 -14.0711603 2.6829774 -7.0216069 -1.9041326 1.5436927 3.1105886 -0.0678110 -4.8549061 -3.1921196 -8.5638647 -8.2412090 -10.6902704 -9.2196369 -8.5689659 -18.5533028 3.0746965 -5.3800387 7.8135619 -1.6902970 -0.7349225 -7.6772985 -0.7820166 -3.5050662 -1.8209572 -14.0303907 -0.5752953 2.7451093 0.5451111 -2.0346558 -12.8943443 -4.5791769 0.7889438 2.3937278 1.5701162 2.1440852 -3.8860829 -7.5479326 4.7210007 -7.9929752 -18.5964279 -1.8534685 -5.5198379 -2.3787048 -12.0386238 5.2857180 -4.6696467 -2.8692467 -5.1070194 -6.4086781 -3.7679014 -0.7703987 -1.1836523 -2.8720965 1.6503862 -4.3630314 -6.8553400 -1.0318002 -9.8891745 -3.3973083 -4.6076541 0.8282809 -16.8971367 -3.1217456 0.6700398 0.9550498 -4.3388038 -9.7380743 -8.4923315 -2.1590922 -1.3730342 -3.4926264 -3.5481868 -1.5667549 -2.0149822 -2.2717199 -9.6301003 -9.4321880 -3.4325521 4.9960680 -2.3269544 -1.0015342 -3.4745331 -5.4183798 -9.3240070 -2.3403995 2.6051884 -9.9706678 -1.5966489 -7.8541026 1.5677452 -1.8495307 -2.7422831 -1.7976077 -0.6611819 1.0537367 -0.5482222 -8.0000887 -0.0542530 -0.8789016 -11.7440491 -4.3734035 -6.9941230 -2.2656794 3.1356976 -2.4478700 -6.8606710 -3.9545138 3.8233767 -3.3315153 -10.3639269 -3.0024631 2.0199845 -5.4338875 0.4024906 -1.4016676 -3.0040925 -8.8381252 -1.2155839 -4.4404111 0.1306465 -0.7568384 8.7546215 6.2159295 -3.9809647 -0.5090494 -0.7348434 1.6761950 -6.6481447 -7.1663747 -6.2662706 0.1368674 -6.0711527 0.5381163 8.6489935 0.1085288 -0.9969563 -2.1992302 -2.5496128 -7.9888191 -5.5991697 -4.5248919 -1.8354772 -3.2864780 5.2491202 -5.8254147 -3.8579648 -1.1411713 -0.9798224 -6.2877417 -1.2616394 -2.1275849 0.9008745 -5.0980239 0.7532713 0.9978221 -0.2553536 -3.5347328 -1.8317397 -2.5154552 1.1560979 5.3085356 0.2798776 5.7944446 -5.7640471 -1.2083957 -2.9803066 -7.1364388 -6.2038040 -3.6752152 -3.2894471 -3.0460110 -0.1625825 7.1389198 -7.7658563 -3.4704323 -4.8975282 -0.5321597 -9.7860126 -0.0748483 -1.7984986 -5.9496098 -0.1945027 0.1062112 -7.8807044 -0.7733849 -12.8534813 -3.5191596 -2.5529742 -1.3166473 -14.5279598 -4.2347856 1.2307879 0.2476707 -5.7320466 -8.0653849 0.3981947 -1.8838837 -1.2333851 -2.0113683 -3.2179103 -0.7290467 -1.9142588 -0.4514285 -0.3815484 -0.8902308 -4.0162115 2.9209146 1.4042125 0.8292055 -6.4725685 1.4843184 0.6508525 0.2890088 4.0646853 -1.2007531 -1.7903925 -4.3757505 0.4786513 -1.6912625 -2.0321126 -3.7806995 -2.9761763 2.3689830 0.7244224 -1.1594751 -0.1574948 -0.9148932 -6.4234381 -1.2682303 -2.9363821 -0.5680063 0.2888571 -1.0286448 -1.9064802 0.3710861 1.0919253 -1.4820986 -5.4746361 2.1758311 1.8733023 -0.8466163 0.9229337 -0.6213355 0.4284799 0.5238243 -0.4470125 -3.2955873 -1.9215577 -3.6504025 1.6675023 -5.5628748 1.0484231 -1.6380316 -0.3119147 -0.5346583 -0.3336306 -2.6390920 -1.3847525 -0.5262170 0.0253775 -0.2657369 -0.4176269 1.0480690 -0.5283939 -0.6751776 -1.2607301 -1.9128516 -5.2441382 -2.4057295 0.8550522 -4.2471533 0.4434583 -2.2355797 -3.1879470 0.0723533 -3.4528384 -0.9009936 -1.1157299 -0.1922424 -0.5767124 -4.7082310 -3.1408622 2.4055948 0.0085807 -1.9087160 -1.0050122 -1.2011079 -0.7577121 3.2331097 1.3288709 1.3270279 2.3080575 -2.9265087 -8.1145802 -1.2471118 -1.8270913 2.3094277 -0.6377772 1.2314690 -0.5259290 5.4618554 -0.3801828 0.0227456 4.8286662 -0.9702522 -4.9964433 1.1376493 -1.1611556 -3.2890861 -0.5057454 -0.0975696 -2.7676871 0.3649525 -8.7537670 -0.0386702 0.6385589 -0.2573052 1.4698561 -3.0539196 -1.0880656 -3.7756541 1.2512836 0.6882407 -0.6321312 3.7691882 -8.2653923 -1.6750600 -6.0301237 -1.4616826 5.0460062 -13.5527134 -1.5223188 -7.0992446 -1.6931231 1.6511322 0.2982912 2.3867853 -18.1904678 -0.9682900 -7.5839911 -0.7979426 1.3289847 -21.7862263 -18.4921875 -9.3921280 -1.2758334 -13.2069273 -11.3378553 -21.6833782 -1.2983811 0.1018633 -5.6347718 -26.2305851 -0.3405039 -5.6498218 -10.3533888 -5.6943955 -7.7631817 -7.0849442 0.9272587 -6.3884139 -0.6328577 1.8860539 -3.7559583 -11.5163860 -2.1723638 -3.4429083 1.0759394 -25.8426895 -7.3164148 -0.1941715 -0.9501628 -3.6081905 -11.6518755 -4.0050941 -6.9688945 -0.6683155 -18.5830479 -4.0400443 -13.3701277 -4.8864808 -10.0167418 -9.3149614 -5.2751422 -18.2331696 -31.9397049 5.0740762 -9.9170847 1.4734744 -0.5553045 0.2384321 -9.5303240 -1.2292154 -20.2615604 -6.0469322 -2.7952800 -8.0152893 -11.8121042 -13.0354643 1.5516516 -34.0565567 -3.1810277 -0.6928037 -0.2494917 -18.4616833 -0.1015622 -0.0623984 -6.8605499 -17.1443787 -0.5423498 -61.5228004 0.7731913 -0.4289594 -13.1833906 -11.4471388 -0.6692867 1.4564962 1.1431026 1.1898655 0.9494449 -5.5953407 7.6729169 -2.6764860 -29.8763466 -0.8228355 -4.2729340 -0.6414050 -5.0621548 2.9970694 -3.5843801 -0.3648276 -3.8390360 -6.6217957 -2.6681616 -0.2285115 -0.9816554 -2.2680931 2.6302385 -3.2470772 -12.2659931 -11.5795937 -5.7740779 -5.5006256 -12.2026815 -59.8703842 -11.0479155 -1.8603606 -0.0099370 -0.6040378 -30.2889175 -7.2815948 -4.9478717 -7.5243425 -0.6168739 -4.0599604 -5.4919705 -0.5668869 -5.5868211 -5.4862208 -10.7683611 -6.9914966 -2.5445731 3.7315238 -0.5765532 -1.6567216 -3.7750740 -2.0940094 -9.7091208 -1.6816351 2.2067451 -8.0949068 -9.8285341 -13.2275543 0.3567944 -5.8474646 -11.1442366 -8.5954266 -0.5382506 -0.6084684 -6.1586738 -9.4340706 -1.0751269 -2.9250178 -10.8315001 -9.1121330 -12.4161158 -7.2462621 5.4069057 -6.8713641 -2.2532277 2.6806004 0.6789020 0.4800270 -2.6237323 -3.7246540 2.0671382 -1.2748119 -13.2257376 -0.2821642 0.5477384 -5.1801796 -10.1913748 -6.7499614 -1.4805002 -1.3616331 -3.9223945 -2.2482777 -13.5327253 -3.0050778 -6.4811597 0.6030028 -7.7860150 -4.5553603 -11.3896399 -1.1681681 -4.8920736 2.1794474 -0.2807823 0.9524065 -10.0721016 -2.6311133 -5.3473134 -10.3387032 -7.3781037 -4.4916096 -6.6158109 -22.2116318 3.2629745 -12.9217834 -4.5049853 -1.6425207 0.1197156 -11.3474007 -0.3883104 3.0004361 -3.3404446 -7.1800838 -1.4605119 -8.1875010 1.0217470 -0.6729520 -6.7094631 0.7697903 -1.1365087 2.7011001 2.2006562 2.9545090 -0.2471784 -7.3805480 4.7128515 -2.2216783 -18.4921703 -1.6339265 -4.6938872 -0.3977884 -6.7228594 6.1131139 -7.6690087 -1.4091290 -1.8506021 -7.1696892 -5.8881783 0.0026256 -2.0668066 -3.1849301 5.0454521 -7.2352271 -13.5787153 -3.7963116 -10.8066607 -9.0493031 0.7539256 -9.3399553 -20.5761204 -3.7691691 -0.1231761 -1.3262788 -8.6802950 -12.6688881 3.0171614 0.6926028 0.3095501 -7.1452188 -0.3187429 0.2707670 -0.8942086 -1.0423722 -6.9711437 -3.9357874 2.3039596 1.1465396 6.2068105 3.6629713 0.2760419 -2.3946075 0.2327170 -1.7662853 2.1656973 -2.0276999 -1.3522801 -0.8141248 -0.7010417 -6.0219808 -4.5400791 0.7733858 -3.2957435 0.3120034 -0.0943389 -3.3019044 -0.0242639 -1.2502439 0.7579928 -3.3552654 -2.2954772 -1.6953007 -0.6625529 0.2675350 -0.6484136 0.8177163 0.0846776 0.5388178 -3.0241342 1.2434032 -2.1392775 1.4881129 -0.4759708 -0.5166773 1.6883813 -6.3125911 -0.6839771 -5.1743045 0.8424282 -1.3095952 8.3895626 2.3414001 0.0296992 0.0547080 2.4529779 2.1343145 -3.2571976 -0.9432340 -1.5572599 1.8457018 -0.2979456 0.7678446 2.6832016 1.5437114 -0.8575166 0.2683766 0.9821187 -5.3394804 -0.4762065 -0.5281397 -1.0496348 1.3015237 2.8808203 -7.8014617 0.8377165 0.4503660 -0.3849968 -1.0549819 -1.0086019 0.8139269 -0.2526965 -1.2393881 -3.2763605 -2.3703828 -0.7280446 -9.4978113 -7.8727965 0.6716006 -1.4014921 5.3769512 2.2734690 1.3342818 -1.4790788 -0.7515249 2.8877232 -4.1547985 -2.3933885 -0.4902008 0.7854191 -0.5842625 0.2778279 10.0754023 -3.0578194 -3.0191846 -2.7631714 -0.8066338 -7.4749007 -1.2867792 -2.9802959 2.5966096 1.0946082 -1.3197546 -9.3861847 1.7522987 -11.9005136 -2.1003182 0.0946900 -4.5222354 -10.7736864 -4.1931157 1.8299628 0.0820958 -0.1080734 0.2415892 1.4264209 -0.0441752 0.3042968 -0.8468916 0.8823227 0.5654306 -0.2699567 -0.2397563 -0.5860104 -0.6436807 0.0664687 -0.8218183 0.4741086 1.4490788 -0.1411166 3.3407989 -0.1205981 -2.4381027 -0.7902745 0.4248746 0.2587032 -0.8276457 0.1501642 -0.5823967 -0.2207165 -0.2543337 -0.7463461 0.2286343 -0.7343229 -0.7623647 0.6623993 -0.0692617 0.2938861 0.3885348 0.4105554 -0.7399298 -0.2678122 0.2502199 0.3365139 0.0229774 0.2030231 -0.5106968 -0.2322954 -0.4678563 0.6353591 -0.0317869 0.0582669 -1.0104889 0.8647544 -0.3269610 -0.1464128 -1.6036477 -0.4842551 0.0567838 0.2537957 0.1404295 0.7484546 -0.6246535 0.7109155 -0.0753736 -0.0914743 -0.2328951 0.3668817 0.1974746 -0.5272564 0.2202473 0.0458776 0.2515337 -0.2187657 0.1108079 -0.6961893 0.9230129 0.2320971 -0.3347964 0.3336281 -0.4718786 0.0023907 0.3618163 0.1724752 -0.0290309 0.1985980 -0.3443244 -0.5404199 -0.1022024 -0.0538658 0.0951806 1.6504470 -0.2416951 0.6332513 -0.0031161 -0.0159386 0.6777977 -0.6375434 1.7751544 -0.7886743 -0.4237608 0.1261999 -0.3100995 0.2818434 -0.2223520 -1.3488750 -0.2796445 0.8228877 0.0091699 1.1411608 2.7625701 -0.2267286 -0.2518663 0.8710310 -0.4477386 -2.3765800 -0.0082406 -1.1168654 -0.0124378 -0.0133203 0.2729099 -1.1062387 0.8490106 -5.0034370 -0.2052409 0.8436018 0.6010577 -0.5128171 -1.1291438 -0.3234062 -0.3577773 0.8222573 -0.5991229 -0.2650775 -6.7085299 3.1305795 -0.1645861 -0.4123296 2.9644530 -3.5710678 -8.9010601 -8.5131245 -4.8122659 -2.7951772 0.8501857 3.1773002 -2.9828136 1.2980785 -5.5535493 0.8616032 -0.0424842 1.0013194 -9.5554390 2.7035165 6.5271835 -3.8198280 -1.5588064 -8.8329430 -2.0167890 3.5307176 1.5727547 1.1148037 14.0070581 0.4713316 0.1415655 -11.9955616 -0.5066622 -11.5003414 -11.4944668 -8.2727909 1.4196808 -1.2172040 0.9080543 2.7757354 -5.9618649 0.6372752 -1.5788838 0.7691546 -4.9778619 -2.5489106 -1.8371419 -2.5488594 -3.0323510 -7.6481199 0.3079077 -4.0464878 -0.5402391 10.6940594 -1.1137671 8.5446844 4.8069305 4.3648081 4.4777484 1.0083586 5.7237520 6.3411479 -8.7549152 2.0039613 0.9695185 1.6649482 -1.6028756 -5.4541121 0.3369691 -15.9228878 -1.8676300 -2.1018677 5.6198816 7.3007259 2.1729383 1.6467555 9.3237486 -0.3052394 0.2331183 -0.9626496 8.2402544 -1.7383428 3.0232396 1.7908814 2.6068256 -0.1469035 12.7949314 -0.0969887 -1.3583639 -7.3423963 -7.5697064 3.7610841 0.3822698 1.0045699 1.2525467 2.9388461 -0.5957004 -0.3113556 -2.9382200 -7.8081121 1.3063320 -2.1233184 0.0181007 3.9012809 1.3612869 5.1165385 -1.1659863 -0.0146241 -6.2396789 -0.8512753 -1.8719203 2.7363572 -1.7312188 2.4859633 6.3654871 3.6075618 -10.2303486 -1.3277630 -1.4870020 -0.3273017 12.3209524 -6.8808370 -1.2460101 0.4360846 5.5896773 -2.2805402 2.3473649 -1.9312407 3.1697609 0.9667712 -0.4722438 -1.7782228 4.9532671 -10.5502939 -0.0257895 -10.2861176 -8.2707777 -3.8410304 1.8984772 0.6571773 -0.9081998 1.1004292 -10.7384720 0.6759527 -0.0777878 1.6363333 -1.1431099 5.7970767 9.0874214 1.7999897 4.9575939 -9.1373806 5.8645663 6.0059166 3.0244622 -0.2973250 26.7607517 0.7696370 0.5289760 -14.6762066 -1.0079205 -14.4317751 -1.9111764 -8.2186508 -0.9319517 -0.5536412 1.9600196 7.2540021 -1.1404891 0.9735363 -0.6227839 0.9327380 0.9018598 -8.2003841 -3.8119557 -2.6545537 -4.1755233 -5.6717954 0.7701346 -2.6904669 -0.7423093 19.0561180 -0.5613478 14.4611702 10.9261923 6.5256529 0.3633872 5.2774973 10.5426683 13.3240795 -6.0423827 5.0938792 1.5891415 1.2992481 -2.3787255 -2.3160377 0.7934182 -4.9771857 -1.7850823 -2.4526544 14.1214561 12.1008110 5.0611997 2.6820309 16.4883652 -2.4683301 0.2167182 -1.0717560 14.7973166 -3.4812694 7.2772918 -6.4241076 3.3289933 -2.1820762 23.7869511 -1.8753490 -2.2164638 -5.3874335 0.1130775 7.0605130 0.8604945 1.3396562 2.0264342 4.1771526 -2.9732320 -7.3124657 -2.5926914 -1.1853119 2.5104828 -4.3216281 -0.0849658 3.9389522 2.7606664 8.0328121 -1.8636956 -1.6562711 -4.2961669 -3.2523773 -5.2285686 5.4646363 -3.5147145 4.7026176 12.2154560 18.3548985 -7.1062212 -1.4359567 -0.7281008 0.0559861 22.4357700 -12.9900618 -1.9254239 0.8019730 10.7708740 -0.5438948 -0.0572528 -2.6994855 -0.1262085 0.8193159 0.2331647 -2.2096641 -0.9986111 -7.6218357 0.1011238 -6.1095505 -8.7190323 -10.8044815 2.4186101 -2.3423171 3.0758243 -2.7251856 -15.8478098 1.9767593 -0.1579044 2.7594776 2.7910173 8.5758266 9.7577839 2.3805153 5.2343340 -8.4835854 -5.5568690 8.2488213 5.6881733 7.9649119 38.8243141 1.9659517 2.8378851 -14.4231901 -1.7267318 -8.9165173 -1.6350979 3.0143838 2.2938643 0.5671600 3.0810828 5.2407336 13.0562019 1.4955922 -0.0138933 1.2007085 8.1344957 3.8543358 -5.7871275 -2.3749123 -10.0776119 -1.5684067 2.0475020 -1.1505898 -0.2228249 25.0620537 -0.2455450 16.6066952 -0.7054429 6.3132362 0.1451542 3.0157552 11.9312353 19.6602345 3.5151038 -1.0436420 1.2791419 3.1544659 -4.0244069 -1.3821522 -3.0873578 -1.0198840 1.2817310 -2.7701511 6.4705334 14.9884043 -0.9521283 3.8830423 21.8074837 -3.5501783 1.2080659 -2.3716574 19.3547382 -5.3209538 1.3653517 3.9124613 0.7437000 -2.6765573 33.2723579 -2.3969111 -5.7699032 -9.0864897 -3.7648125 10.7534132 2.4509208 0.8877515 3.0052381 8.0366430 0.0895779 -10.0603352 -2.0336547 3.5457602 2.2037830 1.2718732 0.7010946 -0.1697027 3.7718923 -2.6644435 -4.1786060 -1.8251538 -1.6810402 -8.0404615 0.0554137 8.3250322 -5.0061588 4.6250024 13.1681242 3.2075548 -1.4887500 -4.5781884 2.5310411 -7.2515268 31.0031433 -9.4689512 -2.6752198 1.5439488 16.2764034 3.1607232 4.3460751 5.3992715 0.8997090 2.3831398 -2.6047645 -1.2981042 0.7426260 -2.1274004 -0.2698987 -2.4993410 -0.2580530 -3.2950895 4.5075574 -3.8917816 0.9504167 -3.9715073 -7.3676925 2.4354427 0.4686266 2.6538854 0.1886802 3.6689415 -1.6314973 -1.6157066 6.5208693 -0.6260891 0.2168504 4.7099190 1.2785116 -1.0565338 22.3961697 -1.6747242 -0.1241514 -7.1420503 -0.1873380 3.1498370 0.3038981 0.9269444 -5.3377943 0.4451470 -2.4357421 0.4786616 -0.3585992 -1.0649717 3.0108049 -0.2628648 -0.1570340 -0.3588615 -3.6902664 -0.4565279 -0.2470682 -0.1523096 -0.4744410 0.4086893 0.4613751 10.0593624 3.1825266 2.3127851 -1.8086106 4.0799108 -1.9171231 0.8501225 -9.3602076 11.0030136 -1.3931866 -0.4547961 1.2956609 -2.6433260 -1.5385166 -0.1619865 -0.4280300 2.9132743 6.2336979 3.2948461 -0.4483862 1.9180629 0.4986414 -1.7033360 8.8396749 1.9319046 -4.2166305 -0.3460357 5.9257398 -4.0194368 2.9924181 -3.9834280 -2.4645796 -2.9686847 17.5495605 -3.6002624 1.4335694 8.1536312 1.8485047 6.9593801 3.1658463 1.2263691 1.5338821 1.8622284 0.1049691 -0.9785731 -0.6278822 0.0072569 0.1887069 0.5064103 1.6767039 0.5378907 2.1060343 1.1256722 2.4510415 -4.9932146 0.0686810 -1.2270730 0.5020607 5.2116385 -6.4364562 1.0015358 -0.4790657 3.5748377 -1.0736519 -4.0598373 2.1491578 3.5039604 15.5271149 -3.2143540 -0.9230444 1.6580065 8.1863279 -4.1024933 -0.1708131 0.8463516 -5.9888315 -1.2604208 -0.6646817 -4.9962492 -0.8420294 -1.3162123 5.2640834 -10.7058802 -7.0879021 -4.6262012 0.5837240 -0.7507549 -3.1186028 -5.5014377 -5.1580853 -3.8589518 -0.2466902 0.9485870 -6.0763149 2.0002425 1.6307586 -0.2712921 1.2923931 -9.1046448 -8.8385468 2.3152370 0.8897304 -4.6268167 10.4748182 -0.0068123 -0.6939494 -10.5089235 -2.1531408 -0.4766254 -1.8297056 -14.2646255 0.0171648 -2.6258667 1.8418984 1.6874177 -1.1887553 -1.6926255 -2.2223012 0.4175020 -4.1270418 -8.6050472 -1.5489661 0.3522744 -6.0586319 -11.9666948 -0.3701966 -3.3680832 -0.4732356 5.5413938 -0.8781083 2.4300654 -0.8953705 -1.3376381 -2.5000186 -0.6367731 1.3825203 4.3598528 -13.5784588 -5.4330034 0.7105686 -0.0846777 -0.6475936 -13.7949476 -1.3767507 -6.3647652 -4.4281230 -5.3432117 -3.8013442 0.8208081 -5.4586282 1.5218040 4.4842806 -1.6255881 -0.3434563 0.1817067 3.2912111 -1.6462421 3.6685107 -3.3915288 -4.1580691 -0.5359589 8.5397558 -0.5737432 -0.8618599 -12.7858458 -4.3695002 2.8692636 0.3956212 1.3005813 0.9771355 -1.1135881 -3.9650505 -2.0962315 -0.2016219 -11.4185600 0.8649904 -6.7081003 -0.6942704 -2.2128279 1.8915229 2.1548400 0.2523803 0.3581572 -9.0328693 -2.2268121 -2.4858375 2.2045422 -2.8872392 1.6854330 1.8511307 3.7015631 -14.9934826 -2.2564034 -2.3686309 -2.6555645 7.6898065 -12.3659763 -1.6428014 -0.3144788 4.4653425 -0.9691687 -2.2678244 -8.5894365 -4.6004739 -1.1740346 -1.8474247 -2.3029253 -4.0480595 -6.1743689 0.7534111 -11.1120367 -10.5377131 -6.7320580 1.8748720 -6.3362131 0.3465805 -9.8684797 -9.3802423 -5.6183410 -0.5292782 0.8511156 -1.4533916 4.7682590 -1.2354996 -4.1610289 3.0017269 -7.6420350 0.9141074 3.5114207 1.3832700 -7.7300625 20.6481686 -0.0894112 1.7640793 -6.9908423 -4.5609713 0.2035344 2.6746910 0.0678243 -0.1456370 -2.3175912 2.0800824 -3.5330262 -0.6631685 -2.9450812 -1.5858196 2.3114152 5.5119019 -4.4507823 -3.0584373 0.7699065 -15.1830721 0.1743613 -0.4979912 -0.8400909 -0.4514414 10.0148849 -2.0611975 4.2973180 3.7793298 -0.7279717 -3.2894542 -0.4384138 -1.4912297 9.7601166 -6.2759819 -1.5374017 2.1354904 0.7900494 -1.1217327 -3.6941135 0.2200066 5.6085620 -4.8881731 -7.0230570 -6.2602472 0.5818516 6.8378577 2.1400816 7.8671989 -2.2671666 -1.1603569 -0.2234479 5.0781560 -3.3805771 -0.7687485 -1.2634656 -6.4760442 -4.9161677 16.5346088 -1.4994044 -2.6077135 -5.0961814 3.5465245 5.5668159 1.8314757 1.3936470 2.6650813 -4.4279728 -3.2226479 -7.7321405 2.2141452 -7.4344749 0.0367038 -0.6454762 -1.8159117 -4.4282227 3.7306669 4.3073659 -0.0464684 2.1572583 -1.1291441 -3.2688966 -0.5379922 4.3447847 -4.6434922 2.1759205 6.8049994 7.0717940 -3.4447238 -4.1455688 -3.9141500 -0.5267633 14.4878988 -16.3328304 -2.9508507 -0.3712178 7.6370773 -5.0603909 3.5234632 2.0356374 -0.7371296 -1.3135768 -5.1792016 7.4616661 -0.6626368 1.4397163 0.1719857 -5.1245775 0.1324668 -0.3809749 0.3089342 6.6828313 -1.3937786 -0.9972705 -9.9688492 -4.3005404 1.1921878 -0.4727584 -0.8264725 -5.6581049 -3.1644621 -0.8952693 -0.7060812 -2.3019500 -0.5729309 0.6950733 -1.4598124 -0.2584237 2.8726051 -1.3080430 -0.0810690 1.7264621 0.9046702 -0.2426847 0.4221123 -0.2471476 -4.4885206 0.1427048 -0.2424434 0.4109145 1.2567891 -4.3198185 5.8439612 8.9227657 2.2639680 -0.1739129 -6.0540209 0.2268115 -2.3762786 -0.0803977 -0.3661377 0.3749775 -2.2161119 2.1640503 -2.7688429 -4.8549838 -0.6485878 -0.3361431 0.0598944 0.4870458 -7.2527061 -2.9739275 11.1626043 0.3668527 -0.3563214 -3.1942356 -1.1748673 -0.1266206 -1.1567997 -0.0976429 4.6385746 -5.0537186 0.5517827 1.7005121 -0.7062988 -1.4202502 -1.8956325 0.1054988 -0.3611600 -1.9654895 -3.4895158 -4.7280264 -1.8108515 -0.1172523 3.8348024 1.5495198 10.5310841 -0.7605687 -5.8342648 -4.8060713 -1.0108186 8.7129326 5.6359744 0.3380573 3.2995780 -3.4983938 -0.6699442 -0.4684947 -0.3292980 -0.0079700 4.2940807 0.6510734 0.3325542 0.2720549 3.1363888 -0.5907518 -1.9295045 2.7567217 0.1484716 -1.1026001 2.3847458 6.7161603 -0.3603209 0.0275365 0.2689024 -2.1050315 0.2479270 -3.3866315 -0.4506233 0.7836698 7.5312004 -6.3589807 -1.6387970 -3.0673685 2.9966681 -0.3954277 -0.7102922 -1.3997805 -0.0774813 -0.1190544 -0.2963217 -1.2662002 0.0159197 0.9364837 0.1855538 -0.0393184 -0.1938563 -0.3278456 1.0600235 -0.9138098 -0.2961014 0.2207121 -1.5732055 0.0228857 0.1473539 -1.1389312 -0.2457909 -0.7533515 -0.0166220 0.2026495 0.1796625 -0.1049275 0.2561277 0.1074644 -0.3461620 -0.1631872 -0.0132730 1.9902738 0.0391096 -0.4419959 -0.1471145 -0.0629466 -0.0672470 0.0016550 0.3239320 0.0665026 -0.0345626 0.1157515 0.0786239 0.3712134 -2.0777128 0.5249251 0.0372182 0.0329983 -3.8584313 0.3077220 0.0597028 0.0253838 0.0210745 -0.0150074 -1.8703600 0.1983787 -0.6566086 -0.4554826 0.7532117 0.3308115 0.0472669 0.2743878 -0.1838100 -0.1431599 0.0275889 0.0333613 0.0662614 -0.2928192 -6.8101716 -0.0275920 -0.1649671 0.1168467 -0.0656895 -0.0719117 0.0480071 0.0142608 -0.1816266 -0.3631267 0.0445052 -0.1617915 -1.0956438 -0.3312138 0.0080369 -3.8669467 0.0636132 0.1527278 -0.2539311 0.0698384 0.4039813 -2.6210277 -0.2295416 -0.0733406 -0.0002347 0.7598245 0.5651563 0.1221125 -0.2055225 -0.1234690 0.1385327 -1.3063831 0.6438490 0.0109727 0.2439749 0.1946957 0.1077126 0.2345181 0.7645020 0.0218429 -0.9286584 -0.8666123 0.0179569 -0.3431668 -0.1929447 2.6020045 0.6695578 -0.0659387 0.1273666 0.0334014 0.0293871 -0.6993923 0.0518911 -0.2498021 -0.1373340 -0.0963936 0.0157920 0.3159151 0.5387430 -0.2466770 -0.0036028 0.0353525 -12.7617416 -0.0397892 -0.8994221 -7.2119656 -2.1810110 -3.7383351 4.9918323 -11.5914507 -8.1291361 -2.8170929 0.6513609 -1.2768720 -1.1583766 -8.8587666 -5.1057997 -8.3183079 -0.2314270 0.3882795 -9.8171482 0.1016804 3.9882410 -4.0546794 3.0533092 -10.1639681 -14.9427986 -0.2972032 0.5778571 -9.8866243 7.3774986 -0.1111523 1.9270766 -12.3488150 -2.7766407 -1.4996870 -2.7149451 -8.0041752 -1.9181052 -2.3486881 0.4820307 -2.9652076 1.0351442 -2.5326102 -3.0646801 1.1890398 -6.3004341 -14.9367628 -1.3780109 0.9498593 -8.6421328 -15.7504702 -0.5782946 -1.6904180 -0.1806090 2.4955723 -1.0778197 0.2560434 -0.4639449 -5.0900354 -9.6971817 -0.8143903 -3.6682603 2.0878057 -15.7139244 -18.9108353 0.5759861 -1.3569973 -0.3383856 -22.5298119 -1.7364295 -14.7671385 -6.0277462 -9.2039557 -3.6983962 -2.1453023 -10.4522314 1.2794158 1.1965249 -4.3495278 -0.3695590 0.7213666 -0.0076158 -1.3938768 -1.8316734 0.7506711 -7.3931427 -0.6332992 5.4891300 0.1697260 -0.7553653 -11.9818001 -2.6507638 1.8347470 0.2480515 0.3386172 1.0883553 -2.2882655 -6.9217300 -3.0098250 -4.3383341 -10.4627476 0.5140385 -8.5439186 -1.1237881 -9.6992788 1.8905449 -0.3124097 0.0989171 -1.7357829 -9.2644024 -3.3823121 -3.0226698 1.7388030 -3.4236019 1.0890797 -0.2749732 -0.7747909 -14.8062630 -2.9736104 -2.7283983 0.5302430 4.5547266 -15.6891289 -1.9334583 -0.0215565 3.3539383 -2.6699295 -5.5877151 -5.7809572 2.0975592 3.7359166 -1.9639397 -4.7801471 -0.3321931 -4.9208689 1.6601582 -6.1848693 -9.6449337 -5.6688166 1.9570328 -2.9274585 1.9999533 -16.0819168 -10.1617785 -13.2581596 -0.4685102 0.4312375 -2.6156447 -0.6373380 7.3226566 1.9151973 1.0220256 -6.2517629 -2.0771377 2.5073714 0.8028424 -3.0874774 13.9787741 -0.3798489 -0.2380002 -9.1870546 -3.4608550 1.9870839 -2.7711282 0.0782764 -0.6156983 -1.2432567 -1.0374746 0.8165423 -3.2743890 -4.0650406 -2.7417223 2.4779768 -2.5658984 -4.2640300 -2.8263359 -1.4891448 -14.2201490 -6.8842883 -2.0756748 1.7456409 -0.0944997 4.1942387 -0.8892362 2.1837835 -1.5841998 -4.7627711 -2.1848838 1.0462829 -12.0800238 3.9466431 1.2865390 -7.0508795 0.9096003 -1.0820616 -0.8296093 -0.0046908 -2.2889848 -2.1305697 -5.6859212 -8.2490711 -3.3263712 -5.4158764 4.0477500 2.2774255 1.6469326 -2.1681800 -1.2020580 2.1019702 0.2256455 -2.8852735 -1.5030190 2.6845493 -12.0087786 -2.8341942 10.3722734 -0.1943417 -1.3166634 -5.4032269 -1.0357752 3.6609461 0.0493683 -1.7351259 1.9571887 -3.8084741 -2.9664462 -6.7718863 -4.5239172 -6.4882498 0.8289528 -6.9158645 -2.1187446 0.0990737 3.7324784 -0.1256346 0.5754420 -3.9119937 0.7941585 -3.8520491 -1.3539650 3.3866930 -5.4398370 -1.1618958 5.1197925 -3.0696006 -4.5284772 -4.2364826 -0.7859406 -0.0312241 8.5074682 -18.5669937 -3.2638018 0.9526115 6.2323217 -6.0847597 -0.1493112 1.4207077 -0.9103679 0.7250137 -2.7737248 -0.7883837 0.2727013 -1.7389568 -0.0869796 -2.7609270 -2.7099810 -2.9384327 3.0183210 -1.0421872 -1.2486023 1.4081174 -9.3218069 -3.1343479 -2.7170775 -1.5065134 -0.6700015 -2.1489363 0.7868095 0.2008635 -2.0535414 -1.7685478 0.4706172 0.4812921 0.5431746 0.2317776 -0.5107222 0.6018119 -0.1655390 -0.1261735 0.4758590 2.6749537 -0.8673992 -0.7505642 5.4010811 1.2584025 0.7590848 -0.2889591 -0.6490616 -5.8162503 2.1670909 -0.8907871 0.3321178 0.4037102 -4.8531427 0.6993475 -4.1854072 -0.2443283 -4.1643767 1.0301626 -1.4497769 0.1743421 -1.0942794 -1.3362492 0.6684753 0.5488015 -0.1757464 1.0228195 -3.3951392 -6.2399888 1.3385162 -0.4219716 -0.9577914 0.7161350 -0.8912677 -0.4226589 -0.8014470 -0.3861857 6.8282394 -0.0590244 0.1108217 -0.0805945 -0.1694450 3.6977496 -1.6209399 -0.0252211 -2.0256500 -2.3721397 4.5290904 -4.4652314 0.3382852 -0.1560365 -2.7809503 -1.2060714 3.8935418 0.7310256 -1.9560053 -1.8344983 -0.3785036 6.6412649 -1.1532197 0.0109686 0.3695324 -1.3157334 -0.3094957 5.6115351 0.2840005 -1.0603756 0.1773029 0.8923544 -0.5531586 -0.1412917 4.6065531 0.6970843 -0.3450742 -4.8956614 -0.1400409 -2.1112156 -0.1176873 5.6737566 0.4970157 -0.6293284 2.8530142 -4.6058407 0.6601757 -7.4105549 -0.3760833 -0.6414076 -0.0872823 -4.0608273 -1.5052422 -0.7388044 2.3228180 -0.5119023 -0.9921154 0.0040418 -0.0405908 -0.0369319 0.0801729 -0.0494439 0.1105992 -0.0099414 -0.0249763 0.0045520 0.1318606 -0.0636138 1.2476532 -0.0403143 0.0690804 -0.0103593 -1.1733449 0.0298649 0.1474909 -0.1028254 0.1361066 0.0745395 -0.2315036 0.0089685 -0.0884280 -0.1135683 -0.0190266 0.0793631 -0.1133487 -0.1191381 -0.1753526 -0.1353831 -0.0353027 -0.1114665 0.0614642 0.0121703 -0.1548402 -0.0765349 -0.0193513 0.0471177 0.1703407 0.0535851 -0.0422372 0.2560364 0.2170786 -0.0200415 -0.0351453 0.1457855 -4.3311958 0.3302514 0.0244596 0.0323331 -0.0663618 -0.2709179 -0.1620540 0.1015324 -0.0622561 0.2398460 -0.0454165 0.0792474 -0.0119664 0.0597694 0.0110594 0.0072583 0.0118347 -0.1582989 0.0320022 -0.1824674 -1.4619094 -0.0307839 0.0383632 -0.1647294 -0.0478323 0.1228288 -0.0822003 -0.0323501 -0.2472807 -0.1063006 0.0065991 0.0498871 0.1187863 -0.0437098 -0.1761772 -2.7555583 -0.0381338 -0.0606768 0.0664585 0.0331543 -0.0753189 -0.5395204 0.0648455 0.0825871 0.1259988 1.4703559 -0.0748257 0.0310926 -0.1117474 -0.0897574 -0.0583178 0.1337651 0.0206260 -0.1056188 -0.0596934 0.2727491 -0.0556229 0.0398996 -0.0233697 0.0043134 -0.0286818 0.2819797 -0.0484141 -0.1021788 0.0301819 2.9652886 0.0432733 0.0294930 -0.1125069 -0.1668303 0.2807431 -0.6584670 0.0342250 0.2320668 0.1089601 0.0335579 -0.7299364 0.0267357 0.0111250 0.1423935 -0.0545846 -0.0015916 -5.9131098 -1.9918964 -1.0056825 0.0840796 -4.6750784 -2.5757487 1.5240093 -10.9149733 -6.6886997 -2.6216836 0.2846315 -2.2719574 -1.5443522 -12.5932999 -4.6390643 -11.5027666 -0.1701420 0.7670348 -6.8673110 -2.2885728 -4.3303008 -8.2373943 3.2619245 -8.6141024 -13.7862253 -1.9021537 0.3622294 -11.1523304 4.0504274 -0.0899032 -2.0409923 -9.2771349 -3.5417759 -7.1888046 -6.8628345 1.8970364 -1.7792917 -1.4260504 0.6190870 3.8224568 -2.6253841 -3.4058783 -4.1705689 0.7534979 -3.0621910 -15.4911251 -0.9859864 0.0168885 -9.0803318 -14.8370552 -1.4692810 -0.9582373 -0.2241040 -0.7196258 -3.7992063 -3.4563353 1.8900473 -6.8774595 -12.2308912 -1.4299922 -7.9517612 -1.0322294 -13.1150599 -2.7265334 0.3099180 -0.3991894 -0.2835502 -24.5813122 -1.4620286 -3.7183757 -7.4076118 -2.5333581 -16.8638630 -5.5003605 -15.5913410 1.2915804 -2.1360128 -7.4519038 -0.1237438 0.5300749 -3.5662012 -1.3174471 4.2513475 0.6252328 -10.6525955 -0.4347437 2.0876174 0.7012135 -0.3652309 -14.6288633 -2.2458522 0.9598470 0.1599876 0.3850079 1.0270224 -2.6915684 -7.3041544 -2.3337860 -4.0382180 -20.8442974 0.5810136 -9.1117172 -1.2105607 -13.8737803 2.4542866 -2.1845117 0.1294037 -0.8762282 -10.0875063 -4.0000830 -3.8068917 1.3124008 -3.7474232 1.2037576 -2.2718351 -0.8449331 -14.7847185 -3.8439558 -3.0777829 4.2835784 1.2274485 -18.8673763 -2.2940526 -0.1636484 2.4736288 -2.5458884 -8.4537783 -9.0982075 -5.5034494 -2.9094238 -3.0186296 1.3718034 -1.2199649 2.3269901 -0.7590082 -10.7560320 -7.7656689 -5.0067620 1.9343326 -0.7835557 2.7603424 4.0841765 -8.9040880 -15.0822887 -0.9455705 1.4201614 -1.3225743 -6.4285226 -3.1038201 -3.1008477 1.1814375 -6.0488081 1.3160741 0.2160891 -0.6080348 -4.8570828 0.8170797 -0.9618488 -2.3349454 -8.3351574 -2.5731277 -3.7820580 -2.3611927 -1.3275119 -1.2603414 -1.2909274 2.8282695 0.5090144 0.2114817 -7.2822542 -4.3302298 -1.2028935 3.0724020 -2.7949815 -2.2630289 -0.9775779 -10.2027359 -1.3698022 -4.2092152 0.9490061 -0.0791118 -3.0778785 -1.5265394 -3.9691443 -0.1243333 -3.0068073 2.0223777 -2.1894937 -8.7472582 -6.2814488 1.2916042 0.6515844 0.6290404 0.3651236 0.3559401 -0.7426028 -1.7203088 -1.0070760 -9.7983599 -7.0129333 -1.1341523 -0.0225983 6.1642928 1.0158436 -7.5541344 2.7660451 -1.8294607 1.4545168 -6.8741145 -2.5749655 0.7991946 -2.1194403 1.6448466 -2.0455077 0.1491772 -1.1941073 -0.4367339 -4.7816358 -0.2726879 2.1188433 1.3932805 0.4328644 0.9052043 -2.8771000 1.0392630 -2.7287457 -6.1603060 -9.4926157 -0.2747075 -0.1559814 -2.3850455 -2.6972866 5.1782775 -2.0541394 -0.2725551 -3.4773996 -1.1699499 -4.4126282 -1.1730556 2.4745080 -6.7706180 1.8477662 0.2545241 -2.1531553 0.8304089 -6.0915685 -6.2798147 -2.2789392 -1.9419323 -22.2059631 -3.4099870 -0.2559121 4.0279145 -6.5218949 -3.7471757 1.3744135 -0.5007403 0.8692905 -3.5398686 5.0483747 1.1084353 -0.9959589 -0.1718194 -1.2252878 -5.0507069 -0.9156916 4.7718167 -2.8236504 -3.6729655 -5.6498017 -10.6906071 -4.0823593 -0.0750802 -1.7617221 -0.1508634 -6.9114304 0.1408548 0.4514036 0.4856367 0.2766831 2.4550261 0.5082139 0.7599775 2.1530869 -0.4083958 0.7445483 -0.1996263 -3.4767206 -0.5156912 -1.1727535 -0.8715622 -1.0456374 3.3839507 0.6802394 0.5549228 -0.0584762 -0.1990929 -1.9837327 2.1961155 4.4641852 0.3200050 0.1916890 -3.8714216 -1.0522201 -2.8659961 -0.1778671 0.2639641 0.5638722 -0.2435000 2.3593926 -1.4983666 1.5281590 0.1096002 1.4690322 1.8680377 0.3581167 -0.7692093 -4.2516904 -0.3967761 -0.2469508 2.9543498 -1.1318377 -0.3487847 -0.1370610 1.1664146 1.6541675 6.5488458 -2.6988266 -0.6493670 0.2786931 -0.4916069 0.0319429 -5.8364291 3.8893945 1.0050266 -0.5071194 3.2484691 -3.7637575 -0.0814531 -2.4256203 -2.2500262 0.0562894 2.4382803 1.8251539 -0.1994082 -2.8030033 -0.1989202 3.7128916 -0.0097174 -0.4205112 1.3841140 -0.2201692 -0.2002955 -3.1279101 -3.6884146 -0.8078243 5.1999245 0.7240460 -1.5648719 -0.8445872 6.1125813 0.1141376 0.3718465 -6.0719118 -0.6738956 -2.4566815 -0.4398086 2.7976921 -2.3918984 -0.5834085 0.3796794 -6.5099545 0.8056663 -5.2429819 -0.4633788 0.0998953 -0.9543697 -8.2235823 -4.6036634 0.0340116 -0.0447957 -0.7390851 -2.6996579 0.4754198 0.0310966 -0.1498745 -0.4424165 -0.6021584 0.0344311 0.0644119 -0.0217151 -0.2057306 -0.5384218 0.1265769 0.1313833 -0.1939754 -1.2408732 0.0617997 -4.9863472 -0.4009489 -0.5784620 -0.0607645 -0.0132906 0.1039893 -0.0488041 0.1651225 -0.8100523 -0.0203909 0.0694407 0.4738526 0.1920444 0.3793018 -0.3484497 -0.2952857 0.0268409 0.5811215 -0.2776157 -0.0101337 0.0139997 -0.0860881 0.2141950 -0.1700130 0.6726857 -0.0462243 -0.0518041 -0.2332475 1.9546951 0.3806438 0.0297309 0.0930938 -2.8212903 0.0781949 -0.1771252 -0.0415710 0.2840031 0.4334497 -2.1908767 -0.6322587 -0.1954930 0.1441046 0.0697658 0.4224817 0.0058179 0.0247151 -0.4599530 0.6852497 0.0304327 -0.0233240 -0.3305509 0.1152821 -0.9694171 -0.0381375 0.2012212 -0.0189164 0.3638974 0.1346243 -0.0713944 0.0942135 0.0652893 0.5222266 -0.2236990 -0.6209213 0.6821856 -0.0452249 0.6892737 -3.4392512 0.1273381 -0.0220032 -0.4498717 0.3218375 -1.8881491 -1.3465997 0.2862853 -0.0882278 -0.1116767 1.8163669 0.1857111 -0.5478153 -0.5819945 -0.0501741 -0.0016312 -0.2545067 -0.0846383 -0.0914148 -0.1856803 -0.1706664 0.6305135 -0.1247166 0.3347348 -0.0221468 -0.1883117 0.0692464 -0.0014123 -0.0127140 -0.3159328 0.2421574 -1.3035839 -0.1470798 0.1548459 -0.3610549 0.0705853 0.1597414 -0.0693074 0.0363184 1.2541591 -0.0306126 0.7184866 -1.7318138 0.0754937 0.1810942 -0.0733916 -0.0232422 -8.5497627 -1.4203836 -1.4657556 -3.9891019 -4.5483122 -6.1207542 -1.1084173 -10.9111900 -8.3285007 -3.4653325 1.0760919 -1.5068393 0.8693022 -16.7880440 -4.1041059 -13.2732439 -0.3057494 0.3065248 -11.4135323 -6.4336123 -6.6487145 -2.6995547 1.6058041 -11.2639303 -6.9415474 -2.5332727 -0.2578280 -10.9277105 -2.0451977 -0.3561031 -3.1983323 -7.1971273 -4.0198450 -13.2660513 -10.8757000 2.6238468 -1.2057073 -2.8671234 2.4598856 -1.6303048 -6.2949452 -3.5562010 -4.4907413 1.3413340 -3.5144305 -12.3859425 -0.9711429 -3.8897798 -10.2960863 -13.1552172 -1.9504009 -3.0360610 0.0298618 -6.1876760 1.6734279 -10.9293766 -5.6361256 -12.4934101 -16.7942219 -1.8642563 -21.4548206 -5.7540870 -11.9157534 -9.9702339 0.8418230 -1.0833515 0.0388124 -20.5323353 -1.1467628 -5.1316371 -8.9299068 -9.0970707 -7.9534354 -8.8883753 -18.3812065 1.0907720 -8.1757107 -10.3307180 -0.4767119 1.1188854 -8.1513491 -0.7819982 -7.3327117 1.9261322 -15.5264206 -1.5073992 -3.9951639 1.0328259 -0.2028561 -10.5568037 -2.7521443 -0.0073595 0.8224170 0.5954401 1.2675375 1.2469816 -8.3508453 -6.6599922 -3.4010427 -22.0682583 -0.1480480 -10.0257740 -1.3455950 -12.6733589 3.0491061 -4.0980263 0.0252404 -2.3247237 -13.6090908 -5.0253849 -1.1682490 0.7671024 -4.1113801 0.5221134 -4.0631824 -9.2673330 -18.6099548 -4.8321729 -3.3984487 -9.4822426 -4.9040823 -21.1728516 -2.7111058 -0.0449753 1.3518991 -12.6351204 -10.9585190 -5.7166100 -3.3521972 0.1675900 -0.8027089 -2.5971746 -2.8617327 0.9271871 1.8585279 -8.9119940 -8.7950592 -5.0560818 0.3953990 -1.8730301 -0.7574388 -0.1330428 -8.8498831 -10.8478527 -0.3149035 -0.8526406 -3.6914675 -9.5092134 2.1314807 0.4987903 1.5250992 -4.7009382 0.7821408 -0.0424960 0.9771299 -1.1905860 -1.2410461 0.4103307 -0.0450935 -5.6042027 -0.9831754 -10.5213528 -1.0802419 -0.7070588 -0.4780014 -1.1889768 -2.4931388 0.3025717 -3.4242692 -1.9866887 -2.7435889 1.1792989 0.6661316 -0.4520693 -2.2271447 0.8806648 -5.4181099 -0.6951921 -5.1015534 -1.1827049 0.5116950 -1.2213870 1.3215531 -1.2660846 -2.2174182 -1.5109221 -0.1724119 -0.6378551 -8.4731674 -8.6367607 -2.9583955 1.6969163 -2.5878422 -0.2013870 0.0020781 -2.9792495 -3.5540514 -1.9691935 -5.0817494 -2.7080822 0.5674011 -2.6280239 6.2473750 4.5988588 -11.6923857 -3.8531461 0.4835219 3.6332142 -5.3177867 -1.9822075 -3.5512328 -3.5541341 -4.4673815 -1.9942528 -1.5406015 1.5254554 -0.3057014 -7.0968413 -1.7169240 -0.0703734 -0.0445613 -2.0526726 2.9140666 1.4619418 0.3887780 -4.3312316 -4.1478992 -7.9763365 0.1243059 2.4153016 0.2588134 3.0635753 3.2276871 -2.3564541 1.9457675 -1.1195269 -0.3812272 -3.7145853 -0.5135447 2.0507672 -7.7917538 -0.4023234 -2.0489180 -9.2524462 -0.4084894 -6.1247511 -3.0965760 -0.7027543 -2.8132925 -17.4903049 -3.9171298 1.0803412 2.1057551 -5.8868051 -4.8941875 -2.4627664 0.4895958 -0.0832259 -3.4355726 -1.5199969 -0.7782395 -0.6769869 -0.4856235 -0.0561997 -6.3223581 -1.0855632 -2.4111860 -2.0216899 -1.7613931 -3.2663074 -7.6693492 -3.2948225 -1.6181122 -0.4734482 0.9912789 -3.5014093 -2.2653766 0.4794624 -1.0169028 -0.0558547 -0.8969952 0.1687815 -0.7702320 0.1534179 -0.9498094 0.6167588 -0.4154691 0.2310293 0.3208774 -0.0118055 -0.3403718 -1.0457304 4.3012733 -0.1406944 3.6696486 -0.2975791 -1.3167549 -2.5584750 3.0131936 -0.2256993 -0.3593141 -0.3676160 -2.8720622 1.4220219 -2.8596814 -0.1137873 -0.7716274 2.3322296 0.5542581 1.5536486 0.9098266 -2.0338159 -0.6973535 2.2704091 0.0385290 -0.8134587 -3.1051126 -6.1307874 -1.4962587 -1.1209723 0.4639439 0.0468961 -0.6874732 -0.1869915 0.5727037 2.1300964 6.9866104 -1.1264160 -1.0680689 0.2590009 1.0487307 3.4459324 -5.4225059 -1.7786103 0.8100128 3.1265199 4.5256333 -4.3688936 0.9461582 -0.5115166 0.4761524 0.9599088 7.0584040 3.7050526 0.3441021 0.4611471 0.6537458 1.5810478 1.4588128 1.3678143 -0.3555554 1.7649208 -0.3528963 -2.7366288 -0.3259759 -1.6951931 -0.0102366 0.8717523 -0.5671610 -0.4140842 2.1447370 -1.0532762 -0.4290183 -2.0706069 -0.4943095 -1.3394694 -0.0440649 2.0819552 -1.3804083 -0.5521973 -0.6151190 -4.1208463 0.5847352 -1.5687114 0.3875132 -1.0170308 3.6189432 -1.8600568 -0.5689768 -0.6423730 -1.5520341 -0.7721094 -1.4699295 -1.2844287 0.0097453 0.2272648 0.2277717 0.2750258 0.1977452 -0.5585955 -0.1226596 0.5977839 -2.2856836 -0.7602230 -1.1356825 -0.1561910 0.4392198 -0.4058256 0.3493012 -0.1793301 -1.6697598 -1.1278234 0.1387907 -0.4701442 -2.1756740 0.0077686 -0.3565141 0.0088110 -0.4675065 -0.6223338 0.3803739 0.3843874 -0.0429243 -2.2171853 -0.2148872 -0.4275879 -0.0388679 0.2673376 -0.1393778 -0.2981815 0.7310939 -0.2391901 0.5022740 0.0025179 -0.3625533 -0.5177218 -0.0924440 0.2196207 -0.2143562 -0.1295373 -2.4758065 0.2519112 0.1394109 -0.0104224 -0.0627768 0.7919555 -0.6988958 0.8704378 0.1868432 -0.2643110 -0.5244777 0.3901398 -0.0957489 0.0904110 -0.2264548 -0.6130150 -0.4295387 -0.3105541 0.6385445 0.5227423 -1.5902591 -0.0897704 0.2487590 -0.0147020 1.0150644 -0.6152458 -0.4355407 -0.0749435 0.1756177 0.4325242 -1.4606106 -0.1556699 -1.5215071 0.1187904 0.3736645 -2.0495892 -0.4417501 -0.2370992 -0.1071051 -0.4120396 1.5565189 -1.5124335 0.8166625 0.4298480 -0.0479831 -1.0561141 0.3700640 0.7361907 -0.5191622 0.7468169 0.0003621 -0.9757928 0.0555673 -0.2163683 0.5991407 0.2708843 -0.1494319 -0.1787244 0.7244745 -0.2032503 -0.2614295 0.0966472 -0.1305731 -0.3936519 0.0387373 -0.2612669 -0.2131667 -0.0915828 -0.2370340 -0.5764176 0.2647226 -0.3180754 0.0072407 1.4860013 0.3414209 -0.1552604 -0.1898715 -1.5223559 -0.4221925 -0.1677302 -0.2825412 -0.5143532 -10.0801973 -3.1224756 -1.6005423 -5.2542748 2.0472791 -10.8751707 -1.4034517 -10.9321480 -9.4338417 -4.3288980 1.0281038 -0.4773999 -0.8212526 -15.0242414 -3.8717775 -10.0112667 -0.4775499 -0.2584504 -13.9787054 -9.7454128 -8.2956572 -8.1126108 2.9236088 -12.6441135 -7.3171692 0.2383243 -0.6179866 -13.6297722 -8.0255785 -0.5144215 0.9168494 0.6286717 -4.5686746 -15.6412468 -5.1647391 -3.1414449 -5.4593520 -1.4520445 4.6072326 -5.7736559 -1.0908264 -2.7441473 -5.8499541 1.2559563 -8.6957998 -12.4199038 -0.8224459 -3.0993257 -8.8889828 -12.6494265 -2.9505124 -4.1369433 -0.0300044 -12.4627047 -4.5939369 -15.6957397 -3.6991391 -9.6199408 -6.7222228 -3.6247246 -5.7478762 -11.7691183 -11.1975985 -18.9872379 1.0738283 -2.8710828 0.5355582 -15.5810709 -1.4222593 -11.7204018 -11.3045168 -9.5722389 -9.5992041 -13.2381134 -23.6496124 1.8531159 -14.5030336 -7.3436275 -0.6032373 1.5085121 -10.4437399 -0.4974482 -9.5475798 1.2395637 -14.9028234 -2.6002083 -13.4745846 1.3366922 -0.3875120 -14.1472950 -4.8988876 -0.9597809 0.9612041 0.8190889 1.7015454 0.9468209 -8.2321186 -9.6864576 -3.7565372 -17.0538750 -0.7468876 -6.9481468 -1.1594579 -16.2096043 3.7033658 -7.0735998 0.4527402 -3.1872268 -11.0569782 -3.9185956 -1.5849376 0.3331649 -5.4748750 0.9311652 -7.1010108 -9.9887505 -15.8500137 -5.9716287 -4.0628061 -4.0180073 -14.7124243 -25.3943367 -2.7655110 0.2853346 0.1779525 -17.9188385 -14.0342951 -10.0567818 -1.1189301 -5.3900118 -3.1174443 -4.9858189 -0.5368240 -2.1320734 0.0020008 -9.5205803 -8.0503883 -6.8394017 1.9841549 -3.1354580 -5.4077029 -3.6276922 -7.3916249 -9.9361506 -0.5270712 -0.5263594 -1.7968634 -10.5181932 -3.0177989 -4.7291403 3.0163660 -5.3146038 -4.7639909 0.5939593 -1.1677831 -0.5316000 -12.7450914 -0.6254688 0.0402039 -5.2430143 -1.1198794 -12.6064825 -4.0175123 0.1744132 -0.5876964 -0.2063040 2.5425508 4.4623275 -2.9899909 -2.8312573 -5.3576360 2.3687234 -3.6035898 -2.3430357 -1.9773796 1.0970719 -9.1692467 -0.3128287 -8.0601339 0.9437864 0.3110669 0.0068939 -4.7308807 -3.2483306 -5.1111131 -3.6701922 -2.3424575 -1.2274895 -6.4841876 -12.6274757 1.6588328 -1.6934870 0.2718375 -5.6291018 1.7054251 -1.3556005 -3.1381478 -0.6539401 -8.6767864 -2.4514301 -1.1709915 -3.1284637 6.3862395 2.8963590 -8.8050032 -5.3775978 -0.2829528 3.7586904 -6.5503922 -1.2522284 -5.1073084 0.1922235 -5.8462329 -3.5659583 -1.8344079 1.4886409 0.7224828 -10.6077089 0.0939715 -1.9621404 2.3282466 1.7415246 3.0910249 0.9438605 0.9205359 -8.2224045 -4.7620168 -9.9922667 0.0284391 -1.0688877 1.5805535 3.4705346 5.6648059 -10.0871878 0.5250638 -0.8099090 -1.2159963 -4.8473477 -1.9696504 1.1593263 -9.5477972 1.3470758 -3.4180608 -12.6130056 -0.0802071 -7.6209416 -2.7460284 -2.5258741 -3.3028498 -19.3633709 -2.7196252 0.5430132 -0.1384954 -2.9698279 -5.9285221 2.3504763 -0.2511316 1.0604837 -3.3961031 0.9090515 0.0615224 1.4849455 -0.7664358 -1.4767241 -6.3595963 -2.4879756 1.8529085 -3.2036920 -0.7362745 0.8237336 -6.7556129 -4.1224885 -1.0937138 -0.8378534 0.6194538 -4.8628178 -1.1239996 1.0805714 3.8603332 -0.2703316 -1.0547836 1.2227663 1.1320952 5.2781482 0.6825341 -0.4662029 -0.9394560 -1.1450317 0.5863685 -7.6072974 -0.7546816 -0.0459180 4.8986034 0.1822339 2.4596095 0.0022263 -2.0278311 -4.7167301 0.6891578 -3.0030360 -0.8909284 -0.5549530 -2.4386761 1.4317623 -4.5058255 -0.2563273 -6.6252742 2.6022694 -0.5359745 2.5085928 1.4947002 -2.8692348 1.5908253 3.1423712 0.9537729 2.7171998 -2.8878036 -6.3672905 0.5867322 -0.1353118 -3.5724895 -2.1296194 1.5195147 -0.4876227 -0.0399202 -0.6411030 7.2590966 -1.7598678 -1.3398392 1.0438068 0.8312491 1.4666699 -5.7459855 -3.7631705 -1.5075420 0.3331920 1.6628127 -3.5701296 3.4370656 -0.4753205 -0.9644934 0.9755663 2.2851906 3.2782483 2.3157065 -1.1914262 1.3895091 -1.5169295 1.1053007 1.2889177 0.8663557 -1.3065231 0.4687446 -3.8062220 -4.1857204 -2.3808970 -1.1130078 -0.3076307 -2.3702312 -2.8139486 1.2200669 -1.3017902 1.7698344 -0.7457583 -0.5191540 -2.3137338 0.1642949 -0.2322050 -6.0055089 0.5753831 -0.5218608 -8.2131414 0.6907878 -4.3169670 0.5819865 -0.1009988 -1.3449643 -2.8241861 -2.3028243 0.1046275 -2.2725546 -1.3705764 -2.3246408 -0.3461114 0.3707440 0.4226102 -0.6900661 0.5305365 0.4133091 -0.3318202 -0.1225073 0.6915329 -0.7068787 0.0719372 -3.4113064 -0.4036791 0.4441193 -0.3185442 2.5737858 0.1914769 0.5704088 0.2354095 0.3031018 0.4523705 -0.4232635 -0.1610916 -0.5512345 0.4810207 -0.4350213 -0.3388538 0.9697220 -0.4496993 -0.5540157 1.5602587 -0.1502820 0.6056065 -0.0265321 0.4341279 -0.4253919 -0.2432505 -0.8165278 -0.1945630 0.1215566 -0.0855101 -0.3954821 1.2102822 1.1148672 0.0766508 -0.4059836 -0.1043001 0.5629676 0.8754398 0.1710954 -0.0809910 -0.3388340 0.4613125 -2.6935863 0.0756028 0.5167647 0.4369558 -0.9073315 -0.1071658 -0.2061827 0.0069288 0.6050130 0.7551086 -0.2765722 -0.3087592 1.9089383 0.3718866 -0.6642226 -0.1158919 0.4232560 -0.3172515 0.0591187 -0.2656965 -0.2725341 0.0179678 -0.1942679 0.1394739 0.4554024 0.2822700 -1.6596390 0.2213238 -0.2787611 0.2595790 -0.3085131 -0.2495996 0.2455583 0.3158481 0.1564876 -0.0455630 -0.1503115 0.5048039 0.4404252 0.3884307 -0.2715151 -0.6056479 -0.2226449 0.3300509 -0.1038963 0.2949059 -0.0304039 -0.2215813 -0.0647303 0.2197636 -0.0410589 -0.0680683 -0.5397602 -0.3841026 0.0865106 1.6722056 -0.1892621 -0.5082575 0.0287262 -0.8112959 -0.5571501 -0.1122232 -0.4514512 -1.0650001 0.2124787 -0.4427501 0.1789127 0.4261480 0.2178562 0.7076420 -0.1657795 0.7212250 -0.3187014 0.8336796 -0.3627684 -0.4501329 -16.6310902 -6.0031357 -0.1943688 -1.4349110 -4.2442713 7.5948977 3.8519368 -3.0574117 -8.2228241 -4.9585814 -0.2099373 2.6640458 -0.4662865 21.3341427 -8.7568045 -6.9531045 0.3155036 -0.1634213 2.6423614 -11.6659203 1.1529261 -3.6070647 4.7315493 -13.2256241 2.2819800 3.9950855 0.9516693 -6.2661266 -20.2775345 0.2769282 2.6236203 4.9644022 -2.9488282 -7.4852934 -3.1470304 -3.1219275 4.9626508 -1.5031856 -1.6278816 -5.8101525 1.2572734 -1.4818296 -3.8283989 0.8200043 -5.6304960 -6.4767156 -2.3301973 -1.2969662 -7.9181585 -5.5249848 1.1133178 -4.7515869 0.1760579 -19.0408459 -1.0005912 -0.7199787 1.3532630 2.5003519 -0.3825751 1.1923913 7.0389981 -18.9233799 3.0698195 -9.9632645 2.2858870 -1.0247868 -1.0841163 -10.6698627 -0.7436699 -2.2582884 -6.2619047 -3.8284390 4.9703345 4.4908485 -12.4481010 0.3231458 -8.2589684 4.3877263 0.5983620 1.0681961 1.3064004 -2.2101889 -0.7107019 -6.9715071 15.4321651 -1.1828744 -24.9194832 -0.3227689 -0.7970613 -8.0158548 -7.6310515 3.2725475 -0.2359439 3.1742959 0.2074505 -1.0448763 -4.3541594 8.6689510 -4.3650289 -4.2629519 1.7010704 -5.4052424 -3.5440280 -4.1604867 0.3635493 2.3560057 -0.6788211 1.6359729 -4.0464039 -1.5541867 -2.8013484 3.6764555 -4.8125768 1.8075323 2.9484620 0.5136936 -9.9585943 -2.2678940 -2.6603351 7.7281065 -41.9795189 -22.1049347 -3.2638330 0.0766385 6.2381396 -11.4971771 -3.4309113 3.5691652 -2.0936019 -3.1897168 -0.6848348 -5.3634133 -3.4234924 -3.0006728 0.4728877 -4.3303046 -9.2895994 -8.1812048 -1.3136802 1.1660728 1.8373102 -12.1716614 -16.7240467 -12.4928522 0.7178096 0.2474770 -3.0598030 1.3551748 -0.5311199 -4.4458270 9.3977308 -4.2728314 -0.4539333 3.7012830 1.2076483 2.4347012 24.4353180 0.2003733 -1.1923009 -2.0839245 -2.5368032 -9.2419119 3.7590473 -2.1189544 3.0477438 -0.1130519 -1.7698480 -1.9992909 0.1251070 -3.2214358 -2.8144484 -0.3798586 -2.8765774 -1.5103058 -5.0337901 -0.8733174 -11.4291887 0.4462828 3.0300913 5.0918617 0.9544186 9.2208958 -2.0404236 3.7658873 -1.4111567 -3.0830033 -6.1130710 6.4277749 -8.0885220 6.5739436 3.0581470 -0.0286487 -0.2165195 -1.7621112 -2.8376119 0.9523951 -1.9199500 -7.5662799 3.3832531 -9.2316837 1.2879182 -1.2198292 8.3977079 0.4368662 9.4622726 -3.1123385 -0.1450468 2.5489712 6.0932808 -4.0951028 -0.8030659 -2.8314683 -7.8296084 -8.5770731 18.9091301 -0.1818910 -2.4040039 -8.4857082 -8.8492508 6.8419929 -1.7243280 -1.3199285 0.3188032 -0.8111617 -1.0087739 -3.9921341 -5.9605126 -4.7844076 2.7769835 0.0875538 -4.1442356 -0.9914377 4.2023230 0.1312286 1.0649723 -0.7264592 1.2617428 -3.0657721 -5.8526068 7.5005703 -7.6365123 -1.3482428 6.1504698 -1.6916497 -0.8305127 -1.3438982 -0.2862490 4.5839448 17.0189209 -11.9968719 -2.4462574 1.3278105 12.0319157 -4.5760598 -0.5249854 3.8069553 -0.4249372 -0.5935655 1.3611635 -0.2402345 0.3626246 3.9638758 0.0965060 -0.2706954 -1.6507200 -4.4556198 2.7181604 -5.4293675 2.5410354 0.1499692 -20.4232292 -3.3810537 0.2768375 -4.5585284 -0.8098422 -6.6517043 0.7740587 -0.9095357 0.6227099 -1.3722658 0.3427762 1.1165488 3.4743583 0.2721613 1.0057435 1.8207961 0.2755280 1.1672341 0.1930216 -4.1479797 0.0365247 1.1605086 4.9229269 0.1701064 0.5142719 0.1077519 0.5459816 0.8665490 4.8083329 1.2614042 -0.7669032 0.0390516 -6.9461198 -0.4185502 -2.5754230 -0.0645320 0.4397853 1.8298349 1.0409144 -3.2503462 0.6979865 1.0808018 4.6261940 1.6474231 2.5137730 1.3765826 -0.8556657 -6.3743515 -0.3515947 0.6727597 0.6357196 -0.0251036 -4.4724126 -0.0551619 -0.5232971 -0.1510348 7.7511320 -1.5465640 1.2859883 1.8942509 0.1513785 2.9207788 0.7564036 -3.7034473 0.0911335 -1.3424498 5.0953846 -5.2076974 0.7522895 2.0845182 -0.5231905 -4.2942228 3.7252774 0.0826738 -1.2298180 -1.0810421 0.4548885 10.8601017 -1.2632736 0.8977286 2.3219295 -3.3258390 0.3112971 -5.2253814 -1.2323074 0.1545123 2.6228180 -0.0420219 -0.8587549 -0.1162814 1.2109836 0.9249868 1.9963824 -3.3371129 0.0589305 0.1466072 -1.5244163 4.9020796 -5.1666012 0.4301581 3.6734626 1.5414319 -0.3701023 0.1063633 -0.1896227 -1.1489216 -3.5779970 -3.3441267 -0.0812074 0.7893462 3.2899485 1.5500041 0.6499448 -0.4301859 0.2165100 -0.1643175 -0.9872167 -0.0609671 0.1556763 0.4552878 0.0420179 0.1445302 -0.4965579 -0.1068765 -0.4153679 -0.5187994 0.3469188 0.2821470 -6.4895992 -0.5475262 -0.7648692 -1.5277883 0.2464232 -0.8424444 0.0815231 -0.0025427 -0.0539322 0.3191202 0.0422391 0.0072717 0.9522736 0.0086466 -0.4542427 1.7285061 0.0579058 -0.5780551 0.0395235 -0.9439186 -0.0724095 -0.0768653 2.3830562 0.0257043 0.1328641 -0.1084304 -0.2514987 -0.8620729 1.6131657 0.8996330 -0.1877618 -0.0785810 -3.3004992 0.0750013 -0.1556151 0.0124414 -0.0412510 0.6106753 -1.9882299 -1.7141106 -0.5910853 -0.7698745 -0.1214480 1.4761517 0.5220502 0.2972841 0.5899143 0.4615110 -0.0304617 -0.0934869 0.4684950 -0.2758052 -5.0662613 0.0109509 0.0180153 -0.3679387 0.7259143 -0.2736565 0.0620334 1.7977457 -0.0214337 2.4288764 -0.8976269 -0.4135722 -1.7651147 -0.1692702 -1.2607479 -1.6501675 0.5071335 0.1191645 -0.9822410 -0.2025577 -0.9956262 -0.9891500 0.6810001 0.2289951 0.1831891 1.7154590 -0.9450992 0.7780876 -0.1105255 -0.4455275 -0.0779236 -1.1877148 -0.2571215 0.0022937 0.2774557 0.1177443 -0.1954255 -0.0775757 0.2739690 0.0142030 0.5525717 -3.3500886 -0.1021288 -0.0315747 -0.0659220 0.8102577 -0.1626580 0.0294802 0.0604326 -0.0189303 -0.0747451 -0.0361708 0.0850414 -0.4877670 1.7201272 0.2094595 -0.0896052 0.3974455 0.1431774 0.5851300 -0.1385584 -0.1487802 -10.9020023 -6.4604053 -0.6119736 -0.9607225 -1.5005718 4.2362757 7.6092496 -0.7658414 -6.7507119 -4.9098206 0.1326058 3.3768137 1.5131369 18.6791916 -8.3135633 -10.8607588 0.2127417 -0.4984641 -5.1033115 -12.5478916 0.5252028 1.6530433 5.4477940 -11.6766396 -2.3584235 3.7621379 0.3280195 -4.0680180 -27.8843441 0.0008050 1.6739914 4.7054753 -3.4632223 -3.4385900 0.5876267 2.1968441 6.7992282 -3.7872941 1.6027490 -3.8304501 -7.0258398 -3.1765740 -3.8263240 0.3538179 -12.6590424 -6.7054157 -1.8343530 1.1983846 -9.5064611 -6.3283176 0.3278785 -4.9637694 0.3581591 -20.2568588 -0.7943841 -4.5918989 0.9763858 -0.5632349 -2.5066862 1.0590392 4.8314943 -21.6714268 6.7913909 -9.3600330 3.2503819 -4.7947125 -0.5508365 -6.6716175 -0.9852833 0.0942381 -7.2383032 -12.6120882 -4.0949631 1.1076270 -23.0044861 0.6172416 -10.7331524 1.9027019 0.2192503 1.1278752 -1.0522112 -2.0876884 -3.8618345 -4.4372187 12.6782265 -2.2130358 -28.4029408 0.0593984 -0.7271300 -13.1014214 -7.1873064 2.1849771 -0.8992528 6.3367796 0.6296404 -1.3813413 -4.3764906 4.4256768 -2.1574407 0.6892807 1.1846412 -4.6285086 -3.2198985 -0.8339602 1.1976030 -0.6862194 0.2904394 3.8897357 -2.6980424 -2.2393785 -0.3252529 3.5821743 -5.0362263 3.2637382 0.4136814 1.5778947 -7.9310403 -3.2447248 -2.0120239 1.4687805 -48.8847084 -26.2270145 -2.8703301 -0.3588958 4.9499941 -4.1472869 -6.8561845 -5.5698552 -4.0807953 -4.3191075 -1.9122322 -1.8393705 -3.8604481 0.0158231 -1.3833557 -5.3814650 -7.3993950 -4.9359584 -0.5879554 -0.5382923 -1.3670213 -6.7480493 -12.9710197 -11.2841825 0.4445008 -1.2806168 -2.7104943 -5.5413246 -1.3032517 -3.2486877 6.1214871 -3.2997785 0.2444350 1.2155699 -0.0264632 2.3298330 5.8472776 -0.4279686 -0.3399495 -1.4716235 -2.5386400 -2.8797622 -0.8826222 -1.4953271 5.6500559 0.1228915 -2.7174265 1.2536781 0.1135622 -5.1315446 -2.0093741 -0.1633961 -4.3283696 0.6919309 -4.5314617 -0.4988731 -9.4473934 -0.8160356 2.9662807 2.1160018 0.7300512 3.5764091 -2.6195273 -0.5990936 -4.6031604 -4.7900934 -0.5504545 1.8885990 -10.4134731 -4.2807941 1.7744969 1.0062784 0.5844038 -4.7252154 -1.9323561 0.0028943 2.8333127 1.3689041 3.1989062 -7.8609715 -0.2987794 -6.1071448 3.6919491 0.2742804 0.9825029 0.3526421 -0.4900527 3.2406266 -0.6468818 -3.3739622 -1.4638610 -1.3643066 -6.1938128 -5.0360260 10.1326370 0.8279085 0.3502911 -4.6596851 -2.6649029 5.0734859 -1.5724734 4.5257177 0.9393933 -0.5889393 0.9811124 -2.5528705 -1.7344528 -3.9386666 2.7539499 0.2222534 -3.2918661 -1.2732563 1.1832098 -3.6542075 1.8421397 -0.9118867 0.1738182 0.5406161 5.2562814 5.5252972 -7.6431327 1.5066384 -2.7504215 -6.2082758 1.8983955 -1.0329494 0.5638666 -0.0799249 8.1328115 -13.4466848 -0.9217070 -1.2126626 8.9026804 -7.2430744 -2.3132706 -2.1499426 0.2875623 -1.5463482 -2.2990482 -3.6447697 0.0530700 0.9869400 -0.0172298 -0.1966260 -2.6791632 -1.3625715 0.5861464 -2.3814039 -4.9234343 -1.0035702 -13.0277138 -4.0207543 1.4375994 -5.2564230 -0.0633251 -4.5946250 0.0411798 1.2286532 0.4462720 -0.3099569 1.5257995 1.0292847 1.7382742 -0.1252225 0.3715046 1.1328629 0.0300274 0.9329253 0.0237069 -2.7134192 0.2664864 -0.5660462 5.4307847 -0.1087739 0.3207189 0.0052277 0.1502821 -3.8456652 5.0939217 2.4589794 0.6661084 -0.1429626 -6.0853152 0.2594236 -1.4536147 -0.0080008 -0.0305471 1.7188976 1.9070795 -0.5413505 -1.7082595 -3.9325104 1.2418110 2.4190071 0.0409817 -0.1262770 -0.8648005 -5.9976597 -0.0866812 -0.0840197 1.8009553 -2.8355017 -4.1431665 -0.0872622 0.0542082 0.5283386 7.0825357 -2.9754248 0.0421554 2.8402779 0.2030469 1.9526969 -6.0174823 -3.4200749 1.3108894 -0.0230628 2.1305978 -4.1494813 0.9820502 0.6884356 -1.1657804 -2.6851208 4.8088236 -0.4774160 0.6595087 -0.7500691 -0.2565803 6.6489401 1.1511425 2.3399017 3.4357920 0.0265437 0.2063327 -0.7103918 2.8965251 -0.1091035 5.1748719 0.1154665 -0.7870808 -0.0764730 -0.5062637 0.8409014 0.6221722 -1.4745905 -0.1767758 -0.0582819 -1.5150970 1.5653224 -2.4334321 -0.0737408 1.4677756 0.2237847 0.0448311 -0.1097801 -0.0147166 -0.4328535 0.7012848 -2.2156410 -0.3137698 -2.8121874 0.4831968 -0.2932357 0.2889338 0.2137762 0.1400776 -0.1084876 -1.2727387 -0.3350597 0.1947748 0.0292764 -0.0502233 0.2202889 -0.2508930 -0.2285435 0.6489351 -0.3537174 -0.6070087 0.0266706 -3.0480571 -0.1683811 0.2286564 -1.0059052 0.2083539 -0.1172891 -0.1409699 -0.0430551 0.0195866 0.1456507 -0.1137000 0.0294452 0.3647248 0.0077800 -0.0506381 -0.0857302 -0.0533169 0.0053274 0.0877002 -0.5753875 -0.0777950 -0.0698413 0.1213901 -0.0560283 0.0673734 -0.0135426 -0.1324507 -0.3638951 1.0974060 0.4651145 -0.0848181 -0.0642637 -3.5362451 0.1658211 -0.0058369 0.0266945 -0.1310569 -0.0164157 -0.9447198 0.6939871 -0.3496045 -0.0809180 -0.1331697 0.1507194 0.0149280 0.0998803 0.0198882 -0.6828791 -0.1587142 -0.1111037 0.6261358 -0.6604312 -5.0138631 0.0174256 0.0140539 -0.0654406 0.4963406 -0.0612997 -0.1181750 -0.0680954 0.0082627 0.3387975 -0.5783111 -0.2590839 0.1310524 -0.0917250 0.5119659 -3.1259961 -0.0408708 -0.0592804 -0.1665707 -0.5704363 1.9788990 -2.7644908 -0.2375405 0.2796683 0.1891274 0.8101864 0.2224751 0.0998619 0.1236557 -0.1160560 0.0241595 0.3223490 0.3067291 -0.1038162 0.2158668 0.1226353 -0.1553317 -0.0149162 0.1904674 -0.0446353 -0.1513693 0.4231793 -0.0953827 -0.1070846 -0.1863008 0.4415622 -0.7381020 0.0288075 0.0055171 0.0134444 0.0834548 -0.0234615 0.0418892 0.4514482 -1.0921624 0.0023101 -0.1204018 -0.8399166 0.1781532 0.1516516 -0.1015494 -0.1390421 -5.5418291 -3.4606125 -0.5281800 -4.4116993 -2.3645048 0.7204017 -1.0874120 -4.5746775 -4.6929736 -5.0926037 -0.1370087 -0.7977787 0.7451371 -3.1580927 -8.2145290 -18.2553673 0.0331046 -0.8164864 -2.1469896 -15.6577435 -7.2981610 -1.5796005 4.1466455 -10.0440216 -7.2918859 3.8504248 0.1857722 -1.1502440 -22.5691204 0.0885851 2.8182323 1.9529904 -1.5928879 -5.2922955 4.5148849 -2.8560090 3.3990905 0.3644844 -4.3277950 -1.0410366 -1.0349226 -3.0246689 -5.2357025 -0.8962823 -5.0976605 -6.6260424 -1.6667649 -3.0549605 -10.4837027 -6.3080430 -0.5218152 -1.3146428 0.1647527 -17.3604889 -2.1067154 -10.3461390 3.4361093 -11.4071331 -6.7861347 -0.3302544 -3.2053297 -26.6471958 0.7400098 -6.1824255 3.4007952 -4.5382767 -0.3238986 -6.2634640 -1.6706967 -7.1982026 -9.9638815 -12.9055233 0.3905379 -11.9627628 -20.9465313 1.5631781 -20.1948853 6.8201475 -0.0443395 2.0313406 -10.4310112 -1.7281190 -2.7791300 -7.7414789 -7.3966794 -3.3056939 -36.2718391 0.9588027 -0.4907002 -9.4449587 -4.4490528 1.2557851 -0.5068755 2.9064333 0.4567771 -0.5359460 -1.5076780 2.7933488 -4.5352802 5.0799232 0.7861757 -0.9145927 -2.3565958 2.5936930 0.5816894 -3.1455321 0.4436203 0.9169747 0.3941655 -3.0738246 0.9447868 3.0653486 -6.2150803 3.1531038 -4.2124891 -3.5744128 -4.4280748 -3.7600272 -3.6052725 -8.5044641 -43.8767929 -30.3907108 -2.6056564 0.1282366 3.7417562 -1.9434100 -11.3992519 -1.5521847 -0.8681796 -2.5605547 -1.2905459 -4.5943203 -0.1361712 3.0285892 0.1942665 -6.0515046 -6.2056670 -0.6195604 -0.5122824 1.1371419 0.4366178 -4.5309129 -13.3272581 -7.2101984 0.7309782 -1.4871157 -3.2893546 -9.4865942 0.0912232 -0.6132792 3.9803319 -0.6228775 2.7009275 1.7149975 0.0543885 4.0743122 4.5571890 0.0436628 -0.3306530 -3.5990021 -1.3852243 -3.5275776 0.7434293 -1.1556381 6.2456503 0.3535879 -6.4892116 1.3073467 -0.7264717 -4.3228407 0.1068264 -0.2359978 1.9135132 -0.2678403 -3.5564952 -0.1164516 -9.3575230 -0.1820710 -0.8706475 3.5866234 1.1193688 0.0891814 -0.0043062 -3.8890467 -0.5461449 0.3159576 0.0403957 0.3683738 -3.5608695 -10.7294016 2.6878176 -1.8756515 -0.7481948 -5.2146392 -1.8531984 -0.2333980 -0.4662661 -3.2519019 3.7017784 -4.2063713 -1.4870242 -5.5493608 0.5690600 2.6266689 -4.3807015 -3.3400269 -0.1781675 3.4819436 -1.8909684 -1.4966279 0.5865164 0.3515718 -3.4682381 -4.2159433 3.8040781 1.2788334 -0.7554398 -2.7757812 -3.2268293 3.3009150 -2.2918105 -0.6973877 2.9837694 0.2012882 2.0687068 1.7750251 -5.4213114 -5.3187437 2.0740891 -0.3709232 -0.6989795 -1.5996492 0.4475174 -3.2125475 3.1274946 4.0486598 -0.7466505 -0.5251788 3.0764382 3.5617957 -7.4356766 -1.3435565 -3.4032412 -9.0399599 0.1222953 -1.8085365 -0.0721854 2.0983875 2.3331470 -9.5046091 0.1428536 -0.8420753 4.4810748 -5.0153680 -2.4940393 -0.9031405 0.7025740 0.5053602 -2.0589466 -1.0151672 0.1602719 -0.2141217 -0.3260771 0.2584079 -2.9362319 -0.5133914 1.5300697 -0.5174081 4.5869436 -2.3160548 -9.0424767 -3.6458342 -0.8448599 -0.8610765 0.7971698 -2.1764133 -0.0939022 -0.2492293 -0.8121480 -0.4650476 -0.1486198 0.0234148 3.5160460 0.5486078 0.6549061 0.8728507 -0.1880767 -0.2163589 -0.2000592 -1.6435846 0.0202058 -0.1995780 1.8811566 -0.1099386 -2.9857666 -0.2759724 -0.1642667 -3.0967338 7.0175228 1.1733277 0.1221453 -0.1497682 -8.2267017 0.5763010 -0.5164653 -0.0724866 -0.1566426 0.3339812 2.1105645 -1.8447547 -0.8987961 -3.2731822 0.2267210 1.0650095 -0.4891726 -0.0395916 0.0160900 -6.9844804 -0.1837099 -0.2650258 1.0227178 -2.5924077 -2.8902609 -0.0931725 0.2902173 -0.1232848 4.4052896 -0.9461008 -0.3224052 0.2933945 0.3393409 1.0856991 -6.2677541 -0.5182180 -1.8235955 0.2393213 3.5839248 -2.5063634 0.2596196 0.0675338 0.9801259 -1.1482294 6.9380689 0.7360182 -1.2771711 0.7260947 0.1185391 3.6017938 -0.6234903 0.1685597 0.3803677 -0.1679727 0.3997108 -2.4500678 -1.4581828 -0.1641731 2.2969708 0.4547249 -0.5173308 -0.4066561 -0.1360491 0.5587360 0.3105861 -0.0382781 -0.1569213 -0.1902342 0.0475182 1.7997230 -4.3587265 -0.4008147 1.5365094 1.5315387 0.2426698 -0.2045715 0.0502901 1.0572423 2.3926671 -1.9915103 -0.2284398 -3.4666753 0.8871130 0.2731059 0.0075645 -1.0283709 0.1283007 0.0132336 -1.5427383 -0.0419704 -0.0198941 -0.0580759 0.0270734 0.0297467 0.1213831 0.0708780 0.1541587 -0.1183354 -0.2515351 -1.1497833 -2.0515540 -0.0149536 0.0005107 -0.5128970 0.0907585 -0.3968808 -0.0525849 -0.0072014 -0.0165295 0.0040595 -0.0012058 0.0359978 0.5983104 -0.0283695 0.0225232 2.0847437 -0.0362465 0.1834458 0.0126807 -0.0138617 0.0201063 -0.0338608 0.0318851 -0.0601992 0.0690209 0.0250932 -0.0473793 -0.2858982 0.7957757 -0.0231281 -0.0927546 0.0209550 -2.6661353 -0.0006712 0.0132997 0.0226690 -0.0217779 -0.1737120 -1.2595567 0.6384131 -0.0495518 0.0184424 -0.0693158 -0.0292435 -0.0442218 0.0269358 0.2371056 -0.0151012 -0.0575253 0.0180541 0.1316849 -0.4192081 -3.4792402 0.0382948 0.0332645 -0.0288562 0.0878259 -0.0525545 -0.0161341 -0.0644827 -0.0294787 0.3249755 -0.2092764 0.0592548 -0.7336701 0.0167504 -0.0050487 -1.7292084 -0.0360870 -0.0409688 0.9851782 -0.0248936 0.9393254 -2.2359180 -0.0097939 0.0950119 0.0457206 0.4943694 0.3484202 0.1444300 0.1946514 -0.0774575 -0.0101077 0.3676784 -0.1278146 -0.0017013 0.1196480 0.0364274 -0.0920493 -0.0435261 0.0299732 -0.0632833 0.0146934 0.1465056 0.0342807 0.0268409 -0.0156664 0.3598750 -0.2147734 -0.0216139 -0.0354808 -0.0324241 -0.0628822 0.0071095 0.0370587 0.2183925 -0.9171645 0.0154432 -0.1671848 -0.1406101 -0.0297383 -0.0157549 0.0010204 -0.0975884 -1.4433848 0.6875985 -3.0728712 -0.0557698 -1.8509395 2.4672968 0.0195252 -4.2532849 -5.4533710 -3.3258760 -1.5599749 1.8869035 -9.7415752 16.0420723 -2.2032535 -12.1405010 0.4013016 -1.5716467 1.9748453 -9.1983805 -0.0305779 -3.1584125 1.8495662 -1.3243629 1.2052729 -3.5390775 -1.6142542 2.0715373 -14.9534874 -0.9070188 0.0039115 2.9941800 -2.0128512 -3.3686163 1.6128978 0.4449026 2.6044729 1.7029196 -1.2974104 2.3947368 0.6939912 -1.4005016 -2.4552362 -1.7008927 0.9489899 1.3356671 -1.8375108 -1.2935628 -7.9108176 1.3168383 -0.7348980 -0.3310099 -0.4494211 -1.8472534 -1.9610893 -2.8179114 -1.0585016 2.0208104 0.3887051 1.2609682 -7.0888805 -19.8617325 4.6428533 -4.3750777 2.7996578 -2.8418958 0.0338904 1.7181677 2.6158602 1.7325931 -7.6634459 -4.7303290 4.3887305 0.4927361 -10.5752373 4.1333365 -8.1871529 -2.3379009 -0.5840587 -1.6408221 -6.4292107 -1.5755930 -0.9374681 -5.0003958 10.0869608 -3.4630682 -8.0010433 1.3284444 -1.6306207 -4.0175748 0.7773973 0.5322858 -1.3179113 -2.1940486 2.2238009 1.9452801 -2.8418946 7.4436026 -3.1945324 -5.3006592 -0.1477912 1.7133995 -5.0737739 4.8642259 -3.5140495 -12.8105717 1.8038913 0.2038920 0.9961546 -2.5990090 7.5244350 2.2727232 -4.7360802 -1.4142119 -3.4535830 -3.1503122 -1.3538383 -1.5043489 -1.8518412 -5.8231950 -8.3708897 -26.1085224 -1.5985014 -1.5696762 2.2449751 -3.3385000 -10.6817751 -1.7753531 1.2265056 0.1095232 -0.4209745 0.6209499 0.5348682 0.3743223 -0.2163628 -0.6892003 -4.8979230 -1.8060262 -1.1772768 1.1184261 1.9036791 -0.0411465 -6.7885423 -4.9958429 0.3038368 -0.3591782 0.1552129 -5.9775252 0.0479739 1.8177240 1.0636421 0.2223199 0.2126664 -0.0565106 1.0281485 4.1913996 1.4673166 0.2246404 -0.5727237 -0.8707018 -1.0844371 -1.2376814 -0.2575286 -0.8556662 6.8390737 -0.0698547 -0.4543592 0.8102639 -0.8972443 -3.7981114 4.9702888 -2.2008090 -0.4098420 -0.0353265 -4.5958300 0.8584411 -0.8375168 -0.0479500 -0.1765778 -2.5464303 -1.0813056 2.0728135 -2.8396633 -0.7110825 -0.4809602 1.1540312 0.0227953 0.2712098 -0.6960360 -8.7352190 -0.9371679 -0.4204656 -0.4318064 -2.0768986 -1.9374141 -0.1203853 1.1637573 -0.7998530 8.4040985 -3.9876349 0.7836494 2.8757362 1.0577943 1.8588816 -3.9635606 -0.3218448 -1.1276726 0.8427593 0.1750917 1.0775185 1.2518865 -0.4813160 -1.4724739 0.7544928 3.5050085 2.2136796 0.5273576 -0.0522016 3.1035891 0.7874528 -3.1069562 0.9370908 -0.1362479 -0.8974123 0.9692231 -0.1023518 -3.1656356 -0.2912555 3.3862298 0.8075331 -0.5385070 -1.9473540 0.2836035 -0.3149213 0.2291082 -2.1200578 -0.6227269 -0.3733579 -0.9010224 0.2513644 -6.6941857 -0.6983629 3.9627709 -1.7126573 0.3672599 -0.3083369 0.2033003 2.6810839 1.6959659 -9.1167326 0.1493391 0.9061410 -1.7254164 -0.4951603 0.1280620 -0.3178100 0.0367801 -0.1145620 -2.1933155 0.2753256 0.0003725 -0.0044187 0.0400113 -0.1455919 -0.1398926 -0.1785195 -0.4296287 -0.4246275 5.5909324 -0.0534341 -3.7105575 -0.3627723 -2.1414537 -0.8698267 0.0093591 -0.5095364 0.0218992 -0.3146593 0.0819228 0.0405478 0.0876989 0.0328640 0.8960001 0.0448315 0.0793591 2.8280039 -0.0339226 0.1247374 0.0015225 -0.3773082 0.0029193 -0.0091249 -0.0635698 -0.0478947 4.2867551 -0.0355601 -0.0587593 -0.0951890 1.5589032 0.0846648 -0.0336399 0.0390514 -3.8727756 -0.0011437 -0.1316846 -0.0150223 -0.0203558 -0.2514429 -0.7578244 0.2397227 -0.1916785 1.1010784 -0.0659174 0.1230245 -0.0788509 0.0005486 0.1755823 -0.5654595 -0.0449847 0.0380678 0.2177615 -0.4909416 -4.6553168 0.0158936 0.0810403 0.0247386 0.4386791 -1.0910361 -0.0643846 0.1925383 -0.0188371 -0.0179154 -0.0947130 0.1026405 -2.9363265 -0.0603115 0.0183362 -2.8161480 -0.0008919 -0.0526333 0.1860383 0.1330208 0.1674712 -0.0435285 8.9725523 -0.0337352 0.0566068 3.5633988 -0.1716969 -0.0179625 0.3680809 -0.2286198 0.0093299 -0.6046819 -0.9292719 -0.0433515 0.3787585 -0.0205387 -0.0787900 0.0244223 -0.1155684 -0.0833903 0.2778535 0.1051666 -0.0105080 -0.0398884 0.1434060 1.3860756 -0.2698354 -0.0291782 0.1258391 0.0121920 0.0085980 -0.0516906 -0.0177620 0.1173685 -0.2217613 -0.1043058 -0.0556181 -0.7111691 0.3072340 -0.0145937 -0.0521539 -0.0568613 0.0539106 -0.0062676 -0.1773428 0.0544036 0.0110651 -0.0440382 -0.0127368 0.0352701 0.0639061 0.0083314 0.0392974 -0.0516745 0.1876289 -0.0126893 2.0873678 0.0996114 0.5834434 -0.0531093 -0.0099883 0.0284880 -0.0004456 -0.1139195 -0.0296925 0.0185655 0.0258281 -0.0353352 -0.0252267 0.0086922 -0.0270485 0.2758321 -0.0088032 0.1203373 -0.0078766 0.1193540 0.0041076 -0.0484341 -0.1095550 0.0236634 -2.7065687 0.0317055 -0.0493002 2.6921139 0.0905898 0.0394333 0.0017271 -0.0266436 -5.3703418 -0.0536205 0.0370623 0.0125958 -0.0202810 -0.1695486 -0.2709894 -0.0441274 -0.2263503 -0.4835311 -0.0628597 -0.0856538 -0.0613534 -0.0604218 0.0629373 0.0690005 -0.0384885 -0.0359308 0.0457426 -2.6398556 -4.0669665 -0.0436445 0.0067185 0.0159971 -0.0170108 -0.0529586 -0.0300654 -0.0764646 -0.0072469 -0.0728764 0.0174997 0.0509826 -1.1311940 0.0111041 0.0188988 -2.5775769 -0.0229573 -0.0184489 0.0689836 -0.0161880 -0.0313674 -0.0188755 5.4343209 0.0063498 0.0688694 -0.0594762 0.0641200 -0.0485102 0.2040847 0.1340129 -0.0225671 -0.8457978 0.0335058 -0.0033924 -0.0818868 -0.0289855 -0.0167924 0.0506900 -0.0023968 0.0090641 0.0250879 0.4391049 -0.0100197 -0.0087236 0.7282147 0.0061061 0.0827576 -0.0208301 -0.0471976 0.0041035 -0.0180382 -0.0407535 0.0455154 0.0191299 -0.0179027 0.0125413 -0.0282515 -0.5688646 -0.0282911 -0.0186640 -0.0378040 -0.0239075 -0.2424570 1.0036532 3.9232490 1.5734549 -0.7122909 0.7893748 -0.1674391 -2.6084967 -5.3336997 -0.0637778 0.3762937 1.7394066 1.5060860 1.6934379 3.2962658 -4.3017068 1.0386682 -0.3699563 -2.8577781 -0.0369016 0.3956913 0.6467437 -2.3620093 -9.0310268 1.0474225 -1.5474989 -0.4130533 -0.5276528 -6.2417521 -1.5759797 -0.5396934 2.1250670 1.1797142 -2.4025996 0.1000636 0.2142925 1.1765586 0.3515475 -0.8548492 0.0365343 0.7871120 -0.8511037 1.5432132 -3.4154947 1.2492453 -0.4183022 -5.5486560 0.9103314 -3.2059603 -0.2886668 -2.3414063 2.8593400 -0.2668721 6.7749109 -0.4828598 -2.6741471 -0.6699504 0.1560728 0.5217894 -0.9400484 -2.9644246 -7.8215175 5.0019107 1.0679549 3.2512853 -1.5327131 0.3842086 -0.1138056 -0.8101729 0.6450551 -0.1611247 -1.2382933 -0.7284921 2.2120049 2.6795080 0.2074827 -3.1522481 -0.8870696 0.0187049 -2.2191455 0.5811018 2.7877719 1.1131395 -0.4807152 -2.6801586 -2.6982224 0.4204817 -1.2988366 -2.4489665 -1.8594937 -0.9773225 -1.1689529 0.5788145 1.7620956 -0.1358964 2.4776673 -0.0810788 2.8558507 -3.5050666 8.5098448 0.0953161 0.6197431 0.4457884 -1.0782857 0.6946552 -6.4278574 4.7880311 -2.8734794 -0.8074367 -1.7182822 -2.5091496 3.7789915 -4.3205709 -0.9087884 -2.1725540 -4.1257324 2.0130537 -1.3381574 -0.2356223 -0.6218344 -0.6472453 -15.7443810 0.9187632 -4.3452911 0.0490811 -0.8845053 4.7205067 -0.8727092 0.1164517 2.8537390 2.1028459 0.5419967 2.6502910 -0.3437707 -0.2952388 0.5496497 -1.2522005 1.1185356 0.0168308 1.7005960 -2.7565608 -0.2726822 -2.2279966 3.0674641 3.3154514 0.0659332 0.9098533 -1.7445252 -0.3773758 -0.1545551 -0.7922256 -0.2860289 -0.4458353 0.0756717 -0.4793044 -0.0843876 0.7936180 -1.1315169 -0.1153409 -0.1686443 0.0977593 -2.9401255 -0.2499887 -0.4006125 -0.5721515 -0.2096701 -0.7363368 0.1455100 0.2127713 2.7061839 -2.2159703 -1.7444454 -0.0967104 -0.3175516 -3.3268731 2.1090848 -0.3619274 -0.0615424 -0.2859384 0.0548263 1.8050016 -0.1215908 0.9018819 1.9193730 -0.3205821 0.0573027 -0.1164698 0.1292370 0.5845004 4.3770323 -0.4565270 -0.2846002 -0.6887649 -0.4668246 -6.7587881 -0.0629784 -0.0681826 -0.2184616 0.2727445 0.1414905 -0.3354729 -0.5638806 0.1131320 -0.4761596 1.4792935 -0.5664578 2.4647181 1.8568629 -0.2483333 0.6825960 -0.2908189 -0.2948587 -0.1370153 0.1294339 9.7582769 -0.3811706 -0.7943853 1.2547408 0.6873456 -3.4459724 -0.4313893 -0.1819643 -1.0003283 0.5110328 -0.2539551 1.2114847 -1.3186262 -0.4961819 -0.3349704 1.4710028 -0.1969769 -0.1200401 0.6366214 -0.3996154 0.1359682 -0.0137563 -0.4208638 -0.3272007 0.3762379 -0.0203676 0.7538474 -0.0045394 0.1042944 0.4536549 1.6339403 -0.2674251 0.2722862 -1.2229246 -2.3453975 0.5414165 0.1881945 -0.2213018 -0.2145777 0.7209671 -0.1153504 -0.4580945 0.0629986 -0.2518901 -0.2653649 0.0579960 1.0431871 -0.2192954 -0.0082268 0.1621775 -0.0679956 0.3752500 -0.0000322 -0.1010395 5.3493767 -0.1859695 -0.3637522 1.0924226 -1.4432771 -0.9380920 0.1644800 -0.4110677 -0.0210857 -0.3072717 -0.1189663 0.0580066 -0.0345406 0.0808204 -0.0490825 -0.0005803 -0.2764076 -0.5353166 -0.0209863 0.1291728 0.0608436 -0.0818179 -0.1001761 -0.1537243 -0.0224741 -0.2076356 1.2613845 -0.0065025 -0.1718138 6.5593729 0.4110919 0.4608984 -0.1809148 -0.0727892 -4.7238102 0.0371754 0.0278628 -0.0405967 -0.1237951 -0.0850120 -0.6808938 -0.0083110 -0.1872343 0.0092711 -0.1654675 0.2287522 -0.1750372 -0.0161191 0.2297817 3.6601126 -0.2663489 -0.1095498 0.4421887 -1.3645732 -3.6113713 0.0013965 -0.1760933 -0.1228951 -0.0048555 -0.0195841 -0.0995863 -0.9751626 -0.0436599 0.1118764 0.2575997 -0.3111152 -2.1579435 0.6099933 0.0195054 -4.6824093 0.1408249 -0.0872904 0.0808404 -0.3333406 -0.2046156 -4.4563851 8.3385448 0.2033065 0.0465499 0.6833718 0.2172866 0.0090951 0.2235009 0.6744455 -0.0708919 -0.4842924 0.0032078 -0.0596361 0.4849580 0.8706736 -0.3161147 -0.0554368 -0.7819877 -0.0675643 -0.1961519 -1.9511148 -0.1329619 -0.0618078 0.6071386 0.5688093 -0.1773004 0.0460442 -0.0021253 -0.0796903 0.7863627 -0.0238324 0.0239254 -0.7648967 0.3432025 0.3637222 -0.1872779 -1.0194677 0.0076115 -0.0050740 -0.2256559 -0.2603232 -0.0402974 0.0310457 -0.1094410 -0.0086786 0.1017190 0.0001414 -0.0068896 -0.0331363 0.0045883 0.1593316 0.0187505 0.5943195 2.5019095 -0.0452709 -0.9370806 0.1241187 0.8273509 -0.0097340 0.0205362 -0.0255385 0.0440055 0.0071673 0.0047127 0.0180879 0.0460792 0.0180399 -0.0434666 0.0389038 -0.0365652 -0.1950320 0.0298726 0.0091431 0.0390802 -0.0874707 0.0493997 -0.0071183 -0.0386945 -0.0599780 -1.3312414 -0.0014725 -0.0553384 3.9671233 0.0193110 0.0368583 -0.0522641 0.0137093 -2.1301959 0.0019500 0.0373280 -0.0063482 -0.0171601 -0.0957099 0.0464794 0.0461283 -0.1614922 -0.5787996 -0.0506669 -0.0871356 -0.0395307 0.0369646 0.0423068 0.0526700 0.0203656 0.0336377 0.0679050 1.9269727 -2.6070156 -0.0349848 0.0362799 -0.0262289 -0.0017176 -0.0385358 0.0336418 -0.3904526 0.0230769 0.0559053 -0.0361832 -0.0028123 -1.3842465 0.2454575 -0.0325796 -2.6826935 0.0474123 -0.0489882 0.0579560 -0.2265719 -0.0438547 -1.3811570 4.1081705 0.0247544 -0.0097069 0.0166982 -0.0099342 -0.0063367 -0.0529748 0.3686799 0.0228639 -4.5863991 0.1959897 0.0358494 0.0198870 0.0106040 -0.1380825 -0.0227425 -0.4466419 -0.0564946 -0.0338312 0.4375215 0.0058973 0.0019295 0.0361868 0.0071186 -0.0573247 -0.0015387 -0.0034229 -0.0457102 0.0253587 0.0425377 0.0527121 -0.3071774 0.0431676 -0.0038467 0.0001806 -0.3466358 0.0458288 0.0399160 0.0177164 0.0174550 -1.3854989 4.9756784 -2.3628242 5.0963387 6.6755481 0.7078815 6.7437854 -2.9954057 -0.0165057 -2.5013723 2.8481944 1.7014904 1.7583562 6.9553332 -1.0469364 0.0205487 -1.4606851 0.8802623 -0.7321360 -3.1664097 -1.5212491 -4.2234883 4.5775733 -7.5716014 -3.3907387 -3.8899460 0.2315198 -9.4790773 -4.4280052 -0.4413646 -4.8622360 3.4330990 -1.1165526 10.1567678 1.5343095 -2.5944898 9.4187479 -0.3405229 0.8740671 -4.7589879 -2.7399280 -2.3677552 3.6496329 -0.9793912 -10.0723448 -13.4752960 -1.3818914 20.4640312 -3.0789616 15.2366676 -0.1648985 10.4143572 -1.2947266 -1.3735948 1.7160908 -1.6917881 8.7660389 -10.0324764 -1.0938787 -0.5636910 2.9084740 -10.5860586 -3.4710634 -5.7893891 1.6215475 -0.3305892 -2.7176843 27.5745106 2.7847350 -5.2537093 -1.3223046 -0.2181600 -6.5762391 10.1840715 -6.3754086 -0.2861957 -0.5159908 -0.6100652 -1.2451906 -0.3529218 -1.6702552 -0.9416747 1.2760133 -1.2602000 2.6973155 -1.6782551 -4.3707914 -11.8760052 6.1598582 -2.3091211 13.9571457 -4.7397885 1.3162161 1.1950929 0.5812789 -0.0762225 -13.2057753 0.2140696 0.3510077 -1.0950873 1.9657023 4.6728587 -0.8126664 -13.5417862 0.0279156 -0.9733123 -5.1703763 10.3429241 20.6784420 1.0372707 -2.5741274 -0.1081479 -6.8203130 1.1168017 -5.4433494 1.7972784 8.6864319 -0.6877374 -1.1238389 0.0334799 -4.5170255 -1.1031113 0.5432878 -1.0672339 -8.3784351 5.3567743 -4.0960526 -6.8549910 -2.7370751 -0.4164262 -3.3711417 3.7586298 -6.5757618 0.5268654 1.1159209 -12.9008875 -1.3143584 -3.5170949 5.6193361 0.1383391 -5.2268505 -1.2356029 -2.9340787 -0.7892798 -2.8404841 1.8657653 -0.7462386 -3.6254201 -2.9019144 2.3488977 2.9559884 -9.5352058 -4.7580576 -1.9837919 2.1194518 -1.9058787 -0.3435864 -0.3572029 -5.5483599 2.6701086 -2.3496382 9.2998390 -4.6810303 -4.0291266 6.0996461 -3.0812209 0.0815140 -0.3267455 -2.4903789 1.2086648 2.5282362 -0.6075074 -3.1245959 -2.7609243 -2.1733875 -6.0185819 -2.6870201 -14.3688135 1.7891731 1.1611061 -2.2698684 2.9767115 0.5187629 -1.1392254 8.3308945 -5.0922246 2.5703926 -1.4344075 -0.8059108 -7.3339481 -1.4084139 -1.2525294 2.6916366 -1.6948910 -6.0307627 -16.8846130 2.6902947 -0.7075046 0.1870917 -2.7370603 0.6600496 9.0676928 -4.5367312 2.4216692 -1.4758179 -1.9698230 -2.0237257 0.0790647 -1.8764278 -2.0097063 -0.8503422 1.2181497 -0.5533432 -2.8417525 -8.8494473 1.1482103 7.2988124 3.8866529 -1.6450716 -9.9487419 2.3618739 2.4524767 1.9480363 -3.8648722 1.0589130 -3.0591087 -0.6375555 0.3125870 3.0019414 -2.2570443 -2.1168549 -4.6787195 -0.2674538 -3.3741143 -3.9729874 7.7175050 -9.1118336 -1.5377183 -0.1991570 -0.6778679 -7.8250394 2.7399065 -7.1411524 0.1289585 -7.0107994 -1.3459557 -2.5942588 -0.9932171 -2.8286123 1.7460161 -0.8977806 -1.1977289 -5.9905295 -3.9906499 -6.0516005 -4.6809473 -4.2246342 1.8453040 -5.2169633 -1.2444395 -10.4497480 -0.9812853 7.3903337 -6.5925684 -3.4615784 -4.3452697 8.1604080 1.3878664 -0.3028948 -1.8081834 -4.1598101 -6.1480718 -4.8071203 2.2635534 -1.1834089 3.4723127 -3.8217475 -9.4835682 3.8500383 -7.9019074 -6.6466513 -5.3859925 2.9233773 -11.9425039 1.7178820 -0.3115974 -3.1300671 3.6584303 -3.2729228 7.7307730 -1.6280538 0.9443936 2.8618267 -3.2253540 -2.4601550 -6.2863917 -3.6135385 -2.7211232 2.6922426 -0.9320347 -6.6563530 -19.3544865 -3.7293108 23.7080784 -9.6557655 13.8562193 2.4185867 8.7094421 -3.2834444 0.1311254 -2.0947592 -2.0203056 6.3545899 -9.6392889 -5.3548393 -2.8595142 0.1087546 -9.1792526 -7.7984958 -5.4717288 3.4555540 -1.8863989 -4.6859031 21.6407299 5.2888103 2.2472675 -2.2061639 1.3744893 -0.9263765 1.0269697 -2.9663727 3.5124519 -0.7328631 -1.7149625 -2.6775820 -1.6826618 -4.6895714 -3.2284265 -1.5257186 -1.7915103 3.1071043 -3.8256066 -1.6600095 -17.2054901 2.8097818 4.4148169 11.5693550 -7.1760740 4.1446061 3.2213714 2.8696280 4.2421732 -15.4916706 -2.0801139 -3.1874003 0.2445916 1.9070894 2.7197347 -2.7088046 -17.8745136 -1.8872991 -6.5363636 -5.4774790 6.2279716 15.6565714 -1.8763182 -3.8041430 -0.9827129 -5.5571094 1.9130268 -9.1873884 -0.0880204 6.5204473 -1.9328476 -3.6284106 -1.0845963 -7.8351183 1.2375114 -0.8561656 -0.6043323 -8.0009460 0.3630504 -7.1495585 -3.0459676 -4.6175127 1.8283168 -6.4254580 -6.5390544 4.9635320 -0.6977662 2.5213468 -8.0354748 -3.9982071 -5.1981816 10.0798540 0.0150849 -8.8693304 -7.4315038 -5.6748114 4.6373858 -5.4022822 2.7219779 -3.1138332 5.8432708 -5.4453168 -3.6494935 2.0323942 -10.4328585 -10.7211008 -3.8179510 4.4354501 -3.0622740 5.4026575 -0.1840478 -5.8346190 2.7550902 -3.7658551 6.9486241 -9.3415880 -8.4570761 0.5721436 -5.4051600 -3.5423431 -0.2549225 -4.7532334 5.8034716 2.5358582 0.1349613 -6.9680681 -4.1741257 -4.6526546 -16.7418270 -3.3995104 -28.2808247 3.7652223 -2.3601766 -4.7290640 7.2923617 -2.6068151 -1.8975314 5.1528254 -11.6940088 1.3955662 -3.4173770 -1.4980772 -5.8369427 0.2101105 -7.8331928 5.3094254 -3.9221869 -11.5438671 -28.4982300 4.7266788 5.0640602 -2.1627440 -4.9912472 -1.6119190 0.2854096 -1.0320544 4.4850168 -5.7962623 -1.3600709 -3.0120752 -3.6543012 0.3278981 -4.3041229 -1.7080958 7.1726489 -2.2203636 -5.6056733 -6.2565923 1.8012996 1.3117959 -3.1214406 -8.5416021 -1.8062899 5.6983228 4.1109004 3.2731359 -2.4215426 3.3396769 -6.5916438 -4.0332041 0.2668488 2.3489122 -2.9737463 -3.2946024 -8.5440569 0.6040828 -5.4508581 -6.2798271 4.8566966 -19.6066837 -2.5495505 0.3719212 -1.9069105 -10.3086720 3.2537065 -9.0303488 -1.2171708 -12.1022310 -2.1226437 -3.7540627 -2.9340367 -3.6759079 3.7402699 -2.6290653 -0.6996827 -2.7352810 -6.3389750 -9.7869091 -6.0911689 3.0093689 -1.4226809 -7.6853166 -8.5771618 6.8884711 -1.0643346 8.0421133 2.0172319 -10.1310873 -4.7982917 11.1270618 1.1382679 -0.1012460 0.7682889 -6.3629003 -9.1604261 -6.5265856 2.3583400 -1.4944936 7.7107334 -4.4188380 -11.5755386 4.4106064 -7.8485813 -7.5921578 -5.8786011 5.5937948 -18.4108868 8.7141075 -0.2084393 2.1362419 5.2465181 -5.5469627 5.8391132 -2.6881471 2.0840752 0.5075991 -6.8369880 -6.7728686 -3.8547540 -3.7599020 -3.8569291 1.4578568 -0.6690261 -9.4374275 -23.3642159 -5.9668198 24.2830982 -11.0593624 13.7517080 4.2968502 5.9314914 -6.2124572 6.2180228 -5.5442715 -2.2260480 3.8862977 -7.1204309 -2.1843259 -6.1280856 5.2412047 -5.6277308 -1.7454101 -5.1509662 4.9929366 -3.8173716 -5.8753529 16.6985340 5.5865684 9.5795383 -4.0258865 -1.0917370 0.0331169 -2.2473648 -5.1034284 7.1144266 -6.8633909 -7.7391419 -3.8132243 -7.1329846 0.6496770 -6.4529696 -3.5531681 0.0710529 0.6740636 -5.7910476 -2.6874089 -29.9516926 -0.6307500 3.3442593 8.4267988 -10.8024158 5.7855654 3.4789355 4.1532011 4.8424277 -17.7972965 -3.3863249 -7.5460558 -2.1155910 2.4373622 1.4703437 -5.1702714 -24.3511906 -0.3238656 -7.5044589 -8.0219021 5.8504267 10.7404299 -5.1023989 -3.6884358 -2.5150933 -0.6547722 -1.6930319 -11.0628052 0.3390479 4.6437297 -2.3721406 -5.5087857 -0.8603822 -9.0859451 3.7609789 -2.8780954 -0.0063937 -4.2140288 4.6489625 -4.2641082 4.0769329 -8.6781359 -3.4794919 -8.6756363 -7.9293675 3.0037446 -0.6231619 4.2344503 -1.1112093 -4.6398096 -6.1767683 13.1053438 -0.9852179 -6.8826318 1.3897856 -7.8213778 -6.6731601 -7.5671921 3.0212417 -2.9345996 8.7981100 -6.0373912 2.6567798 1.9587516 -10.7815409 -10.6063299 -4.5699663 7.4049034 -2.3846874 10.9654465 0.0193330 -1.0513706 3.8028908 -4.6529565 4.1616101 -7.4104819 -13.2740288 -2.4818134 -6.4262180 -6.9142895 2.7991521 -2.7570083 0.8768691 2.6764493 0.6239049 -6.1358757 -5.0442100 -7.0473661 -27.9212475 -6.9072876 -29.3260784 4.8319259 -5.2155685 -8.5964003 10.2245827 -6.8156781 -2.2498820 1.6017853 -9.0425701 -3.4094179 -5.0251470 -0.0766038 0.2838355 -7.9633312 -7.3678732 7.6905499 -6.5640221 -14.1869154 -35.5767212 8.7901773 5.5903358 -3.9451616 -9.0894737 -0.7674114 -4.4010973 -9.2018309 9.9572811 -10.6796713 -10.0256386 -4.1209507 -3.6450684 1.7591641 -6.7405138 -3.3653145 1.8226286 -2.4472394 -7.4862876 -2.5936003 2.5751190 -2.8091571 0.0547672 -10.4221697 -13.1475544 3.4138393 9.1410723 6.6870108 -0.4911779 6.3318315 -3.5844793 -7.8318601 -1.0903765 2.9290709 -3.1194205 -5.0130134 -10.8893166 0.5457152 -7.5953779 -5.6769371 3.8838887 -21.8756104 -4.0184999 -0.0508689 -2.9229465 -14.6118164 2.2920120 -11.9888592 -1.5414546 -18.4489155 -2.3461196 -4.7053757 -1.3527448 -6.2325711 7.1194396 -4.4873986 -0.7934842 -1.8624104 -4.5708671 -0.5412535 -1.4662249 2.8423293 2.0019324 -9.8471394 -5.0744910 -6.0931387 1.2708923 7.1120095 -1.1878843 -16.6664982 -4.5166302 12.3051500 -0.7334642 1.2798001 11.1237268 -8.6576614 -11.5475702 -8.7079391 1.6481484 -1.2890128 6.8608179 -3.3703330 4.4030666 3.9301715 -6.6151381 -6.8662658 -4.4190221 8.6730595 -20.7489777 15.9261837 -0.2185644 7.7694392 6.5451856 -6.7885575 4.9941058 -8.7077694 7.1913695 0.7242374 -8.9590654 -9.9699841 -0.7947163 -3.5564470 -8.5345955 0.0865371 -0.6225007 -2.7496374 -25.4787102 -9.1140575 26.4168034 -5.9751983 13.3741302 7.7962036 3.8960469 -9.1719418 -7.1328831 -6.3601151 -2.2722185 1.9452208 -3.8162644 -7.2959900 -8.0433140 13.0088224 0.1345132 3.5240045 -0.1858994 6.8639355 -6.6568880 -8.0007162 12.1686783 6.0046687 -2.4233563 -4.6878529 -2.7631612 -2.3937423 -9.5353317 -13.9219847 9.7391481 -5.4700704 -2.4245892 -5.3838110 -7.2449384 10.2269535 -9.0426645 -0.2425323 5.8847384 -0.1841245 -7.8033786 -3.1076827 -35.8854752 -4.6469555 -3.3636508 7.0234795 -14.0625105 9.6244297 1.2729449 4.6758909 6.1422763 -14.3689833 -2.4097118 -10.7339926 -6.2503653 1.9832752 0.8669870 -7.7291870 -24.9208431 1.1515986 -10.0132647 -5.6620083 8.0875769 6.9376874 -7.9206638 -0.9841867 -4.8162003 1.9488299 2.1776288 -10.6340723 1.6173056 3.9897742 -1.9074197 -6.0637617 0.4607489 -8.8854294 -0.6882218 -3.9575479 0.4679172 -3.1934404 3.2844057 -5.3438416 9.6573477 -15.7173777 -12.2420645 -11.1731930 -6.4892154 -11.8340034 3.1247227 5.8346539 -1.0591660 -3.6802247 -4.1290345 16.5781307 -3.7601447 -5.7328773 2.7653918 -11.1734514 -13.3158493 -10.6459141 2.3945186 -1.4905962 7.4275055 -5.0147223 -5.4196572 0.9811889 -4.1310244 -9.7485924 -4.3847094 10.4955788 -1.0809224 16.0010777 -0.4169433 3.6147997 4.9472866 -4.6283364 3.6519344 -12.5120811 -3.4359562 -2.5585442 -6.3902550 -10.0177679 8.0915432 -4.8463993 -0.1580173 0.6617476 -1.6961374 -3.5631406 -5.0264797 -10.3860149 -29.6134548 -5.8131018 -24.7350559 7.0660686 -6.5086279 -11.1602879 -0.1323810 -7.0858469 -2.4043086 0.3345889 -7.0899472 -4.1779375 -4.8512249 9.0651464 4.0824184 6.9952874 -3.6635292 7.6556649 -10.6434145 -16.7029190 -38.1943512 12.2789564 -8.1894932 -4.6540251 -9.3310966 -12.2007895 -5.6654534 -20.8508205 12.1587296 -6.4653883 0.2895955 -6.6929030 -3.5344725 10.2956400 -8.8405380 -0.5968744 -5.9342098 -5.6199288 -7.7240748 0.3378480 4.2117038 -6.8019400 -8.1192827 -21.8493671 -15.8772411 -0.0823475 7.6609421 6.7715521 1.1682703 9.7392397 -6.5624270 -11.1983843 -5.5788255 1.3296381 -2.4866416 -6.6052980 -12.8710909 1.4302872 -11.7226839 -5.6821017 5.3795786 -32.3391342 -4.2444382 0.6500004 -4.1281962 -13.1052523 4.8074327 -10.4903526 -0.1640091 -23.4601116 -1.4589678 -4.5801501 -2.0736561 -6.8252749 3.3298681 -5.4090929 0.0957159 0.7709665 3.6943488 -1.1095763 7.8578749 9.6984615 13.9357424 -10.7487774 -5.0393796 2.1040015 -3.4854610 -24.1040249 0.6714171 -22.8085194 -1.0062524 7.6755910 -3.1507351 -0.7954681 18.4586411 -13.0767794 -11.1109886 -11.3905783 -1.7466853 -1.5800302 5.0115800 -3.5415623 7.0124130 5.4531121 3.2126820 4.2670150 -0.2467076 13.9143305 -17.1616497 -13.8451576 0.2397735 14.2709408 9.8758459 -6.7928309 1.9414907 7.0883512 13.3852777 0.1130375 -10.7606878 -12.3879738 -18.1236115 -25.5183868 -2.0993483 -6.6269455 -0.3010636 1.2883039 -16.0248413 -13.1140795 32.3852654 -0.3135659 15.9149933 10.6741209 1.9567466 -10.9640188 -7.2374535 -14.9241123 -7.8497338 -1.5182800 2.2841597 16.3855934 -5.8430166 10.5196037 15.7713327 -1.3176281 2.6313999 4.9455843 -10.1363935 -9.4906521 9.3300886 -3.6588016 -3.3507347 -6.4391418 2.0585067 10.1278801 8.5743055 -8.8041792 15.0639954 -3.4148021 10.7033262 -6.9486613 -7.6311884 10.9541950 -10.6619539 1.3435864 11.6512012 12.5257626 -8.6101084 -5.4317393 -30.9399052 -1.7030014 -10.4321918 4.6261568 -17.0033894 0.6873193 -4.9091535 7.7917752 7.4856691 -3.5567522 18.1896515 -7.3903728 -11.1589851 0.8637553 0.6477671 -11.3273020 -21.0363350 1.1147292 -2.1879382 -0.1703887 8.4170933 5.7849050 -10.5213842 -1.0129478 -4.5880151 9.4418869 0.2470722 -1.5753005 4.0284052 6.1531839 -2.4074137 -6.5924840 -4.6778388 -14.1456280 -4.7519994 -3.1246469 2.4113631 1.1940391 22.8922348 13.4516401 7.7521973 0.1123730 -6.8107347 -12.6191063 -7.6840529 -3.4138246 -13.5444698 -7.3663306 -2.2045736 -0.9356499 0.3714359 17.2833824 -7.1566300 -8.1495171 13.8206568 -18.9901390 -10.6109505 -13.0046368 -14.7539015 -3.2344766 6.3894815 -5.7709899 2.3281393 1.8733321 4.0204201 7.9036403 -2.2333429 15.4030695 3.1879160 0.0131609 -0.4594347 11.5468140 8.3342361 -5.2999301 0.6583383 1.2293599 4.6321774 -1.6760086 -7.4121461 -12.5689192 12.7169113 -20.2763348 3.2238264 -8.6296129 2.7536731 -0.5821253 -3.6971536 -12.7574272 -33.2221260 -0.7474478 -18.6912289 11.7907219 -9.1367121 -12.2311525 0.4127926 -15.9452839 -9.6711769 -2.7473738 2.5074184 -7.3481956 -2.8531787 5.8820095 20.4605255 0.5746709 -0.3112769 13.7435389 -19.2559910 -17.0718899 -33.3379288 6.3840222 -8.8731585 -5.9891825 -5.0601988 -13.6980877 13.1286430 -19.4387798 14.9201717 -2.3475449 6.2286787 -7.8944817 -2.3087254 8.5400438 -11.6312847 1.8131185 -4.6806207 14.4010477 -7.7925940 4.3023334 8.1565523 -5.2835350 -12.1427450 -17.2038631 -18.2143307 -0.9026998 -4.0367594 10.0247631 3.6888826 14.5281477 12.4529085 -8.4994373 -11.1017532 1.0517514 -2.3898339 -5.3986940 -11.9411488 -2.2025604 0.7372026 -1.3403471 6.6823344 -28.2242451 -4.2344279 2.0489116 -4.8250151 -0.7433797 -1.1051793 -1.2601459 3.0725071 -15.1364794 -2.6937902 -4.8326497 -8.9427700 -9.1907721 -13.7366791 -11.2004871 1.9387256 8.7950764 24.8892632 15.8359823 8.6623240 33.5572701 -0.7316607 -14.8912821 9.3805027 -10.3401079 13.6729307 -15.9059973 -0.9528294 -3.9626057 -2.1100831 14.2867126 -0.0387124 10.8466845 -6.3996339 -15.8052435 17.2710915 -15.1234140 -1.2407370 -2.8911262 -6.1825442 -3.2477481 18.4649277 5.2967377 -0.4098949 -2.7754877 0.5610981 16.3288212 7.8921542 -7.0772376 -1.8598490 5.6177816 10.3581772 -7.6436276 -5.6331162 -5.0365891 2.4356802 -0.7910889 -1.4135602 -14.0640640 -9.1725645 -10.4647169 -14.6756639 5.6761756 3.7484906 14.1988764 1.8306425 -14.7647038 35.6085091 -2.7242291 24.0477486 9.2854481 11.2843237 -16.4611111 -1.0741938 -0.9787520 -12.6273613 -16.6590900 9.6763439 12.8664913 -8.5980358 7.8508325 14.2197599 18.8448162 15.6949520 8.5173531 -12.3445597 -13.6800756 11.7570705 -12.7410402 -5.3963313 -15.1353951 7.2944388 18.7411404 -1.1219314 9.2640505 9.2942019 8.7780514 17.7967682 -10.9179935 -4.6217074 0.6171941 -12.3360033 0.0529629 -13.5404949 -4.7385817 -5.4977236 -3.9268250 -5.2934737 -7.5719380 1.0383830 8.1869364 -0.5297986 7.6746888 0.3345798 0.8563691 9.6411667 4.9344635 13.0137730 -20.7607632 -15.4270926 0.9676611 5.4619827 -0.0208830 -7.9428296 -5.9750085 7.8445640 -4.7749872 5.4164572 8.7748976 -0.6784427 -3.9734724 -6.1110067 -3.1833811 14.2960577 -6.6297722 6.6972737 15.5792551 -0.3370742 -1.4126170 6.8006968 0.1851539 -9.7107630 -2.8583441 -5.9084153 -15.3785028 9.8907061 -3.8614233 -3.3215463 -19.2680340 -4.8401928 -15.3284168 9.8034725 -5.2233896 15.1644020 -2.7341213 9.1780281 5.1032424 1.8794630 12.6070585 -2.0857162 9.9698648 1.9882337 -20.4843788 17.1064091 -16.8736477 2.7078974 0.6794941 -2.6396902 -10.6870136 4.4606628 -1.8723904 5.0301986 1.3310654 -0.7053546 19.0601254 14.0824957 5.0555210 -1.5421228 19.6997318 12.0481939 -9.8266048 -1.5332608 -9.9917297 8.2230434 7.3684897 -8.7574806 -13.4753580 19.8032131 5.8446603 -23.1981468 10.5303726 6.5806408 13.4742165 0.3073721 -12.9605570 -21.1133003 -0.4472152 5.1219912 9.6521225 -0.3101550 -17.6592751 -1.6811976 1.3100150 -9.4004107 -10.0696783 7.8498006 8.0679312 -6.1912742 5.4694858 23.8466072 7.6195765 14.1605625 5.5267935 -13.5967083 -11.2007761 -28.4584618 6.1505275 -1.5425780 -24.7484341 8.7530003 5.5392828 0.9060824 9.7932034 2.6190794 8.4172125 18.4022808 -10.0582829 -0.3940110 4.2552834 -18.0046043 -0.1254269 2.3754456 -3.6891870 -3.0702357 13.8298235 10.5990171 -17.5227146 5.4484835 -14.1259394 -0.7709128 8.6053715 1.0766876 4.9828849 -6.6549792 -9.2220736 7.9638782 -9.4096613 -15.8017559 -0.2546396 -2.4138253 -5.7196555 -12.2538528 -10.9404345 5.7706161 2.1301270 1.9268533 -15.9920368 4.4040737 0.0015108 -4.9699612 4.7889738 5.4295802 -4.7608109 11.3670053 -14.0884790 -0.5588655 -6.6097708 3.2066767 -4.3318868 -8.0446930 -1.3978769 -2.9443047 -16.7630482 14.0703249 -1.1107334 0.5280678 -12.9477558 -1.2631443 -21.0589085 -3.5925086 -2.7793183 2.6817427 -3.1693740 -3.2508798 -2.2152500 1.1987085 6.2950811 -12.2703400 1.8473849 -3.9292469 -25.5249100 -17.8287964 -18.9569912 1.3836645 2.7170777 -17.4774723 19.9421310 -3.8312867 -5.0575852 -4.4324956 2.9770367 4.5882206 16.8055248 19.4466591 -1.5035180 -4.9284344 -6.1735878 5.8956399 -6.2120967 -2.8883770 -23.0600090 -4.7646508 -1.6845266 0.7476238 -14.5087461 -3.0556982 12.6959686 -11.7604427 0.7306754 -2.5394328 5.3198075 14.8176479 -14.3776789 -7.5211220 -8.2416143 34.7475548 4.6572604 7.8709569 -18.5585957 -2.8768213 -7.2164550 6.1109705 -4.8257456 -3.3942628 -1.8935179 -13.6581860 -9.5291061 22.3110142 0.6645249 5.3798366 6.1798038 -5.6073256 -12.6811638 27.0757523 0.6004780 -2.5149171 -14.4908638 -1.5902311 3.2452247 4.3926010 15.1890821 4.7501349 7.3797164 3.9868038 -15.0289888 -2.0714297 -3.3219035 -17.2206783 -0.2630684 -20.3125629 -4.9831643 -3.6602018 3.0555215 -10.1061583 -11.1672258 -0.7133095 1.4399251 0.0519349 -6.4611797 0.6045287 0.0694040 -3.8570194 22.1505222 -8.0415668 -3.3849037 12.8885717 -1.0141587 18.3606071 -3.2069788 -2.6795802 -5.1677799 4.6948671 -2.9124064 3.8405619 16.5124893 5.3365164 -3.6777773 -2.0753775 7.6251001 4.2883840 4.9407291 -14.3165283 35.8471718 -0.0115770 -1.5243556 -3.2114241 12.7345829 -2.5470371 2.5019479 -3.1253209 6.6067963 -1.5459248 -0.9563800 -3.4671688 1.0791233 -5.1614089 -16.7971458 -0.2258130 -0.2355565 -1.1144078 7.1750169 1.4882993 -2.1843448 -18.5090008 -2.4845283 -8.3891125 12.0723362 -4.4865313 -22.0445766 -11.0896320 -21.6437702 -1.0342240 -5.1702914 -13.6796455 -9.7150097 11.4045248 -11.0501604 6.3213701 1.6787748 5.6775951 24.3399353 20.2583351 0.0804847 -0.2775001 7.0417047 13.4657173 -2.7402577 8.8351469 -27.8841629 -3.2602680 1.7870699 13.0169172 -5.0932856 2.8929718 8.3404827 -20.4862881 -0.3376356 13.2565508 2.2193263 -6.6344771 -14.8729982 -3.9799292 2.7735996 14.7087717 8.1429529 7.4436421 -18.8909798 -3.1761024 -3.6176858 1.5062432 -5.0355306 -1.7700831 1.2370933 -1.6287704 -20.2991180 -7.3126459 1.1747286 -9.5833483 0.4340995 -7.3169951 1.0533174 19.2690716 0.4984961 5.1780801 -3.0625763 1.4501522 -1.7398983 -2.2960112 19.3236561 -0.2144094 0.1713638 -3.4368587 -12.4842491 -1.8537848 -1.4155501 -16.2197800 -0.8083209 7.2473350 -5.8694634 -8.3839998 0.8803982 -8.3459101 -12.3792715 1.0395833 -15.1040363 -6.2128038 4.1441159 -1.9759784 -3.4397998 3.4669142 4.5552707 -10.8266459 4.6035094 2.9548850 -4.4981804 -8.0373411 -7.2041740 2.7817893 0.8421415 5.9871092 -1.1515006 -3.1731100 16.0308285 7.3446379 -4.9300756 0.9135045 -0.4882255 -5.8358288 1.7064382 4.3193746 -4.6264410 1.4438963 1.8166412 -5.5300932 -3.1473999 -2.8688476 5.7127738 -13.1613283 3.3907704 -7.6943007 1.8553981 -2.0157826 -24.3028698 -2.7402451 -12.6100492 -8.2745647 4.2142386 -11.6631756 -9.8058424 -23.1853390 -22.3107262 -15.9927397 3.5162671 2.9986961 14.3357477 8.8636627 60.0452461 -14.7971411 -4.0386825 0.0153922 -35.4461975 -18.3256092 1.8929836 -19.5949554 -91.7416229 -21.8711777 -30.2672119 -45.9656677 -15.7040577 -59.2202911 -49.3874550 -4.1875925 -9.6901836 -35.2887993 -34.9774933 -17.1615047 -31.6028862 -21.1125031 -18.6308727 -22.3622665 3.1928072 0.4459340 -22.8071823 25.6834087 -17.4682369 1.8165461 -26.5671120 -57.0642281 20.1234665 -7.9383783 -19.3381195 -59.3164330 -44.3690605 -29.7837219 -1.6620610 9.2675257 -7.5178461 9.2097139 -31.3574390 5.2094293 -2.3665845 -56.5322113 -11.7584105 -19.2886772 -23.9774094 -47.6200638 1.8942746 10.3736219 19.4076862 -57.5510979 -6.3434119 -26.8533516 -63.0699234 -13.6331091 -11.0887823 7.3129578 -198.2124786 16.1482925 -10.6591845 -7.1892524 -1.9840332 14.5438232 -9.4728527 16.9031963 7.8888798 -17.0248585 7.4421148 -11.8582869 -19.9977436 11.4380941 20.5819168 -22.3055801 -16.3520393 -51.0310326 7.2734137 -2.1010900 11.1783934 -3.3209527 -43.1257591 -5.8879728 -15.9989519 -126.2232361 -19.5821877 -32.9398117 -3.9951582 -77.7054062 18.6302738 -117.4628830 8.6506777 17.0822144 -39.3906136 -34.3438683 -4.2326965 -41.8158264 -15.9979696 -15.1827440 -135.1701660 -156.9070740 -45.8615074 -50.6864929 -24.7832394 3.1386335 -16.7778225 -80.6810455 -13.0995693 -1.5411879 -72.0475388 -52.1984100 -143.4269257 -7.3806701 -0.0439913 0.0589718 -5.4919152 -0.1305423 0.0283336 0.1999352 0.3792907 -0.8726681 -4.4447565 5.8080568 9.1692343 -0.0117690 -0.3880539 0.0032628 -113.5055847 -0.0699247 -7.0018477 9.8142414 0.1459659 0.0015589 -0.0087856 -0.9291548 0.0007386 1.1363025 -0.0066615 -2.1063588 11.9495821 16.0234089 -0.0080769 8.9404135 -0.5751672 0.0568575 -28.6827774 -0.0026747 0.5203498 -0.4472161 0.0112165 -2.9951789 -1.0196327 0.2773929 -0.0553860 -26.0505714 0.1892173 25.5928555 0.3479716 -49.4027061 -95.4159546 -0.6913276 4.4921598 27.4890671 18.3275127 7.9995508 -34.0029526 -0.0112442 0.4215123 -0.0074089 -0.0680664 0.0231601 -0.3729877 -15.2378960 -0.0283805 0.0132414 0.1217221 0.0558923 20.6232071 -0.0604737 -1.4948170 31.5855484 12.0662689 0.1562763 0.0950506 -0.9071486 0.2636439 -0.0037638 -0.0352438 33.6078987 0.0821451 0.0615031 -2.3139777 8.2882385 -0.0817132 -98.9954987 0.0057820 -0.7934180 0.0106713 -42.8634529 -0.0424353 0.0977810 -7.6407633 0.0587102 -12.4435806 0.0176749 7.8551273 15.6236515 27.1633739 1.2151314 15.5765924 -0.0994745 0.0866613 0.0005984 3.6497684 -6.4420395 -1.6349688 -40.7849655 18.5256157 0.4286845 0.4210274 0.0177003 13.4260006 16.8101826 -0.7251734 13.4407330 -0.0130347 14.6038828 0.1028431 -0.0244406 -3.3272064 19.5180168 -5.4077988 0.0051767 -0.0002412 -0.0679511 -3.1266959 -2.3705668 0.1239550 0.0040956 0.0915899 -0.0537425 -17.1880741 -13.8639450 -1.6857017 -21.6340828 -10.7462425 22.8780956 15.6042795 -16.9199276 -0.7533462 62.3817902 -0.3779688 15.1684742 -15.9904280 -20.9482803 -0.9490699 -0.0621195 -24.2702522 -1.9905419 0.6928811 -18.1112728 7.6105208 -21.9022350 2.3164821 -30.0312424 2.7259202 9.4764910 -1.0360698 7.5881977 0.7257345 3.9511778 13.4446411 -4.3727508 -7.7022014 -13.3140535 150.4920502 8.8880157 2.5434721 -3.5162423 45.0057983 -37.8162575 25.8512554 -0.9453128 -1.9200174 7.4352174 10.5486517 -21.2947254 -14.9784946 -9.7554827 -7.9991016 24.0370312 1.5282509 9.0930033 -1.8606271 -14.4239702 69.6456070 -15.0222712 46.1788902 -28.3157825 -17.2483196 7.7667956 -41.3069725 -10.2246447 -12.0794239 9.3630304 0.3719683 -52.7532349 -31.9932117 23.2306118 -0.4801465 7.0944338 39.0171814 -18.4785252 13.0271425 -17.6699772 0.0246476 2.2335436 -15.9927683 -11.3540392 -2.0455925 -13.5100927 18.4869480 -22.6769600 -15.1543617 58.8800430 -18.2184868 -3.5276222 -4.2083755 -15.7683887 5.6537595 -2.9941187 -6.6420474 0.0170231 1.1336594 -0.9994335 16.7649879 -31.3581505 5.0920925 -21.8841095 15.9433994 0.9284550 2.0088081 -9.4613047 -1.7725741 -0.9732450 11.3058538 -0.1134038 -18.7490368 -4.8396468 18.4281769 12.0147276 -24.1831799 0.9423349 -8.1701431 -9.2185469 1.6150495 3.1139991 -6.2785373 0.8794018 -3.1265054 -7.1392937 -15.9948730 -16.0745678 0.1775997 -32.4493065 0.5156269 -28.9004459 0.3441376 -19.0522404 1.1359915 23.4237823 -0.5432442 6.4465160 -0.0810268 7.6814952 -0.2675604 -0.2717512 3.2890201 2.3878393 9.3127317 -2.7028980 -7.0322618 -1.5967776 -0.9451890 -14.2108707 -1.2516671 -0.0945633 -0.3936539 -1.6961858 -1.6659074 1.6287972 0.0042031 0.1015399 -10.4189358 4.7148285 -3.0311949 -3.8236105 -2.3426797 1.0133255 -1.3242455 0.0762144 5.8956695 -1.9834526 -1.2773855 -3.9650755 0.3049657 10.7031565 -0.0140632 -1.8127429 3.1120605 -0.7245733 -5.8210139 -0.2856237 -1.4091100 1.2289759 -1.1730990 -2.4005485 -1.0405401 4.5066857 11.4124155 6.4999409 31.8535461 -0.7216216 -4.3863535 0.3139214 -1.5378073 1.2310749 -3.5692341 11.6736946 -3.3240225 -7.9052410 1.0429684 -7.1953015 0.0169897 -5.8161106 -0.7994511 7.2147374 0.7174428 2.7544234 0.1553286 1.9839199 -7.0697713 0.0677444 -25.7757015 -0.0427273 -7.0813208 -0.9393135 -0.5084154 -0.6728104 5.0050478 -1.2937653 -0.5687091 -0.1046173 -1.2561677 -0.0912909 16.2681561 -1.5649781 0.3406577 0.7136773 -0.5664125 21.8989334 15.6979818 1.3115889 -1.4582877 1.7863860 -2.5663347 -3.4115987 15.5756559 -0.1610791 5.6442661 -3.2004714 16.0591774 -7.8579412 -0.9082162 -0.3077630 1.2366567 0.6398494 -0.9995918 5.5467324 7.0455122 -14.4592247 4.9541974 6.5598373 -1.8364036 -0.0628147 -2.7633607 23.1337967 -0.5561585 2.0412743 -2.7615941 -0.7898560 -3.1721656 -0.3879440 -8.5007896 -3.5211608 1.3834293 3.6639047 0.1102986 0.5078399 6.7976499 37.7737465 2.2595561 -7.7444172 -7.9993982 94.6939697 3.9216082 9.4502497 -22.7944851 2.6454325 1.2398059 -6.8846416 1.8103346 3.2952766 5.9457822 9.8503208 28.6849213 2.2817068 -14.9313383 -7.6126924 -11.0404320 56.7424164 -15.2320137 -11.7733583 -28.8529530 -14.9875717 -5.0309253 -9.6687517 -30.2283936 0.6410480 16.6085949 1.1060987 -8.4973936 -12.2027254 -17.6818428 0.2411330 0.1727047 -0.6562350 -33.3464241 73.4500809 -11.9043856 -10.7159090 -15.3236008 5.3314977 6.9631906 2.4822760 41.3786278 -0.3286406 -4.8320889 -5.5515056 23.8476543 -8.7771845 6.0192761 2.7250829 -10.9467020 -5.7539072 -10.9894466 -3.9950676 12.6935034 2.2814455 -15.4874544 -15.4611673 -13.9207897 0.4172888 5.7575808 -0.0039899 -3.9954455 -16.5930347 -17.1473408 58.5580521 -13.4883862 -9.5822821 -40.4285851 -9.5429268 10.8352137 1.4786780 2.1818509 61.1414795 -14.1070728 5.1423798 -10.2925529 -4.2396197 8.2754507 10.7776546 -10.3042030 2.3654935 24.1010208 48.6408539 2.3158116 -37.2913132 -4.9880953 -10.9770851 -11.2692022 1.8451065 -18.2257366 4.1078858 7.9195065 -2.1290560 -15.7885151 -1.0333787 -0.0089462 44.4139137 -1.9550233 -3.7367251 9.2634068 1.4661839 4.3568926 -1.3661922 0.1130871 -31.9978008 8.6396599 -1.3564813 -10.4797230 -14.4082098 1.0381079 -0.2888825 0.6764162 11.7022696 9.7184782 28.5759449 1.5918074 3.4210210 -14.7003584 2.5352037 -7.4758782 -13.4599104 -1.0007892 5.6846991 -6.0589671 0.4089742 0.7984712 -1.4264777 -1.3565670 -2.3089099 2.1701865 1.4462824 -1.5888202 4.5531597 7.8130827 -1.0297465 15.1166649 -2.4721301 5.3259826 3.6439550 1.5443074 0.6310195 -1.9747928 -0.8658877 -1.4620035 4.0974007 -1.3171816 1.5341747 3.0551772 -0.1669069 -3.2246585 -3.7408102 -1.5752752 -0.1535742 5.8271608 3.3705447 -0.8655491 -0.5129859 -3.4050751 -0.6582262 -15.0947876 0.8148610 0.1126524 2.2814682 7.7438216 4.6710701 -1.9401113 0.5478439 -3.4226780 -1.9292079 8.1030273 -0.3979315 -0.8530995 -1.7477036 2.6285369 -2.8876197 -0.0660351 -6.5324984 1.7786808 -2.9420998 0.2598135 3.9947345 0.3724428 -2.7132781 -0.6475941 -4.4939284 9.5165739 -7.0250940 -8.0323954 -0.3721043 2.0328183 0.4815303 3.0864134 -0.7250994 0.8697387 -4.7181897 -1.3225539 -4.4927521 0.3554193 -1.5969172 -2.5666013 -0.0015289 -1.3544155 -4.0448256 4.7905545 -0.2850517 -2.0034997 -0.6605324 2.3571906 3.2264888 9.2585335 5.5781345 -0.3393492 -1.5849043 -0.2397414 1.3598348 5.7910571 0.0328661 0.6289424 -13.3639078 6.1373286 -2.6029007 3.0983143 2.1710749 -0.4508030 -0.2986637 -4.7073951 -4.4547319 -2.4908090 -1.3864685 -0.8540605 -0.9249232 2.7350485 -0.2537627 0.3972311 0.3002902 1.4534878 -4.3741369 2.0529170 -1.1374997 1.3558341 -4.8789029 1.4674246 -1.5807294 -2.5356524 -1.9998597 -0.4223800 -0.7130267 -4.3792491 -2.9661438 -89.9244385 -5.8111129 -31.7208538 -9.4572783 -30.3729153 -36.5904922 -42.5411339 -16.5790977 -11.0883017 -22.4125137 -120.2247467 -7.9940815 -7.3033299 -40.4323235 -25.7784843 -15.9978943 -18.7917767 -65.3666306 -49.1731377 -35.5503922 -35.3237610 -32.8601036 0.4719149 -10.6109228 -51.7873268 -1.9995273 -135.2035675 -49.8073997 -50.2625237 -72.7423325 -5.4692035 -6.3591261 -17.8538246 -16.8358803 -15.6235704 -33.3365059 5.2488794 -15.6328421 -10.2762918 -22.2663116 -29.8766727 -30.7461472 -15.4051571 -89.5437622 -31.8884735 -30.8264370 -15.6190329 -176.4714050 -19.2663670 -60.4489594 -34.1442032 -36.2402954 -13.3093472 -77.6786728 -7.9963179 -11.7852859 -16.1759567 -28.7173462 -39.0565033 -7.9980946 -29.1792679 -81.8762817 -60.0438004 -12.9910240 -120.6738510 -40.5894508 -10.8213472 -52.4086494 -67.6035385 -26.6019402 -14.0782928 -12.9855595 -63.9953766 -53.8852081 -12.6037312 -155.1019440 -11.9546223 -48.0393906 -17.6371498 -15.9986506 -46.1896095 -15.6896515 -68.5373154 -14.5534725 -17.9843292 -15.9994860 -37.7075844 -27.0181141 -16.0010738 -16.0031757 -26.9161205 -23.5032101 -117.9821167 -109.4607315 -111.6275177 -4.6042943 -46.3836174 -43.5587730 -10.9482107 -34.2336464 -29.5197887 -31.7372246 -3.9975040 -21.3887825 -93.1194153 -16.9561691 -9.2824345 -3.1753085 -68.4235153 -14.0965252 -7.3958564 0.6962828 -40.8313560 -59.9860039 0.8437281 -11.8779202 -30.3314266 -4.7211699 -15.2782974 -25.4063587 -12.5068369 -52.4660988 -5.0291572 -2.0628526 -8.3748360 -124.5372086 -48.4109612 -38.7452431 1.3011918 -1.6800075 -20.2278652 -4.4828696 -11.6452694 250 128 5 0 0.1000000 1.0000000 -5.3929334 0.8507708 3.5702932 -1.5722823 1.0525461 -1.4634662 4.4385366 -4.1770473 0.4675303 -2.8035653 0.0201882 -0.8271512 -0.9145787 7.5026269 -13.8015566 -6.3122516 -0.0865902 -0.2220154 0.4261985 1.5267122 2.3684185 11.1476908 -2.1941130 5.2839689 -0.3015780 7.7554717 0.6121064 -0.9084527 -6.7187538 9.5011530 -65.2808609 -1.5686543 1.3211797 -2.7186711 -0.5640568 -0.4738871 6.4274502 2.4397109 -2.7034576 -3.5203066 1.1547307 6.2392983 -0.1842939 1.4010417 -0.0270315 1.8802696 -2.4895251 9.3485765 27.0420971 -0.7107606 -6.4635038 -2.0282683 -0.4396492 5.4890785 1.4965701 4.3056874 -0.6146606 -1.3335036 -2.5108204 1.2239128 -1.9294974 1.4039164 -1.9277266 -3.3556340 -0.0694559 -1.3070172 3.9148726 3.1324456 7.6535468 -0.3027442 -0.1203211 2.0195920 1.6559671 -1.1520922 -8.4414377 4.2637486 -0.9124542 0.6014159 1.7188888 -1.9760867 -2.3610594 1.5792198 2.8731620 7.4433346 3.5512509 3.4209907 -0.5039070 -6.6373267 -2.2104893 -3.0045741 -3.4622068 -7.0007477 -3.7934260 0.8124710 24.0175514 -1.5763980 -1.2728646 0.0256737 -5.1352839 11.5298796 -1.8709174 2.6344221 -3.4650316 0.3077245 5.3117170 1.6595668 2.3880148 -9.6942234 -4.4796119 -1.6697104 1.7585806 -1.6463798 -0.1053730 -0.1089919 -4.3653550 -2.9509892 2.9734218 -1.8696028 0.1939072 -2.1738658 -3.2555618 -0.5608110 -6.8312988 0.0416553 6.8576412 -3.6908998 4.6695123 0.3123345 -4.4934831 -5.2230153 -0.0063795 -7.2840605 5.4428544 -1.1256207 8.6149015 -7.8382306 1.8743788 -5.4073358 6.2895331 5.0101929 -0.5487089 14.4323654 12.6992693 -3.8008525 1.5182769 -3.0352864 -1.7981997 2.8105378 1.0375179 23.7144165 -4.3696456 10.9481878 -7.8417902 9.8274679 2.2181292 -0.2365675 -9.4270515 24.3712349 15.2033978 -2.7691667 1.2938080 1.0028174 -2.8669040 0.2930016 12.6074553 2.9164891 -5.4308734 -6.8285031 2.6923454 10.6446724 -2.0023775 4.1879449 0.4133082 4.1821117 -0.8838562 11.7044611 42.8320961 -11.4838047 10.3226213 -1.3152546 -2.3337667 10.0843496 7.4705200 12.1107473 0.6740051 -2.1126387 -1.0399405 2.8980019 -4.8890214 2.6164646 -1.5616531 -6.2499380 7.4688721 -2.3142838 6.3715892 3.9746723 13.1559324 -5.0127645 0.6028842 5.8844142 11.6976290 -2.1007364 -30.4762478 6.8973460 0.2027316 -3.3230572 -1.6591482 -3.1975114 -2.9443772 3.4328651 5.1245298 13.7567816 3.6325483 6.2763062 -0.6516877 -1.1493342 -4.6635947 -5.7650199 -15.3170156 -3.3929050 -3.1587822 3.1588569 51.0309906 -2.5957158 -2.5677876 -2.1079454 -6.3947320 18.1832333 -2.7533317 -0.6155345 -5.8510337 0.4518888 10.2981024 1.4687036 14.1846924 -5.9090881 -4.1230736 -5.9306216 6.9689207 -2.9653471 5.5280628 2.2528822 0.3225003 -5.0176716 8.9688253 -12.1838036 0.2563230 -7.4530239 -6.3755827 -0.2441551 4.7769327 -8.3757362 16.1270695 -6.5861359 6.6819358 -2.7232847 -7.7020640 -1.1285352 -0.3731913 -10.4355793 6.1203847 -2.5010617 11.7800493 -12.7481966 1.9189363 -8.7672539 8.4964275 5.8647633 -7.3107862 19.9248791 3.6453292 -5.9638367 2.6334105 -2.3284326 -0.4520768 5.4020081 4.6114049 38.4845695 -6.9739881 15.9307909 -10.3795481 16.3695431 2.9549360 0.5393133 -15.8094540 25.4211121 20.0959492 -4.8132849 3.5556831 1.3759110 -4.3441038 1.1943367 17.6024513 3.6799588 -7.0921240 -12.0126133 2.6551971 14.8591909 -3.3406124 5.6329112 -0.8366563 6.2632127 -2.3129258 20.4812298 62.7493057 -12.0369587 17.6132507 -6.0231385 -3.9978349 17.0000515 9.4175978 13.3026247 -1.0166987 -1.5769432 -1.0561203 3.3102593 -6.0335560 4.4528551 -1.5600170 -8.8044071 9.6568346 -4.4505825 11.7620707 7.2033887 19.4966869 -7.1432776 0.9274899 7.5829377 13.5247068 -4.4933176 7.6279764 10.7748213 0.2174995 -3.9509904 0.2306953 -4.6094584 -5.3132586 4.1642265 6.5553908 21.5500412 5.7642303 10.0403461 -1.5142924 -2.7950728 -5.8473845 -8.6622553 -19.8388062 -9.6868372 -3.5358188 3.3756094 77.4178696 -4.1942687 -5.2465587 -2.4924266 -10.4064398 28.5986233 -4.0420656 -1.0720447 -8.9465561 0.0884846 13.9430065 3.2917292 18.6033630 -29.9884167 -5.4561987 -5.8319049 0.0252781 -6.9617362 8.0471277 3.2197917 1.6927160 -8.2080660 5.2223811 -16.7145920 -0.1988565 -7.4479632 -9.5720339 -1.3805641 3.9041500 -1.2195400 20.8841171 -13.9728413 9.5250320 -1.4623140 -4.6886482 -3.0838978 -1.4185238 -5.8770990 0.2766777 -2.0999892 6.6556249 -9.0729151 -0.0485620 -6.3824062 3.1364284 3.1246276 -22.8894653 9.9616117 -9.9502602 -3.0134916 3.4347610 -5.7718949 2.4405382 5.5288167 5.6699929 28.3469715 -4.9600258 10.5273647 -5.3465114 14.1706095 1.4391682 1.9440749 -12.5893373 8.7498274 6.6658359 -5.7601247 4.8908601 0.9482250 -3.6482263 2.1954963 10.8322620 0.8956522 -4.3955283 -6.9626827 1.6948663 9.4953728 -2.5964315 1.9993786 -2.8270504 3.7912412 -2.0623651 14.3442326 36.6312180 -2.6834660 14.7897511 -16.4491463 -4.0012894 12.9022093 9.1633387 2.4591439 -6.4847775 2.4550993 1.0140636 1.2020972 -1.8203999 2.8480318 0.2589513 -5.1434579 1.3569673 -7.0957456 9.8818207 3.9442225 12.1185074 -1.2830762 -0.1497974 1.8301615 4.2707372 -7.1602840 12.2560987 7.0387092 -0.3998351 -0.8555510 0.5756602 -3.9671738 -6.1034694 1.0730268 3.2912776 16.1573334 4.0494328 7.4393902 -1.4633219 -4.7869415 -3.5574946 -5.4253793 -11.6252012 -14.7053308 -1.4845729 0.2249212 53.0369301 -4.2698612 -3.8871429 -1.5171165 -10.3758373 21.0548038 -3.3039060 -0.8737190 -6.1078897 -0.4975599 8.4517527 3.8899155 13.1278172 -9.3111296 -2.4904799 -0.0087752 -8.5218945 -11.4484730 -0.1684063 2.0368955 1.9150038 -5.4004335 -4.9951982 -7.4299645 0.3398183 6.5535202 -7.4998860 -1.6091837 5.0124364 -13.4120884 11.7120199 -16.7166729 5.1061535 0.9637691 -8.8034945 -0.9001502 2.8608782 -1.6711501 0.9323255 -2.2280188 4.7731504 -4.3718843 0.4821924 -2.2863667 1.1292619 -0.4055356 0.9726056 6.4165483 -16.9972095 -6.1538320 -0.9883935 0.2383381 0.0195687 -0.6745758 0.8172948 14.2199831 -2.1781054 5.9721403 1.9732521 7.8312044 1.1227102 -0.6269273 -4.8851271 2.7403138 -21.8500099 -1.0026538 1.0176237 -1.2543093 -0.6234754 -0.4939395 5.5198951 1.2869415 -1.8454813 -2.6816781 -0.1851612 5.2676120 -0.4999000 2.0024102 0.2678452 1.4815695 0.4404668 6.9098334 23.9225502 -2.0093424 -9.2659740 -0.2083407 -0.3988977 5.5921769 2.7201033 -1.8746514 -0.0898853 -2.3501351 -3.2578139 -0.4190765 -1.7034243 1.2291355 -2.3059011 -2.2472277 -2.8663597 -0.9015536 4.0165229 3.3394194 7.2962179 -0.3156695 0.0159978 2.2691431 -0.2215452 -0.5401855 -1.2806808 3.9634185 -1.1482781 0.6924837 4.3094645 -1.8438840 -1.0293058 1.5987924 1.8802108 7.3315573 2.6595185 3.0203168 -0.3785461 -6.4321318 -1.5308059 -3.0910630 -3.2538905 -2.1652884 -2.9576826 -0.8325364 25.7636395 -1.3705922 -0.7441328 -0.3873026 -4.3929482 9.4049559 -1.7482668 2.1757805 -3.0501382 0.3057210 5.8161983 1.5120701 3.0393782 -16.6058922 -4.1295781 -1.4564308 -0.7554367 -1.4179624 -0.3641400 -0.0929941 -3.7227623 -2.8517995 -4.3498993 0.2370433 -0.8908750 -2.1709461 -2.5909472 -0.4354589 -9.5058794 1.2263438 -0.8490450 -2.5064130 4.7860579 -0.2157575 -3.3459747 -6.3381114 1.7561089 -6.4921713 3.8476021 -1.7122620 8.2873516 -7.4839110 2.2492316 -4.9460263 5.6738243 2.4836340 3.3362293 13.1302414 13.8677902 -4.7907262 -3.3968873 -3.5870805 -2.2899940 1.5463480 2.0400889 22.8863354 -4.3583832 11.1526890 -5.5144234 10.2417583 2.1201272 -0.7679791 -7.9745221 -3.3673556 -4.1526418 -1.2224495 -0.0698938 -1.0684880 -2.5016868 0.2884829 12.0097504 2.1788213 -3.8456609 -5.5338759 0.5048572 9.1172018 -2.1849997 4.6737986 0.2761035 3.6819763 -2.7953289 10.1600800 41.8867607 -14.9755020 10.8340101 3.0638800 -1.3870850 10.5031748 7.4175887 3.2916250 0.2027125 -3.9812181 -3.7978508 2.0925393 -4.9406562 2.1135619 -1.4183517 -6.5491371 4.9438515 -1.1894315 6.3671637 4.2716584 13.6137152 -4.0285120 1.0363806 6.6383758 10.8314199 -0.6971815 -0.8490533 5.6707520 0.5912542 -2.4177210 -3.4436023 -2.7124348 -0.1175708 3.8602574 3.0531962 13.2604418 3.3657455 7.4392061 -0.2591628 2.8071077 -3.3061585 -6.6938052 -12.8865271 -0.5959612 -2.7364573 0.8761483 50.6529388 -3.0086269 -1.8710874 -3.4194796 -2.3591778 14.9200592 -2.4367046 2.0630450 -5.3837714 0.5368130 9.5874519 2.1379259 9.2766457 -10.9760752 -7.7120366 -6.5865355 11.6359606 -3.9074330 0.8610960 1.4535513 0.1011705 -5.3039336 1.8151770 -6.4196053 -0.7265763 -2.8846407 -5.5346889 -0.4689498 5.0638609 6.4973235 7.0720844 -4.1961713 6.4075842 -4.2181392 -5.5998478 -7.4232593 4.2493863 -9.0843611 4.3114858 -2.3531411 11.9902620 -11.4356194 2.7010767 -7.6565051 7.8831878 3.0099943 -1.1313771 18.6503105 9.2266512 -6.4622579 -0.4768752 -5.5001087 -0.8718547 3.1650572 4.1526847 37.8477440 -7.1081781 16.3957539 -10.6014233 17.2631245 2.7602446 -0.3351554 -12.9353256 24.2547779 8.0577250 -2.9841232 2.6219320 0.0406084 -3.9551332 0.6002123 17.3608932 2.4001844 -5.9752021 -10.7011290 0.6224771 14.1683521 -2.9565184 6.6237893 -0.3385400 5.3102765 -7.0439138 18.7127132 64.0362625 -15.3458996 18.6595764 1.6852176 -2.8404417 16.8389778 10.1633530 3.5703454 -1.3069203 -2.8026128 -2.6795595 2.7462845 -5.9164414 4.0419960 -1.7643467 -9.2742863 6.6830101 -2.6612208 11.7768307 6.7418742 20.2254467 -5.3350191 0.9202383 8.6711483 13.7155361 -1.3891566 13.9290829 9.2007389 0.3324907 -3.7435086 -3.2587442 -4.5756311 -3.0053458 5.3261538 4.1851554 21.1529045 5.5835519 10.7646236 -1.3940043 2.3493147 -5.0177941 -9.5635872 -16.2842941 -7.9633121 -3.1764920 1.4816476 76.6763458 -5.2341213 -3.7497644 -4.1874337 -5.9219761 24.2272472 -4.1857095 4.8050385 -8.6976528 0.3480454 13.9495544 3.0316253 15.3037224 -32.2681389 -8.8642235 -7.0788646 6.1174788 -8.7859182 1.0450931 2.1835766 1.0760581 -7.9934182 -30.4195290 -14.5496655 -1.0315934 -2.4081192 -8.2210321 -1.6634363 6.9494004 8.7890415 8.7672186 -8.6520061 8.7594767 -3.4106188 -4.6961951 -0.9698025 4.9458666 -5.3599038 0.6955560 -2.2155666 6.0201993 -7.9232740 0.3097970 -6.3375902 3.4659147 2.2286954 -36.9956284 10.5566473 -16.1667767 -3.0224094 3.0172198 -6.3863387 3.0511198 4.7722979 5.7768469 29.0534687 -5.8816576 11.1232309 -3.5851622 17.3107777 1.2767190 1.7146581 -12.9890833 -87.3423157 7.9717584 -4.8492360 5.0604649 1.3420947 -3.6105864 1.9056534 10.7620525 1.0712065 -3.5231106 -6.5687904 1.2990521 9.2837982 -2.0614557 2.8706682 -3.4993041 3.5611989 0.1141464 16.0560856 38.7345581 -3.1530688 15.2961979 -13.6728954 -4.0466280 12.2983313 6.9046183 6.3517976 -9.3367195 1.3751372 0.2511291 0.8874688 -1.2117107 3.0496240 -0.2624384 -5.1640792 1.4384190 -6.8612061 8.4713697 4.8549938 12.3889809 -0.4594173 -0.3590436 2.4867122 3.6095989 -6.0745511 13.7232590 7.4033604 -0.3866396 -0.8085165 0.5372421 -3.9472570 -6.4105086 2.2818661 3.3417184 16.5057545 4.3778067 7.7118626 -1.5123258 -3.3766704 -2.6558745 -5.5173864 -7.7491851 -20.3173447 -1.9657031 0.5298780 53.7792778 -4.5676050 -3.9570284 -0.9324527 -8.9452515 20.7276268 -3.5451400 5.1880941 -6.0181866 -0.6758341 7.3478084 3.9870687 14.3838425 -4.5702271 -2.4179366 1.0831062 -7.0672269 -10.0740900 -0.1299147 1.0816295 1.6808176 -5.5358315 2.2552629 -7.9138393 -0.1978966 5.6295142 -7.4856329 -2.3655441 -4.8411789 7.7225466 12.1760235 -14.4940901 5.6084571 0.5908015 -7.8985877 0.5029087 1.7080981 -1.9515049 0.7189558 -2.4451556 3.8924813 -4.0488820 0.9723563 -2.7264864 1.5001678 0.4733633 2.3658113 4.2333941 -13.5150185 -3.8012683 0.4157159 0.4011807 -0.3934639 -0.5816113 1.4359411 12.5988436 -2.8300605 6.5877805 0.3948104 5.4248462 1.0377269 -0.6869968 -4.7961478 -42.7797127 -22.8570080 -0.8410352 0.5615556 1.3427650 -1.7037539 0.4447518 5.9484673 1.0217216 -1.8874755 -2.6363056 0.4715791 4.0094857 -1.0449411 1.6864728 -0.3122077 1.4209623 -0.9584880 5.9802599 16.3391399 -3.2526550 -10.9949827 -0.1891957 -0.8574650 6.2800488 3.6027894 -2.0550761 -1.2395988 -0.0262119 -0.8560552 -0.3999693 -1.7522932 1.3687208 -1.4630220 -1.6602609 -1.1059055 -0.7298306 3.5676930 2.8031895 5.9628963 -0.1349176 -0.1061115 1.3990629 0.3164342 -0.1649208 -14.9073515 3.4214656 -0.8779837 0.2400389 4.6293755 -1.9259064 -0.8617805 1.5074855 1.9292276 7.9140348 2.3360322 3.0620620 0.1127502 -6.7838178 -1.3738579 -3.6062262 -2.4398534 -0.7000112 -2.6771591 -0.6763660 22.7153969 -2.2424710 -0.8125319 -0.3316278 -4.4381199 9.6156654 -1.8167207 2.0493090 -3.3176527 0.2409423 4.1127625 2.1424506 2.6109521 -10.3476324 -3.0131931 -1.2139320 0.3189837 -1.2281195 -1.0809495 0.6362654 -1.4324677 -3.3275235 -1.3273053 1.5028384 -0.9400329 -0.7405559 -2.6199291 -0.6949096 -4.4117866 1.9715592 0.7812229 -1.1438638 4.2039824 -0.1980412 -3.6976068 -2.8651097 1.7509654 -6.5640569 2.2378993 -0.8913280 7.7550321 -6.9068499 2.5540280 -4.7340765 4.3537183 -0.3191187 4.5985665 10.7346077 8.8033533 -5.7575450 -3.6245334 -4.1173134 -2.4888785 1.0370610 3.1693816 19.4672585 -4.9434805 12.1398067 -5.5781555 8.1413088 2.1087627 -1.1884527 -5.9982314 -7.2558951 -2.7573965 -1.0194000 -0.8425922 0.5378863 -2.6407483 1.4890251 10.2487020 1.0420929 -4.0143695 -5.6201425 1.0506757 6.1357431 -2.3195429 4.6181479 0.0837599 3.3001807 1.3804389 9.7430801 38.1750832 -15.4501715 11.1227016 0.0228346 -2.5338399 10.7227707 8.0190172 2.4761038 0.4367548 -3.9965274 -3.7691419 2.2967927 -4.9769049 1.6048921 -1.5083767 -6.8570409 2.8797960 -1.1382400 6.1152101 3.9346490 13.0765953 -3.2346497 1.1202548 6.3246155 10.2166023 -0.4326939 -6.4520988 4.0910664 0.8437780 -2.4372914 -3.1705437 -2.8072908 0.9392806 4.4447894 2.5859540 13.7401304 2.9738390 6.9637766 0.0023151 8.5525084 -3.2308569 -6.8101187 -12.3370218 1.8340346 -1.9987218 0.0341652 49.3586693 -3.4765093 -1.8929937 -4.5433679 1.9049988 15.1239920 -2.4469204 3.6390164 -5.5098515 0.4306482 7.7360740 2.2960577 7.9684482 -12.3290863 -8.0768051 -6.5389347 12.2500591 -4.9856162 -2.9858055 2.1892519 0.6212873 -5.1541686 2.9123898 -1.8109065 -0.2177226 -0.3721769 -5.3022428 0.0731155 -0.7217552 6.4881754 6.2228885 -3.7310538 5.2575135 -5.8435931 -6.2406726 -0.6161743 5.1840639 -8.9516993 2.6298928 -1.8793330 11.5939751 -10.2005539 3.5139997 -7.4510031 6.3082833 -1.6851964 3.3592007 16.4358540 1.2274280 -7.9939051 -1.8760816 -4.5444903 -1.4804424 0.7129353 4.6209302 34.9488144 -7.7912908 17.2796631 -9.5730381 15.8453636 3.1981738 -1.1217538 -11.1797438 -45.5106316 -4.1179023 -2.5223188 1.0196931 0.5530718 -3.2964292 1.9166064 16.0459824 1.7146719 -6.7671027 -9.8385334 1.7882491 12.6175137 -2.4926212 6.9334865 -0.3579419 4.7784443 -3.4384637 19.0307026 62.1249352 -17.2556210 17.8753891 2.3370903 -3.4493797 17.0470333 10.9809923 -23.3645611 -1.5893333 -3.5334852 -3.4966428 3.3528566 -5.8136668 3.2039976 -1.8261610 -10.2667961 4.1283216 -2.3262362 9.2939625 6.1728430 20.4936466 -3.9646339 1.2322612 8.8300447 12.9475546 -1.4831469 14.1456738 7.6145840 0.5178981 -3.3282337 -3.7497106 -4.3462038 -1.2201236 6.6581960 4.1019988 22.2408924 5.3056684 10.2993259 -0.9469098 7.6335015 -5.5457573 -9.7346735 -14.3352413 -2.3371053 -3.0171943 0.4944257 74.9146652 -5.6120071 -3.6001852 -5.3149786 -1.4814260 23.6170959 -3.9026895 6.3389053 -8.7572479 0.4658893 12.2331028 3.1626642 14.1279860 -36.8607025 -10.1068201 -7.9584656 6.5812688 -8.5945625 -6.0969429 2.9761403 1.9322530 -7.9427462 -49.6821327 -4.9800954 -0.4410490 -0.9710294 -7.9835320 -0.1275439 -1.5608822 8.4303589 -5.1839428 -5.8740740 8.2853870 -5.6018434 -3.4428556 1.4925371 8.9927149 -6.1494913 2.6932626 -3.0517933 7.2932134 -6.7671127 2.0599840 -4.9842024 4.5304689 -4.5546050 -13.9206333 10.5009851 -13.0721836 -3.4646678 3.1812286 -1.4465539 3.9577665 6.2168140 6.4887729 27.9523907 -5.2685838 11.4755697 -0.0558813 20.9233761 1.3527148 1.4956515 -11.6409073 -53.4156227 -21.9747753 -3.5798233 5.2606955 2.1879623 -1.6912649 1.1425675 11.6808138 -0.7851177 -3.6260548 -6.2129259 2.0610654 10.3827906 -1.6987844 2.9466848 -2.9106793 3.3544443 2.1558151 16.4313717 40.1749077 -4.5706372 14.9535074 -4.6615477 -3.1239221 12.7521696 4.2799683 16.2323437 -4.8954844 1.1997032 0.5084150 0.6493621 -0.3950117 3.6887903 -0.9681193 -5.8958097 2.6150436 -4.7043424 9.5218115 4.7062249 13.0306768 -1.1363838 0.1766404 4.4214211 3.4441717 -4.8384337 -69.8893890 6.9884591 -0.3423516 -0.8748985 -1.9517000 -3.4589214 -2.4736166 4.1441693 3.5855367 16.3400517 3.9531147 7.3535390 -1.1044552 -1.7361599 -3.1022260 -5.9490299 -4.3606663 -11.4155035 -1.0869737 0.1758565 52.4933052 -4.8042698 -3.1907220 -1.6115800 -7.8158650 17.6917496 -3.2547302 8.2921276 -5.8909106 -0.1976350 9.6888466 3.3523355 12.8586626 -8.5373869 -3.3440454 0.7775648 -10.0653667 -9.2182245 -2.3871355 -0.2391395 0.7029727 -5.7735085 -21.9013519 -3.5536487 -0.6166483 1.6635267 -8.4025269 -2.5479655 -0.1221730 3.4908488 -88.6866531 -10.0643120 3.4905953 1.7897813 -3.9918540 0.2729920 3.0990350 -1.4889237 0.0662775 -2.5837705 4.3052769 -3.7683206 0.2673195 -2.4925447 1.8411754 -0.4069436 3.4465921 3.2851179 -15.7406435 -2.8534565 1.3699942 0.2405670 -0.8152555 -0.0409554 1.5002930 10.2536783 -3.5123432 6.2858734 -1.5061529 2.7114384 0.5767542 -0.5965870 -4.4233060 -37.2407341 -22.0453091 -0.7487772 0.3477241 1.2357551 -1.7286179 0.3966447 4.2710533 1.1548259 -1.9655280 -2.6106315 -0.2247473 3.5956814 -1.3130533 1.8590249 0.5286158 1.4437004 0.3629355 5.4644618 15.2417765 -5.0021238 -13.3855238 0.2483232 -0.4434146 6.1696305 3.8946617 -10.5646048 0.1589173 0.2849711 0.2988753 -0.3857245 -2.4975693 1.1562171 -1.1790389 -2.2496755 -1.7849652 -0.4412405 4.8027601 2.5364537 5.9443207 -0.3430216 0.0202241 1.3320422 1.1296638 0.7882594 -31.0380516 2.7688339 -0.8245748 -0.4741322 1.5880674 -2.0108378 -0.9918140 1.7117940 0.9851990 6.8466339 2.0463982 2.4036853 -0.2113843 -6.6999760 -1.3706968 -3.5831740 -2.1666000 1.3597765 -4.1443582 -0.7635300 23.7349548 -2.0051162 -1.1143481 -0.9282175 -4.1348872 7.2213149 -1.8134028 2.6440907 -3.4122031 0.0417442 4.3069706 2.4623568 3.5866220 -9.2191935 -2.8359938 -1.7503326 3.2219408 -1.9928983 -2.6683040 0.8163795 -1.0816178 -2.9063897 -0.1768043 -4.0318494 -0.9375166 -0.5071247 -1.3111023 -0.6690940 -5.7755899 0.7864591 -2.3198769 -0.0479589 4.0575209 -0.1923246 -4.1159635 -2.6614587 3.2329762 -6.9364796 0.6117643 -1.9662118 7.7636776 -6.3453279 2.6433401 -4.4645100 3.6060066 -2.4193115 5.4155798 8.2867975 10.1825609 -5.0248375 -4.9599972 -3.6193120 -3.0590622 1.5726212 4.1181202 16.2959595 -5.7829590 12.9058704 -4.9186606 5.6660624 1.9473346 -2.0131316 -3.4242373 -13.7123327 -1.1437572 -0.9683960 -2.0177226 -0.0481002 -1.9536856 1.6089962 8.7074528 0.4988369 -3.3773093 -6.1236577 1.3553846 2.3214533 -2.2184055 4.5952892 0.6764459 2.6882014 4.3794274 9.3082056 35.4877777 -16.9537373 10.4011564 -2.7222171 -1.7772038 10.1760921 9.2768459 -0.8259513 1.0888160 -4.4094782 -3.9254775 3.0235646 -5.3128576 1.4510359 -1.9813452 -7.2059889 0.8861532 -1.2691900 7.3478432 3.2813561 13.2180166 -2.7265854 1.2500013 5.3867307 10.3160324 -0.0557624 -16.0481644 2.7433171 1.0062529 -2.7933562 -3.9123118 -2.6085105 1.2727187 4.6626005 1.9547378 13.0568895 2.4440892 5.7637138 -0.2198009 10.4724722 -2.4145639 -7.3836465 -11.9228086 5.4955087 -2.3375874 -0.4488787 47.9599800 -3.6904557 -1.9269400 -5.3564730 4.8023076 15.1194696 -2.3711264 5.6303387 -6.1872282 0.3460681 6.8519845 1.9050118 7.2817841 -14.6304626 -9.0106544 -7.2329035 12.6234169 -6.8891902 -5.9168448 3.6576762 -0.6417995 -4.9718328 -0.1493738 -8.7305994 0.1933469 -0.2430533 -4.4411435 1.3118281 -0.0148592 5.4683514 0.7633291 -2.9399908 4.5739989 -7.6701880 -9.0599537 -1.0596850 4.4243298 -9.3261833 2.9578080 -2.9478219 11.7105932 -8.7109690 3.3058112 -7.1114612 5.5555563 -3.9910033 5.4980140 12.9675522 4.8283486 -8.9009600 -2.6647706 -4.2646651 -2.3253646 2.4287574 6.0467448 29.7600994 -8.8841534 18.7088165 -8.5525427 11.6825924 2.9163876 -1.9799399 -8.4213848 -28.1012497 -2.5128913 -2.1106031 -0.1428210 0.3688605 -2.9139068 1.7101214 13.7469759 0.8722752 -5.7510867 -10.2915516 2.4109540 8.7412739 -2.4168618 7.6093307 0.4757348 4.2978702 2.7113631 17.8111496 60.3839149 -18.8872471 16.1903362 0.2675085 -2.9679518 16.3445549 12.4496078 -41.2649727 0.2548149 -3.6537077 -3.0259655 3.3417885 -6.1828747 2.9818995 -2.3753426 -10.4767561 1.5501865 -2.1886663 11.2495623 5.7692623 20.5597363 -3.1542599 1.5199460 8.2823334 13.4276314 -1.1255738 5.7375641 5.5437536 0.6559518 -4.1681771 -6.3637242 -4.1109543 -0.5664170 7.4375591 3.7240746 20.7583961 4.3660793 8.9294310 -0.5800265 8.9412937 -4.6373434 -10.3836470 -13.2862797 2.6632740 -3.1967580 0.2278924 73.7358704 -5.2980614 -3.2389266 -6.4276595 1.7427299 23.4498367 -3.7118106 6.5049477 -9.0236588 0.1511893 11.7159986 2.9040678 13.8407354 -36.1827812 -10.9282780 -8.6056967 3.2097988 -9.5306873 -9.6772213 3.9358404 1.1102583 -7.9408484 -13.5593081 -5.1199045 -0.1142716 -0.3710136 -6.4732327 1.0329925 1.5717556 8.4737663 -5.8051729 -4.5941892 7.0497441 -8.8752489 -4.2230711 2.3126397 7.2777004 -4.8378167 2.6986699 -0.3287556 7.5437045 -6.0199461 1.5542485 -5.7179480 -0.5242663 -6.5947628 -5.9109607 10.7038860 -21.0509129 -5.0970969 1.2621403 -5.0759091 4.5502272 4.1749444 6.6968932 25.5202274 -6.6433625 12.3879738 -8.3580770 21.1144485 1.1407681 -0.1287660 -11.1482124 16.9737377 3.7047169 -3.3982337 5.2293139 1.5188510 -1.8029231 -0.6636891 10.4441605 0.3713217 -4.4675422 -7.0231361 1.0105832 8.6916752 -0.6184214 4.0810103 -2.0097957 2.9993634 -32.0756264 15.9710407 44.9621201 -5.2816582 16.1105309 -0.9816709 -2.7169046 12.8663893 2.8991077 26.6299763 -3.2260315 -0.8213472 -0.6900339 1.0022204 -0.7135390 2.6977355 -0.2609586 -7.6066256 3.0535431 -3.5967374 7.8602762 5.5519981 14.0920248 0.0987488 0.7096568 4.8175397 3.1008437 -4.1509385 5.0009246 7.6927757 0.1559111 -1.0808195 -1.5953263 -2.9490376 -3.2003615 5.0270948 3.6382821 17.1072445 4.0487232 6.6657333 -0.8945019 -3.1931291 -3.0586627 -6.2859435 -1.7901826 -11.8681898 -1.1461544 0.4177000 48.0002441 -5.2181201 -3.6797824 -0.5115361 -6.6454453 18.4477634 -2.7991300 6.8893485 -6.9999781 0.0930507 10.3964596 0.9924031 13.7295513 -8.2005119 -4.2445116 1.5320957 -19.8947773 -6.4182978 -2.9372005 0.7415110 1.9855088 -5.5750093 -28.7968407 -14.2367849 1.1028700 -1.4408560 -6.5784822 -2.5334122 -8.9605179 3.8235390 -87.4326553 -7.7778335 5.2478538 0.4169393 -3.4202182 -0.1088913 3.5761912 -0.9249731 0.8030041 -2.1889472 4.2566776 -3.3951602 1.0098777 -2.5972102 2.6134546 -0.8537084 4.3025656 2.6346002 -19.6905708 -1.0409994 0.2420669 -0.1958816 -0.5817104 0.9926002 1.4357537 8.3401699 -3.9411883 5.9689488 0.3317903 2.1046486 1.1185004 -0.2925074 -3.7598541 -28.3176422 -23.5120125 -0.8729746 0.5800846 -0.0675937 -1.5918573 0.6327153 4.2897429 0.7722000 -2.5978603 -2.1202090 -0.5442995 2.8227174 -1.4218488 2.1741056 0.0161097 1.5955297 0.1053455 5.7846823 14.0137959 -6.9721808 -14.8923388 0.2220721 -0.4753894 6.1384168 4.5358381 -22.3164845 -0.7007895 -0.3863032 -0.5217655 -1.3125167 -1.9278176 1.0743040 -0.7505906 -2.3911161 -4.0280919 -0.6661376 4.2781644 2.1943321 5.8701553 0.3987148 0.0611057 1.5272903 1.6030900 0.2449027 -9.5993938 2.4604981 -0.7989142 -0.3471975 -0.1714818 -1.6861931 -1.4392240 2.0260227 0.6763597 7.1106601 1.3993089 2.3670702 -0.2484886 -6.3551579 -2.0766604 -3.4518256 -0.9298002 1.6280773 -3.6963558 -0.9386626 22.0523853 -2.4362946 -1.0652829 -1.2141414 -1.9859048 2.7290258 -1.6655284 -4.2818131 -3.2141924 0.2480113 3.7946997 3.1131477 3.4151835 -22.4247684 -2.5300748 -2.5985281 2.5124936 -1.6431183 -1.5404294 0.0475518 -2.5944843 -2.9083815 -3.4707556 -3.0918579 -1.3100978 0.1346337 -0.6915568 -1.0865545 -7.9997959 0.9711580 -4.9137554 0.5494484 3.0396059 -0.6590315 -5.8482933 -3.2978342 2.4777222 -6.2576079 -0.5825003 -1.4264374 7.3048315 -4.9265003 3.3659899 -4.5376678 2.1841910 -6.2868295 5.5249753 5.9514494 8.5237675 -3.6312158 -4.9705844 -3.6883230 -3.3569679 0.0553348 3.7859373 15.4921827 -6.6142507 12.3836012 -6.3121939 4.0802460 2.2367072 -1.7668178 -2.3503060 -20.4081478 -0.3030807 -1.0196898 -2.0840304 -0.4203853 -2.0408916 1.2270545 7.8689842 -0.5093459 -3.7182882 -5.4959011 1.6713361 -0.5302009 -2.4774561 4.7409067 0.6659935 2.4723470 3.7197983 9.1143484 31.8860779 -18.1325436 9.8191748 -3.5914164 -2.9107440 9.8713303 10.4738798 -7.3839250 0.8243388 -4.6338181 -3.7712281 2.2909417 -5.3376555 1.3717355 -2.6397889 -7.3265567 -1.1431198 -1.1711166 7.9694891 3.0829022 13.0953846 -2.2073817 1.0732075 5.4609456 10.5543556 -0.7337456 -11.7911329 1.6006604 1.2484367 -3.1531768 -2.2919204 -2.7346783 1.2625865 5.6801314 1.7850810 12.4597616 0.5881054 5.2849283 -0.0628983 18.6982708 -2.8956223 -7.2725739 -10.0620270 4.1529379 -1.5803267 -1.8664712 49.2326355 -3.6862636 -1.9982009 -5.8815532 12.4700136 13.9953365 -2.3693967 5.3539100 -6.3051105 0.3890676 4.5808358 1.5354090 4.4262743 -11.1616316 -10.5702047 -7.5391774 11.9787865 -6.7919569 -5.5345478 3.9543762 -2.4644914 -4.6956129 -7.7655048 -17.7037354 -0.0315428 0.2277953 -3.7825747 2.0293007 -1.5959046 4.5918727 -8.3910236 -3.0272374 3.0262711 -7.5150304 -15.0180082 -2.0206254 4.1599832 -8.4237232 2.4903741 -2.1487923 11.5159264 -7.1137481 4.2983537 -6.6601448 3.1879857 -8.9617462 6.3606811 9.6818895 9.7854433 -5.3749480 -4.4008570 -3.8898818 -2.5926924 2.9984875 6.1971159 26.3676472 -9.5502958 18.2883530 -7.7077894 9.1035881 3.2962201 -1.9875807 -6.9203405 -25.1983261 1.8481784 -1.9829135 -0.1169634 -0.6384811 -2.7851179 0.9137061 12.8175325 0.1203326 -5.8778586 -8.5190639 3.4850125 4.9116616 -2.5958519 7.9676590 0.5600989 3.7084146 4.6912355 17.0104427 56.1357536 -24.7194500 15.6350002 -2.2857203 -4.4601159 16.2111473 13.6812973 -47.7026520 0.0760703 -3.6729233 -3.2583373 3.1681533 -6.0843821 2.7686207 -3.0368297 -10.8631973 -1.1759785 -2.0244105 12.5636015 5.6555538 20.4654350 -2.3388166 1.6129030 8.3919439 12.4852848 -2.0365076 -1.0984508 4.0596189 0.5977321 -4.3110385 -7.0917978 -4.0695705 0.3634959 8.6230240 3.9226260 19.7812328 1.4163542 8.6245289 -0.2460829 16.8935013 -4.8886828 -10.2595510 -10.8051634 2.0727062 -3.2466869 -1.5225198 75.0378036 -5.2721043 -2.9164088 -7.1021791 9.8115730 20.8737793 -3.6045249 6.5075126 -9.1220474 0.4545376 9.8175507 2.9658592 11.4525681 -42.2163544 -13.6803646 -10.1501989 1.8179917 -8.6073666 -6.2388682 4.0450778 -0.2838308 -7.8060293 -13.2797012 -20.7033501 -0.1984548 0.6049712 -6.1286726 1.7114795 5.7099943 8.1981249 -10.5676346 -4.8878260 5.9187026 -9.3246880 -9.3321180 1.6645840 6.4026899 -5.6331167 3.6687129 -0.1509843 8.5634928 -5.5479760 0.5697709 -5.8961630 -0.2128191 -6.5218029 -1.3773588 7.9336448 -12.5035849 -3.5936451 -2.4237642 -10.0475769 4.1175671 2.6715817 6.2910280 26.7553959 -6.8091969 12.9960375 -1.0534029 22.6194553 2.2667348 0.3872753 -8.6241055 -0.7705556 -5.6486630 -2.7706137 4.4052110 2.4563906 -1.7666001 -0.6035878 9.1747856 -0.4926849 -7.4733829 -6.0575309 1.3252281 9.0244741 0.1174176 5.2292800 -0.1332509 2.5067556 0.4533036 15.5899353 47.9909019 -8.0397339 16.0665531 2.2029159 -4.0904217 10.3392019 4.5658188 -1.7664312 -2.7612655 -7.7247591 -5.2434487 -0.7187258 -0.3957932 2.4379694 -1.2009770 -5.2574921 1.1766995 -2.8687987 5.3237853 5.2838378 14.3765106 0.2141583 0.1410396 4.1480317 2.3864119 -2.8390653 -16.0553303 6.2286220 -0.5710417 -1.0723737 0.4495161 -3.3381605 -2.8829432 5.4586124 2.7235858 16.2213669 4.1356716 6.6758375 -1.9792249 -3.8896716 -6.8700438 -6.2423644 -2.6165714 -8.2059250 -3.2782841 1.6245340 46.9642220 -4.7729983 -4.1618047 -1.1533786 -5.1493554 17.9191551 -3.1523888 7.3163519 -6.5883851 0.9612819 10.2504368 1.2231302 11.9713488 -10.0233526 -2.5824242 1.2866927 -9.6412287 -4.4106140 -4.5183201 0.7072999 0.6080089 -4.8675437 -17.3794975 2.8891585 0.1791140 1.2422501 -4.9407821 -1.4794159 -2.5692632 2.7665758 -65.3892136 -4.8282413 5.9551396 -2.4884212 -2.1470850 0.0559659 5.1245966 -1.4955130 0.7411591 -1.9687412 4.9003658 -3.5809841 3.1938672 -2.0750206 2.4546556 -1.6960350 4.3204703 1.4971955 -25.6092415 -0.0190584 0.5472362 -1.1528913 -0.9926005 1.0342852 1.7808696 5.9580183 -4.1319537 5.6114469 1.1370262 2.3159461 1.2044934 -0.3265280 -5.6924200 -19.1681519 -25.5934811 -0.9474821 0.1293993 0.9356301 -1.9887326 0.8366807 6.5419917 0.8921875 -2.1711283 -1.8343651 -0.3926918 1.1150448 -1.5420840 3.2423289 0.6857339 1.3682666 -0.1149964 5.6344261 12.4338446 -9.3517666 -15.0946970 1.2346497 -0.3923098 5.5262251 5.4741969 -24.7132912 -1.3217740 -0.5805463 -0.5735142 0.2042028 -1.9407429 1.0459061 -0.7335022 -2.6757967 -3.8243871 -0.4866166 4.5055799 2.1738186 5.2226367 1.1175402 0.1694868 1.6110569 1.5725095 0.4061997 -33.9076729 1.7825657 -0.9478652 -0.2254870 -2.5331113 -1.5986477 -0.7351317 1.6926836 0.2474060 7.1549025 0.2287140 2.4238081 -0.8152148 -3.6216011 -1.5515748 -3.4247084 0.0141953 4.7080359 -3.1243248 -0.9359649 20.2892056 -3.2255387 -1.0940213 -1.6126542 4.9224367 1.4159331 -1.7279855 -5.7698245 -2.9484677 0.4726068 4.7841725 3.3606071 4.2640820 -9.7213945 -2.6642992 -2.5480907 1.1878855 -1.4858427 -1.0976125 -0.3953157 -2.2988811 -2.7261992 -1.9720644 -2.2154682 -0.8625906 0.1534998 -0.4000879 -1.1040148 -18.5985966 0.8437032 -12.9107332 1.5180771 2.4746668 -0.9839466 -15.0769892 -5.3140383 -0.8219157 -6.9401560 -0.0513733 -0.8961420 7.4033141 -3.3764319 5.6816463 -3.5658398 1.3273754 -12.9637299 5.6814699 2.6009660 20.8724976 -2.6351836 -6.9206161 -4.2831144 -3.7690711 -1.1921345 4.2079754 11.5159311 -6.8348851 11.5781918 -4.9534144 2.3477128 1.8187165 -1.8137335 -1.2243987 -21.7122097 -3.7608380 -0.6460826 -2.4673746 -0.9832888 -2.2551529 1.8545001 8.9373827 -0.9455526 -3.4172335 -6.0149736 1.8124057 -4.9374471 -2.7892537 6.4979415 0.3232604 2.2599218 4.6631436 8.3391247 27.7355194 -20.1406288 8.2628345 -1.2724776 -2.0346076 9.5704441 12.9590530 -13.2051134 -0.3402999 -4.6071062 -4.1286893 4.8343377 -5.5355997 1.6030010 -2.5051117 -7.5774541 -1.6068627 -0.4767253 7.0624518 4.0807838 12.7842722 -0.9478663 2.2195272 5.7895632 10.5125599 0.1262994 -13.7466764 0.2607625 0.8221363 -2.5570579 -5.2452674 -1.6507028 1.7518874 6.5975466 1.2961435 11.3244820 -1.1209871 5.9711289 -1.0452772 17.9578094 -2.5108545 -7.7624588 -10.4888153 10.7301798 -1.5797749 -3.7089691 47.1313705 -4.0044951 -1.1476455 -6.9556456 18.3715935 10.0162449 -1.6394596 2.6778557 -5.9909620 0.7688593 3.5252843 2.4608591 0.7255135 -12.8789511 -11.8907385 -8.2025328 13.2753267 -7.2812824 -2.4150929 4.9694748 -3.6980209 -4.9418859 11.3877697 -8.0928364 0.5515468 1.6259242 -6.2848988 3.4773171 10.3417645 5.9430938 -15.7856388 -1.2746292 2.1308901 -7.4343090 -21.1254616 -4.1464214 5.0956168 -8.7833967 2.9141939 -1.1925695 11.5773706 -5.8632116 6.8181081 -5.7784872 3.7074263 -17.0848446 6.9357142 6.7237616 -8.0198555 -3.8833654 -9.8102465 -4.9299059 -3.2318773 2.7137706 7.2100782 20.2452335 -10.2971897 17.5276852 -4.0906453 7.2992778 2.8317044 -2.3104889 -5.6923642 -11.5422821 2.7564008 -1.3529841 -0.9027936 -2.1597819 -3.0397701 1.2163355 13.8005600 -0.6108411 -5.1893101 -8.1715670 3.0806398 1.8345946 -2.9243975 9.6334982 0.2558816 3.5814066 5.0627055 15.2364855 49.6212540 -32.5920258 15.2695513 -0.8158596 -3.4456077 15.4556580 16.3945675 -56.9816856 -0.8932192 -4.2217770 -5.3959427 4.4350638 -6.2875586 2.8844392 -3.2429016 -11.7666817 -2.4129601 -1.4483675 11.9090347 6.5344553 20.0797386 -0.6517736 2.6190634 8.1109543 14.2361536 -1.2480301 -5.3076615 2.7210605 0.2603065 -3.4987555 -8.2763176 -3.1199813 1.0193522 9.2642431 2.9129863 18.7718582 -0.9186016 8.6268988 -1.0850285 15.7260208 -3.9383538 -11.0593834 -10.6272850 8.7800961 -2.1418438 -3.7236257 71.8098297 -5.6462560 -2.1060030 -8.1895971 15.9864340 15.8549051 -2.9062781 9.1625652 -9.0909758 0.7434814 8.6142168 3.6222725 8.0326385 0.2182083 -15.9041500 -11.1681414 8.6304760 -8.4459381 -0.7936436 4.7514992 -0.7503817 -7.6304851 8.3038092 -14.5315886 0.6423233 2.2313426 -8.3822155 3.1379788 -10.3835707 10.6114864 -12.6390038 -2.9996202 4.1760325 -8.6998005 -5.6109953 0.2759884 1.9111487 -6.0952873 5.4350939 -1.2725166 8.3967905 -4.9226618 1.3221017 -4.0275636 3.1350048 -7.4069614 0.7820410 8.0375061 -5.3170304 -0.2656879 -9.2772608 -1.8657682 3.3310595 2.0496941 5.7130165 29.8386288 -6.8792310 12.4269447 4.9890833 21.3262959 2.6915166 -0.5686933 -8.9787340 25.0608788 -16.9494019 -2.5818696 3.6803105 -1.0650635 -0.1310930 0.5630622 9.5558825 2.4017279 -4.9709678 -5.2156768 1.9596504 8.7598600 1.3953881 5.1552844 0.3685195 2.7352898 0.6803024 16.4430828 44.2417259 -14.9069872 16.9389343 3.2134871 -3.1007507 10.6428099 5.3699408 -1.3937678 -2.2353866 -16.4706097 -4.1860180 0.2111597 -2.4747169 2.1093400 -1.5930035 -6.1837049 0.3386787 -2.7706037 6.8708835 4.6818318 16.6120529 0.2050436 0.3893435 3.7396402 1.7121660 -3.2472351 23.4536228 6.3334122 -0.9235889 -2.7103114 -5.5280018 -2.9332759 -3.9344113 5.6413016 4.3843184 17.0443096 2.7778807 5.8998661 -0.2044346 -5.0811067 -4.0783691 -6.0927124 -0.5636789 -7.0234632 -4.0111089 2.5151234 47.4022331 -4.3056355 -1.6772227 -0.3694927 -4.0309482 17.9301491 -3.0391533 1.5551275 -6.1927643 0.6987736 9.9516792 1.1099083 13.4966965 -0.9240816 1.4818132 -0.0842053 -20.4770012 -3.2977109 -7.2589140 1.4560601 4.6162491 -6.5462899 -12.5739393 -3.6104307 0.2396142 0.3156420 -3.9698322 -1.5775578 20.6143932 5.5158505 -24.1391945 -2.6012943 8.3088741 -4.6290083 -1.8732284 0.9001651 10.1025486 -0.2929163 1.9352901 -2.9984198 2.5956078 -2.7429390 1.5887640 -1.9088455 1.9655404 -3.6964777 1.9628090 0.5397721 -28.5840111 -0.4996994 -3.4800105 -0.2733633 -0.6348267 -3.2347639 -0.0286679 5.1540132 -3.1373696 5.7944045 0.6104020 2.4699361 1.2927001 -0.4923815 -5.0979624 -16.1232243 -24.6202927 -0.5751446 -0.0391220 -0.8627283 -1.5291445 -0.1324965 3.6252377 1.1718253 -1.0849698 -1.6701962 0.6183007 -1.3865397 -1.0907331 3.6314714 0.0684223 1.0430057 -0.2383078 6.8579888 19.7904587 -10.1181097 -16.9672203 1.2109267 -1.0620683 5.0278616 4.4365797 -1.2699949 -0.9446784 -3.4462240 -4.1711106 -1.0390716 -1.2375386 1.2374564 -2.0659974 -2.1807587 -2.2089047 -0.6041631 2.3834202 2.6876633 5.1787763 0.0371481 0.3254789 0.4022985 2.0525930 0.1968338 -4.1183028 2.2455602 -0.2662291 -0.1762005 -7.3962407 -1.5277369 -0.9682363 1.3454088 0.6566546 7.3966951 0.3496688 2.4114778 -0.0638839 -0.3076472 -0.6950737 -3.6900225 -0.2207812 -0.2748933 -2.2804482 -0.3709318 23.1939526 -1.6783450 -0.4359727 -0.7321223 -1.4227513 4.5667648 -1.3856329 4.2088480 -1.8836871 0.4481944 1.7621046 2.0192187 7.6629686 -1.5193526 -2.7017949 -2.9737482 -4.1762643 -1.2512527 -1.9855602 -0.6602684 -1.9847348 -2.8067081 -2.4222922 -3.5946209 -1.1275063 3.1805713 -0.8503308 -1.5333639 -21.4656258 -2.3765788 -40.4920654 -0.9886943 2.9523218 -0.7943478 -3.6085773 -4.0702419 3.5876172 -5.7423778 3.5293660 -1.9404045 3.8332481 -5.0712452 2.7001271 -3.8318610 3.4586954 -10.7325678 2.7270527 -0.1442594 4.6442828 -1.8986382 -3.8267906 -2.3352451 0.7067235 -0.2163201 6.6145759 12.1643791 -6.4532537 10.4698277 -10.4524307 -4.2303824 0.2753431 2.1420953 -8.1427107 -5.4814367 -5.4398479 -1.7900871 -1.0020117 -0.2594347 -0.8060778 0.4241962 1.6012982 -2.0215428 -3.8673766 -2.9004824 -1.0568767 -10.9229040 -1.0832778 5.8179693 -0.2657568 1.7645323 -5.9290762 12.5162678 41.4826927 -10.3449001 13.0774088 6.4160171 -3.2389288 9.1902208 6.8434896 -5.6308918 -2.1611907 -1.9392267 -1.8550023 -2.5078235 -2.5543833 1.1643447 -2.3144178 -5.7637296 -2.1441441 -2.1539371 4.5461273 3.8680139 13.4648371 -2.3307526 0.8773156 2.7946467 3.3060303 -4.7641792 -10.1223888 3.8271127 -0.3708827 -2.1146457 -8.0041447 -2.7885244 -1.0414113 2.7407866 -2.2282696 13.4134483 -0.2592394 7.3501549 -1.9803386 -0.9189345 -3.1249032 -7.2409463 -1.9932194 0.9670193 -0.6767112 -0.2151943 43.3089714 -3.1644506 -0.3201601 -2.0705402 -4.5927105 2.5522289 -2.6732893 4.6544452 -3.5093460 -0.0062311 -1.9774824 3.4128454 11.7871151 -13.9360447 -4.0996885 -2.4864619 -7.3958468 -1.5523039 -13.2672968 0.5488143 -3.6393275 -5.6074347 4.2639899 -0.9383058 -1.3289319 -1.2014928 -6.9950457 -1.9444176 13.3352766 -30.6392956 -4.1106730 -2.0352368 0.7302964 -3.2325692 -5.5555758 -11.0847416 13.2133818 -7.3869252 5.6381941 -2.5060215 5.2697449 -8.3407784 3.4507942 -5.5686955 1.9431683 -14.7951288 3.7989528 -2.9517949 3.3201282 0.9379412 -11.8169174 -2.6489065 0.9435409 4.5403256 10.0495481 22.1743374 -9.4704332 16.4110126 -17.3139057 -6.7878599 1.5293615 1.3337615 -11.8908710 -0.3291048 -8.0943031 -2.1285248 0.0635512 -3.3712540 -1.7859023 1.0082352 3.5976684 -1.8140843 -6.3630166 -4.3298907 -3.6469228 0.3368696 -1.8717633 9.3484278 -0.3836910 2.6207337 -6.6986957 15.4878311 63.7827606 -15.5218563 18.9446011 9.9596024 -4.4583058 14.3775787 9.8138914 -14.4549408 -2.8664429 -6.8788714 -4.9616861 -3.8812375 -4.2598028 2.2282679 -2.8462572 -9.5160170 -1.5781378 -3.3873181 8.3607988 6.5682859 19.7494030 -2.9114323 1.5843465 2.9278607 5.5541725 -5.3484368 -6.6062365 5.5749388 -0.8972028 -2.7861867 -2.7312014 -3.8611994 -2.3649817 3.9776621 -5.3925128 19.7978420 -0.3678195 9.3383036 -2.3019938 -3.1264882 -5.1714883 -11.0911341 -1.6033531 -0.5569352 -1.6045351 -0.1459378 66.9898300 -4.8642802 -0.8560513 -3.5144131 -6.3439894 13.4834490 -3.7445078 2.2824445 -5.4091072 0.3004996 -1.5879283 2.4132729 17.9687881 -0.1234260 -6.3783360 -5.7907991 -16.3644733 -2.7502787 -9.9505672 1.1374068 -8.2439232 -8.3896408 4.3259864 -8.0837879 -1.8138769 -1.1586378 -8.4412909 -2.4315639 0.3968027 -41.6803284 -2.0422969 -3.2400908 2.7382364 -3.5059147 -8.3997450 -12.5852499 4.2447414 -2.5698009 -0.0265994 -1.0596571 -0.5089573 -2.1605520 2.2916195 -3.6396327 9.5772858 -4.0756588 -1.9653122 -0.3587732 -0.0311914 -5.3402534 3.3975191 -0.5823929 -5.2934318 -6.7971759 3.8321767 -3.7629957 -7.7067904 13.3835983 0.1767389 9.5576315 3.1931434 -5.6725688 -6.3021264 -0.2401990 2.8578320 -0.7739515 -5.3916149 15.6139917 -1.1696142 -0.4066156 5.4271655 3.5914376 -2.1574147 -4.5509963 -9.4704704 -7.9732738 -2.2854147 5.8110299 0.6849070 -0.0216772 -4.0129905 9.4450588 30.0058899 3.3079023 2.6353991 0.4783892 -6.3628616 9.9004593 5.4996166 3.3754468 -2.3884156 4.5367084 -7.7751250 -6.9489622 4.1273441 2.7486880 -3.0951149 -1.2627559 7.3206382 -3.6045721 7.0646620 8.3081493 13.9562798 -4.8432636 -0.2854652 0.8924356 11.1231833 1.1297028 -0.6951975 2.9325380 -0.6458603 -9.8092480 3.5340629 -3.0238039 -8.9998989 5.7205691 0.8973078 10.7879601 -0.1636412 6.5967808 -1.3663629 -4.6942482 -0.8675548 -13.1922569 0.1606613 -4.1553650 -1.9135563 -0.5430227 22.0810719 -1.1677281 -2.6798172 0.5417444 -2.0716190 10.5237808 -2.7188687 -0.1569049 0.5754927 -0.8971524 -6.4406385 3.9516411 7.7202539 0.1604994 -9.7762699 -11.5665770 -0.7542631 -3.9423773 13.2543888 -0.5498251 0.7910427 -5.9286942 0.6709729 2.9512100 -7.9596801 0.7870285 -2.9438617 -1.3001710 3.3737657 5.4747872 -6.7013021 -6.2130456 6.9200792 -0.8059530 -2.2430930 -1.2577213 11.5636930 -0.5794346 1.4703951 -2.0758021 2.0711348 -2.4796979 1.8196489 -1.6792766 2.0731990 -2.9082890 2.2438331 0.3512698 -14.8636274 0.5816505 -1.1010945 -0.4043564 -0.5308276 -4.7543836 -0.5556169 3.1737869 -2.8570993 5.0009551 1.9726323 7.4873481 1.4603742 -0.3442898 -3.9848807 -21.6721458 -23.3815422 -0.7237315 -0.0431070 -1.5304499 -1.0074203 0.1483018 3.7253981 0.3756124 -1.1410704 -0.8599164 -0.2317571 -3.6833303 -0.9598491 3.6856937 -0.2208006 0.8450605 -0.3532467 6.8757043 18.4747658 -10.0545855 -12.4754868 1.8591832 -1.3372400 4.9319868 3.5845642 -0.0313474 -1.3117386 -2.7137160 -2.3651779 -1.3592454 -1.1470594 1.1807699 -2.2336316 -2.3840151 -2.8595173 -0.8696254 1.2924733 2.3449488 5.4099603 -0.4249428 0.3384747 0.2186010 1.0471010 0.0575379 -1.6784992 2.4029250 -0.0492595 -0.5952669 -11.1918592 -1.4650509 -1.3261746 0.9472587 0.1192525 7.5705495 0.3489651 2.3018508 -0.0754922 -0.5655792 -0.5630406 -3.5647833 0.4921298 -0.5268422 -1.6728836 -0.5634927 22.9730892 -1.6006371 -0.1041385 -0.4364868 -1.7025868 3.9694221 -1.2943439 6.2875476 -0.5284426 0.5811709 2.3811653 2.1318853 7.7388616 -8.3061056 -2.2509546 -1.6961998 -1.6081696 -0.6332359 -2.5903518 -0.4434982 -3.3758967 -2.6468480 -1.4005699 -1.8706387 -0.9582453 3.2908535 -1.1415015 -1.1744362 -7.9291267 4.8120413 -38.0900497 -0.6001484 2.1949093 -0.4160816 -5.6846390 -1.7479297 3.9831667 -5.1727457 2.9069657 -3.1973462 2.8851814 -4.6731672 2.8170376 -3.5175021 2.7716627 -13.2280855 3.2935388 -2.2373590 17.9130421 1.1062431 -4.4021678 -2.6978800 0.2368075 -2.3070195 6.2190561 9.7504196 -5.9746580 7.9833021 2.0897415 -4.5022354 1.1463656 0.1231916 -6.7954788 -24.9376030 -13.4427032 -2.4703722 -0.4465587 -0.7818366 -0.9080602 1.0481174 3.8105042 -0.9158306 -2.7766435 -3.2956436 -1.4590929 -16.5139561 -1.3491745 5.7400775 -0.2051430 2.0294819 -7.6258726 10.3870716 36.8404388 -16.0613651 14.4138031 5.9002323 -1.5488875 9.9028988 6.9005499 -13.4914522 -2.2085500 -2.9957199 -1.8219749 -1.6205620 -3.1832318 1.0089649 -2.7795696 -6.8120341 -1.7327622 -2.8462646 5.0130830 3.9884462 12.8678036 -1.6877617 0.9736657 1.0177873 8.0339499 -2.8162494 -29.1759090 2.7279088 -0.0767428 -1.5912013 -11.5879936 -2.5494273 -4.1874423 1.3258992 -2.0687435 13.6140270 0.1532987 4.7606530 -2.1115215 -4.2155704 -1.5445294 -7.0401320 -0.1877420 -0.6915261 -3.7719545 -1.3089827 44.8042946 -2.7243156 -0.2526899 -2.4742947 -3.6712735 5.1685247 -2.3843036 6.1418839 -0.8863492 0.4314127 0.4637042 1.6117262 14.4088383 -13.0854921 -4.5120587 -1.6971259 -1.2513494 -2.5682902 -4.1092510 1.0201334 -8.9278336 -5.1764059 -6.6449494 0.8319324 -0.4160410 2.9223645 -5.0234232 -1.6370437 -14.5904293 8.5142603 -4.9986620 -1.5083413 0.9719008 -3.5250194 -11.5759916 -2.0945816 -5.3144760 -7.2277336 4.6830468 -4.4748631 4.8072200 -6.8472257 4.6930475 -4.9936881 5.2193394 -16.3370361 4.4006920 -1.4822800 -6.2319469 3.1027770 -1.0949304 -3.9648974 0.8680540 -1.1909879 6.6390896 -8.7116880 -9.2153778 13.0952682 3.8540766 -13.0319805 1.8371952 0.5272172 -10.2551870 -1.7627722 -20.7873001 -3.4746022 0.9094021 -2.7227762 -1.1772726 1.2852006 4.6565924 -3.0713792 -3.8689752 -3.7213147 -4.1600938 -2.0241888 -1.4638542 9.0632963 -0.7675446 3.0004370 -10.0249052 15.3788605 61.4850006 -22.3419743 18.2891617 11.4297915 -3.3366346 15.7347946 10.1103516 -24.2754898 -3.8364422 -2.2498424 -2.9950373 -3.7108326 -4.4277701 1.9390937 -2.9644678 -9.0939083 -1.9664795 -3.8367059 5.6292949 6.4116063 19.1910381 -2.5752764 1.6648229 1.9173844 10.8469772 -3.7302325 31.4460411 4.9889698 -0.3079365 -3.1574714 -15.7809505 -3.6217675 -5.5356092 3.1040711 -3.2108316 21.4060383 -0.0531033 6.4628325 -3.1912546 -6.2117329 -2.1657884 -10.6878710 0.2467832 -1.8090496 -3.6952090 -1.3440270 68.6443100 -4.3610506 -0.6517488 -2.9632752 -5.1588178 12.7193508 -3.3388264 8.6426973 -1.9264936 0.5339400 1.5446826 1.9701277 21.0912209 -0.6218358 -6.4591012 -4.9220037 -14.7281952 -3.0881565 -3.6078916 1.3442566 -3.1408272 -7.9094906 -7.9387689 -1.6796851 -1.7791268 4.0277143 -6.8196959 -2.5369809 -1.2566520 10.0006914 -11.2003975 -2.6739478 -0.2047223 -4.4665337 -8.6823950 -1.6995100 1.1054507 -2.8155174 -1.0495749 -3.1787686 -1.2263244 0.6804761 2.8468971 -3.5373867 -11.8493338 -8.9423313 -1.4358951 -10.0714674 -1.1527412 -28.9482136 0.5419994 0.6248333 2.6851969 3.4438798 4.9551182 -2.8334777 -7.2044220 10.8056698 -4.5003171 -7.7477589 4.3998446 0.6096453 -5.5327935 -0.1782259 -3.0821366 -0.9112041 1.7550217 -4.6093640 -1.0407276 -3.8486001 6.5235987 0.7803876 -4.9696002 -0.8768778 11.9106779 4.8851819 1.3911324 5.1627312 -0.3667259 2.7736034 6.8467393 5.6028805 29.4539032 6.8193188 13.4360085 0.6139865 -4.4020805 8.8910570 5.0016603 -4.7482481 -0.4034986 -0.9663982 9.2084455 5.2114911 0.0863046 0.8328698 -1.9725657 -6.7461319 1.7608683 -2.5249453 0.8691894 4.5270281 13.9512644 1.1673846 0.8569494 6.7683315 4.2279277 -0.4898622 7.2567530 0.8718684 -1.3299006 -3.3478301 8.4361916 -2.6033821 -7.2975502 8.8285913 -18.3112774 21.2875271 4.8743401 0.2818401 -0.2668317 -3.8924699 -2.7460315 -8.6956835 4.3073587 -4.9520006 0.5632616 1.4164195 40.5748100 -2.7040377 -0.6507218 -2.5653198 -2.2748039 3.6255066 -2.1248519 -1.0249045 -1.0204856 -0.4467867 -24.0574188 0.8425279 3.5501676 -0.2122859 -2.2970612 0.9404002 -0.2899675 0.0653675 -10.1155939 -0.1042786 8.8566523 -5.3255239 -8.4185495 -2.0444362 2.2366846 2.6057460 -4.8723712 -2.2750304 9.9048033 -1.5625788 7.9970598 -7.0444446 4.4864168 0.1748483 -1.6058937 1.6936281 12.3761864 -0.8382173 0.8592932 -2.3321714 1.6164929 -2.7511945 1.6819978 -1.6448430 1.7548203 -3.7095604 1.8962762 -0.1492271 -13.2909870 0.5610184 -1.6615911 -0.7175351 -0.4768321 -8.6964436 0.0665633 1.6011571 -2.6593096 4.5862999 3.1126714 9.4725227 1.1261860 -0.1309015 -3.6348360 -3.7056978 -21.1420021 -0.6159990 -0.4450830 -1.9702579 -1.1018991 -0.4049338 2.4268014 0.0407212 -1.3833947 -0.5465769 -1.0404629 -5.6647954 -1.3323439 3.2081258 -0.4745054 0.8775218 -0.3235532 6.2310548 16.6388378 -12.7866364 -12.2160358 1.5352242 -1.8090916 5.0042071 3.3781407 2.9875400 -1.0242909 -3.8643329 -2.4035900 -2.9594870 -1.4021523 0.9748269 -1.7518269 -2.4236088 -3.1569850 -0.9246375 1.2298338 2.2120690 4.8281593 -1.0735035 0.3109165 -0.1221452 0.0297848 0.2461703 8.9067106 2.0409045 0.0646032 -0.4319312 -13.6094780 -1.6185536 -1.7598544 0.3071347 -0.7219388 7.0745921 -0.0563657 1.6475179 -0.2486299 -0.8226727 -0.6799692 -3.8260696 0.6772989 -0.6957228 -1.0342548 -0.8559654 21.9812965 -1.2932731 -0.3902425 -0.6802960 -1.3131050 3.4036837 -1.3301351 2.2396138 0.5356755 0.4419305 2.3209326 1.9688040 7.7285829 -18.6503277 -2.0493674 -0.0559833 -0.2596877 -0.3538848 -1.0248066 -0.6148997 -6.2270584 -2.3145714 0.2939548 0.8597356 -0.8013535 2.8199096 -1.3991960 -1.3591698 -0.1772281 1.3856412 -21.6475487 -0.9583378 1.5848018 -0.3404426 -4.5863218 1.4565588 12.2738562 -4.8754082 0.9378830 -1.8156849 2.0418499 -3.4456573 2.3193281 -3.4590919 1.0553185 -10.9736900 2.9032488 -2.4224019 -10.0231466 2.1409483 2.5907760 -2.9344480 -0.6422184 -10.3927879 3.0860565 18.2622738 -5.9222674 4.9492979 -1.1173559 -10.3279905 0.6474305 -0.0204048 -5.9922061 -10.5051451 -43.4379616 -1.7265999 -1.6388251 -3.2534280 -0.7344235 -0.1554460 2.6520634 -1.0069638 -2.8721373 -2.6493831 -1.0038936 -38.9159279 -1.1818689 4.8393717 0.1924756 1.8207499 -2.9162695 9.2782307 25.1191959 -11.8845968 7.5370798 5.1331863 -3.3612971 9.5847673 6.8002777 -3.1039677 -2.0515902 -4.4205418 0.0501730 -3.5549524 -3.9383447 1.2670827 -3.2061324 -7.0350966 -2.4261007 -3.0273440 6.2507257 3.7146225 12.4502182 -2.5793834 0.8202578 0.7828624 6.3868690 -1.7987039 -10.4903584 2.5031171 0.1570084 -2.4979055 -9.6755915 -2.8408267 -4.9226203 1.0448933 -2.9430368 14.3541632 -0.3267267 4.6424484 -2.2250414 -2.5732043 -1.5212680 -7.4278507 1.2918215 -1.5693202 -2.8312507 -0.8151051 43.1658974 -1.8702009 -0.5413436 -2.6207542 -2.1607831 0.8995883 -2.6076310 10.3513832 1.0373526 0.0730915 0.4136120 0.9213024 14.5293684 -4.5788717 -3.4152231 -2.0085731 6.2881837 -1.8425431 -3.1221614 0.1954213 -11.2468605 -4.6130958 -0.8730503 2.5223742 -0.5453836 2.6274769 -4.6281166 -1.9353303 -40.8280411 3.5998313 1.4552191 -1.2625110 1.2843539 -2.7545490 -5.4729037 0.6972989 3.2794182 -5.8104920 0.9366918 -1.7998251 4.6415262 -6.4217353 4.3759856 -5.0664978 1.4630867 -15.0721445 3.9131284 -21.7560787 -3.7872989 -14.6765194 -10.3546238 -3.9893329 0.5896496 -10.8002529 3.6076212 -15.6336908 -9.2768450 7.5379925 -22.7664604 -2.9689932 2.0898359 0.2196325 -8.9630661 0.0442297 -11.9221344 -3.3125496 0.6660530 2.7297037 -1.4358032 -1.7733709 2.1464946 -2.3538423 -4.8915563 -3.1555853 -4.0528302 -3.6600420 -1.7108008 6.6202922 -0.1026397 2.2252915 -2.9253719 8.6127682 29.5577049 -24.6521683 11.6879940 8.1487455 -8.9663153 13.8450022 9.9189510 -11.9480715 -2.4427109 -9.2248974 -1.5424998 -0.6053984 -6.7024527 2.3235090 -3.6292534 -9.1574583 -2.4665823 -4.4608054 5.6666260 6.6047044 17.9187298 -3.2786593 0.5604337 1.2331339 0.2844666 -2.7967274 -3.3526294 3.3211749 0.3383613 -2.4857292 -11.2630501 -4.3926840 -6.6751223 1.8907068 -7.6993742 21.4936180 -0.4032226 6.3867526 -2.7051773 -4.4270930 -2.6121368 -11.0096102 1.4266934 -3.2360106 -1.6830052 -0.9451438 62.8685188 -2.9003797 -2.0525210 -4.3198123 -2.8702800 1.1220977 -4.2750177 13.1525087 1.2809916 0.9555051 3.6674356 0.3655815 24.9599915 -0.1797107 -4.4099507 -10.8465109 -11.5885811 -2.0935886 -5.1474228 1.2897604 17.5861969 -6.5570993 -3.6394658 2.3524818 -0.8783016 3.9012165 -6.1376233 -3.2471294 -18.6497536 4.0158181 2.9387348 -2.5368812 2.2135663 -3.9537735 -11.0978165 -0.0922669 1.6193502 -4.6876383 -0.5041220 2.7891762 9.6778202 -7.7772727 4.2060800 -3.4188993 1.2560472 -0.5239057 -2.3907518 -1.8805296 -0.0578071 1.8041149 -4.6786995 -0.0013017 1.5853720 0.5868871 2.5814312 -0.5152012 -5.3863173 -2.5742579 -2.4426968 4.5595617 4.3361683 1.2289734 9.4588623 -0.1115753 -0.2385073 -1.3950200 -5.7382398 4.7581754 -0.7885391 5.2616477 -5.7685671 -4.9899278 -4.6214128 1.2360548 4.1199784 -0.5049196 -0.2359597 6.8714447 -0.7677870 1.7644657 -1.2598721 4.2801185 7.3592911 -0.8655816 17.3472691 -2.4789393 6.0046296 10.5846186 3.1636226 0.1725369 1.2949812 0.0879180 -2.5420525 -1.0677785 -1.6759099 2.4906945 0.1387969 -7.3366737 -1.0650831 -1.8249962 -2.4960966 7.3163548 7.8681192 -0.2257364 0.5373781 4.7202978 -3.6270599 -7.9886346 -0.3450420 0.3220722 1.2411828 -4.5675616 -0.3987589 -2.1468508 -7.0816808 6.3180571 -2.7227957 23.2556019 6.0196848 2.6862876 0.4802055 -7.7141666 -1.8777658 -10.3228130 6.7137499 -1.0883136 -14.2993832 -2.3269367 39.9773483 -3.6480341 -5.7482219 1.6892990 -2.7532070 -4.0404181 -3.5090799 1.3113165 2.2464952 1.8449405 3.4277792 6.8307428 -3.1920962 -0.0231539 -8.3901997 -0.2688716 -1.0643628 -1.3212967 -1.4494185 -8.9531221 -0.7447098 -4.3339081 11.0436268 4.5584321 -0.1231885 -5.0736570 -9.0008554 -4.7412615 -3.1355317 1.2266066 0.5954603 -5.7004247 4.9680529 -2.6132629 -0.9758810 4.6552553 12.8958368 -1.0690033 -0.5406951 -2.0932767 1.1352433 -3.2247572 1.6432233 -1.8130831 2.3915558 -4.0220413 1.6621509 -0.5299944 -14.9250612 1.2637614 -3.5472291 -0.9063167 -0.8933741 -9.7928171 0.1944378 0.9175044 -2.6363218 3.8176978 2.8718560 9.7677183 1.0515355 -0.1380351 -3.0017278 -4.5477190 -19.7864914 -0.8021103 -0.9350104 -0.4306751 -1.1748977 -0.4568607 1.9298887 -0.7185140 -1.0161968 -0.2412942 -1.1708493 -9.3972750 -1.5899140 3.1878304 -0.4829414 0.8414665 -0.4353344 6.3260193 16.2721786 -15.2744989 -9.5350981 1.7967347 -2.0475929 5.3032651 3.2483234 0.5705590 -1.2541170 -4.9244742 -4.0758348 -2.2488344 -0.8993250 1.0644033 -1.7326924 -2.5096219 -3.6469479 -1.0728639 1.0865535 2.3746877 4.3153658 -1.4667747 0.4449013 -1.4290731 -1.0931994 -0.2088010 8.7922983 2.0515780 -0.1032861 -0.4232519 -16.5132332 -1.3695832 -1.7356207 -1.0664812 -1.0449524 6.9501505 0.0057675 1.2430397 -0.5205439 -1.1855987 -0.3455490 -3.9484065 0.9881878 -0.4293580 -1.3477163 -1.1426837 21.4823399 -1.0255700 -0.2836460 -0.4366242 -1.0887053 1.6805044 -1.2054969 2.9656723 1.7856075 0.5006767 2.3525641 1.5096713 7.8035417 -23.4423981 -1.1452284 0.3755720 0.4795979 0.2069109 0.2823989 -0.7634583 -4.5869951 -2.2536583 1.8766859 -2.4103308 -0.7282422 2.1338274 -1.1591308 -1.3334695 0.6448964 0.5002127 -18.7901859 -0.8236106 0.6101455 -0.1702685 -2.1300373 9.1080885 20.0047913 -4.9623847 -1.3997742 -1.8363538 2.1678894 -2.6858225 2.9244449 -3.2536657 0.3021661 -10.9897327 2.6011682 -2.1811028 0.7653011 -5.3528490 -10.1846857 -2.5131035 -0.4674382 -8.2184315 1.8428999 18.6936302 -5.2861071 3.7885208 -0.2677863 -1.8095250 1.3734510 0.0178380 -5.8541293 -3.3132796 -17.1525078 -1.9018282 -1.1229757 -5.2609797 -1.5531089 -1.9151876 1.5083798 -0.8040797 -3.9838820 -2.1674707 -2.4801364 -17.4358654 -1.8867511 4.7626667 -0.4768795 1.6279414 -1.9074136 6.4686518 12.8169155 -7.1073618 5.3066339 5.2016883 -4.7055893 8.8123503 6.5899987 -5.2258186 -3.0835993 -2.5320361 -6.7757154 -6.3190742 -4.8145094 1.5096853 -3.5236030 -6.5786152 -3.0092378 -2.5116682 2.7127082 3.7717447 10.6975946 -3.6358607 0.8017768 -0.3158591 1.6444048 -1.7083843 -7.0696716 3.3748784 -0.0373978 -1.0972540 -9.9590178 -2.8475678 -5.1172237 -0.1718343 -5.0883451 13.5840902 -1.3573688 3.0263591 -2.1784863 -4.5229807 -2.5561981 -7.4711366 1.3807583 -2.4013345 -2.1446743 -0.4849261 39.8567543 -1.5050725 -0.6044016 -1.5621619 -2.5898092 -0.7517908 -2.4696686 18.2483215 2.9543376 0.7018338 2.8084831 0.3341562 13.7128315 -6.7688184 -2.8316815 -2.8701727 7.7291369 -0.4908376 -0.0260623 0.7359329 -2.3012667 -4.8059859 -3.6337218 -9.5220213 -0.3877899 2.5419562 -4.7220054 -2.1273582 -3.7769876 3.1693702 -3.3882630 -1.4050664 2.4904096 -1.9651111 -6.0677099 16.2354774 12.7636309 -9.5390625 -5.1111526 -1.2869503 3.0624073 -4.8510294 5.1302238 -7.3828712 3.5855074 -11.2198935 2.6074448 -14.2053690 0.6783043 -12.5276012 10.4228268 -1.8226964 1.9584954 -13.7493916 0.8388899 -6.3885918 -4.9854941 8.1669502 -1.8112069 11.5531836 -0.7813848 -0.3576019 -9.2871418 -0.0284578 -6.7856894 -2.0614283 -0.0729198 2.5354917 -2.5361741 -0.9353718 4.3949571 0.7048684 -5.9057298 -2.1901505 -3.2579348 -8.1644621 -3.3375857 6.8011684 -0.3730306 -2.6831334 -10.5555468 9.7888584 29.9151478 -18.9239044 7.3082552 5.6869230 -6.1398740 14.9264736 8.2734060 -3.5033028 -2.3230174 -4.9631019 -5.2487359 -6.8612370 -4.5511718 3.0789487 -4.8433390 -8.8333893 -20.8069534 -2.5433288 5.2204447 6.2643046 14.4129496 -5.9765062 0.6859425 -0.6663586 -6.7392349 -4.8270402 -1.9667811 4.9179106 1.1254250 0.5219831 -4.5202603 -5.3665695 -5.5831766 0.5243376 -5.1580305 18.8149300 -1.8288230 5.6798401 -2.8272085 -5.9875550 -4.0533590 -11.4424639 1.1770623 -10.5294800 -4.9018583 -1.4307680 66.4186935 -2.8178706 -0.9801255 -2.5051391 -2.2309046 3.2555907 -3.9696486 34.3343811 1.4569225 -0.2992043 7.4715533 1.5990802 22.6859360 -0.1568012 -8.1314678 -1.1364146 1.4006041 -0.5071462 -4.4100451 2.2957687 -9.0098820 -6.6722660 -4.9295688 -21.9732246 0.5542525 3.1733942 -8.0278492 -2.2951868 10.3918982 4.2817335 -2.3794174 -3.4962525 2.2959764 -3.2786658 -2.0401111 -2.0647137 0.2981765 1.8534513 1.7414985 0.0990498 2.9663780 -5.4114289 -3.5131328 -3.3384094 1.2977923 -1.2993648 -0.8312019 -0.2145959 -0.0196872 -1.0511990 -0.2099988 0.8812476 5.1310320 -0.1271335 -1.1223322 -0.6488954 -2.4877810 7.4114923 0.5085942 -2.9072003 -0.5093547 4.7966313 -0.0225355 0.0333343 -0.2067268 2.8803151 2.4470077 -1.1888262 -2.3095205 0.5684880 -10.4743195 0.9678172 1.1509700 -3.8337226 3.5086682 0.0199213 0.0712780 -1.2487669 -0.4237497 -0.6007547 -1.7039562 -0.7826466 9.7451458 0.5823720 -0.2076485 0.2528414 -4.8985038 2.3356442 4.0221844 -0.1915072 -0.8758826 -0.1089304 0.2131916 0.5671338 -4.6515269 1.1066254 3.7247221 -4.2313619 0.2806488 -5.6638079 3.5337102 -4.4880352 6.8418651 -1.6206137 -1.3621588 -0.0148860 -0.9569107 -3.6825325 0.0835542 0.4165430 -0.3886997 -3.3079245 0.2736957 1.6753396 -2.3918126 4.1935930 0.5768569 1.2352939 0.1261341 4.0618629 -4.0657511 -2.5758350 -3.1762040 -2.7348285 0.8903422 -3.6549659 -4.1390214 -3.2553029 -1.0532401 -3.2484820 11.7084360 -2.2168524 2.2632658 1.0889618 4.3820281 -0.1896542 4.7776775 -0.4793993 2.0802271 -1.0403877 -1.7009659 -0.0495694 1.1991770 -0.5166666 -1.5917463 -1.5208783 0.5478855 0.0920683 -0.1035116 0.8586575 0.0214878 0.3911293 -4.4301677 -3.0822496 -5.5067244 -6.4290423 0.5396926 0.0408885 -0.1148292 -7.9606318 -0.8555329 -4.0408611 0.0029511 3.2065427 16.3739090 -0.7906089 -1.7596612 -2.8416536 0.9442605 -3.7894211 1.9041712 -1.5722479 1.5079702 -4.3542676 1.6071392 -2.1430814 -13.6560965 1.7029060 -3.4447966 -0.5855967 -1.0276333 -8.6657619 0.6348887 -1.5731182 -2.5279586 3.4591970 2.3829756 12.5216732 0.4666951 0.0967064 -1.8205838 -1.9850892 -19.6967201 -0.2589456 -2.1394539 -0.7763870 -1.1669978 -0.9782799 1.4639388 -0.6819056 -0.9920223 0.3436573 -2.3776298 -11.4898214 -1.9388272 2.8755755 -0.6136202 0.8146287 -0.3424459 5.9966106 16.3942852 -15.0491724 -9.9544897 3.1201835 -2.7516625 4.7000108 3.0648711 2.4710617 -1.5390148 -5.5026174 -3.9108720 -4.6145930 -1.2535714 1.0778928 -2.1778777 -2.3931723 -2.4156444 -0.9599586 0.6884981 2.1968658 3.6796279 -1.8414263 0.3010149 -3.4236445 -2.0935528 0.0688436 -24.5893497 2.1819046 -0.2343968 -0.7932150 -20.3271027 -1.7080142 -1.6849065 -2.6376088 -1.9574102 7.2765741 -0.1369003 1.3116450 -0.8030617 -0.8883353 -0.1246173 -4.0826745 1.3881530 -0.3845628 -1.0548939 -1.3216717 21.5978413 -1.0841070 -0.4734523 0.2611251 -0.5860462 1.2227700 -1.2320766 -2.7445951 2.7493646 0.2898065 3.4080708 1.4446770 7.8006401 -15.9813042 -0.5264232 0.5184255 0.7510728 0.4053634 -0.6012567 -0.2597283 -5.2536478 -1.8553988 1.6825373 -5.0749969 -0.7973396 1.5536753 -0.9194695 -1.3085212 0.8475276 -1.5961317 -15.9554424 -0.3281944 0.3908487 0.5566669 0.3135239 5.3752804 24.3261948 -4.5995841 -3.9393394 -3.8197668 1.9622214 -2.2896817 3.3933675 -2.9443226 2.1445553 -15.1196547 2.5824959 -3.4735873 -7.3722796 4.8931646 -0.6587478 -2.4516675 -0.8820894 -11.7377129 1.5496222 -17.9361725 -4.7419829 0.9974687 3.1681569 1.3349949 1.2189497 0.3133021 -4.4859409 -17.6761932 -1.6941879 -1.4615670 -2.0624442 0.4904394 -0.9787817 -2.2391114 1.8561808 -1.7739060 -2.5232184 -1.0876937 -4.1432247 -32.1212082 -1.8414652 4.4178462 -0.5868095 0.9109484 -3.1816740 5.2439499 1.4609571 -13.5934086 -0.7321079 6.7609992 -5.2893968 8.0008907 6.0537548 -9.4020882 -2.1915593 -0.0293572 0.4760345 -3.6114857 -3.4484389 1.7699169 -4.7510023 -6.3584900 -1.3742837 -2.3325782 2.0097413 3.2244349 9.8427324 -4.5356874 0.3350607 -1.6315635 -2.4639883 -1.0914245 -3.7364740 3.6488924 -0.7152838 -2.7692745 -12.8604803 -3.5172200 -5.4052401 -1.4835538 -6.4084153 14.8219929 -2.5226619 2.9037004 -2.6850543 -4.3776817 -1.0924776 -7.8522234 2.4268644 0.5417745 -0.5984008 -1.5464907 42.2252579 -1.2136085 -0.2779061 -0.6663002 -1.7953389 -7.1487918 -2.8223968 21.9290504 5.5960064 0.8240247 4.8304229 1.6487552 13.4975672 12.2662325 -1.3214417 -2.9624493 2.9678946 -0.2222427 -1.5441790 -0.2401816 -9.6595106 -3.7715421 1.9928703 -11.1182137 -0.8028702 1.5422182 -5.8496904 -2.4657276 9.6166830 -0.8158243 -4.1758652 -0.6403676 0.0016875 -0.0454961 -0.4991931 1.0595424 2.4542496 -5.7222581 -6.3163662 -0.6267886 2.8597081 -4.8575344 4.9752126 -4.4137402 3.7545035 -18.0642052 4.1584873 -7.4938459 -1.7653680 0.7454734 -1.7556373 -5.0522795 -0.5265439 -3.9162698 8.6244516 -7.0564747 -6.6768060 3.1446698 -9.9790506 9.1265497 1.6882819 0.4642848 -5.3915386 0.2743520 -1.9877439 -1.9713879 -2.1771290 1.4350489 -0.7597349 -2.5020115 1.5306695 -4.7251120 -5.3429909 -1.3511286 -3.8814800 -13.6239653 -2.2925088 4.7067513 -0.9740612 2.2309036 -4.9038010 6.3953414 21.0092220 -16.0251884 -1.7977228 14.1259918 -5.8758292 13.2864180 9.2477818 -1.8427495 -1.7350767 6.0638657 -0.0075660 -9.9301949 -2.7301166 3.2423825 -6.9421606 -7.6087327 1.1671107 -4.2671204 4.0711389 6.1188154 14.9530935 -4.4473634 1.7740277 3.5493126 -14.2524986 -0.9818944 0.7905805 4.0733719 -1.2436690 -3.3872254 -11.0962582 -3.8961678 -7.3949580 2.3236725 -7.8416862 25.5954819 -4.7359319 4.7796483 -3.2894208 -4.8887825 -2.9091020 -12.1462345 3.4254417 -1.2595786 -1.3165464 -2.9955246 58.1915436 -2.3716290 -0.0286845 -0.5998337 -0.5464191 -4.5578580 -2.7298572 2.5553179 8.1217146 0.6390640 7.1174083 0.1194568 21.0995941 0.2358460 -3.6021109 0.5275960 -2.5844119 -0.2779698 -2.8958168 -2.7483642 -0.7662073 -5.1494026 -0.3468162 -12.0756512 -0.6997651 1.8075931 -6.0929751 -5.4895539 -3.4361036 -2.5592015 -7.1591225 -0.3329795 -7.6896286 -0.1956377 -2.6922970 2.8527071 -0.3232829 -11.4101810 -2.3769705 -4.0900369 -4.5751181 5.1656065 -0.4496041 -2.3991690 -8.4310741 0.9215626 -6.0882645 0.2013988 -0.4704136 0.6667600 1.8100047 1.2764555 -2.3640399 1.5727996 -4.2016935 -0.8915820 -6.9386506 7.0409513 3.3858016 -5.4169264 -7.0986900 -2.9548812 -23.3771305 -0.0377095 -0.4338192 -5.2930083 6.8493705 -8.0969744 -11.7502775 5.3197360 -2.5872612 3.6865373 -3.0429049 -17.2268410 6.9885964 0.1029680 -1.8327305 5.6739769 3.1724088 -8.3538952 6.0480680 2.9062316 -0.7788574 0.1280289 3.1122007 -7.2551394 -3.2344365 8.9751186 7.4690762 0.1722181 -0.7878607 -0.2005730 -0.7333158 -11.5108185 6.3984880 -1.4753960 5.7756519 -12.8395433 4.1566405 -3.0399044 1.6096017 6.5227742 3.1096280 -4.1403542 -2.4379838 -3.4799204 -0.0086805 -5.0006762 0.1779648 -4.5038328 9.2835245 -8.3593788 0.3822180 -4.4409113 1.5206544 4.3360572 -14.7864561 17.4948654 5.1146693 2.2209091 -1.0959082 -2.9424515 -1.3361956 -9.8443995 9.3530645 0.7045387 -2.1411595 7.6295314 28.9833183 -0.7971838 2.7420447 -0.1693286 3.9674621 -5.1157055 -4.3662033 -0.0070185 -0.3780060 -3.6975303 -5.9908690 6.4684849 7.9942608 -0.0834457 -11.6760426 0.3285784 0.9097934 -6.9014068 -2.7878146 -12.6226473 0.1392659 -5.7745495 -2.6143286 -1.8814791 1.9254336 4.2471771 8.7369633 0.0342099 3.1136866 -13.8333969 -0.0441653 -4.1717849 0.9613959 -9.2430201 2.1046643 3.6974597 19.2676296 -0.3359807 -2.9429953 -2.8318486 0.5560544 -3.8419807 1.9021969 -1.4011406 2.3165245 -4.4899359 1.4008946 -2.4299133 -12.8432531 2.9944410 -3.9577296 -0.5799789 -0.7424799 -9.8116217 -0.2225209 -2.4301467 -2.1246326 2.7373540 2.8827341 13.2016001 0.1952098 0.0942525 -0.1612631 -11.8578615 -19.6041527 -0.4716211 -1.8961118 -0.9302334 -1.0676289 -0.8807458 0.5886190 -0.7702217 -0.4519452 0.8260226 -2.0696566 -13.9515219 -2.0335052 2.1710572 -0.8315184 1.0077602 -1.0370092 5.9497848 17.2151546 -16.8101006 -7.2034154 4.9295306 -2.0113764 4.8365111 3.0688057 3.4075530 -1.9218237 -5.7436008 -4.6238766 -3.6700644 -0.8588390 1.0256307 -2.5289681 -1.8803738 -2.4081626 -1.0854431 0.2319894 2.1582048 3.1098537 -2.4671466 0.4230006 -4.9631324 -2.0706513 -0.0863462 15.6905012 2.4815371 -0.7511937 -0.4570530 -20.7761822 -1.3411562 -2.4443855 -3.8311648 -2.3839400 7.4445767 -0.3183910 1.2442859 -1.2521749 -1.0649667 0.4782696 -4.2803226 1.8029964 -0.3198791 -1.5454947 -1.3119549 19.7902355 -0.8401247 0.0788957 0.9308875 -0.3505370 0.0533640 -1.1881893 11.2628365 4.1457491 0.6803285 3.2378397 0.6394513 7.6494689 -20.3408012 -0.1034577 0.8840551 -0.0768017 0.8091036 0.0585652 -0.6345347 -3.4821496 -1.9707015 -2.0598612 -2.2703052 -0.4630093 1.1216319 -0.2022190 -1.3624320 -0.7575791 -2.8937037 -6.4075413 -0.0171080 -0.0610964 0.7232265 3.8844972 4.1812601 24.3895969 -3.7470922 -6.4981656 -4.3601708 0.4124053 -2.8156755 2.8284559 -2.8486567 0.7485018 -15.5729437 2.4312510 -5.2127872 10.5829411 2.9324708 5.5297604 -2.7622952 -0.6575191 -13.5860977 -0.8145329 -9.8446827 -4.4644547 -1.8258853 5.4465795 -1.1821557 0.7944314 0.6051480 -1.6492298 -5.5927987 0.4350141 -1.4557835 -2.7650845 -2.8238616 -0.5752693 -2.0468030 -1.3317574 -1.8909699 -2.4637983 -0.6524295 -5.6959677 -35.5601578 -2.3085649 4.1499100 -1.7149650 1.5733958 -2.1906009 2.1403484 4.7808194 -13.6178713 -3.9499967 10.0847368 -4.1833515 8.7016764 5.8522196 -7.3123574 -1.7654556 -3.2995882 3.4544561 -10.0816736 -5.9839196 1.3852376 -4.3420563 -6.6832509 -3.9183395 -2.4575171 1.7482638 2.5647848 8.8036385 -5.8786550 1.2577391 -2.6553633 -1.2554896 -0.3902180 0.8913600 3.2398217 -0.7614072 -2.9049182 -22.2612457 -2.2285326 -6.0167975 -3.0552623 -8.4693899 14.5414286 -2.9045203 1.6707118 -3.0760498 -7.1384053 -0.2822245 -8.0574188 3.4010928 -1.8575230 -2.1083400 -2.5934753 40.3658791 -0.6742128 0.5540364 -0.1564126 -2.9645481 -14.6683359 -2.1244891 24.0547047 7.1882820 1.0832764 1.5469356 0.4561090 13.1291637 11.3848343 -1.1993493 -1.8034444 4.6684084 -0.6979061 -0.6555352 0.7067113 -12.6503878 -3.9550736 -26.2341614 -1.5578991 -0.6472047 1.4487852 -4.5955515 -1.9286143 1.4160837 0.5307209 -10.5407829 -0.3329374 0.1638273 -0.2676114 3.3408265 6.9242010 0.6610153 -4.5203824 -8.4611568 -7.6238451 0.3985581 -0.7931771 1.9650291 -6.1898808 4.4466610 -27.8702545 3.2164760 -17.0614223 -0.7018919 -14.0081625 -7.9354701 -3.7122879 -0.1465390 -13.0650415 1.2802827 -6.8939724 -7.1257262 0.7899357 14.9876785 12.8999443 0.5200626 2.2418156 -3.0335433 0.6395898 -0.9564697 -2.0461302 -2.0894487 -7.2004724 -1.8743912 -8.9735126 -3.8132508 -2.7714968 -3.2655041 -1.6227200 -16.0971107 3.0850418 -4.0106626 8.8891459 -2.5238953 2.9104946 -8.4980927 5.4285607 21.4056988 -3.2328897 1.9838558 12.1960649 -7.9144039 15.5638618 8.3376274 -5.2043338 -4.0580797 -11.2516842 -0.4912712 -13.9926481 -19.8854332 2.4577324 -3.9051993 -9.5232296 -4.6442671 -2.4903700 5.4124932 4.0899358 10.9218178 -10.8117962 -0.2297354 1.3919542 -17.5749741 -0.6334893 -2.1040647 5.6694465 -0.2348016 -6.9202881 -13.0022993 -4.8993955 -6.2355533 -0.8590586 -17.4620285 19.7931652 -5.4010649 4.5154085 -4.8442807 -8.4361515 -0.0499927 -11.5845242 5.0636740 -6.6394019 -1.8476363 -3.2331562 65.3794250 -1.5054483 0.4397270 0.3391753 0.2815576 -8.2192259 -4.4803982 6.7315230 12.0977697 0.8974601 5.4115028 1.0995164 20.0283852 0.1410061 0.1339686 0.5656033 3.4586449 -1.0408425 -6.4535632 1.3923748 -1.5727823 -6.7251968 -22.5219116 -2.4144983 -1.0156188 0.5033544 -4.7176166 -3.9294915 -18.5174465 -0.6463607 12.5869236 -0.7474781 -11.2294407 0.4901135 0.1872173 1.3787524 -1.8758273 -3.8041306 -11.4116535 -6.2073774 1.8599371 -1.8621358 1.8905628 -2.1296976 -12.6954689 4.4709921 1.4351025 -6.5450306 0.1631494 -6.7211366 -3.6422448 -0.0303770 3.9103041 -5.3742347 -3.6494672 -4.8862348 -2.9547257 11.1566162 6.6813083 9.1772356 -1.8040264 -1.2460582 -1.7732395 0.2549157 -1.7926965 -2.1401949 1.0643903 -1.9379958 -0.9016169 5.4886670 -7.9397593 -7.0588522 -5.2705922 -3.0446157 0.7989177 5.5939455 -4.7798362 11.5542173 1.1558243 -1.1808805 2.0200639 -3.3477328 16.6544247 -3.8443716 -1.5469072 -4.1917734 -3.3702974 10.6172686 2.7342262 -1.4464979 -2.5520515 -5.9878817 9.4721384 -0.2792489 -4.6900144 0.7352611 -9.5071945 -5.0490007 4.1613154 -1.7931381 -1.4096839 5.4687009 5.1081014 -3.1648967 4.4620399 -3.1127677 -1.4664828 -0.3465593 -1.1057808 0.6126468 0.1591648 -0.3202574 -3.8628182 0.2296962 -3.4743369 -5.7733622 -10.3223934 18.2132454 -0.4921448 2.7883210 -7.1659422 -5.6068230 -4.1659331 -4.3188858 4.5015998 1.5347744 -5.6327386 -0.5601101 56.1910210 0.2527886 -1.7326852 -3.1831927 -2.1753447 -6.1615753 -2.6175473 0.6127961 12.2176466 -0.6115873 2.4058855 -10.1698599 4.3365774 0.0140968 -2.8444116 1.3161116 -1.7457935 -3.1788051 -3.8785899 -0.3700420 -0.0977655 -3.0189028 -5.0756974 -6.6896167 -1.2669421 -0.3990761 -8.6605730 0.1890484 0.6746253 0.9767864 -8.1769476 0.1854278 -6.4938564 0.2654525 0.0719474 3.3864450 21.7821732 -0.3658078 -3.2668593 -3.6707325 -0.2944391 -4.4814138 2.0433333 -1.2331910 2.5668366 -5.6401811 1.4145559 -4.3667178 -20.4256687 0.6749688 -2.4597449 -0.6023092 -0.7278970 -8.2099562 0.0893657 -5.3383884 -1.9378810 2.1600134 2.2436121 13.2294941 0.5286807 0.3431768 0.7962058 -5.1499653 -18.0347271 -0.4452852 -2.2574444 0.4764412 -1.2688798 -1.4090877 0.1809551 -0.4975767 -0.1914971 0.9902198 -3.2993186 -16.1076164 -2.4178567 1.6762458 -0.9448069 0.8793172 -0.5353199 4.2143855 18.2948647 -17.2437916 -5.4600658 6.5072732 -2.4377813 4.8633580 2.8048279 9.0444164 -1.6545655 -7.0828996 -4.3367867 -4.9137430 -1.4778174 1.0845263 -2.8112557 -2.0411460 -0.6971352 -0.8747057 0.2278830 2.0024498 2.0148523 -2.9737082 0.0437464 -7.0935717 -3.3695941 0.2041755 5.9203005 2.4549730 -0.8656076 -0.7866510 -23.0378971 -1.6926951 -3.1527367 -5.6068559 -2.6410902 7.1198344 -1.3330076 1.0210131 -1.2959285 -1.1439645 0.8211909 -4.1825442 2.0797465 -0.6201669 -2.1816299 -1.5638447 19.7191277 -0.3042092 0.2539828 1.0727230 -0.0276416 -0.6467749 -1.4820570 10.9746227 5.4854879 0.8495933 2.4603641 0.8560755 7.9903951 -6.9055562 0.7269838 1.3384725 -1.4478725 1.0609388 -0.7682291 -0.3081563 -6.3261132 -2.0187368 3.8079960 -0.3948009 -0.8735039 0.2739820 -0.8197611 -1.1523490 -5.0482931 -7.3907514 -4.8053761 0.4097686 0.0377463 1.2184578 -4.2334447 4.9778218 -0.4855651 -6.4318724 -9.9295492 -6.7071877 -2.0410638 -6.7852011 3.5973973 -2.9356344 0.4527162 -18.9101276 -1.9770952 -13.8256302 -14.7203074 -19.7267666 -5.1658502 -2.0357680 -5.2804222 -18.4277611 -2.8700910 -16.6155357 -3.9971013 -5.7929568 1.0870516 -29.1208324 0.8188008 1.4998600 -3.2060542 -13.2306223 -7.1969333 -2.4542072 -4.5093446 -4.8757262 -2.2235160 -5.2013412 -2.2916734 -0.9217504 -1.9015536 -1.1021174 -6.9340754 -25.7765274 -5.4385648 -2.0614486 -0.5862509 1.4563768 -2.5298908 -8.3847809 -13.6052589 -16.2119503 -11.2989635 -4.2522469 -2.9028714 8.1807985 5.8453045 -10.1436243 -2.2459979 -10.6015568 1.7501292 -5.3166089 -12.2103376 0.3849598 -4.4551086 -3.7404971 -4.6636920 -2.2150929 0.4851500 3.4285443 5.8335915 -10.9147062 0.3082146 -8.6764288 -5.8218803 0.3808089 18.5516224 2.4588811 -0.2333687 -4.1985617 -10.1446848 -2.8980923 -6.5688620 -8.8368092 -9.5691500 9.8339252 -7.2227716 2.1662939 -3.6279263 -6.6287847 -0.0188517 -7.1835527 -4.2777200 2.2253339 -3.9652278 -2.0328391 39.1023750 -0.3690282 0.5805187 -0.4194228 -10.8294535 -12.7188826 -2.6954648 -2.2242470 10.3599968 1.1604931 -1.9342147 0.1966621 2.5179679 21.2046356 -1.4893154 -7.3911710 -2.4585321 -1.4556308 -3.2589083 2.4733255 -7.4661226 -3.8943162 1.4430525 2.6178193 -0.2826982 4.5210829 -7.1647973 -0.4792925 -6.5104928 -8.1090145 0.9725759 -9.2073469 0.0169535 0.5075687 -4.5826702 5.3307180 15.1389637 -9.2808924 -14.4631739 -1.9317074 -4.5206633 -4.6363592 5.8719945 -4.2249360 -0.3995210 -27.7308254 -0.4781516 -15.9305134 -2.2642949 -10.3620224 -14.4365950 -6.1796803 -4.3528051 -15.6277189 -4.4667563 -15.1840553 -6.1437893 1.2987646 4.2050862 1.7861909 1.8074696 1.2833823 -5.0988679 -10.8373785 0.7017555 -3.1679878 -4.2301741 -2.3905663 -3.9160633 -3.9762230 -2.2527554 1.4587959 -4.9058404 -1.5669366 -4.6389637 -22.4684486 -7.8249898 3.6118445 -0.6466883 2.8529265 -4.4235044 1.6928989 20.3210011 -9.5979214 -0.2632620 2.8366351 -5.3460293 12.4387388 8.0109835 1.9595101 -3.7293515 -7.7040734 -19.6634235 -13.1050968 -15.3323107 0.5309054 -6.1094580 -6.3221393 -5.3648186 -3.2164111 0.2922603 5.4139853 7.8480072 -15.2000580 0.2893840 -7.6248507 -3.1216657 0.3067522 -2.1529362 1.1141361 0.5472257 -5.1703167 -20.0668335 -4.5649958 -10.6680298 -4.0411263 -17.4402084 15.6638250 -5.3026996 -0.4819978 -5.4978981 -6.6938295 -1.7962588 -10.4508438 -2.8658359 0.6786925 -4.5215807 -2.2095978 57.7823944 -1.2016941 0.4848391 -1.6884363 -15.2698975 -5.1135454 -4.2412443 15.3875008 16.0534325 1.8489757 -11.0895205 -1.8728364 10.1521616 -4.4736447 0.3051066 -0.8872193 -10.3591900 -1.5574040 -1.1194063 1.7580123 2.2680922 -5.7038331 5.9218597 2.4045169 -0.6723265 4.1004791 -8.8360558 -0.9470930 -1.8469019 -12.9626055 19.8302670 -8.2785149 -0.8865609 0.5092596 0.4361388 5.2376699 6.1926951 -3.2727149 0.5503162 -4.4353609 -13.5502329 16.0753460 3.2319748 -1.5501068 -11.9962988 8.0641098 1.8007463 -7.9877853 0.7526136 -1.4428244 -6.6967998 0.4558799 4.1577454 0.6793056 -7.6929598 3.6904714 -4.6963410 21.0767479 5.7256918 0.4117762 0.0004558 1.1028957 1.6672273 -0.0044456 1.4482654 -0.2700678 3.2323864 -8.2866459 -1.3044474 2.8706949 13.2663622 -0.1587517 -0.2032581 1.0713079 3.8523512 0.5542895 -2.3291516 12.7302866 -1.2569489 1.0600823 2.8787818 -2.1226974 2.5121984 -7.8422704 15.7921991 6.2060814 -4.5996857 7.5855265 0.5277086 -4.5427980 -8.1290846 0.0453645 10.5957212 0.3845633 -2.9205959 0.4513132 -5.5189261 -2.0007157 5.7141523 -1.0842191 -2.3579526 2.2514799 6.7004814 -2.9636521 1.3058941 29.5157490 -19.6448669 4.4127030 0.6785797 -9.1813536 -1.3296498 -3.8717055 -5.7251596 -2.1152923 0.5777094 19.1374130 -2.1045072 20.4320259 0.2371316 6.9733219 -6.2437143 0.3783663 2.3474724 -8.8829412 8.4966688 -8.0496387 0.4136568 1.6435826 12.3867521 0.4545804 3.7481177 1.4403415 -1.5880402 -8.2483282 -2.2113414 17.7528648 10.7486172 1.0289707 5.1897831 5.4641271 4.5399833 0.0359251 -12.9969826 31.1830482 -3.7932110 1.4871092 -9.3383703 -0.3433763 -7.5764394 -8.8020258 -11.7274046 -4.5015063 -2.5186386 -1.7370089 -10.4887218 -4.2910571 -3.9957440 3.5635090 -10.3479109 -2.9553654 -6.7494817 6.8660884 -0.1759590 4.2659316 19.3280792 -0.7188773 -4.0240273 -4.4088812 -0.7982212 -4.6700411 2.5749798 -1.0323777 2.3029304 -4.9015341 1.2607800 -4.6446681 -17.6078415 2.2620823 -3.0406284 -0.1480249 -1.1453615 -14.2354593 -0.0887872 -5.7667732 -1.6952087 1.5744675 4.3544545 15.7685604 -0.1005000 0.7812969 1.9115020 -25.5668716 -17.4646549 -0.4035659 -2.7345712 2.0175407 -1.1237093 -2.4996908 -0.2505643 -1.0507404 -0.3468803 1.4399984 -3.5485065 -17.7002316 -2.5605261 0.8664586 -1.3796538 0.9342713 -0.4051174 4.0069571 18.4185734 -16.2584000 -4.5719814 7.7424355 -2.2719703 4.6346288 2.5773058 9.1163235 -2.1430938 -7.6028605 -5.0625911 -5.3025055 -1.4457703 1.1788186 -2.7317224 -1.5190539 -0.1524734 -0.8792580 -0.0765030 1.8196977 1.8613651 -3.3570004 0.1832464 -8.8095160 -4.4679098 0.5548050 16.5507565 2.7814679 -1.1128591 -0.3943853 -24.1846523 -1.5781921 -3.5857193 -6.7564120 -3.8015218 7.2619066 -1.5387191 0.7397116 -1.7242736 -0.9193179 0.7616220 -4.3962536 2.4854951 -0.9471775 -2.9448609 -1.4698259 18.8977299 -0.2696702 0.6647806 1.7031769 0.4293256 -0.6661066 -1.3609091 9.0964060 6.1948090 0.7881720 2.7466607 0.7921991 7.8069000 -15.3544674 1.0803071 2.3594677 -1.1606816 1.5808984 -2.6668024 -0.4034231 -9.7800541 -2.0214956 0.0135482 -0.7999199 -0.7219104 -0.4259149 -0.5843289 -1.4701179 -1.7632298 -0.6565093 0.6386507 0.7276388 0.0375070 1.6612511 -4.2057199 5.0653753 -7.1397800 -4.9364576 -10.8723488 -6.7470913 -2.5780382 -3.2477999 4.7561617 -2.2920833 1.1801192 -17.3769932 -2.1784275 -8.2434044 7.8679457 -5.8736615 -6.0389180 -2.0842566 -5.3058839 -9.7306118 -0.1714782 -6.9868937 -3.7969091 -5.5581841 4.6043572 -21.4662857 -1.0452791 1.4056499 -1.2259089 6.9410629 0.3238893 -1.9296361 -4.1829324 -10.1497803 -2.2670240 -4.1507463 -0.5654837 -1.1282591 -1.6370302 -0.2602461 -8.2553864 -8.7828770 -5.9548998 -1.2180653 -3.1204753 2.3534863 -1.5465815 -10.2314310 -5.3337398 -17.0111809 -8.4307928 -2.0293293 -3.6162779 8.6675014 5.7777896 -12.5609331 -4.5710249 -18.3623714 2.1763930 -11.5527611 -14.3394318 0.7908436 -4.1700888 -3.9395568 -2.8344731 -2.5673618 -0.9213749 3.6534319 4.1572499 -11.9597454 1.0110716 -5.0199280 3.9341662 2.3944221 -3.5603979 2.4945493 -1.6078721 -4.7175212 -18.4644299 -2.6918221 -8.4915886 -6.1413069 -12.8967648 11.7899857 -6.5080872 1.7187968 -5.5779676 -8.0970716 1.0235054 -6.9403639 -3.6755247 -2.7953680 -4.8449578 -2.6157620 39.9260864 -0.0470573 0.6329870 1.6143804 -10.6327772 -9.1661234 -2.1593187 2.2489102 13.0046597 1.1174084 -0.0593256 -1.1964643 3.9107170 -9.0660715 -0.2311849 -5.2932959 -4.2506790 -0.3018566 -5.7561855 2.6578040 -4.6666026 -3.4962118 1.1000783 2.8963013 0.2110767 3.9387085 -6.1989255 -1.0012232 6.4738383 3.4979711 -8.6210899 -8.7693043 -2.0613294 1.8023762 -5.6799660 6.8533840 4.9844322 -8.2145367 -16.1200809 -11.9497910 -4.0145259 3.3975904 6.5275793 -2.9387462 8.6871233 -16.3602791 -2.0460773 -15.1667423 -2.7434609 -4.3058686 6.5708790 -3.1599076 -3.9652228 -6.3369312 -6.8865542 22.2447338 -5.0459461 -2.9931040 3.1853154 -6.1268568 2.3769903 2.1930239 -1.0349094 0.0488547 -2.5113301 -1.7676598 -5.6852140 -4.8506365 -4.4807053 -4.3031850 -11.7337046 -3.9877610 -1.6283584 -1.7746059 -6.9089508 -8.2320271 -8.3914022 0.1337655 -1.8092407 -6.5816035 -2.8470702 -9.1340885 11.4261627 -19.1366425 1.9185742 6.1229959 -6.2100105 12.1860600 8.9264774 -6.0423713 -2.0972989 -3.4357944 -12.4748259 -9.8070145 -13.0699654 1.6375077 -7.5225220 -8.6829586 -2.3436832 -3.4372323 -0.9649917 5.8615994 4.7627826 -15.3721828 0.2693237 -0.7637269 9.1383610 2.5285897 0.1630557 1.2860392 -1.1585536 -4.8541307 -21.1687641 -4.8115931 -7.1002007 -1.7675384 -16.9845657 18.8034554 -8.2194242 -1.6259016 -6.4881878 -8.2523632 1.0825808 -13.0216742 -1.6630465 -3.1282029 -4.2234092 -6.9990020 54.8931389 -0.2464584 2.2484341 1.0090581 -13.1448021 -1.6976080 -3.6365783 -4.9350228 21.1726589 1.3090265 -1.2107691 -0.5690448 14.9758244 0.4020283 -2.0156777 1.4170293 -9.4224615 -1.3786581 -7.7930021 -3.2744358 -6.1148658 -2.8899639 -13.8503141 2.3196259 -2.2411397 6.3068252 -11.9489918 -3.3516994 4.3804207 1.7233329 7.6863284 -7.7472024 -10.2920818 3.0737529 0.6380349 -15.3386383 1.0050542 -5.0487719 -7.9935546 1.8836887 0.2263860 -4.9857888 9.8992920 -0.8932741 -16.5588322 -2.6797321 -3.8892531 0.2648475 -0.3668714 -3.0323839 2.9184813 -10.8551607 -0.9020186 8.3467979 -3.0659747 -1.0084046 -0.1497711 4.0012765 -0.2922899 2.7086565 2.0730171 -0.0263738 -0.0811019 0.0218963 -0.6986361 -0.1403034 -3.2832663 -0.2611269 2.1668427 -9.2195225 -1.7156860 -3.7751250 -4.0028119 -1.7321690 -2.9188514 -0.2449868 -1.4734803 12.9942102 -0.6205851 -0.0964256 -3.5557458 -10.3858624 10.3734646 1.7285612 16.5915661 3.8854973 -1.1869613 7.3330255 6.8936048 -0.7527395 -14.1686049 -4.4663377 -5.7358313 -14.0977821 3.6173573 2.0226846 -12.0312757 -11.6028395 -0.8875479 -4.6472917 -4.4501982 7.9300728 5.2685876 1.1395495 1.0495285 -2.2080557 -0.4401309 -7.8135996 0.4326058 -3.2152979 0.0359507 -3.0726175 5.3009491 -5.3698606 -1.7574289 3.9154079 -0.9417561 11.9412098 -1.6798717 3.7467351 -15.0234966 9.2196865 1.4162728 -13.3323507 3.4898174 4.0855947 -8.8630123 0.5891190 15.7898989 0.1754763 -7.0295091 2.5237777 -0.0697522 -8.2228136 -9.1128540 -0.1443410 5.7356820 -2.6966856 6.8021841 -13.3565512 0.7692858 -0.0017350 -0.8183460 -0.2779693 -2.9579444 0.7298208 -3.0188239 3.5261385 0.3737897 -1.4948070 2.1257656 -3.5959628 4.7835727 -1.7109731 4.2407360 -3.5147188 8.4696903 -6.5428777 2.8906927 -5.3074675 -5.9939132 -3.2019899 -0.4113793 3.5939043 18.3501129 -0.5246549 -4.3705482 -3.7149498 -0.9753384 -6.0236540 2.5998476 -0.9169105 2.2594159 -4.3317108 0.9749677 -6.0340819 -16.6550484 2.6040986 -3.2013183 -0.4922191 -1.3990008 -16.7463322 0.5089490 -7.5990472 -1.4819984 0.6441627 5.1166296 16.5167789 0.0546595 1.0067828 2.5634017 -11.6527214 -16.2455845 -0.4848333 -3.3160374 2.4616346 -1.2627065 -2.9965746 -0.8314478 -1.0691929 -0.3112095 1.6713648 -4.3173347 -19.0507107 -2.9931445 0.1382228 -1.3301370 0.6537225 -0.0059904 2.6937964 16.6580334 -18.6522694 -2.4484344 8.4404564 -3.3065870 4.1694455 2.4029486 14.8837175 -2.0093853 -7.8078399 -4.5795832 -4.9788604 -1.9997243 1.0557140 -2.4418595 -1.8039130 0.6982952 -0.9938517 -0.3424246 1.6998520 1.1037401 -4.1435308 0.1782868 -11.2438555 -5.5760484 0.5332051 -16.3942242 2.6003144 -0.1217633 -0.2781263 -26.9078693 -1.7262987 -3.8342028 -9.1630592 -4.0894613 6.7207079 -2.4522727 0.8881325 -1.6116264 -1.0503147 0.8255600 -4.3376555 2.9487975 -1.1761801 -2.6851444 -1.5447577 18.9518337 0.0965624 0.5806005 1.4971528 0.7899604 -1.9597942 -1.3077756 7.0503497 7.0035524 1.1145325 3.2928293 1.1754961 7.7864475 -15.7639704 1.5887612 3.0478466 -1.2217767 1.9394867 -1.1409389 -0.3496138 -10.2086782 -1.8937407 -3.0126603 -1.1617008 -0.6786072 -0.8416738 0.0741592 -1.6585736 0.7428906 -2.9074585 3.4630809 0.7463519 -0.0833263 2.1699784 -5.7032285 5.5882058 -5.5401969 -5.1139932 -12.1786556 -6.5823183 -4.0260229 -8.2699270 4.4309239 -2.4186850 1.5009061 -13.0020695 -2.6466789 -9.9364767 3.6453192 -0.7042352 1.5355834 -2.6541412 -5.0780387 -10.0396261 -2.9514446 9.1480427 -3.4107602 -7.2782350 5.5175958 -17.4764252 -0.0089048 2.4180214 -0.1898851 -8.8366051 -1.0025219 -1.5532943 -4.1854987 -0.7191131 -3.4993141 -5.3650255 0.1063041 -1.5652407 -2.0485952 0.7317358 -8.4592285 -22.6326485 -6.7237411 -2.7538061 -2.2001626 2.0454726 1.4378036 -11.4952841 11.9461737 -23.9562645 -7.0007658 -1.2433082 -7.3571124 7.4133549 5.4790912 -5.6661701 -3.7181568 -6.1063399 2.7937944 -7.2356524 -13.0899353 0.4330168 -3.6611292 -3.9087248 -4.8730474 -2.2707329 -1.5023783 3.2459152 2.1161454 -12.5672026 0.5602272 -5.5088887 -1.7124143 1.2828099 7.1203570 0.6367993 -0.2599826 -3.4161620 -13.7311211 -2.7201443 -7.5911460 -9.6490335 -12.7270708 11.5159588 -8.4115505 1.7202555 -5.1923919 -11.2059097 0.6784270 -6.8817835 -2.9584315 -0.2652558 -3.0720468 -3.1043243 40.6489944 0.8543623 0.3438757 0.4873373 -12.0249052 2.0071607 -2.6737077 1.8605758 15.1465883 1.6605034 -2.7263255 0.1105254 3.1588154 16.0182018 -1.1097714 -7.4533076 -2.0500977 0.6558553 -0.2489294 0.9977202 -2.2438636 -3.0859504 0.5135112 2.6924167 -0.6124648 3.3537314 -3.5472732 -1.2733489 8.2386274 -1.0912316 -2.1805453 -9.2010660 -5.0646420 2.5941291 -2.1612456 9.3493443 -2.5443609 -6.6468472 -15.8197241 -18.7551689 -6.4769006 2.1999502 7.6299067 -3.4097908 -2.3245373 -8.1663351 -3.3209589 -15.0157452 -1.6155829 10.1944838 2.2156880 -1.4818921 -4.9782205 -5.8583145 -0.4968928 -5.5024943 -3.4583039 -10.7370987 -0.7883800 3.4838283 1.2391338 2.3143239 -4.2913489 -0.1255314 -3.0932081 -1.7270297 -2.0312834 11.5678558 -6.3983574 -3.6056421 -5.3497686 -2.1245732 -2.9958758 -1.1007719 -4.2490478 4.4037662 -8.6605253 0.1007861 -2.2827597 2.4298837 -0.8648971 -14.4778681 6.9753256 -19.9711323 -4.2149639 2.6280606 -15.0139322 13.0579500 7.3315091 -5.8171325 -3.2420938 -1.1661816 -2.6084459 -10.8656769 -19.4306278 2.1365955 -5.5849910 -5.1355290 -8.7573071 -1.9759096 -1.6665787 3.4901292 1.6425711 -16.8005390 0.8751054 -8.3483267 -12.9641676 2.4151592 -0.3141458 -0.8875837 1.3328708 -3.0532722 -9.6017847 -3.9481823 -6.6857414 -3.5273538 -16.1534367 20.5333328 -5.5689168 3.2211356 -6.5821509 -12.3990870 0.2290263 -9.6037483 0.4559056 -0.7338713 0.3136911 -1.8819207 64.6993332 -0.3277796 3.5079494 -1.0309095 -11.0988493 -5.7068114 -4.1118975 -3.3471875 23.0572510 2.7469997 -7.8626699 3.2814429 9.8175831 -0.0859231 -4.2752471 -3.4330826 -17.1629391 0.5115833 -1.8029283 2.2932296 -5.6692400 -5.7635188 9.7256050 4.6775651 -2.0764799 4.8104138 -5.7642131 -4.4237080 23.4801483 -2.6448588 3.0739098 -9.9439993 -13.4064779 5.2036028 -1.0090439 0.5639990 0.4964418 -3.1727793 -4.1121740 0.7959346 4.4825559 0.1258643 3.8001094 -3.7178500 -1.2086580 2.7578232 3.7858911 -0.3556443 -0.0298881 2.9500172 -1.6485350 -2.3671341 2.1836052 6.5668011 -0.8809472 -1.3101194 -0.0153205 9.7324991 -0.3473126 -0.7160741 -4.2491007 1.2869319 -1.0679282 0.0663489 -1.0239786 -3.9136438 2.7926636 -3.0425634 -3.3181531 -0.9183946 1.3415390 -3.0384493 0.0398397 2.1937473 0.7122597 0.0370175 -1.4857259 0.0247853 7.4017725 -0.4204823 0.7036910 2.4170291 -7.6224194 4.4097610 3.4943540 -0.0595617 -1.3428330 13.5658894 -1.9966733 -0.2690186 -1.8573918 0.7048873 0.8658983 -2.9129560 -4.3519158 6.5172520 0.5247165 -1.1017267 0.4043637 -3.0181804 -4.2932062 1.0255615 4.6747565 0.8725466 0.7582092 0.2802382 -0.6814363 1.1150100 0.0282647 4.4695473 1.8540349 -1.2643274 0.2668261 -1.7129893 1.7006810 1.3024722 -2.4479139 7.4444160 2.3795373 -4.2862692 5.6180592 -0.1065241 -0.4481990 -9.8555546 -0.8006402 -0.6327097 2.1796980 2.2203796 3.7162588 -4.3228259 -1.6388223 3.2203557 0.0526844 0.3797540 -2.9906578 -0.8482589 2.6146452 2.3358886 -0.2758173 -1.4012461 0.0907088 0.0101665 1.6190665 0.1189308 -0.2156928 -3.0190101 -0.5085062 6.0531020 -0.1560644 -4.9629478 -0.1694872 0.6693822 -1.6320330 0.0602936 -2.2926147 1.8672440 0.7883848 0.1984487 -0.8222169 0.8063523 1.6699475 3.0682542 0.0940661 2.7895124 19.0096970 -0.5715057 -5.2673602 -3.8944740 -1.7251732 -5.8826690 2.3085370 -0.6923158 2.2393782 -4.3770466 0.8857024 -6.6026955 -21.0688839 2.5607405 -4.5511928 -0.3046817 -0.8152677 -17.2205906 0.2510508 -8.3991976 -1.2104355 0.1318548 6.3114114 18.1288700 -0.1797083 0.8066004 2.8621552 -9.1248226 -15.8935070 -0.2743972 -2.7948599 -0.6931753 -1.4926634 -3.1107614 -1.2689142 -1.2735639 -0.1633912 1.5438808 -4.4659357 -20.6940060 -3.1374569 -0.4104537 -1.7253160 0.5576965 -0.2476956 2.3176281 17.2812119 -18.9440498 -1.2960397 9.5573158 -3.1343040 3.8516297 2.3137412 15.5738869 -2.0673375 -9.3486576 -5.9023061 -6.4280686 -1.9050757 1.0642086 -2.2894931 -1.4248304 1.2614521 -1.0285254 -2.3252780 1.8018849 0.5836945 -4.7883911 -0.0014549 -12.9190063 -5.2510743 0.7539816 14.5778122 2.8352137 0.6551988 0.1859495 -29.3001938 -1.6301711 -4.3730316 -10.2179966 -4.7211151 6.8031316 -3.0899148 1.0935367 -1.9727435 -1.1719954 1.1448158 -4.4531207 2.9699118 -1.1138403 -3.8198650 -1.2186931 17.6931896 0.3071976 0.8880785 2.1745350 1.0838840 -2.5322242 -1.5074645 -14.8239880 8.3238173 1.0931709 2.9842479 1.2677490 7.7137723 -2.0489209 2.1701565 3.5881417 -2.3870983 1.9727098 -1.2230756 -0.5375246 -11.0612841 -1.6670532 0.2613679 -2.5051880 -0.7910526 -1.3821727 0.8960657 -1.8580768 6.5171709 -4.4317946 3.0032885 1.3179581 -0.1199747 2.1207891 -4.6171293 3.0698974 -6.3443713 -5.7135997 -12.6757555 -6.2271972 -5.4955521 -3.0953856 6.1811337 -2.2894185 2.8481984 -14.8134174 -3.2242923 -4.1687236 -13.8873167 -2.8907039 -6.4488406 -1.6824206 -3.6108022 -17.3751793 -2.5821433 -6.4861174 -2.3905113 -6.3102264 6.0274210 -9.7138777 0.1371223 2.0292411 0.6802607 -8.7725401 0.1360515 -1.3192329 -2.2923822 2.8880129 -3.7893436 -5.2057710 2.4696076 -2.9521756 -1.7978672 0.5143706 -6.2561178 -30.4822426 -6.8603787 -3.7832248 -3.1364169 1.3792398 1.3149362 -10.5597439 7.4639349 -24.5279446 -3.0523918 -0.3144474 -6.0160761 7.0045609 5.5723562 -7.5943694 -3.1174600 -12.3826427 1.2372166 -12.9441996 -13.9746590 0.9568416 -5.2132530 -4.3861809 -6.0725093 -2.6255429 -2.1592517 3.1306758 0.7986730 -13.9653749 -0.2492853 -8.5143166 -4.8810945 2.0195875 17.1798458 0.9850262 0.7885240 -3.4063811 -8.9319906 -3.3006816 -8.7207403 -11.6967344 -13.0893936 13.5498505 -8.2087288 0.5053090 -5.3284802 -9.9350719 0.8682534 -6.6668763 -3.0336063 -3.9224048 -4.0168533 -1.7823157 37.6074295 0.8101310 1.2335874 2.1068349 -10.9262180 -1.2299511 -3.1314268 -2.3637865 17.3694744 2.2475641 -3.5511975 -1.9782518 2.1288998 -6.7792654 1.6402558 -7.8585172 -6.1036577 0.9876579 -2.0615890 1.1114770 6.0498104 -2.5214496 6.2827878 3.5788963 -0.3221714 2.6472933 -2.5080724 -2.5193517 19.2424068 -2.8964770 1.4966344 -8.5363111 -8.6470490 2.4095330 -4.5572619 2.0003486 0.0913308 -6.2002993 -16.2129288 -21.9592991 -11.2860222 1.0618589 6.8011599 -1.5749506 -2.5273039 -18.9842300 -2.5435700 -6.4308925 -1.6896608 -10.1986055 -3.2445791 -2.7107518 -5.0967855 -22.6995201 -5.1293674 -3.3172989 -3.5863419 1.3613235 -1.1652634 -2.3369441 -0.2988807 1.8833925 0.2571327 3.4152491 3.8559637 -0.8950735 -4.1801353 -6.2348914 -4.8437467 -8.9478884 6.5909481 -1.3724926 -4.2177496 -0.2813765 -2.3483367 -9.4917669 -6.4172945 4.9887819 -2.7396564 2.2298238 3.1404414 -10.8300352 13.4673576 -17.9514771 -0.8343209 2.2888262 -12.6322632 8.8687048 5.4050350 -2.1254811 -5.2120681 -12.8027544 -8.8158512 -37.9321823 -26.2727966 1.9581485 -8.0462208 -3.7567532 0.0820860 -3.0896835 -7.0613017 4.4543719 2.1412325 -17.8512096 0.4644545 -0.1249377 2.0522771 3.6213114 3.1159754 2.5824955 0.8748567 -5.3641362 -17.9511642 -4.9227548 -5.0121150 -9.7380257 -28.8220329 21.4816875 -19.1726742 2.9117527 -9.7768412 -11.5574379 -0.0698842 -12.8711405 1.1277305 -4.3131452 -6.0965614 -0.3466585 36.0900879 1.9014144 3.1834106 3.8818245 -10.5907907 1.0911809 -3.5730765 -7.8845048 26.0602551 1.5661182 -2.0259974 0.4280889 5.4090528 0.1797024 3.1507323 -2.0237613 -7.2965312 1.7326456 -1.0105696 3.5582640 2.5144136 -4.0081973 -3.0154078 0.7605826 -0.0336050 0.5564774 2.2237101 -3.2868302 21.5700474 -6.8382516 -0.1712136 -8.1959782 -4.7007689 4.5225964 0.8685227 1.5397586 1.3027782 6.1573076 4.4621816 -5.4788771 -6.5448895 0.9248644 6.3446412 -2.8609695 5.6418247 0.0282324 -0.0589452 1.2925037 -0.2046397 -0.4185945 -5.1065850 -0.0885413 6.3345633 -2.9914038 -2.6106873 -0.0187232 0.3974257 -2.5344656 -0.3581285 2.1421003 -9.6936464 -8.8559494 -17.3154449 0.1688443 2.9281421 -0.8212860 13.8371429 3.3011870 4.2003617 -5.8063517 -0.2762688 3.7828863 -9.8643990 4.6545100 -15.1219282 -0.7253625 -8.6865931 12.0122738 0.0158568 2.8269002 2.6826870 0.5210577 -7.6296091 2.5016451 5.4896197 2.6121459 -10.1716337 2.7202971 -9.9502554 -1.2612568 -12.9918728 -1.2246366 2.6123612 5.2054114 -1.2847122 -1.5305206 -8.1359167 -6.4380488 -5.8375783 -1.8391991 -4.0954590 1.3079211 -3.5126665 -11.1200199 6.2962909 0.7359321 0.0882967 -8.8766136 0.4529581 -2.2726719 6.1900234 -6.4489064 -1.5735703 5.0603714 1.7409711 2.5435903 2.4035122 13.7748566 -1.4409598 13.3315859 -0.2136920 -1.2677879 -2.6647174 -7.7417932 -7.0385647 -3.0781479 4.7657342 -6.8304319 2.2984519 -5.5904527 -9.5848284 -2.3977385 -1.9801066 -1.5427899 -2.2278342 -3.2994902 1.7473094 1.1560179 3.5548491 -20.0313244 5.5056434 0.0678444 16.6779690 2.6190147 2.0479693 -5.2965107 9.4486961 -3.4802988 1.3745580 -19.7236385 3.4795401 -10.3783445 1.4860964 8.3240919 1.1400216 -10.6856413 54.8733559 -1.3915502 2.1310110 -6.9726796 -10.3474541 7.5220838 -0.0383727 2.5200794 17.8921261 -0.7773904 -5.7837572 -4.4553237 -2.4465578 -5.6261201 2.5487208 -0.6034343 1.8298396 -4.9475293 0.9253704 -7.4220128 -22.9680939 4.6954389 -3.7433681 -0.4297927 -1.2430860 -26.0471439 0.5483475 -9.7948418 -1.1242861 -0.6119256 5.5583930 18.5914898 -0.3181971 0.8714896 3.0183849 -6.9705315 -15.2474632 -0.0028132 -3.5590703 0.5272857 -1.5164173 -3.6705396 -2.1943350 -2.0100739 -0.4052932 1.9325085 -5.8286242 -22.2319489 -3.3780396 -0.9696891 -1.9898055 0.4415144 -0.5112610 1.5309762 17.2758598 -19.6015148 -1.9036371 11.0878525 -3.6278572 3.4238553 1.8545210 18.2928886 -2.5143020 -9.2322435 -5.2602329 -7.3944049 -2.2662027 0.9369922 -2.7597017 -1.6401387 1.2359698 -1.1041821 -2.3110681 1.6026239 0.2766254 -5.1859341 0.1505139 -14.3626766 -6.7037597 0.4784289 15.2407913 2.7317517 1.1538246 -0.1268234 -31.9038143 -1.5371935 -5.1107779 -11.1012850 -5.3757019 6.8958735 -3.8689861 1.2591929 -2.3982587 -0.9722707 0.8770447 -4.4496822 3.4012668 -0.4802870 -3.0608330 -1.3207240 17.9715633 0.6324654 0.8987327 2.4080551 1.5356079 -3.3235343 -1.3198620 -16.1911068 9.0901270 1.1878089 2.6143134 1.0351585 7.3878455 -4.5498490 2.2404752 3.7292762 -1.5504929 2.1725380 -0.0287746 -0.4138197 -13.2963934 -1.4228749 4.6755648 -2.6536500 -1.1642445 -1.9475321 0.6778810 -1.7324120 1.5399467 -5.7203927 5.2564735 1.7161202 -0.6154287 2.2633588 -4.4384198 2.1266067 6.6084533 -6.2947140 -15.4105787 -10.1537066 -8.3508005 -4.0856490 6.9042134 -2.0886829 2.4301031 -16.2654266 -3.4975855 -2.4797714 -5.7053003 -6.9327168 3.8938324 -1.4675024 -5.5058446 -20.8487968 -2.8819580 9.7724085 -2.0163052 -4.8135777 2.4677496 -2.6041687 -0.1673055 1.7874776 0.6823134 1.0897263 1.4362866 -1.3041832 -4.8266034 0.8663443 -4.3805542 -6.6289673 6.9663463 -3.7710230 -2.3402398 0.7238924 -6.8740449 -26.8406773 -7.1957712 -5.1462712 -3.7693043 2.2923820 1.2690791 -11.3808460 17.2593536 -28.3082943 2.8604827 1.3751962 -6.3413239 5.9139891 5.0638776 -16.9875946 -5.8956017 -19.5554848 4.9036107 -12.4722891 -12.5571527 -0.3873712 -5.8883486 -4.5035686 -3.1845107 -2.8858607 -4.2442474 2.6788018 -0.7130941 -14.7817850 0.1881853 -7.8943639 0.8984458 1.3237339 22.5395470 0.6172568 1.4159212 -3.8261602 -10.1540270 -2.9821777 -9.8084431 -10.5285902 -12.1635799 14.9679375 -11.1595440 0.8988233 -6.8651133 -7.4028702 0.4759005 -7.1195564 -3.1999040 -1.8087354 -3.6671832 -2.3329415 35.7386780 0.7451836 1.6260939 3.4179049 -8.4971972 7.6254592 -3.0554733 0.9057945 20.1789646 1.7574311 -6.1668272 -0.5871697 0.2328817 2.7221673 2.5308664 -7.8974738 -5.1109796 0.8987162 0.3178869 1.1429081 17.8256207 -2.6529202 4.7123675 -1.1892364 -1.2577869 1.7065719 -1.8172649 -0.7749608 15.1540890 -8.7348747 -17.2107639 -8.6614227 -11.5298481 2.7672596 -5.7366014 0.9071450 75.0893555 -5.0714602 -21.8422451 -14.8644323 -17.2585716 3.4953930 10.0807018 -3.9468818 0.6612321 -7.8801346 -5.5586362 8.7355518 -2.7152431 -8.8277349 -12.9332123 -1.3610752 -0.0053357 -9.4565344 6.2565398 -6.9078403 -2.8982193 -5.1603017 0.9876900 13.1326084 -1.4012880 -0.0294308 3.4575317 -16.7674580 9.5156431 -1.3070776 -2.3902740 -2.1980486 -2.6045868 -12.4127712 13.2476921 -3.2181654 -3.5255129 -0.7782915 -8.0589399 -18.5827332 -6.2266440 1.3906240 -5.8840384 2.6164632 0.6970553 -7.7640138 16.4090328 -17.7510796 -9.3554077 3.6644313 -11.1209955 10.6903553 5.3087072 18.8198624 -11.4756174 -7.9692340 -0.5992338 -19.0319481 -16.4749336 1.0858287 -9.9896717 -12.2655144 -23.6053524 -3.6123400 -3.5077670 4.0871301 2.1466141 -22.1656761 -0.6138527 11.9543600 -12.8475332 3.5156600 2.6750340 0.5338578 -0.3817326 -5.1896019 -9.1002960 -6.0886436 -10.3142834 0.2680136 -18.2830391 22.5766201 -5.8326197 2.7859087 -12.8920889 -7.0960736 0.7000269 -12.7444105 -1.5437683 -5.4188652 -3.8524961 -1.2895797 25.5843697 0.1599238 4.2286334 3.5504906 0.1289996 -1.7964768 -5.2455430 -12.2560034 29.9453659 2.9131317 -1.7778280 -0.9469824 -2.4298327 -1.6345928 2.1708255 -1.6626887 -24.7401123 0.3659902 -2.7567680 2.3287859 14.9631605 -5.6976943 2.3773825 0.9831685 -0.7994194 -4.1960669 -13.0162764 -2.9317491 15.3972034 -8.2206326 -0.6533353 -9.0447378 -14.6017132 4.7998147 -3.9748015 -5.0177207 10.1751060 -8.0728331 -5.5331359 12.1278181 2.9481902 7.4057484 2.2590425 -8.9313726 9.7114887 5.9652576 5.2701755 -3.9162087 -0.0496723 22.2760429 -9.5274525 -4.2997031 1.4487401 -6.2223225 -23.4669704 -0.9298908 -5.2277799 9.3617811 -25.8284798 -10.7319250 2.7263079 -10.4106560 -0.3601385 0.1626460 -4.1509662 0.5534051 -0.3055956 -0.6915279 -12.5365772 -25.2173080 6.0323825 2.4248495 -2.4231470 -1.6510752 -1.3602089 -0.3251607 -6.4404626 2.9327116 3.5844035 0.2253777 -1.6469136 18.8643723 -14.6800795 -3.9545343 7.5682583 3.0146027 -21.5519505 -0.8477136 0.7880524 -11.6047287 5.3139548 -6.8254480 17.3545494 -14.4365788 -10.0030766 2.0269876 -7.8052053 -11.4954472 -4.5571985 -6.2397342 -15.5970993 14.3577394 10.2238607 -10.3514652 -7.9964142 -0.6562524 -10.5849648 -4.9613595 1.1290805 -3.5267708 -10.7991514 -2.5484748 3.8947494 3.3680801 -2.7207637 -0.6152156 -17.8434868 -3.0136385 -9.9600573 11.7715683 -4.4647269 0.1426912 2.4624076 -8.7357082 -6.4950085 -16.7813148 -4.8844447 -7.4554048 28.7413387 3.6877503 1.5755354 -7.0920320 -0.0623580 3.9565885 -7.1944399 -3.2712705 21.7296181 4.1860261 0.0802372 -3.2171929 -4.4201493 0.1048329 12.5738316 7.5569878 -1.9084545 -3.5185206 -6.3464003 -1.7260115 -2.5653520 -1.3651402 -21.3165627 1.2314634 -8.9346457 4.0108695 -15.9898129 -8.1157942 -21.2806511 -14.4399958 -0.5578766 7.2472029 -19.3249550 -3.1620526 -0.0104161 2.4847252 16.6529598 -1.4712807 -6.3888059 -4.2691655 -3.1468666 -5.6042309 2.1907864 -0.4266543 2.0971992 -4.7675180 0.7512592 -8.9143867 -24.2074528 5.4383144 -3.0258265 -0.4542818 -1.2749125 -23.3970909 0.3004167 -11.4394169 -0.8306801 -1.0063769 6.7239728 19.4943142 -0.5230725 0.9968592 3.1818624 -8.7882109 -15.0422840 -0.0283045 -3.6317527 0.9839109 -1.7210932 -4.0126429 -3.2758980 -2.4558101 -0.2321955 1.3705684 -5.9018917 -22.5926857 -3.5435798 -1.7092290 -2.2291520 0.4569176 -0.1780565 0.8125602 16.0913372 -20.3521881 0.5380369 11.9565334 -3.0281987 3.4695508 1.6468291 17.7588215 -2.0126729 -9.3332138 -5.2807121 -8.4763746 -2.3058546 0.9865475 -2.5516520 -1.5719739 2.1775475 -0.9504387 -2.8194227 1.3960855 -0.2782722 -6.0386572 0.3977075 -15.8855581 -6.7929764 0.9508559 13.2642117 2.2546980 1.8365989 0.1426104 -33.0429840 -1.3211124 -5.9039626 -11.9714260 -6.0941114 6.7480869 -4.5523276 0.6875834 -2.7761443 -1.1231619 1.1671550 -4.6594319 3.7618649 -0.1427250 -3.3452048 -1.0630579 16.9688740 1.1946598 1.3981105 2.3529592 1.7405279 -3.7397058 -1.1381127 -34.6308594 10.3784609 1.0956708 2.0233259 0.3856852 7.1859136 -18.1363506 3.0240920 3.9604192 -1.5829854 2.0332899 0.0532900 -0.3778324 -19.1935635 -1.3807334 -0.6943592 0.3251043 -1.2212781 -2.0205011 0.5566075 -2.0135860 6.6039414 -5.2965312 5.2908564 2.0547929 -1.1987293 2.2086194 -2.1264403 0.1990777 -10.9288177 -8.7003765 -16.6711216 -7.7233367 -7.7775841 -6.9736395 8.6367636 -1.6076510 4.2288866 -16.7047710 -3.6012075 0.4055221 0.7253104 -9.7631073 7.7130890 -1.0664920 -2.7257376 -11.6321487 -2.7473385 17.8193531 -1.3091824 -6.0257282 0.4181522 6.2361412 -2.1729598 2.3110919 1.0767432 10.4193974 3.3642783 -1.7179164 -1.9552377 5.6825266 -3.5704987 -5.9705329 6.2394018 -4.4433446 -1.6830282 0.6197266 -6.6801825 -9.6207247 -6.7726469 -7.6896625 -4.3466363 3.1275423 3.4462874 -12.2584057 43.4208183 -22.7321835 5.4385433 0.9389220 -6.0516534 6.1553788 4.4055443 -23.0336494 -5.3104630 -34.7766953 6.3073063 -14.6448336 -14.6184711 0.1103799 -6.1373148 -3.7519610 -4.7512732 -2.7473021 -4.6080666 2.3037806 -2.5087974 -16.6807728 -0.4121314 -15.6704397 -6.0207553 2.3433702 -2.7740672 -0.9358487 2.3885486 -2.8233888 -17.9547462 -3.2536316 -12.9986143 -16.8852177 -13.4363241 16.7915077 -10.8954668 1.6549759 -7.3621211 -7.1816978 1.5484831 -5.7523856 -3.3063877 -3.8051283 -5.4049110 -1.6990939 38.3920746 1.1099414 2.9635208 3.3089700 -7.5518641 16.2847633 -3.5540929 7.1415386 23.0297070 2.1937006 -5.3541327 -2.3181949 0.9612461 -10.1833754 5.7684698 -8.3751144 -5.9914837 1.0783197 -2.3949924 1.2039832 0.6873560 -2.9983525 -1.9792787 5.7641234 -0.4929737 1.6741621 -2.7140923 -1.9329522 18.5565109 -5.1202669 -13.4204540 -8.1705990 -15.4144716 2.4281197 -4.3099942 1.0161029 16.7813740 -11.7988644 -21.8348789 -18.6305828 -14.3022537 -5.1770444 10.6727524 -3.2305918 7.7959309 -3.5338821 -4.3099699 7.0862298 -3.1787682 -7.3848977 1.2103769 -1.4594755 -1.5075140 -26.3664665 -0.7821916 -4.6449671 -2.5816979 -8.8443718 12.5492811 -7.5798202 -3.9028199 2.4574924 2.7845242 5.7063556 1.3086339 1.0564433 -3.6854095 2.8999698 -3.6745391 -11.6575346 8.2925644 -1.2623454 -3.0336363 -0.8836020 -4.5619044 -4.5116177 -8.1474562 -9.8486996 -5.2964191 4.0738196 4.6817999 -21.7993221 13.5047989 -8.6915274 -20.9403381 11.2238798 -7.4303789 10.3109741 5.8876071 -6.4766755 -7.6807704 -13.4008932 3.1334362 -28.3432446 -29.0843983 1.2422920 -8.6907740 -4.4642935 -15.8765993 -3.7520437 -5.6938167 3.0325212 -5.2987819 -23.6804581 -0.2863465 9.6527195 -9.5203590 5.8828416 6.0469193 -0.5860375 0.3583373 -3.0276883 -8.7431183 -5.0343051 -5.9687567 -0.8605132 -15.9201136 26.8762665 -25.9068012 2.2047226 -10.9326229 -7.5577812 1.6849561 -13.9690933 -1.0486025 -4.9713030 -7.9616380 -2.8421743 46.8633690 1.7830290 3.0342081 3.6161816 -3.2310438 -2.0420318 -5.1156535 -11.9491386 34.8322525 0.7449158 -10.8980169 -6.1704693 4.0757160 0.0438226 6.3088613 -5.5978675 -7.2121930 0.6002284 -1.6473485 0.1167709 0.0293800 -4.4818182 12.1934872 4.5755916 0.0789572 -1.8102177 -2.0899475 -6.8312941 16.5647240 -15.1149807 10.3955812 -9.2494535 -14.7879391 3.7389007 -8.7764654 1.9176066 3.6316767 -13.2463140 -7.0040226 -5.6360388 -4.9942951 2.1615267 16.1026573 3.6224532 2.9009717 -8.9716930 3.6675060 2.7762413 -1.8560138 25.8600388 -9.1028919 -1.5320860 3.3302977 6.9986587 -8.8860655 -4.5169683 12.7653265 -1.9744451 10.1149082 12.8918571 -2.2459993 -9.1132202 6.6802573 0.3024337 -3.0444400 -2.9311185 2.3535182 -6.3317060 -2.6195395 -13.1934099 15.1064444 -1.0266991 -2.0036135 -2.5384300 2.0929728 -2.3226717 1.5992849 23.9461403 2.0644691 5.3216958 -0.6369308 -9.0296097 -9.8837290 -1.1774756 -1.6227595 -0.0124404 -7.5274868 8.1861677 3.1506371 -0.9225181 -7.5102668 -14.6894684 7.3695569 -32.8104820 -0.2916872 0.6085594 -4.3680959 -11.7199707 -11.8411541 -4.3556638 -3.1434913 3.8335519 1.4432458 -9.5112066 -0.3961111 1.7198777 -5.3053474 -7.4544077 0.2587892 -7.5351300 5.2452602 -2.0152404 0.3113985 -1.1615101 -6.7393060 0.0028177 -10.8287811 17.8583183 -1.8987451 3.5863714 -15.3937311 -0.0421749 1.3374316 -7.7187171 7.9818978 0.3147586 3.3046372 -7.6914773 9.9256773 -0.0921846 9.1744747 2.8035843 1.5289969 -8.8437529 -2.0243802 -1.3189728 30.2986279 -0.2289511 0.4882077 -3.1805706 7.0029297 -0.3186890 6.8067904 6.7198501 -5.4016886 -2.5509236 -12.5647707 -3.0903759 0.7222482 -3.7619979 -9.5209198 -6.0216885 -5.4535036 -0.1054805 -5.3869519 -2.4750381 -5.3397827 7.1402693 7.6648865 10.4880457 -9.9312363 -0.6506734 -0.0459949 3.4189939 15.4329834 -2.6014938 -7.5017152 -5.7972822 -4.4334927 -6.0962048 2.7403533 -0.0954721 1.7743478 -4.6298947 1.0366981 -10.9371634 -26.1169987 6.0551357 0.4227452 -0.4372546 -2.2266870 -19.0512238 0.2648503 -12.4606228 -0.2373430 -1.6862782 6.8188200 21.6093063 1.6422507 0.9882849 1.9534773 -16.4665966 -13.8040495 -0.1246978 -3.9958162 -2.0328028 -1.9000341 -4.3643136 -3.5931404 -1.4313637 0.2292298 2.0090055 -6.6768107 -25.1175404 -4.2378068 -2.0483358 -2.6989794 -2.4182112 -0.2228318 -0.0957899 16.6163216 -20.8711929 0.4613633 13.4147758 -3.1002598 2.5662892 0.7857287 23.8117695 -1.1870998 -13.9995298 -3.1865749 -10.3264685 -2.2348573 0.9643244 -2.4980364 -2.2118132 2.5424747 -1.0533314 1.8091486 1.3257779 -0.7534480 -6.3248219 0.4910813 -17.4528255 -7.7438884 1.4073900 -9.2233171 1.1365814 2.5728714 -0.1330973 -35.0721397 -1.5235176 -7.6227498 -12.3999281 -6.7433071 5.0262680 -4.0636191 1.4665360 -3.9141150 -0.7910975 1.5480726 -4.6335158 4.1696649 0.7360082 -4.0897112 -0.6106762 15.7959690 2.4491434 1.2589564 1.4317157 2.1098394 -5.4155216 -0.9638373 -30.8040524 -46.0722313 1.1537429 0.3290071 -4.6805673 7.4355164 8.7854376 3.8565223 5.2919540 -2.4292395 2.4975204 0.7101685 -0.7372409 -24.5007057 -0.6850592 0.6331555 0.5403921 -1.0408531 -2.8034837 0.0806532 -2.0438039 -4.0759668 -7.6382661 10.1222334 2.6387870 -0.4621832 2.5322022 -4.0778880 3.2835281 -18.8046284 -6.9765997 -16.5374088 -6.2782950 -9.1599302 -8.1600332 3.9396579 0.1892313 -5.9274487 -12.4094458 -2.6238968 -6.5812063 -11.5780306 1.0334367 7.7353978 -3.3002262 -7.2415004 -6.6002498 -0.4047827 -10.8611431 -1.4308845 -6.7527242 1.5012144 -1.8213329 8.3024607 2.8053424 -0.4526877 3.8494799 -4.3693185 -3.2493618 -5.9107494 -8.0052738 -3.5811191 -14.8739738 0.4794241 -4.7378063 -0.7818344 2.5253105 -5.7036152 -23.0873470 -8.8748569 -6.1310816 -2.4658296 2.3675618 -0.9413520 -1.4600847 6.5896039 -2.4990835 1.9366801 0.3341574 -6.1878934 7.4572144 3.2434862 -18.4290123 1.0122516 15.6550903 -16.4854240 -21.6502113 -10.8783684 0.2285264 -5.4335303 -2.9003611 -4.6123033 -1.9485998 11.3444233 2.0545981 0.0263645 -16.4498253 0.7913190 -3.3658116 -0.0874275 1.7759558 27.2336788 5.6056943 3.2089391 -4.2920308 -8.1161871 -2.2573171 -10.8489542 -13.0155201 -7.1114974 8.9026003 -11.8986168 2.2272792 -5.1395679 -5.8717132 1.9341466 -5.9727478 -2.3383536 1.9989744 -2.5094609 -0.8842798 34.7489853 3.4745865 3.2206442 1.9249266 -6.7137303 5.6440778 -1.6162887 1.6837031 9.7162523 1.4641364 -3.9641013 0.3733926 5.5315380 8.3608150 9.3454113 -5.8534122 -5.2030301 3.4481027 3.7698810 -0.6836546 -9.7610626 -0.5186371 -2.7253318 8.0502930 -1.1628257 1.5299798 2.0652344 -1.8476154 2.2432652 -15.1745625 -12.9854994 -7.6811457 -5.1712213 3.2685668 -3.0972500 2.7400138 0.1959756 -8.4606361 -26.7446690 -12.7912760 -13.0952263 -4.7223182 6.4987526 0.2596485 -8.5469952 -0.5942954 -1.4146258 -2.3830464 0.1490837 14.9313688 -7.0946074 -2.1738708 -7.0984440 -5.8961043 -4.7888608 0.1322915 -1.7932926 -16.3580894 8.4432449 -4.3723884 10.1025085 1.3029622 1.8410629 3.9179833 9.0020561 -2.3421812 -6.8299022 -12.9655762 -3.6469641 -3.7093515 -3.1235747 -4.1242404 -1.4531505 3.7603352 0.1339406 -1.6501546 -9.5623274 -10.0918131 -2.6077509 -0.3940886 0.1253363 -6.0034604 8.3494463 0.1076482 8.0810604 12.1619034 -11.0721893 7.1799250 3.8003066 -0.4171554 6.6893268 8.2123604 -9.6584816 -29.7694035 -14.5637798 2.4895720 -8.4206505 -5.4625278 -7.1670628 -3.4832828 16.5229702 3.7091279 0.6490047 -22.0469704 0.8731387 -11.1388979 -2.4707563 3.6286108 -0.1447219 5.3570547 2.4971344 -1.3635437 -8.0022755 -2.8140163 -10.8855267 -6.0676689 -15.3051491 17.6233292 -14.6617327 -4.6563168 -4.9771767 -8.0707521 3.6939151 -12.3139782 2.1543016 2.6441257 -2.2536535 1.4464983 28.8035526 6.3649435 5.6122365 1.4161477 -5.1641474 -11.3250856 -2.8276250 0.5125163 -14.0381365 1.7536064 -2.4249175 -3.1027102 11.9189863 -0.2316012 9.4099283 -9.9141273 2.7507367 6.1293898 5.8041039 -0.5149974 -0.9237490 -1.1465930 5.3192129 8.4999914 -3.2601819 -1.6261833 0.2349636 -4.6076703 -1.0532190 -18.0316792 -3.2013762 -3.9803689 -13.6702757 5.2515683 9.1208763 3.2598035 -0.1364842 -1.1660185 -0.9587913 -7.3112359 -1.2442586 2.1322522 -9.7722597 3.5920959 4.6875715 -2.1046596 9.2572813 -0.1153093 -0.0477144 12.2611246 0.4174905 3.2104051 2.6956728 3.3073673 -0.3235755 -0.6266969 -10.7366734 -5.7643261 -1.4203495 1.0704323 12.7591734 6.8192177 -1.2313651 -0.0960791 -0.1173718 0.4986645 -11.3140678 -0.0708971 -0.7666277 -28.9718704 -2.1363852 1.5687277 1.4136599 14.1787806 -0.2342341 -0.1506828 -14.7081118 0.8906105 1.2288113 1.8071281 -3.2645833 1.6015931 -5.7569423 0.0883645 0.3113485 -2.6017876 -8.0023966 11.0310659 -8.4535151 -0.1702775 4.6820941 -2.5154674 1.2452120 -8.8923807 0.4045064 -0.3010290 -4.6537104 9.1840496 -0.8086632 3.5466754 -0.2117603 0.4738380 3.7447050 -3.9319537 5.5738411 -2.6382713 6.7341938 5.9417095 -0.0415741 -1.7030442 -4.4491029 -10.0877151 0.5467996 4.5787764 -7.6344180 10.4391994 0.4213228 -0.1281658 2.5155964 -3.0495021 -0.5427144 3.5601397 9.3584728 -6.1282029 0.6867942 12.8391314 -0.9569992 -0.9354581 -8.5086536 8.3826885 -2.0680237 -1.5772969 1.9109286 13.6159458 1.4456240 -0.3092434 4.6525702 2.4893155 3.0589802 -7.8819332 -3.0474780 -0.0669593 -1.7054054 0.0917327 -2.3952930 9.9010868 17.9515915 0.5835911 0.0419154 1.8359463 -5.5594463 -3.9823196 -5.8920665 -0.1724687 24.9302483 -6.4325457 -7.7855186 11.9802332 -0.5679895 1.8303636 0.4385125 12.5088196 -0.6160176 0.6377413 4.4604115 -3.0334880 -8.6675863 -6.0389080 -5.6052551 -6.2870612 1.4068773 -0.2577001 1.8769583 -5.1535001 1.0160325 -11.9860659 -20.5285854 8.5205822 -0.5050393 -0.9010513 -3.2563341 -17.9095783 0.4439223 -14.8990593 -0.1521108 -2.7066047 6.7579360 22.9050522 2.6357157 0.8021042 2.1740570 -15.6024065 -14.0278482 0.1242575 -5.0717525 -2.1217120 -2.2601604 -12.4612417 -5.4696097 -2.3807156 0.0095948 2.0331752 -6.2896395 -26.1277065 -4.9902682 -2.3766909 -3.8244848 -3.3839025 -0.4324787 -0.6195346 15.7552948 -18.8707733 0.9261664 14.5152464 -3.4141898 1.2675207 0.5858886 22.2317410 -0.8428470 -10.0392351 -3.4212666 -9.7589293 -1.9349741 0.9659697 -2.3773332 -2.7051783 2.4907587 -0.8893884 2.3547206 1.1304492 -1.4385993 -6.9828453 0.9868898 -18.2355022 -8.6473360 1.6045470 -1.2770867 0.7748181 2.3614185 -0.0144357 -39.9672585 -1.2225318 -7.7062016 -13.2358294 -7.8161922 3.4134963 -4.1022711 0.9388573 -5.6438417 -0.7314222 1.6753731 -4.9130487 4.2817922 1.6648310 -3.2429602 -0.6228161 15.3411999 2.8594768 1.2488931 1.3845320 2.3550062 -5.7110491 -0.5348276 -29.1641445 -50.4764175 0.5259900 -1.0346478 -5.1462235 6.6057653 6.7823439 4.2544847 4.8455925 -1.9851975 2.6135952 1.5176209 -1.2260532 -27.6150589 -0.0960203 5.9008837 -0.8996372 -1.2951347 -2.9451842 -0.9442425 -2.2156010 15.0665522 -4.6325202 4.6122203 2.9816453 -1.2418823 2.4492834 -4.5771055 1.5089856 -9.5431366 -7.8380055 -19.4870605 -6.7053108 -12.7054167 -7.5831537 2.8314431 -0.0816819 -10.3210554 -11.3712473 -2.8491488 -0.3541606 1.7606447 1.4872980 -37.7448845 -3.8482945 -8.6355152 0.7632483 -0.1789587 11.9929790 -0.7036486 -6.6100349 2.2070658 2.8321958 4.9558201 1.5357211 0.1068779 -28.5964241 1.0093524 -2.4164631 -6.3627810 -12.2735367 -3.9752905 -10.2260017 1.6221179 -4.8764315 -1.2642015 2.7836838 -6.5478392 -16.5028038 -10.3364487 -5.8730149 -5.1898232 4.1807342 -0.5903665 -3.1371891 8.7345448 -0.0667114 9.7347336 2.0403981 -6.5475383 5.6927905 2.7980862 -13.8627224 1.0559772 10.1047974 -4.2899232 -16.7177048 -11.6050158 0.4678240 -5.8616800 -2.9727588 -4.2627516 -1.9091047 10.5665436 1.5368940 -2.1780775 -16.7948074 0.3485430 -1.0777626 -5.3769078 2.5045426 -2.8594773 3.8808765 3.0505886 -2.1502974 -1.6357461 -2.6916473 -10.9189558 -14.1561775 -9.1147442 6.2885962 -10.6364260 1.8603556 -7.6527119 -6.4113288 2.1693256 -6.3813863 -1.8528357 2.1812098 -3.5200682 -1.0931487 35.5452538 3.9490683 3.6371179 3.3221335 -6.2090983 9.5962439 -2.2920992 22.7556019 6.3210421 -0.7799736 -7.3880892 -2.1040170 3.6972950 -20.2509861 8.4817734 -9.3899193 -6.7109537 3.2576122 3.8966687 0.7102633 7.5393276 0.2904390 8.2409344 -0.5037184 -0.3852881 1.8391494 -0.6861085 -1.7083918 27.1041145 -3.5532174 -13.7015772 -7.1371884 -7.7735190 3.3266346 -7.3560643 2.4699032 1.8471521 -9.4695654 -25.3350029 -15.5709648 -16.2346306 -3.0768554 6.5407038 2.5557251 -10.5993891 -8.2743702 -1.9455847 -11.0085182 -8.4655027 8.3218966 -8.9143391 -2.9230459 -9.3898382 -10.3755693 1.1496681 -14.9568634 0.9366684 -3.5514612 11.4776287 11.9331684 7.2392387 3.8959863 2.7333443 0.1207005 -21.8770618 -2.3727725 -11.4257593 -13.1555691 -2.8705556 -15.1757421 -4.4027362 -3.6753523 -1.0164421 4.4765692 -5.5639796 -22.8021450 -11.2928343 -8.7237253 -5.6808333 -4.6034927 0.1198439 -13.6951637 9.9872618 -1.8281577 14.1174803 12.5013895 -10.8072453 5.7480330 2.2965796 6.2142673 2.7666376 -3.8740666 -18.9136314 -31.3116093 -20.4373322 1.5993063 -8.1328630 -3.0893831 -2.3431098 -2.4833376 16.5750637 3.6488883 -1.3155687 -25.7528934 2.3898907 1.4919218 -9.6684723 4.9825888 1.1922200 8.8536644 3.3429182 -2.2852721 -0.6282954 -3.2319796 -13.7168102 -18.0008392 -9.4083624 19.7178345 -17.6840191 5.5981588 -9.4438009 -3.7566211 3.9004114 -11.4137487 0.0758206 3.2783306 -1.7926431 0.5504156 45.2265816 5.5636601 6.9269114 5.1049356 -1.3449346 -5.4255495 -1.7184780 3.0471907 -11.5802860 1.0570529 -4.8933935 -23.9905987 13.7723398 2.1725750 12.4682379 -2.0582569 -23.2219086 6.6405044 7.2873402 -2.7433493 -0.6320756 -0.9769394 2.7414305 -2.4265919 -0.6368669 -1.8118353 1.1498979 -5.8073401 21.8826427 -9.3306923 -9.4463835 -4.6405210 -1.9891901 6.6452088 7.9999175 -1.3372598 1.5156679 -6.5771012 -19.9174919 -8.5894632 0.7421759 -4.9295406 -9.7368889 1.2460116 -14.1830654 9.9867830 3.3166640 -2.9340696 -0.9267907 23.5751762 -10.5582647 -2.6519229 -3.5944602 -3.1642437 -8.5697403 -2.2322056 -2.7760477 16.8180695 -3.2983267 13.9906597 1.4519494 -0.3069491 -1.0037867 -0.4334899 -0.5918965 -1.3715631 -1.7558986 5.7370043 0.6914597 -8.9341879 0.2844581 -2.2477252 -7.5652952 8.9534159 -4.2142944 0.3458557 -3.5259490 -1.1592211 1.1426642 -20.8111687 -7.8855863 0.2180081 15.4042845 4.6062760 9.7104635 4.0853143 -7.6193891 -7.8918500 2.6182122 7.0776086 1.4236542 -27.0020790 -15.0034866 -0.8097916 7.8998961 1.2655550 2.3061745 -7.4753966 18.4300632 -3.4109089 -1.2079082 1.9955570 -2.2896485 -3.2660713 3.9426131 -1.1192509 -7.2976141 12.9826450 -0.8130105 10.9601479 -6.9156189 0.9139312 -8.4108515 2.8982167 2.7569656 5.7785144 19.1652336 9.6251163 0.0873685 4.7176199 -2.6236839 0.4866027 -3.1419842 -8.8998566 2.0862644 -1.9350502 -0.5355055 5.6461854 -3.1298447 5.1693592 5.4892697 3.0970244 -4.1009054 -12.6227121 1.0019188 -1.0666245 4.3875403 -4.4289608 1.2042464 -13.9333515 -10.5797405 1.1471542 20.0101433 -6.1656432 -11.0267658 12.8210344 1.4552921 -12.6130972 1.1641215 -1.4942964 1.9609863 -10.4386110 -10.0901594 -6.8325424 0.2127670 -5.8031974 -6.2792134 -4.0419979 -1.9283416 -0.7564629 10.1472816 10.5718050 -0.2113592 2.8834832 -5.0986099 -3.0661397 -9.4594326 -7.1648841 -6.9961524 -6.4546938 -1.6229666 -0.9059295 1.0434279 -6.6201234 0.6960919 -13.6230049 -20.1803780 12.5837078 0.5688110 -0.5728524 -3.3200626 -16.5336857 0.0929911 -16.7053127 -0.2482699 -2.9180281 6.5436158 24.2512264 1.4991544 0.7586771 2.0587723 -8.9923038 -12.9079428 0.0772145 -5.3498421 -0.4467921 -2.5777001 -12.0724306 -9.0828257 -4.1694908 -0.3657744 2.7295024 -7.0510483 -26.9365921 -5.3193903 -2.4089389 -4.1126990 -3.8404589 -0.3509741 -1.5173751 14.8464127 -18.3119926 1.9979378 14.7942047 -4.1040421 1.3436201 -0.0049557 25.1275730 -1.2988701 -11.5638742 -4.8011532 -10.6718369 -2.0374293 0.9615846 -3.1790311 -2.7692778 2.6361642 -0.8452682 2.9163172 0.7303973 -1.9197633 -7.6586809 1.5150836 -20.3766308 -10.0601864 1.2814727 -4.7060719 -0.3775074 1.6098274 -0.2649972 -41.6147041 -1.3321404 -8.4603281 -14.5598383 -9.3767233 1.8519591 -4.2689133 0.5354451 -7.0436888 -0.8508548 1.3385866 -4.9745145 5.1323404 2.2479591 -4.3886442 -0.2802723 14.0011339 2.8197238 1.3817865 0.7661968 2.5305541 -8.3038769 -0.5716879 -10.3506746 -42.7857857 -1.0729642 -2.3358703 -7.8105974 6.4272156 10.6703424 4.2466707 5.1849551 -1.5874255 3.0343869 1.1550741 -1.2648172 -29.2586880 -0.1332869 2.2931380 0.7574375 -1.6156204 -3.3142130 -0.5207112 -2.2924120 0.9592652 -5.9119396 -0.0032254 2.9689248 -3.1963928 2.6509290 -3.6930830 1.2506144 -13.3972168 -7.8547082 -21.2969837 -9.1785679 -16.1853695 -9.9202471 0.7633995 -0.2257021 -17.0094318 -10.5670795 -3.2609448 -6.2973261 4.1721168 5.1054950 -11.6337137 -3.9814548 -9.7817926 3.6726096 -1.1466402 52.6441269 -0.1720716 -7.6714311 -4.5948267 0.8660448 2.1586285 1.8905658 -0.4139080 -25.9211464 1.5673289 -3.2103546 -7.1325436 -12.9785614 -4.1650033 -16.1357479 0.1037905 -7.7666879 -3.0141451 3.6229177 -5.2376785 -14.4834261 -11.0606222 -6.8880320 -6.1478009 1.0271816 0.6844600 -0.9381846 7.6737475 -2.6266794 15.1617975 1.5095516 -9.2242069 3.8898900 2.3999438 -15.0585670 0.1927869 5.2338271 -4.0393691 -19.0597839 -10.8534555 -0.0597382 -7.0693045 -2.5962765 -6.3951478 -2.2257097 12.3212204 -0.2427656 -2.9094121 -18.3013706 0.6480709 -17.8752880 -1.8729784 2.5811965 -11.5024796 1.6736530 2.2482462 -3.4200935 -13.3311043 -3.5386000 -11.6773767 -23.0869732 -9.0007305 1.7158116 -9.6560230 1.7873788 -8.3983459 -5.3046584 0.7899475 -5.3817606 -0.1270187 4.3971810 -4.5346518 -0.1721743 34.8987160 3.6727171 4.7605538 1.6340320 -6.1144600 -1.6825945 -2.6006370 3.6393883 -7.6408510 -3.4179473 -12.3433409 -3.2154336 3.1934149 -1.3155551 10.6323118 -10.2720413 -5.3173776 3.5039294 3.3980074 -1.2996492 -28.3883095 -0.1978999 2.9253087 8.3217077 -2.9514925 1.3218417 3.4052751 -2.2111571 -0.9444467 -7.6544175 -5.7143579 -7.0105610 -13.6073189 3.6014640 -1.8632522 9.7821054 9.2246523 -9.2078362 -26.1283779 -14.5573807 -18.5846386 -3.0570991 5.0584087 -1.0338912 -13.5414867 -3.5104551 -3.1489124 7.1639752 2.6904001 15.5038128 -10.4765072 -4.1357002 -9.8525162 -8.5101204 0.3802366 -13.3534069 1.3974644 -1.8194571 2.9764833 10.0853529 4.8085017 2.1548858 2.6624379 11.1764307 -14.3226633 -2.5409086 -11.1354332 -6.3861914 -3.2456369 -20.8049908 2.6340463 -8.0566969 -2.2225232 6.2988210 -5.8252745 -6.2966242 -11.8153067 1.0689596 -7.8868618 1.8107028 -2.4255435 -3.5141897 8.2253590 1.5254896 22.2396202 12.4073830 -12.2896185 1.8808414 2.3425162 10.5900459 4.4257321 3.5295858 -4.1733088 -37.0391960 -13.3222351 2.2264276 -10.7150021 -5.0010200 0.2292455 -2.5403159 14.7076521 1.8279146 -1.8112279 -22.9992237 -0.8037814 -5.4212184 -4.7036290 4.4104648 5.2731962 8.5672178 1.5395248 -3.2048595 -0.9692217 -5.4604406 -18.5934772 -24.3857250 -9.7168112 10.1274786 -26.2965889 3.9167552 -8.7069941 -9.9221954 1.9518912 -10.3495178 3.5858254 5.2269750 -6.6490068 2.7632933 47.3302879 6.6579976 6.5788760 4.3872466 -4.7254348 -14.7451077 -4.2672396 -5.1627603 -10.0905218 -1.8417352 -1.8049357 -8.8802443 12.9718351 7.0515289 16.1802273 -4.7842684 -5.1653733 8.0647974 8.3888607 -2.5416865 -7.5610342 -0.6400830 1.0329792 5.8634295 -2.4817398 -1.7567962 6.4564142 -6.1352329 2.2350788 -14.1906672 -2.2172406 -4.1874933 -8.8381186 7.2983332 -2.3227346 -1.6526940 4.1119862 -9.2465954 -15.3840704 -17.0887794 -13.7473021 12.5076523 9.8102360 -0.1168417 1.2370790 -3.6620059 -0.5273044 3.1904836 0.7594553 15.9631052 -20.1250801 3.2197843 -1.1842966 -27.1969280 4.0146513 1.1484295 -2.8102536 10.6117058 -2.5326865 8.5655546 5.5676541 2.4093454 0.0391824 -0.1195771 19.8444672 -3.3654170 -2.9192228 -5.7356043 0.1051049 -6.0281034 -11.3392353 -7.2174959 -8.4413843 11.0883379 -12.0997057 18.6277466 -4.6774030 11.4026880 -0.3614327 -16.6821442 -0.7870005 -1.4570210 15.6437111 2.2748597 -5.6398478 14.9059744 -6.8687305 -8.8858175 1.0686612 11.6126976 -3.0877020 -17.5180912 -16.5699921 -9.5562687 15.1806269 2.2283707 -1.0882797 -3.4897182 10.2455158 -5.0511374 10.7336035 -0.3962638 -8.0930233 -15.1926908 3.3784831 -8.6556349 -0.0246346 4.6573272 0.5836592 8.2916193 3.1723876 0.4905331 -3.4711556 0.8908258 -3.3949187 2.7006264 6.6344104 9.4711304 -3.2542629 -10.8462048 -2.5222337 2.2883823 -8.4756660 -9.2921629 9.5162449 -15.0439634 7.0642486 4.2262249 12.6313620 4.2876415 4.2908440 2.1584389 7.6293602 4.7622962 -1.7897862 -1.6648468 -8.7669888 2.4371119 4.9847307 -0.2891437 6.7761350 -0.0324296 10.1921892 15.2693138 -0.5778957 13.0637350 2.9583032 -15.7176723 0.2190514 -2.1533916 8.4634972 -9.4637384 -15.0601959 -4.6414676 7.3878284 -6.8655329 3.1365523 -11.3816528 2.1868167 3.8951008 3.2977033 9.0683002 -0.6646548 -1.4034474 -16.3910675 -3.2533288 -10.5224285 -7.6059170 -9.6034307 -7.2378087 -4.6384249 -1.2193346 -0.1215395 -7.8232880 0.6152593 -17.2016811 -31.9087486 9.4743643 -0.0892396 -0.2070151 -3.8247039 -18.1832352 -1.6418200 -18.6813259 -0.3195513 -3.4496775 6.7316628 26.2620239 0.9848750 0.5309953 1.7511340 3.1299329 -12.0631208 -0.0364051 -6.5819316 -1.3764927 -3.1575961 -7.3898711 -13.1990108 -7.2315617 -1.2315456 2.6484518 -8.0491629 -27.8667755 -5.5559258 -2.5155118 -4.7027278 -3.9897611 -0.2715850 -2.4433184 12.7775335 -18.6956902 2.0287042 15.3194695 -3.2969527 1.4003345 -0.7634668 28.8928356 3.0458705 -15.0642853 -9.1327391 -8.3284178 -2.0938466 0.8042638 -4.0253296 -2.7427418 3.3790362 -0.5841329 1.1705849 0.5587072 -2.4027781 -8.5573969 2.4543304 -22.4795685 -9.8705359 1.6874026 15.8212376 -1.5271565 0.8153312 0.1068790 -46.7885628 -0.8946275 -9.5178928 -16.0471191 -11.0008450 1.7777138 -4.3437519 0.5768779 -7.7629929 -0.9073338 0.6981399 -5.0272412 5.0332317 2.4235470 -3.4336507 -0.2773462 13.4993868 2.9060812 2.6166978 0.2927469 2.8230832 -9.4986897 0.5783901 -15.0092239 -11.4500818 -3.7510533 -6.3292847 -6.8271494 6.0055079 -14.7394199 4.6546583 5.1743031 -1.4539245 2.9025099 0.6496770 -1.3303342 -31.2607479 0.1642911 2.9228568 0.5060014 -1.7129887 -3.4902632 0.9080487 -2.2835658 3.8953013 -8.1187410 1.8361425 2.8164799 -6.3763580 2.4013469 -4.9988079 -1.8116167 -22.6926899 -8.4679289 -22.9128342 -12.8099937 -20.4768353 -8.4203558 -3.2862959 0.0737138 -22.4615898 -10.5208368 -3.0172629 -7.3723664 -4.8839655 2.7586780 -25.2692337 -3.5183046 -9.2042065 4.4663391 -2.6527901 -25.3128262 0.5188764 -8.2700253 -2.0876074 24.9790974 1.2283058 1.0481061 -0.9060950 -8.0562592 3.2179365 -3.3790469 -7.6217775 3.0862515 -5.3673520 -14.3588190 -0.6730114 -10.3641768 -2.2900572 4.4890466 -4.8922739 -17.1634808 -11.8340054 -8.9328518 -9.9053955 4.5628624 0.5409573 0.2902197 9.0915794 -0.1828339 16.7756729 1.6787441 -7.2918119 3.1166184 0.5312856 -9.5213537 3.4123631 1.6592524 -3.4978657 -14.0756874 -9.3445568 -0.3667988 -8.5246630 -1.4787225 -6.7609859 -2.0563080 9.1520901 0.4239273 -4.3493519 -18.1808147 3.0389240 -12.7749290 -0.0303464 2.9217734 -8.7970600 -0.8823232 1.6056962 -2.2674575 -14.8693333 -5.0307484 -13.5979166 -18.6346130 -12.1201496 2.8395648 -8.3819351 -0.1856268 -8.5718994 -4.1073608 1.5055755 -4.9435740 -1.6770180 3.2636030 -4.7289133 -0.2864847 36.7603226 4.7100968 6.1707654 0.6853557 -4.6262722 10.4435120 2.1465845 -4.6923299 -37.5759277 -6.5112319 -16.8709049 -10.6064186 6.4494457 -19.6700401 11.3696041 -11.1525536 -7.2767625 3.5824447 4.5064096 -0.3696611 -28.0228138 1.0417582 -7.5463161 6.9209309 -1.1092272 1.1010848 7.3671970 -1.5951602 10.4574108 -11.3179064 -5.6946888 -7.4266462 -19.5287209 2.5817726 -6.6392713 -2.2785239 -2.2389238 -10.2524691 -30.9070263 -8.3468971 -22.1586056 -4.8090158 0.8527286 0.7821373 -19.1331863 -7.7050481 -2.8826809 11.2494555 0.5478087 9.5498018 -3.2063954 -6.1614928 -13.0898123 -8.9198313 -3.7994673 -17.7944965 9.1239452 -8.8242245 1.4621357 15.3843851 6.2982020 2.1545765 1.7501839 -19.6214104 0.5286618 -3.7582884 -13.6879807 5.9665947 -5.9017940 -8.9418001 -0.8977002 -12.3265314 -7.0491729 8.4811468 -9.5030689 -7.0603638 -14.8831224 -4.2214642 -8.7954073 7.9471006 -0.9975669 -9.7455635 10.8355017 -12.5311184 10.3414345 15.1642513 -10.8525105 3.4620333 -0.3867586 18.7385197 6.0196404 -2.6968634 -7.5284557 -23.4694901 -14.5859652 1.3651079 -11.5468798 -2.8476820 1.0891929 -2.8364980 14.6940889 2.2091551 -3.5675840 -28.8471432 4.5806880 10.2063427 -1.9598552 4.3154068 -2.6340656 3.2117081 1.2622695 0.3081197 -11.0954304 -6.0160103 -19.0848789 -19.0031967 -26.9799805 6.6869879 -23.3262024 -3.7440579 -8.9123106 -4.9855418 -2.3721845 -9.4019709 4.6344194 7.2491789 -6.5988593 0.6031410 53.5093193 7.6656938 7.3785033 2.7598124 -1.1625037 -12.0483665 1.9152100 -6.4568439 -22.1957340 -5.4191465 -7.9724998 -10.1054792 13.4681549 -8.6961794 16.7655373 -7.6980882 -4.4562578 8.4395638 3.6905234 -4.1093884 -11.1374292 1.0410188 -18.3106384 4.2582974 -6.1858435 -2.5339656 10.7703075 -4.7495217 3.4055331 -17.9653034 0.5799859 -4.7907963 -17.3367233 6.1818805 2.8832026 2.1858640 5.3977876 -2.1999035 -14.3605127 -26.1495762 -13.2173252 11.5482378 7.7630897 -1.6392046 2.0410643 -8.0157728 1.8468313 8.4269428 -0.4416247 -1.0787361 -1.1624211 -4.9312015 -2.1712761 -13.2284441 -9.0759163 0.5560737 -7.0425386 2.6035092 -2.3657982 14.6651354 3.9656286 -1.9360304 1.1573191 -0.3290970 16.3085384 -1.0139614 -8.5229616 -13.0172338 2.7092493 -7.4229565 9.1179514 -4.2305760 -2.8290863 3.9558363 -11.1909809 1.4350929 -1.7159121 10.4368916 -4.4509983 -0.8024628 -1.1285584 -11.6976500 8.3574963 16.7280045 -2.1086671 17.8837852 -10.6239758 3.8278239 4.9482780 3.6998761 -0.2763111 -16.5669498 -15.8909140 -30.1831455 14.1617670 -0.5285608 -7.0064116 -6.4133401 5.3829145 -1.9404241 7.7093229 -0.2223132 3.8079212 -6.1569872 0.3282675 -10.6784964 2.7763591 4.8547940 2.2346358 9.9659300 -0.6647931 2.3391292 -24.0418606 -7.2428946 -20.9267387 11.9442139 4.1930413 16.1228409 -3.1666718 -19.6269417 -3.9974883 1.4856086 -0.1372763 -9.2394114 1.1173180 -1.3059841 -1.4420730 4.2596760 17.5647812 5.8399510 0.6241169 3.0816381 7.5272646 -7.2726541 -6.2558646 -2.2503633 0.0504008 0.2847402 -8.7127113 -21.1884079 17.5597363 0.2285009 8.2598324 -7.3869281 -6.6445456 5.7809639 -3.7775111 -21.6572475 2.4842353 -1.2666619 5.4904904 0.1300978 -6.2275190 -5.2079148 6.6473718 -5.7601628 6.8312435 -8.0364971 2.9706750 5.2474570 11.4179745 4.0504727 -1.0259757 -0.2064887 -24.0909042 -3.4741008 -11.7817192 -4.6822991 -13.6601582 -8.6879272 -11.4838886 -2.9680390 -0.8243144 -10.1672211 0.7106640 -19.7207088 -28.4203587 10.0204811 -8.0463829 -0.5595214 -3.8939066 -16.9787445 -2.5689294 -19.9405384 1.0240216 -3.4345489 8.0845909 27.2462883 -4.8840399 0.3797566 1.2387650 3.0540071 -11.4813805 -0.1059237 -6.6748514 -0.7973860 -3.5019028 -3.2275219 -21.4701672 -8.9603033 -1.0842619 3.4988177 -8.6447182 -28.2579327 -5.8187218 -2.6407719 -5.8777847 -1.0473850 -0.0699650 -2.4915392 12.0415020 -20.0355453 2.4046237 15.5908890 -3.6304195 1.3926362 -2.5417507 18.1109486 7.1607246 -15.6615515 -12.3319645 -10.4331722 -2.2487941 0.5355940 -4.0357423 -3.5764122 4.0213852 -0.1589274 0.5725626 0.8873438 -2.9081123 -9.3400621 3.3306248 -24.6397381 -9.3991919 1.1779171 7.5496802 -1.7252989 -0.0282265 0.5891888 -50.1740303 0.1025014 -10.0180836 -17.5822296 -11.8137560 1.8511970 -5.3987784 1.6195564 -7.3235078 -0.9648711 0.5441495 -4.5539384 6.1093769 1.8851067 -2.0300794 -0.7851878 13.3163223 2.4167454 4.7369823 0.2680448 3.3651145 -10.1543140 0.4722367 -22.4797821 -5.4256749 -10.4794588 -12.0536928 -5.1461315 5.6179771 -10.5577507 5.9565468 5.2506781 -2.6980999 3.6627443 -1.8556619 -1.3471576 -33.5094566 -0.2146791 11.2959156 -0.5914570 -1.1292291 -4.0044532 0.0065655 -1.9492638 9.8395166 -8.1323004 -3.8447680 2.7171037 -9.4028358 2.5272322 -5.5846062 2.0964844 -23.2382584 -9.8588123 -25.6115227 -6.9261322 -26.1614132 -10.5175285 -15.9364624 -4.3270001 -30.7157917 -11.2743292 -3.2723470 -16.1151810 -3.6185622 4.9486947 -13.3417988 -3.1756406 -13.4751625 5.7394743 -2.7309370 -15.3525715 7.7924571 -14.2738743 -2.1567805 20.3559761 -6.5377908 1.5314106 -2.3640106 9.3724985 3.3461573 -4.8672075 -11.5071363 12.3748026 -8.2232561 -8.0977640 -9.1515350 -13.0072966 0.0760526 6.0193124 -9.5270672 -9.1928959 -14.4454393 -9.1615801 -10.9897060 6.9774990 -1.0242378 -0.5849065 11.0097408 -8.5603399 21.1227226 1.4264674 -7.8439984 3.1818173 -2.1983919 -4.2182479 9.0373564 -2.1724339 -3.3977602 -9.2436800 -10.9844198 -0.6454239 -10.7400551 -0.1329758 -6.5266147 -2.4289939 10.5687532 0.6616640 -6.9265532 -20.1752872 0.9264027 -6.0427680 3.3122222 2.2737942 -13.0209188 -5.0423841 1.3676277 -1.0523015 -15.2496567 -4.2008133 -15.8144827 -20.0431118 -17.2800655 -5.6164198 -8.7593603 0.2903819 -8.5926981 -3.2458713 3.7411809 -4.1982288 -0.6865510 1.0703831 -4.3103690 -0.5081998 37.0735664 2.1700923 9.6732273 -0.9201093 -3.1556082 1.9316030 -3.9867444 -8.5951738 -30.3108215 -14.4950962 -26.2479553 -7.0730767 7.0365510 6.5976658 11.7350340 -12.9479628 -7.5843368 4.5405445 0.1134866 0.3867172 -23.6015110 2.0207949 4.9604244 2.2323761 -0.2823573 1.4719394 10.0571003 -0.0404286 21.0889645 -8.6417513 -5.6679020 -7.1921453 -26.7481155 2.7464299 -6.5265484 -2.0742745 28.0781155 -11.4692602 -39.0812645 -13.3974009 -29.2201214 -8.5628405 -23.9746094 -7.0530705 -32.0585785 -14.9448156 -0.7526197 -19.0195332 5.3085866 13.0611305 -0.5465248 -2.5219619 -12.5742397 -7.9939585 -0.3879809 -12.9609556 10.1891489 -11.7901154 -5.5902309 27.6247005 -0.2945465 1.4369305 1.2321968 1.1103734 3.0495703 -5.9248905 -14.4941263 11.8701477 -8.8993301 -10.5334501 -4.1701107 -17.5722790 0.7562120 8.8052235 -19.4181118 -6.8471808 -18.1078720 -22.0250759 -12.8565178 -5.6268282 -2.4533370 -28.5169277 37.6493988 -27.4338360 5.9573240 16.4092655 -10.2903690 4.8733964 -1.9780109 -3.5214715 10.9443779 -7.4824376 -8.4393606 -16.0245228 -18.3731880 0.1538771 -13.9327288 -1.1039553 -2.2807789 -4.9720330 13.7357035 1.1590353 -8.0166016 -27.7598076 2.8994119 2.0178587 -3.7064211 4.2619209 -5.9636550 -4.3596592 1.3548633 1.8214060 -20.1593609 -4.7723823 -26.2878113 -15.3969288 -17.1515999 -15.0119057 -9.5747652 -7.7330813 -8.9411249 -5.7954717 6.2875767 -7.5292850 5.9963040 3.9142275 -4.5642428 1.9808817 54.9242172 4.7601256 9.4784861 -1.8556414 -2.7269044 -14.1844053 -4.0547800 -3.3928998 -19.6383038 -14.6323261 -19.1161938 -15.0094156 8.7400522 7.5722523 14.7812300 -11.9611712 -2.9662366 8.4558573 5.0548043 -3.5681632 -15.9635801 2.4234233 11.1678610 -23.5081768 -5.1966538 -2.8391235 13.1018152 -2.8649199 14.3783760 -18.3377380 0.0387357 -1.1410236 -27.7645245 5.7021976 0.7391406 13.5699854 3.3995860 -4.3834553 -11.2960491 -9.7480602 -12.4771662 -4.2632971 10.4916277 4.5941429 -17.2865868 -14.0050831 2.3534954 0.9548284 -1.6023201 11.5661631 3.9601452 -6.3776379 -6.5372734 -11.4290667 2.5781164 -0.2674506 -2.0379846 10.0786057 25.3645344 13.2340479 4.4776387 1.2493176 3.5212674 0.1848489 17.0123405 0.5632160 -13.4635067 -8.4332142 -2.8897974 -8.7428570 -5.2629414 -5.3753300 -6.2374010 3.9235630 16.0484238 0.7555872 -5.9466581 2.7235582 -1.3972780 5.3163791 -4.8683462 -3.8196065 9.4946232 3.0956936 -1.0288056 26.6438198 -9.6210556 -0.4654208 -0.7681660 -0.7567274 7.5870991 -24.2289658 -18.9189034 -17.7180271 16.6878357 -1.0412912 -0.3565939 -6.8165250 5.9557853 0.6245950 10.9614935 -2.0943773 -3.1956985 -5.4332337 3.0413294 -7.9235640 -22.1298866 2.6887136 0.8532143 -1.1152533 -1.3276758 5.8772483 -7.6738596 -3.7129185 1.0687866 -2.0057068 1.2104590 -0.8904977 -0.7510667 -11.9741840 -3.3452303 3.3704119 -4.3277731 -11.4085302 8.5719652 -0.9971417 -1.4251195 1.2012210 -1.0626171 6.5760198 5.2244563 -0.0914813 5.9380174 -4.6247663 -1.5954924 -1.0930122 -3.7437384 -2.4189942 -1.7976712 -12.8478994 20.0333061 -1.9862795 13.3456659 -7.9162812 3.2361629 6.4760046 2.5929875 -11.8604259 3.6259205 -2.9156656 -0.2516368 11.3523006 -2.1520030 -5.5107741 3.9549224 -7.6516309 -3.3236260 -9.9012365 1.7178389 5.0006399 2.9111958 6.1672578 -0.1310670 2.2714376 -23.9376049 -2.8046672 -12.0542088 -9.0342293 -18.4236736 -14.1169004 -10.6151667 0.9940479 -2.0288980 -9.0843172 0.9080334 -23.4437618 -35.6171532 12.6540003 -13.6777163 0.2165450 -2.6524599 -13.9130659 -2.4264724 -21.2590122 8.4682789 -3.5380375 7.0640674 27.4392796 -10.4530468 -0.1432679 0.0677320 4.8810740 -10.8533573 -0.1428431 -8.5677128 1.4379157 -6.1109743 -5.3351116 -60.4788055 -10.6033611 -0.3824912 2.6234798 -9.3262815 -28.4137650 -9.4705639 -4.2864704 -10.9956017 2.2753925 -0.2670763 -4.5196872 10.8292980 -20.6132755 3.8183403 15.7677374 -3.8106759 1.1763895 -3.4059114 -1.0061156 10.9451542 -14.7257538 -13.6411133 -10.5656700 -2.4750450 -0.0054984 -4.1831408 -1.3223464 4.9404397 0.0690609 0.7247452 0.4527361 -4.8748579 -8.4602165 -0.6089421 -28.2392750 -9.6438370 2.4151487 -7.4051204 -1.1107091 -1.0730709 0.6271639 -53.9738693 -3.6181936 -11.2097492 -22.1462193 -11.5741825 0.6538739 -7.3530989 2.8818877 -5.7209811 0.4548823 2.2057145 -4.5435667 5.9499936 2.2056873 -2.2955008 -2.1395795 16.5225887 1.0435578 3.7881355 1.3138148 4.9733186 -5.4538908 -3.9889116 -19.0900650 0.3714319 -19.5486507 -20.6505852 -1.1307130 6.6176863 -12.5968065 6.7458935 4.5880079 -2.2189875 2.9376304 3.0206470 -1.6546834 -35.3239937 -1.0485266 12.2416391 1.0006459 -0.6748099 -2.9142592 -1.4593785 -1.9660815 12.4449043 -7.0538435 -15.6798525 2.4269886 -11.9805727 2.7807980 -6.1942096 -9.6343603 -6.1535611 -13.0428782 -25.2134724 -12.4227314 -36.7158699 -14.4321547 -33.9219322 -1.1626284 -26.6201248 -19.3700066 -2.9936540 -31.8770981 5.3722582 7.7414999 7.1641927 -2.9574022 -10.0298367 5.0296040 -7.0651188 21.6650257 1.5622188 -12.3385935 -8.9231348 24.4386520 -11.9164839 0.8740624 -3.4504526 -7.2996082 4.8488784 -9.0061560 -12.2342834 20.1396179 -12.5035143 -10.9685850 -30.6715641 -18.5141220 -2.1834371 4.8067198 -12.5951109 -0.3171053 -17.6248627 -10.1514015 -14.6139631 3.0407526 -0.0640824 -3.7378123 37.8996468 -19.6089115 21.3049335 -0.7331545 -7.1812873 0.6384743 -1.3451295 -3.0363145 15.6037807 -1.7863463 3.0226684 -8.8887415 -12.6487284 -1.3508852 -12.5752831 5.0809078 -7.3406963 -2.6296093 9.7552423 -0.7475103 -9.2146559 -19.2093391 -1.9533174 -14.3310347 6.9248815 6.4629941 -12.3002062 -10.5577364 -0.7907748 -0.5315626 -24.3557701 -7.7930574 -16.7141495 -21.8812218 -14.0347300 -5.3695784 -7.2765765 1.2559359 -7.3745856 -2.9203453 2.9161370 -2.3570726 0.6827794 1.6421775 -8.4273472 -1.6736811 40.3470802 0.0494852 9.8840837 -4.0409608 -1.6441382 -4.1357789 -8.8856430 2.0427136 -38.3951416 -25.3248215 -42.7052040 1.7164494 7.8074489 10.2271814 14.6641302 -16.2592354 -12.0001040 2.8548820 2.9808514 0.2069292 -0.9485126 -0.0124347 3.0749340 13.0296478 -1.1922367 1.3744538 12.6946449 -1.0322268 19.0152664 -8.7517509 2.3966298 -7.7460423 -35.5831032 2.5341792 -7.2009978 -16.0234966 -4.2600002 -17.7848358 -35.3558769 -8.2618237 -39.9057999 -19.3614178 -45.4053268 -1.1290643 -33.3532295 -28.6183052 -2.6223869 -22.1115456 2.0427990 15.4563828 8.3994560 -2.2594275 -13.9407883 -8.2054605 -3.2854388 51.2954559 11.9718475 -17.2397423 -10.5582752 40.2826309 -9.6603260 1.2747189 0.0132996 -1.1560218 13.6136456 -9.5654402 -19.0686474 18.7399998 -14.1616077 -13.0981321 -20.7158070 -25.4178371 -2.9275718 6.6517549 -15.9566889 4.0464048 -19.9349537 -11.5441446 -17.7770576 -10.2059898 -0.1713902 -29.9578609 17.0582752 -24.0332127 -31.4286308 10.5546408 -10.1349077 0.9465476 0.6252334 8.3048801 18.2809505 -12.6538639 -7.2868600 -15.9435682 -11.7377558 -1.4211973 -13.8430128 2.9399590 -12.4313602 -4.9525385 15.9840097 2.8423295 -9.7516527 -27.0518875 -0.1663851 -20.8501720 7.8929725 7.9918752 -2.8936374 -13.8476915 -3.4513276 0.6581854 -43.7952728 -9.2335501 -30.6005974 -28.1639061 -10.1570177 -33.7294579 -11.1460085 -3.8469844 -9.0552931 -2.5898924 4.1133437 -7.5568786 5.6260591 2.1039407 -7.7554746 -1.7256613 53.0058289 2.0702312 12.2662125 -5.1617351 4.6630001 -19.7468681 -9.5013733 -3.3415735 -27.2864685 -33.9133835 -54.7520218 -10.3176632 14.6508989 -6.1483693 23.1677399 -11.1389265 -15.4482660 5.7642865 5.1555328 -3.0373631 20.0171242 -0.4846368 6.1346469 13.0816689 -1.9427490 -3.7444749 13.2884874 -4.2006698 43.7833824 -19.4562683 12.8875351 -3.3841136 -38.7950706 5.0916901 -2.3509204 -2.5807164 1.1939163 -1.1466485 -20.8116150 -2.8679352 -16.0648861 3.2203789 -5.7034588 -2.8751769 -24.4135933 -8.5351801 -0.5551578 0.5911735 -0.4458947 16.1033688 -7.6157336 -1.1935391 -6.7394376 -9.7793341 15.9079361 4.2533240 18.9309597 -0.1096902 -3.8768299 25.2639256 -7.4065557 -2.2723901 1.0680888 0.6802092 10.9268513 -1.1778435 -9.7394094 -4.0345402 -3.8142033 -11.3573980 4.7486777 -9.7477112 -14.5454197 2.8456414 11.1967564 -13.7180147 -16.3493595 -12.9390421 -8.1629229 5.2963719 0.1059681 1.7536631 14.1952477 -2.6670306 -4.8661041 17.3931446 -7.8278289 -0.5478778 -1.8410372 1.5639424 3.4199486 -24.6771526 -26.5819416 -20.3230934 9.1702719 -1.0702062 -6.6944757 -10.2001858 13.1969852 -2.3571715 13.4704762 0.4120339 1.5179780 -13.6311083 5.2151351 -6.0307951 -3.5910492 3.4039018 1.2400168 -3.8285947 -1.9995477 4.4578319 1.7084880 -1.5357103 -14.4829407 3.5110352 6.1074123 -10.3183241 -24.9177284 6.0173879 -4.3229623 -3.8297443 -11.8642282 -8.6372528 3.1721365 4.8105278 1.4080857 1.9166338 -0.2435380 5.9795036 2.5724792 -1.7737399 -0.4934075 -4.0939369 -0.5575575 -1.2666123 -7.7892556 -24.4386349 0.8521807 -17.9995613 21.3714752 2.3743045 10.7442503 4.2700686 -8.4287367 5.6570921 -2.7671134 4.7374878 6.9665394 -1.1025058 2.5216386 5.0746813 -0.2414714 -12.9370317 -0.5306421 -6.6403017 -6.7724323 -13.2580795 -2.9862964 3.4513135 3.5795176 2.0025377 0.5956898 2.7405126 6.8741889 8.3243494 -15.9988756 -2.9427702 -14.2487926 -14.3953466 -2.4426491 3.9518523 -1.3195630 -11.4464846 0.0588118 -19.8671284 -5.1801004 10.7647476 -0.4330891 0.6365696 -1.3135310 -67.3665161 0.2277318 -16.2225170 10.4109669 -3.5670197 7.7652521 30.6299000 -5.2277727 0.1348640 1.9339699 5.2273993 -9.0237694 -1.2216718 -6.7607117 3.2643695 -3.0296929 0.7288245 -59.0999413 -7.2932329 -4.4975696 -1.3323525 -9.6033306 -30.1547413 -7.3419137 -8.0546923 0.2557657 5.0617857 -1.8219520 -3.0332277 4.7527685 -6.7192726 10.5535793 16.2660866 -2.3313851 1.3945757 -1.6477306 -15.6420670 2.4025192 -0.9070640 -1.3416244 -11.0608673 -2.0203767 -1.3258417 3.1952386 3.5550923 3.4335585 -1.3676846 4.2755489 0.0125174 -3.1602476 -11.4283609 5.4485316 -22.8045082 -12.8046331 2.9326227 -134.5305634 -2.0815718 -3.2714345 2.2010632 -54.7715797 0.9249790 -8.4168196 -20.5123882 -12.7678862 1.7499840 -6.1245799 3.8632729 -6.2996793 2.8357153 -2.2297165 -5.0300183 7.1017561 0.1361548 2.5920343 -4.7664003 14.5272799 1.9435180 5.4514480 -0.4589333 6.6250415 -6.2318969 -0.4186214 -11.3205872 8.1914206 -18.6442432 -22.1178455 -2.8870528 -0.4659596 -13.1067142 5.4888482 7.0115094 -3.9519396 -0.6019014 4.4180279 -2.1001508 -36.9791908 -1.3522429 11.9192724 6.3724213 -1.6752771 1.0429519 5.1773710 -2.8604510 2.5259616 -11.3167067 7.6813645 3.2296240 -6.6122651 0.7290085 -1.2712504 -9.8594646 4.6736770 6.6148558 -13.8195734 -2.8865240 -13.2501554 -5.0630479 -16.3505764 -1.0532600 -0.7736344 -15.4597397 -0.1211795 -6.0225787 -27.8073235 6.8007236 0.9951667 0.6793494 -2.2650757 20.5409832 0.7208652 -7.7837152 8.7174387 -3.6926637 7.8687983 32.6081047 0.7297355 0.5661425 1.1599391 -6.4473114 -11.4722481 -0.5855870 -4.7861109 9.0221481 -2.3817675 -1.3706794 -6.3435249 -6.8116274 3.7690167 0.1851519 -13.2305431 -18.6556206 -3.1844528 -14.9888029 -4.0742693 -2.5605702 -1.7510513 -0.9734336 16.9892235 -20.8909283 3.1079471 17.5911465 -3.2124124 1.2556150 -0.7841431 -2.4484305 -4.8253679 -6.7026792 -5.6342449 -9.5072470 0.0332102 -1.1451281 -1.6675221 -1.7759348 4.5693774 -2.5830936 9.3489103 0.2254318 -0.6332611 -8.1740885 3.7747695 -24.2840385 -10.4923258 3.1005943 -3.8261003 -3.8356233 -49.4371681 2.2741129 -35.3930588 -0.0197520 -7.8887067 -14.7710810 -12.3382301 7.1980848 -3.4745834 -2.6948948 -1.2434168 1.3009393 8.6227970 -5.3150768 8.2614870 -0.8823267 0.1940799 0.9332379 13.3570118 -1.5931504 1.2669330 -4.6387067 6.1371479 -4.8753715 -1.6242230 -7.7698293 8.4713440 -12.7141953 -22.3069382 -4.3610134 13.0625601 -0.8104371 -37.2620010 6.6731825 -2.9381242 1.3006226 0.3881155 -1.8467138 -30.4697628 -1.7241167 -30.6919060 -2.7561100 -1.2628256 -7.9468913 5.1658630 -4.3397107 -19.5893955 -10.9439793 -8.5428257 4.7454028 -2.8524225 1.5137194 -6.5717044 -13.2761173 0.2884923 1.1465147 -9.9808121 1.7781994 -8.4343424 -7.9091134 3.8371480 -3.0483584 -3.4863431 -1.8602650 0.4543450 18.2293472 -2.8872216 7.9217916 -4.1987543 -11.3648815 -2.3674135 33.3958855 1.7777556 -21.6959362 6.5346379 -0.9378356 11.3190374 30.2839203 -2.3354979 -1.9524468 -0.7422786 26.3720627 -17.5751667 -3.5273628 -4.1568975 4.4991064 -4.5234747 -1.7941893 -0.9784772 -3.4957509 3.0968144 3.5426972 -0.4451500 -8.4313202 -3.6584556 -11.6711454 -4.5996814 2.1856380 -2.2215550 -3.2338204 -3.0017002 -20.1684856 7.5593491 -7.3437948 -1.2440467 -2.4006784 -1.1762856 -1.6451436 10.6769047 -12.1512318 -9.9767504 -8.4237871 -2.2470007 -1.4299382 -3.7481368 -3.2015469 8.5555363 -2.6316710 5.5711493 -2.5262058 -2.6705089 -8.1462345 1.4359500 -18.0893002 -19.3323116 -0.1822078 -2.9897068 -0.9306565 -3.6398449 3.1131873 8.3641758 -2.2493978 -21.5626965 -12.2973547 5.9537582 4.2441063 1.4600019 -7.0714569 -0.5551652 0.4264050 4.4869418 -3.7450936 8.0387325 -2.7965086 -1.2430307 3.7071474 15.6242895 -0.9174662 0.2667515 0.7045857 5.6781316 -12.8138113 -1.6944859 -0.0105558 -7.5000768 -15.0623131 -27.4936352 -1.2452292 17.2838898 -1.1656072 -12.6058559 3.1258166 -5.9809709 6.0809779 -4.7247291 -2.5065863 24.8125038 -1.0461829 -7.9322138 -9.2576189 2.1376507 -6.1395812 5.4045444 -1.6875546 -6.5041666 -5.9718642 27.1211357 4.2329359 -4.5289998 1.2259319 -3.9118841 -0.4804572 2.6350238 6.4631739 -0.4803981 -10.2105827 -4.1800871 -5.6800623 0.5635516 1.3416942 -5.3708224 -2.7151020 -6.1080470 -2.9577520 -0.1399022 26.5588570 -6.7297707 1.2359961 -11.8764915 -15.0921249 -2.2842479 -2.4837959 9.6272840 -13.6369658 2.1414998 6.7346935 2.3508909 -15.9769058 -13.0458622 0.3089564 -1.4289044 -1.2852310 -7.9918218 6.6609592 -9.4588089 -17.8381138 -1.8167821 -5.9149666 -10.0546284 4.7644963 -0.2445316 -3.4936676 -5.4648542 -1.0017506 -11.9267864 5.0013185 6.8127985 -0.9889199 14.2315969 0.1895565 14.1658382 2.4288964 -10.7864723 -4.2407484 5.6708574 -0.7779061 9.4798975 -19.4463253 -25.2100716 -18.3852768 6.7458787 0.7649674 -5.6574326 -17.0061302 -16.7450638 -2.0646265 1.4336861 -6.1718268 -13.4256096 -4.8804655 1.5813571 -5.5725431 -1.1964530 1.0223081 -0.7560644 -2.7557127 -0.3944432 -4.8735662 9.8944225 -5.6727176 1.1483220 2.2208219 9.6954861 -19.7076092 -3.8558748 -5.3135800 2.4239368 2.9716306 -0.1839515 -16.7902184 0.4308283 -2.8842986 7.9126053 4.3816915 -2.3391109 1.9378057 1.8800553 -3.4697957 -1.8219351 4.5509748 -3.5840807 -0.2926597 -10.2685537 -2.7373621 -8.6455793 -14.4237995 12.8084345 -0.1777292 1.5999981 5.8926959 -0.1910247 2.6226988 4.2546339 -2.0077572 -5.6169109 1.2785705 -1.3838130 4.3709865 -3.9840491 -13.8381996 20.0480213 -8.4212646 -0.6201167 -10.2698126 -3.4510462 2.0536501 5.6915307 -5.2573810 0.1899983 0.7535672 5.4838791 4.9802504 -0.4053435 -0.0469120 -0.3570589 7.6324301 1.0569774 4.8777585 -3.4714737 -0.4859039 -0.3139291 -1.9145358 0.6939552 0.9397677 -5.0080686 -3.8682711 0.4769601 -2.4426470 2.1555836 9.9567986 32.2910500 3.4975476 -3.6865082 3.1584260 4.9645090 -0.0729795 -0.8848997 -2.4446316 0.7040870 -0.0574706 0.0812147 -6.6665473 4.9234891 -1.7696035 4.5509052 1.3857849 -70.2497177 2.3520284 -3.0661039 -1.0727425 0.9575611 2.0138907 2.0299165 -1.8343072 -0.6399942 6.3397417 18.8322392 -5.1007237 11.0452080 1.8468705 -2.1619804 5.3690228 4.3899083 -2.1842349 1.2980856 -6.1815295 -5.0210710 -3.9341090 -2.3977306 0.8392569 -1.0973740 -9.1316633 -1.1490852 -0.9077394 7.2821259 -70.5441742 7.4972548 0.6558906 5.3387647 0.8333104 -4.5899453 1.0950431 -2.2378075 2.9879804 1.7934633 -2.4607995 -3.2132742 6.3898377 1.1703151 1.9939141 -3.1872406 10.4857445 -2.3763356 3.5101926 -0.2515295 -4.3359427 -55.0006943 -0.5154625 -15.2723293 -4.7391510 -5.7966557 3.3898084 37.0562935 1.0864458 4.9284477 2.5122414 -2.1222634 7.3833184 4.4723859 -0.7524295 3.6348288 1.1918947 -0.7823411 0.9996523 6.2679582 -1.8489412 0.7620231 -1.6597164 -4.8336816 1.5339680 0.9588377 -2.7656207 -2.3985043 4.3225579 1.6997939 -2.4463546 -0.6994408 -1.6223466 0.7762571 -1.0535561 0.7472697 1.7849768 -2.8452876 0.1162132 2.0067079 -0.6333086 -1.9650434 2.5680320 9.7933130 10.6346474 -2.1454384 1.5926331 3.8188369 11.3535194 -0.2047617 11.1984482 -5.8376212 -0.5033309 -4.6262574 -4.5865469 0.9893414 4.4648027 2.0274420 -17.8370152 4.1127324 -4.6824875 7.3612905 18.6587944 76.1357956 7.1503181 -3.4406781 13.3672066 8.0936289 2.5311251 7.5741658 -6.8875518 -4.7775173 -2.8590395 3.6444538 -3.7689478 8.8893919 -0.1442523 9.7096100 2.0791862 -2.2395086 6.3295341 -12.2825441 -1.7293463 0.0659027 4.4757566 5.4846396 3.3069553 -2.3950593 9.9539499 33.8333740 -8.5556355 18.1059723 2.4795873 0.0403536 19.9308395 11.2927523 -4.2428918 1.8168837 -2.9515450 -1.5887693 -5.4368567 -4.0173984 0.7376634 6.1067023 5.3006401 -6.2881870 0.4697455 24.8016891 91.4655533 14.1670732 -8.2239561 11.0531874 1.2793108 -11.1920347 -11.4981680 -5.3759475 5.7565451 4.7976723 -3.3282981 -9.7727728 10.8988676 -0.9665406 1.9730475 -10.7629128 19.2544346 -3.1868629 7.2102590 -4.2080574 -0.3193657 18.9191589 -2.4302738 9.4064112 1.1603056 0.0139952 3.7365363 60.7171059 4.4820294 22.1453133 3.9732997 -0.1004941 17.2429256 9.1658745 -1.9644654 1.7465439 6.0616865 6.3829436 1.4681696 12.2425947 -3.0340078 3.5920136 -0.7094261 -7.0623355 5.6312761 1.7796853 -7.1219630 -7.5290504 4.8143926 3.4491332 -4.3766408 -1.7168505 5.3840566 8.5003958 -6.5375228 1.1590561 2.2750924 -4.8307648 -1.0223299 2.1068172 -3.7469811 -2.2424939 2.8529911 12.4589796 13.8517218 -4.0501781 2.8654449 3.5865939 18.9336929 -0.6766164 18.6941471 -11.9075947 -1.3041013 -4.5226617 -7.9614868 -0.6374841 2.1579981 -2.3482912 -46.2062187 5.5062075 -9.2684870 7.7518487 25.9276352 71.8356705 9.8946543 -35.6004753 6.1290712 12.8704357 4.4454756 7.7626867 -11.5414248 -5.4030862 -2.8148348 5.0445957 -0.4498878 11.9884501 -2.3022311 14.6713781 2.3795662 -12.3448648 8.0763235 -16.7573261 -2.7493479 0.5918950 6.2864861 7.7146988 -6.7441258 -3.9728239 14.4182777 52.4070168 -18.2409935 26.5509243 5.1536021 -1.1310242 29.1618328 14.8579826 -6.7669010 3.9094663 -11.3609943 -7.2539029 -9.4738293 -8.7436409 1.6365509 6.2359400 8.0826693 -4.9315610 -0.4628146 37.0917625 94.4419250 20.5830135 -8.6923780 16.2615604 2.1916602 -16.5827370 -11.0860653 -7.0598226 6.5082574 7.2638450 -8.0114565 -13.8087301 15.7284279 0.1007095 3.6068120 -13.7714901 27.3599224 -3.9205706 10.4010582 -3.2172174 -1.2464539 16.4023895 -3.3119774 9.9898634 0.2996087 0.5064312 7.1021209 98.2231750 7.8612642 27.9476814 3.5446663 0.6248083 26.0412273 13.8822689 -5.0902104 4.6965408 7.2079711 5.8583851 2.9402797 19.6129456 -4.9885988 5.8091993 -3.2389433 -16.8100529 8.6426897 3.5484452 -10.2111387 -15.5508022 7.5592933 5.1789055 -6.4099131 -2.9115953 4.2819066 10.8293219 -8.7199764 -0.3002103 3.0064621 -7.5333071 -0.0569405 1.5499377 -3.2203858 -2.4255157 -5.3274045 6.1391168 5.7164831 -3.8275919 -3.9533482 -0.1373267 12.8450575 -0.0229429 15.0669403 -12.3714094 -0.4008553 -1.2454174 -6.4082165 1.4491929 -6.5961294 -11.4115353 -12.7714663 -1.1409392 -10.3384867 -4.7060509 20.4654560 -11.5775909 6.6540389 2.5156322 -32.8660698 3.1140110 3.6016853 0.9519705 -7.5412765 -1.6264000 0.2342048 -3.3347130 4.4186316 7.2502847 -5.2753162 9.7728977 0.1892067 -13.7460051 3.4980588 -15.0498772 -2.6908956 0.8511670 3.4685287 3.9271507 -28.7633629 -3.0385804 8.9760332 38.1620560 -15.1868277 16.5164413 4.7377071 -1.3211133 17.5699768 7.9308815 -4.9172654 1.0938545 -16.3492184 -13.3429136 -9.8081522 -10.1584835 1.3803486 -0.3999480 3.8165431 0.6169591 -2.0353849 21.8972454 0.8456985 14.2075891 -11.3501263 10.1992188 1.0783315 -11.9636297 0.0436245 -4.9733605 2.2120140 4.4373770 -9.7328453 -5.4901166 8.8245363 3.0039575 1.8776351 -7.9750152 16.7727890 -1.1757814 6.0577335 2.3864396 -0.8239671 3.9063954 -2.8723760 1.4652541 -0.7309076 -1.4412878 5.5143561 75.9444962 5.3418055 10.1954155 -0.3552250 2.2440543 15.5924568 9.8822289 -5.9711552 2.8338382 -0.1448809 0.7726707 1.6006629 14.1807461 -3.2516057 3.1010375 -10.7966890 -12.2098579 5.3023000 3.7998848 -11.4961929 -31.9744415 6.7122793 1.5760105 -4.8038158 -4.7683010 -2.4401753 4.8238187 -3.6882119 1.5287534 1.9360268 -5.3641868 1.3232348 0.2393342 0.2555917 0.6290589 2.1696141 5.1124544 3.0177383 0.0294715 -2.0716577 0.8313558 5.9052835 1.6591331 0.2805636 -2.9312253 -0.3203330 -1.6475238 -2.3085897 1.8219783 2.6749516 0.9650818 0.0961248 -0.4026338 -3.1855767 2.5705154 10.1677151 -33.2940674 2.6380131 -1.6102448 6.8573866 2.1115422 0.0970524 -1.1428854 -1.6844212 0.4801085 -0.7421687 -1.4600627 -7.6985297 4.4222445 -0.7070674 5.7534928 1.2757900 -15.9964724 1.3022153 -3.9551973 -1.4623691 1.2241614 1.7970781 0.8876490 -6.7238617 -0.6152624 4.9575071 19.2205143 -5.1706185 9.0030689 1.6202043 -1.2633713 4.3213701 4.1814899 -1.5480990 1.9030242 -2.1326647 -0.4833039 -4.1257887 -2.0440931 0.3979614 -0.9411574 -9.7468042 -2.2017434 -1.5580153 6.1842728 -20.7296238 6.7547898 2.5354936 4.3037863 0.4504781 -6.3766413 -0.2978903 -1.8835545 2.8250704 1.3820374 -0.9026874 -3.2796783 4.9743633 0.4757061 1.2169169 -3.1922643 10.4476767 -2.1619377 4.1398363 1.7038447 -3.5964396 -7.3494058 -0.4137764 -9.4153881 -7.7661629 -59.7251015 3.6423957 37.9143257 0.7694817 3.3160193 1.9231943 -1.6910586 6.0297828 4.0111170 -1.0282934 1.6911230 0.5929604 0.8158501 1.4248930 7.3126616 -0.7331003 -0.2129610 -2.1516421 -2.6296713 0.4172656 0.6809381 -1.5178787 -3.0445392 3.3423021 2.4873593 -1.7813531 -0.3599543 -1.9614396 1.9533100 0.0836524 1.8420556 0.7206568 -1.8406243 0.7444314 1.9683236 -1.4541960 0.4110836 2.6334579 9.3899508 9.4568892 -1.6664989 -23.1383839 4.9100957 7.0221572 2.4795573 -0.2962961 -6.4575596 -0.5324559 -5.0152607 -5.6707501 0.9260831 5.0157824 6.6412048 -8.5553436 2.1132228 -5.6610656 9.7638102 19.8936558 -37.8547096 6.4001060 3.0130703 16.5072861 4.1734638 1.0984114 5.5226765 -5.5203447 -3.5666022 -2.6502063 -0.7425321 -3.2295556 7.6822219 1.0046678 8.8635311 2.4175391 -15.0664692 3.0488639 -8.7340250 -1.7835789 -1.4717132 3.4877784 2.6971519 -21.3650455 -1.6099066 8.4912014 34.9565964 -8.3936300 15.0579453 2.5381057 -0.2523113 15.4816179 8.5080748 -3.5414824 0.7572231 2.4743774 2.1769373 -4.8934779 -3.3044095 0.3618674 3.8362257 1.1997601 -4.7409792 -0.0125888 20.4120197 54.6044006 11.7405634 -1.3961085 11.7300644 0.4670933 -10.4506407 -14.2001476 -5.5404673 5.6055532 4.7462811 -1.2004001 -6.1820350 12.7687302 0.6745469 0.5886054 -6.8686337 19.8944321 -4.7005525 7.8912301 -0.8438637 -2.2517583 5.6636443 -2.7502654 7.0842342 0.9876108 -0.5352209 3.0706460 57.6313858 6.6610150 7.1793065 3.2518642 -0.4665391 16.1145306 10.7389507 -2.2785871 -2.6255703 4.9062700 7.6977296 1.2369217 14.7334642 -2.6871564 3.3419075 -2.9896662 -4.6470284 3.1169252 0.3305711 -5.1657429 0.5528753 3.2160406 2.8687131 -3.9662316 -0.8516015 4.1888194 3.6592345 -4.8439460 1.0654389 0.8061665 -4.5108409 -0.8527611 1.9707565 -4.4183412 0.4491952 -0.9579355 12.7872801 13.2615757 -3.7270176 -16.1175194 6.3638992 13.2011881 2.1637719 8.5307732 -11.1577330 -1.2410384 -5.9119315 -8.8474979 0.5186020 3.2645037 4.1135926 -16.1852627 4.1948943 -10.2944756 10.3760653 27.8755512 43.0868263 9.4761925 -23.0008755 10.7557611 6.3957791 2.1019793 7.2001309 -9.3632050 -4.5175538 -3.6096518 1.8465350 -1.6118262 12.1280470 -0.7844157 13.2033491 2.8390541 -18.3656788 4.3714256 -13.5259752 -3.3803611 -0.4966968 5.2510147 5.2961040 -57.7269669 -3.0297174 13.4175816 52.8941879 -16.0138569 23.3882694 4.7785530 -1.0929022 25.0851784 13.0873861 -6.2139292 1.3085536 -3.6237316 -1.8547316 -7.6840558 -7.3355875 1.2556442 4.4245386 3.0687392 -4.9806447 -0.9271229 30.8183765 47.6511765 18.9235420 -6.4609804 13.4761467 1.1439818 -14.5482645 -14.8543825 -7.8341155 7.3013830 7.0066209 -5.2918978 -10.4091253 14.3615532 1.7609866 1.5593855 -10.8855610 28.2460194 -5.2436891 10.9815416 -0.6912048 -1.8567065 10.6610498 -3.4839571 9.3907995 0.3319544 0.5819092 5.8625526 95.5548935 9.4570026 22.0880508 3.8801548 1.0939393 24.3296242 11.7334127 -4.5363021 -0.8600785 5.1156201 9.6185532 2.3999612 20.6690407 -4.5665784 5.4074745 -6.4966679 -11.4287615 5.3832355 1.9045144 -7.6441646 -4.3556018 6.3950148 3.9098790 -6.9922729 -2.1455488 3.8181953 6.7854171 -7.0588617 0.7687891 1.9766982 -6.9923625 -0.0030717 2.5159085 -4.1645956 -1.9201803 -21.6535988 5.3420296 6.4928026 -3.8781996 -0.9212094 2.4176943 12.1599741 1.4950056 13.8422794 -10.7076454 -0.4646055 -1.0779920 -6.3018284 2.6526301 -3.6020637 -9.7486258 1.5949767 -0.4337506 -9.7238245 -0.2361461 18.6165600 -85.2508316 7.1430922 -36.3870850 -38.8970718 -2.3940873 4.1744080 0.5191550 -6.2731347 -1.4174926 -0.1303236 -3.2178872 3.3453796 8.5611763 -5.8836741 9.5427284 0.5519789 -18.4096794 3.2109497 -7.4438844 -2.7250488 1.2224667 3.3085136 3.6758552 -190.9128113 -3.0633333 8.6329060 37.1818619 -15.7348108 16.0296803 4.5151830 -0.8618093 16.1662025 8.4196281 -4.4137301 0.8341379 -16.8047581 -12.8837481 -9.4751606 -9.3116884 1.4891129 0.1623773 4.2628598 1.6954232 -1.9739968 19.6917324 3.2926946 14.5489979 -5.2473187 11.6006489 1.3289580 -11.8346481 0.6541883 -5.3081107 2.9860880 4.1234288 -9.0971107 -5.2657561 9.8460417 2.7948666 2.2360837 -7.8904510 16.4850521 -0.9472961 6.9447126 2.2574408 -0.8179707 -0.9902640 -2.8527501 1.5809420 -0.9721082 -1.1515841 5.5749221 75.3333054 5.9510908 13.0835295 0.1378704 2.4903905 16.5007305 10.6636324 -6.9618144 2.2639074 -0.8997601 4.4362693 1.9035271 14.2155371 -2.9633975 3.5021944 -8.0342760 -7.3593059 5.1477575 2.8653538 -10.8107548 -5.9230146 6.8189416 1.4743389 -4.4639740 -3.8939211 -2.1706183 4.3016644 -3.6198142 2.6694019 0.9229308 -5.1910563 1.4995792 1.4274017 0.0881442 0.3847161 2.3582652 4.2748184 3.4037449 0.1567589 -0.6021464 0.7816304 5.1007600 1.7627571 3.6680512 -2.9620385 -1.0182190 -1.5876188 -2.8209240 1.3544083 2.8490832 10.0712719 -6.7267046 0.1119892 -3.4262865 1.3309438 9.7001047 -40.5060349 2.4480786 -1.1911312 7.7004671 1.3008739 -0.2262030 -0.6811274 -2.3373895 0.1423079 -1.4593610 -1.7460032 -4.1695046 3.5662043 -0.8545858 5.1822157 1.1453654 -13.3156300 1.1361464 -3.4319000 -1.5668857 0.9141419 1.8602166 1.6343188 -8.2299299 -0.5786277 4.5833039 17.5131454 -4.7010889 8.3153906 1.7532011 -2.5113201 3.4598219 3.0466676 -1.8059716 0.2046137 1.6638340 4.4384465 -5.3440137 -1.8121814 0.2567336 -1.8941042 -8.8279171 -1.7916930 -0.9383050 6.2869473 -36.9146614 6.9127998 2.0213530 1.4417143 0.6560549 -4.6368380 0.0041021 -2.2814002 2.3969758 2.0040944 -0.4868677 -4.2728715 2.4312901 0.9468055 0.8812833 -2.7511709 9.4321404 -1.7489736 4.6147599 2.6300352 -0.1371676 -5.3017182 -0.4762818 -5.3129544 -4.8233323 -56.0967140 2.9734716 36.5710869 2.8561563 2.2161205 1.2029757 0.3227157 5.6110520 -0.1854042 -1.7532160 1.7003490 0.1843387 -0.1221854 1.7702734 8.2757292 -1.0594656 -1.3795843 -2.6949983 -2.3076777 0.5455990 0.0122845 -1.5052127 -2.7731740 3.2217762 0.9647236 -1.7447466 -0.5938801 -0.8159969 4.3446302 -0.1856292 1.5139430 -0.0437945 -2.0274487 0.4125497 2.0296435 -1.6868964 0.4434043 3.6219869 8.7479839 10.1205683 -1.5885266 3.4628625 5.2281170 3.5727923 4.6663294 -0.0954918 -7.3543510 -0.3090556 -5.5073280 -6.6993985 -0.1205793 5.3758297 13.5708237 -4.4205256 -0.2504845 -6.9849200 6.2372618 19.7778873 -22.5404377 6.2373652 3.3532975 16.8164768 1.9606639 0.1800772 5.9029250 -5.9766078 -3.5032823 -2.9163997 -2.6933355 -2.8990483 6.6353469 1.9814554 8.2867117 2.2305853 -18.9989376 2.1594617 -7.0883374 -1.7068136 -2.1217110 2.6930685 2.4200175 -12.4639502 -1.5226852 7.5754142 34.3140450 -7.1710682 14.8707924 2.2897792 -0.3394407 13.0927048 6.3042002 -3.5247152 0.4080262 7.2182250 7.0194716 -23.0512695 -3.3463330 0.1109763 2.1001883 -1.4152440 -4.8595400 0.3178713 18.5626011 48.4992332 11.1493645 0.0166701 7.3088474 -0.2089591 -6.6779461 -13.0732899 -6.1292043 5.6824923 4.2013636 -0.7650240 -6.6043029 13.9551077 1.6379666 -0.7256271 -4.9037709 19.1221752 -5.5736079 8.2220984 -0.0387719 -0.4268371 1.5031028 -2.8132534 -1.8011179 0.5059583 0.3914317 2.7541714 54.7328415 7.2281861 7.3787384 3.2293859 1.0777125 15.8042841 -25.6643295 -2.7479544 -3.8072355 4.1970096 7.6999292 0.8803588 15.8912830 -3.1591988 3.8639827 -5.2648063 -2.3844264 2.1174788 0.0700182 -4.7985687 5.7869701 0.1801429 2.3687699 -4.3539472 -1.0888216 3.6264555 2.2178824 -4.8199792 0.1962958 -0.3913469 -4.2934275 -1.7586565 2.0333269 -5.1808882 0.9244118 4.5414619 12.6680269 13.5205460 -3.6221735 -4.4029365 6.4733510 9.3569803 4.7907467 1.7718993 -10.4520226 -1.2203275 -6.2042651 -9.1552439 0.7149622 5.2538486 12.3172092 0.1950177 2.4107032 -10.9944487 9.6117373 29.2268562 -62.5414581 9.2709923 -1.6083090 16.5084801 1.8988808 1.1468593 7.3297377 -9.0366430 -4.1751437 -3.7962198 -0.1928336 -2.4476006 11.1815548 0.9929416 13.2186651 2.7914565 -31.5565186 3.0758605 -10.0068378 -3.3183155 -1.0292519 4.7122459 3.9589360 -70.1210709 -2.4790812 12.2370434 52.0151520 -12.8779345 22.6249199 3.8143957 -1.2003046 22.2279110 9.8225641 -5.8010311 0.5904904 2.4591675 3.8251753 -22.2696915 -6.5651078 0.8683097 2.6122053 0.7134002 -4.2054105 -0.5898534 27.4074402 -30.5579815 18.5929050 -4.1203928 14.9561129 0.4077914 -9.8724546 -14.7996693 -8.4131479 8.0124598 5.9727387 -3.4391048 -10.0279016 6.7397442 2.8962269 -0.0598831 -8.1453953 28.0879688 -6.0705132 11.7995815 0.6304511 -0.6088433 -2.3380823 -3.5721483 2.4885771 0.5229421 0.9113523 5.3349552 91.6697769 11.9568624 9.3797941 4.2191720 2.5855887 24.1702633 21.3766918 -4.5575566 -2.9866352 3.0787659 9.6006498 2.5197103 21.9022369 -4.5806503 5.7506337 -6.8183689 -7.4249840 4.1809888 1.1888220 -6.8883758 1.9674220 3.9648190 3.2248626 -6.1799197 -1.9353340 3.4343743 3.9828725 -6.8312802 1.1934289 0.0902651 -6.5556598 -0.9033322 3.1548550 -5.0598426 -2.0605772 -24.4275494 6.4829016 7.0727744 -3.2330306 -18.1261215 4.7074313 7.3659053 2.5197732 14.7727528 -8.0355616 -0.5213955 -0.5758226 -5.5411215 1.9647502 -1.2210186 -5.4364271 3.1985981 2.2096190 -8.8410063 2.2965183 15.6912012 8.3210831 6.9241385 -47.1951561 -31.2657166 -11.7823400 3.5918822 0.4720010 -8.0072660 -1.8444600 0.1066274 0.7927690 2.0662432 9.6129074 -3.7905536 7.8254662 0.2208976 -12.2960892 1.8109972 -4.7390757 -2.4695954 1.4980446 3.2481401 4.2157602 5.6423268 -1.5550143 9.3157024 36.3008270 -16.1772633 15.7869549 3.8610198 0.5749153 15.5606804 6.0833745 -4.4190836 -0.3480665 -12.0310135 -8.9095840 1.8757805 -7.9741936 2.0817451 0.2613084 2.9893320 1.3709621 -1.6783764 17.5273094 -3.9125845 15.1160908 -2.3156872 -13.8441353 1.3732750 -9.5809641 -0.1821298 -4.7615924 3.9654565 3.9794426 -6.8571668 -6.0928698 8.6999187 3.2946277 0.6520694 -9.5000248 16.7377720 -1.1521902 6.9777637 0.9497506 -1.0495350 3.9046783 -2.4176950 2.9986098 -1.1800548 -0.9181545 5.2597208 75.9819717 7.2018971 21.6265831 1.0007315 2.5034978 16.0472412 -107.4829636 -5.1921959 1.2387900 -3.4138045 7.3480253 1.8904198 12.6253157 -3.4108438 3.9093618 -7.9735818 -8.2360783 4.4449306 2.6892631 -7.2412896 -10.3364773 6.0747433 0.5107401 -4.0134063 -3.2977707 -1.6661463 4.6869760 -4.6339412 2.0074084 0.8129097 -4.8461108 1.5591553 0.9148141 0.2456533 0.2238248 3.0886047 4.2420154 2.6794913 -0.2586059 -1.1989907 0.2244684 3.6979008 0.7257578 2.6113174 -2.4017150 -0.6906512 -1.6068019 -2.7538171 0.9582299 2.7266409 9.7501831 -4.3584270 0.0769648 -3.1690567 1.9376985 9.9410772 -42.6611671 2.7399011 0.1781006 8.5798635 0.2623902 -0.1375315 0.0953661 -2.7735317 -0.2807388 -1.1601222 -1.4537572 -1.0054089 3.3337443 -0.4000657 3.5803430 1.0636823 -14.4962940 1.0585148 -2.0312526 -1.9392878 0.5027794 1.6369096 1.5093707 -8.6179962 -0.3994561 4.1653275 17.6733322 -4.2613349 6.8477783 1.6077843 -0.4095375 4.3739924 3.1924675 -1.7246362 -1.0244468 6.8893890 9.1137524 -1.2142315 -1.4138331 0.0955841 -2.1048632 -8.5463085 -1.7994365 -1.3373214 6.8942657 -40.0576210 6.8356233 2.5631847 -9.2698336 0.7895827 -2.3842390 -0.6461114 -2.0681880 1.9111151 1.4163113 0.2859866 -4.1826091 -5.1209931 1.4319488 0.4811331 -1.6043897 9.6223011 -1.4292879 4.4940600 2.6166103 0.1290773 -6.3923526 -0.7345811 -4.2238159 -2.1908684 -59.2223587 2.3693130 34.3255768 3.0452218 -3.0850768 0.4941312 0.4356003 4.6505785 -56.3670464 -1.6778439 1.0165331 -0.9025252 -0.6973448 1.5356462 8.3290157 -1.7880744 -1.1964674 -2.5842841 -1.1256928 0.1423295 0.9490788 -1.7377766 -0.9922315 2.7796674 -0.0989265 -2.1247575 -0.1925182 0.2768498 4.5774832 -0.6730220 1.1318969 -0.2831121 -1.8520124 0.4520735 1.9781823 -1.6200339 -0.1918722 4.2075486 8.7101469 9.6875830 -1.7283856 3.1877894 4.6980729 -1.1888769 7.5508590 -5.9201908 -6.9056649 -0.3915289 -5.8054128 -7.1929960 -0.4235431 6.0759149 11.2685623 -0.7727660 -2.5126705 -7.1401014 4.2137413 20.0337143 -26.1167717 6.0656481 1.0908285 16.0108566 -2.2337582 0.1568140 4.8197031 -6.3757529 -4.3348303 -2.6415317 -4.9278512 -2.1956363 5.3827405 3.5019085 7.9029303 2.4151132 -36.7122993 2.2153089 -6.4979410 -1.8360927 -3.1949091 1.7642754 1.7450874 -0.3342172 -1.7416261 7.2722473 33.9261284 -6.9696140 14.1752148 2.4064183 -0.2607065 10.6275167 5.5584707 -3.3677890 -0.1054405 12.8741388 11.4571781 -2.7260795 -3.3888867 -0.1975510 0.6627770 -3.0214779 -5.6826863 -0.3790676 18.3091125 26.4018726 10.7361574 1.4135151 8.4325590 -0.9160172 -4.4518414 -12.8321009 -6.2513938 5.3374238 3.7624702 1.2933900 -5.9031906 8.9711676 2.0681708 -2.2499883 -3.5982084 19.1821709 -5.9520497 8.2786589 1.3859116 -0.7150419 -16.7586136 -3.4052286 -11.1344948 0.1297408 2.3936219 1.8937067 48.8654022 3.0681288 4.0716710 2.8943398 1.3627733 15.2047939 3.4981167 -2.5920742 -7.2595549 2.1871681 7.1555614 0.5809664 15.8530931 -3.0174806 4.2884231 -6.9283504 0.3464858 1.5744185 -0.3676212 -4.1983714 9.2175999 -2.7717059 2.3889480 -4.7541132 -0.8993230 3.4601088 2.1532807 -4.5423822 0.0034401 -1.4968685 -4.2267132 -2.0631144 2.0599017 -6.0074058 0.3581045 5.4855242 12.9896364 13.9890261 -3.4778430 -0.5095488 4.3024740 4.5523190 8.6306505 2.9978526 -9.8368912 -1.1444216 -6.6562676 -9.3680010 -0.3760836 7.0231128 10.3138771 4.6442547 -0.2483513 -10.4920359 9.3946657 30.3913403 -45.1297607 8.9445734 -2.6329191 18.6433258 -8.2066069 1.1705776 7.0673962 -9.3250303 -4.8056111 -2.8368402 -4.0520625 -3.2963643 9.3832016 2.7850325 12.0051556 3.3952408 -33.7022095 3.3760076 -9.6730604 -3.1803579 -2.3141961 3.5451920 2.5204613 -37.3679047 -2.8620610 12.0825777 51.8488503 -11.8722372 21.6089821 4.1141100 -1.9805564 18.1497498 8.5504217 -5.3787704 -0.1079672 9.2403746 8.4532576 -13.5844793 -6.0032735 0.4917450 1.4057268 -4.8747587 -5.9195161 -1.0653526 24.2125416 -30.0482559 17.8769722 -1.2681813 -23.2698212 -0.1245288 -7.9551430 -16.0403099 -8.4962626 8.2664614 5.2848992 -0.7261727 -8.3718529 4.3814960 3.4787340 -1.7332972 -6.9941931 28.2621307 -6.6843238 12.3445673 1.6052433 -1.4203293 -4.8635740 -4.6204419 -7.1029735 0.8199076 0.3345485 4.8225813 86.0723495 8.2164879 6.9130864 4.1790104 2.6795361 23.4360237 -21.8355160 -4.1411805 -7.1435871 -0.1739533 6.6508880 2.2724948 22.2273979 -4.7699881 5.8137431 -7.5490775 -3.4445236 3.3775887 0.2379299 -6.5734892 6.4880815 0.6401610 2.8441553 -6.4962397 -1.7738642 3.6089880 2.2119188 -6.8014684 0.1467832 -1.4276578 -6.3490162 -1.1383950 3.8198264 -6.5167356 -0.8222917 -0.7732943 5.8667440 7.0817666 -4.3528233 -15.7977858 4.9556761 1.6920640 0.9978676 15.4237204 -7.1405630 -0.0714015 -0.3163710 -5.6971040 -2.4172180 -2.1083891 -3.3724480 -0.7310728 4.0518332 -8.6160860 3.4517496 18.7984791 1.5213188 7.5013142 -23.8867283 -10.7208004 -2.1783817 1.4575871 0.3860309 -7.7745748 0.0656346 -0.8498874 3.1572518 1.0041981 9.9881220 -2.8109529 8.3190918 1.4596798 -13.1005716 1.3411722 -2.2884777 -3.1966248 0.9991102 0.5895323 4.0427732 5.2631621 -0.8858035 9.8254976 34.5671539 -11.8316517 18.1897011 2.8099802 -1.1579319 17.5528221 5.1798663 -4.0590520 -0.2555376 -12.0091124 -8.2849865 -17.4894085 -6.9800391 2.3479185 -0.9877416 3.1098003 3.2457380 -1.3367002 12.4057980 -0.2130122 15.3238134 -2.2968862 -2.4307053 0.2576510 -2.4634449 -0.6264617 -4.8852773 4.6633978 2.6961119 -6.8584218 -6.2642694 -73.3455887 2.7122402 -0.8310441 -9.2769165 17.6437683 -0.9523900 8.2813091 1.4028244 -0.3175382 4.7728243 -1.7748740 4.0384197 -2.8093314 1.1627525 5.1460652 67.1747589 7.1880913 16.9446659 1.8664531 3.2729034 16.0613403 -42.7624321 -5.4061222 -0.4397263 -3.2603669 8.2464561 2.0646627 13.5053139 -0.9814745 5.1584444 -4.3054347 -13.5158539 5.0110750 1.4606885 -6.1107082 -10.2318125 3.0910652 3.8278296 -5.2246246 -2.2542803 -2.3031819 4.0430284 -5.5514250 -1.7332584 1.2316809 -3.5858691 1.3448703 2.6444902 0.1486868 -0.2164452 2.5279467 4.6490455 1.7067513 0.4721944 1.4563284 -0.0136843 1.1404457 0.1551883 -5.7661386 -2.3917251 -0.4415502 -2.7270811 -2.7899628 0.8122029 2.4973214 8.0515022 -3.1719518 -1.5293384 -3.7006061 1.8289720 11.0209341 -38.5389595 2.4396811 0.3492630 8.4480553 2.3399069 0.0526453 0.6025265 -3.3409622 -0.4808985 -1.2931951 -2.4438150 1.1744961 2.2273586 0.0301976 3.7744305 1.2994808 -18.9534779 0.3165869 -2.0144548 -1.3341408 -0.0766419 1.7757041 1.7719527 -7.9905276 -0.7911469 3.7315109 17.2462082 -2.7444656 5.7335429 0.4833008 0.2243169 3.4774215 3.8016369 -1.6278005 -0.6003501 8.5955744 8.7492657 -2.0573616 -1.6287961 0.1104012 -2.3671694 -9.6119881 -1.4610878 -0.9464864 4.5689673 -32.3543777 6.2945504 3.3446879 -24.4189358 -0.0676349 -1.4440641 -1.9178613 -2.1111975 2.3300471 0.8402292 0.7542326 -3.2330675 -10.2091303 1.3690683 -0.8421267 -1.4815750 9.4471722 -1.9129874 4.7569404 1.7023997 0.1642667 -10.4149818 -1.0134673 -3.5023048 -0.9331813 -56.0937767 2.2854300 35.7255821 2.2934129 -9.9795933 0.9429309 0.4721255 4.4467831 -63.9987030 -1.0284379 -0.2805170 -1.1127934 -0.7613361 1.3181351 7.5159760 -1.4157929 -0.1577022 -2.3047299 -0.8944049 -1.1972004 0.1365150 -1.6652222 0.5860535 2.7162604 0.4789385 -1.5966215 -0.3336030 1.1629183 4.4784570 -0.6264865 1.1694462 -0.7792740 -1.6429782 0.0209412 2.2588384 -1.7893575 0.2835208 4.1927271 9.2012730 9.9774733 -1.4724536 6.1983123 4.8153181 -4.5697727 10.0858326 -5.6317639 -6.7062201 -1.2854456 -6.3876076 -7.4439440 -0.8502125 6.6423001 9.2102242 -6.3594041 -4.7113538 -8.3228760 1.0467440 20.6896667 -24.1188660 5.7880044 2.7293751 14.9010382 -2.9283283 -0.2735841 5.2742710 -7.1555910 -4.5010576 -3.1972098 -5.4811444 -4.4413705 4.0350547 5.1133509 7.3030534 2.7302265 -63.2494087 0.8021978 -5.6597061 -1.3643321 -4.0336900 1.4980905 2.2572739 10.0197430 -2.2596359 6.1884131 32.3573456 -5.2254410 13.0546474 2.1955204 -2.8942842 8.7731075 5.0981421 -3.4328105 -1.6122265 15.1602879 10.6935091 -0.0651734 -3.5625174 -0.4479213 -0.3032216 -4.4735775 -5.1952820 -0.7312310 16.5249519 -95.2112503 10.0106697 1.7046734 2.3976028 -1.7480704 -2.5460093 -13.7527676 -6.6236701 5.6200700 2.5880911 2.9612229 -5.6149473 1.1117257 2.1017811 -3.7578323 -2.4525518 18.7673531 -6.7390676 8.5418463 1.3917717 1.4171219 -45.2403107 -3.5131135 -17.7848930 1.9968790 1.8387320 2.3162086 44.3748779 0.5282448 1.9210368 2.8353381 2.7081544 16.0953999 -1.6385357 -2.0126095 -11.5662403 1.5050344 6.5796347 0.4861144 13.7963123 -2.8537769 4.3874941 -7.4219584 1.0788810 0.4885342 -2.1293447 -3.6168234 11.6289034 -7.7016530 1.6194360 -3.6726596 -0.3484332 3.4745066 2.9465480 -4.3839197 -0.3364896 -3.0615964 -4.1684399 -1.6739898 2.3306489 -6.0456314 -0.3095765 5.0819612 13.1045198 14.4225798 -2.8650517 5.1855497 5.3307691 -1.0311141 10.5950241 4.9306297 -9.9149055 -1.5411050 -7.3993788 -10.0786018 -0.1465857 8.1993217 7.7637477 1.1430337 -4.1576681 -11.7778988 6.1124401 31.2357674 -39.6802788 8.5472050 -0.8056573 20.1320629 -8.5904388 0.7555591 6.3089771 -9.8182840 -4.8376918 -3.8209498 -6.9170570 -5.1445661 7.5930471 5.3762145 11.6782742 4.0733438 -29.7513695 1.6306491 -8.4029045 -2.6781394 -3.2492650 2.9673805 3.8735988 -15.2925406 -3.5653069 10.5720463 50.1649666 -10.3530626 20.9443130 3.4373345 -6.4020638 13.5670996 7.4339457 -5.2123613 -1.4413739 12.4021368 7.6602387 -4.9860725 -5.6563601 0.1035223 -0.4844072 -8.6435862 -4.9661617 -1.7624525 22.7948475 -16.4116211 16.7046032 1.5219892 -46.7152138 -1.5747738 -4.5036769 -18.5597668 -8.7385960 8.4916611 3.6451204 1.5320833 -8.2062874 2.3291032 3.2516627 -4.2588511 -5.0577583 28.2770233 -8.0545206 13.1268940 0.7864084 -2.0884926 -0.0849347 -5.0355144 -9.6637325 -0.4013972 -3.8203115 5.6804404 77.4919052 6.2714529 6.1852088 3.9256639 2.9367192 24.1907215 -18.3697815 -3.6271980 -12.9046078 -0.9549953 7.4885941 1.8220956 21.1840572 -4.3105044 5.2887092 -8.0190802 -0.9805809 2.7836752 -1.5260268 -5.5177293 9.5099592 -5.1312523 2.3757150 -5.5890508 -0.9315739 3.5466161 3.5890563 -5.8178887 0.3327308 -3.2987506 -5.7917666 -1.1619827 4.4539838 -6.7165451 -1.1364082 5.2187257 7.5840378 8.1813173 -5.7181149 -3.4388723 4.0951576 -14.5595150 2.2063718 15.8795271 -5.4305091 -2.6873186 -3.6527269 -4.8059602 -3.4069889 -0.2119359 -2.9791639 -16.6311092 4.8983779 -6.7321491 8.1997519 20.2886047 2.6405437 5.5683098 -10.1723623 5.8465137 -12.9590349 2.1437397 0.0994529 -8.0757742 -0.5309380 -1.8691298 3.8086152 -0.4353212 7.7963228 0.1605775 8.9594126 1.7540109 -28.6524982 0.2199878 -4.8560119 -2.4196064 0.7016119 1.5238714 2.0813494 -4.0057807 -3.5284956 9.0657787 38.1677437 -10.4370136 12.7896185 2.7929714 -2.9410353 18.0767765 7.0620179 -3.7419102 -0.9519736 -9.2790737 -7.9103651 -11.2293081 -4.6786828 2.1664093 -0.9992320 1.7009492 3.9876709 -2.3255548 17.7619801 -28.5853348 13.5806446 -3.1322236 -0.9522704 0.1031903 -2.6094379 0.0701669 -5.2699065 5.3720260 -0.1432448 -4.7333236 -6.1020217 -48.0608063 2.2543058 -3.9353826 -6.3733854 19.5595455 -1.0962486 8.5880680 0.1804669 -1.7560797 -11.4646416 -2.7882493 -1.4004580 -11.2509680 1.9570378 4.3394547 66.6410751 6.6681051 9.0049791 2.4690993 3.5745928 15.7860556 -14.5701485 -3.8395846 -3.3795862 -3.1736751 5.6947889 3.3801522 13.6326199 -2.0304208 3.9258060 -0.7027795 -8.8453608 4.1545076 1.7618039 -5.0030951 -5.3558450 3.7225480 1.5423687 -3.6159916 -1.7179030 -3.9610703 3.7066731 -4.5601196 -3.1784530 -1.0596515 -4.4068189 1.3112921 3.3855965 0.2067579 0.1695339 1.4344783 4.9263291 1.7351594 0.3684832 1.0769168 -0.3447001 -0.3872761 -1.8675197 -28.3072281 -2.5832472 -0.7771468 -1.6106075 -3.2547708 0.4747109 2.0412562 16.2191753 -3.5807643 -2.1845949 -3.6153886 1.8000525 11.8127003 -47.7831497 2.4837091 1.0042225 8.5854759 3.6905072 0.4909979 -0.5643275 -2.7417502 0.3252286 -0.4048172 -2.9515316 4.0899611 1.7493198 0.7222069 3.6711519 2.4803281 -26.4757862 -1.0418777 -2.4723566 -1.1655474 -0.6806969 1.4515780 1.7139708 -31.6764145 -0.9749250 3.9859056 17.1552601 -2.2496381 6.1322908 0.2706281 -0.1758459 1.6578985 3.7985957 -1.2518835 -0.7013965 12.2239761 14.3294659 -1.5865291 -1.8737354 0.1339708 -2.8315258 -9.4548988 -1.4727129 -1.0905644 2.4185772 -37.4980545 6.5252609 2.3379397 -49.0678596 -0.1862808 -1.2210033 -3.0474274 -1.5066289 2.5627697 -1.6811588 0.4744616 -1.8624759 -18.0216255 1.7427219 -1.3244694 -2.2373393 9.8225279 -2.3187344 5.3057361 1.8045379 -1.7030431 -17.9330864 -1.4701977 -5.9545398 1.4581804 -22.3621693 0.7750735 33.1924629 1.2977631 -14.2559166 1.6034758 -0.0800083 3.4230285 -59.8345299 -0.7239939 -2.3874350 -1.8775265 -0.6514102 1.5089450 7.1838217 -1.6853411 0.0434814 -1.1499032 -0.5065460 -0.9774592 0.0230818 -1.6058986 -0.0446763 0.5111070 0.6837851 -0.3258651 0.2046273 1.3815225 4.2510433 -0.9804919 0.6287478 -0.7529168 -0.9411941 -0.1809407 3.0023193 -1.7693671 1.9324464 3.1920364 10.2284050 10.8446827 -0.1596522 4.6335878 2.2114542 -7.4748316 10.9606953 -13.6848421 -5.8117127 -1.6446736 -5.5425801 -7.9709330 -2.1038415 7.2100778 17.8529415 -11.7298584 -5.6807718 -9.1637020 -0.9387222 20.4257660 -20.7446404 5.8146367 4.4021816 15.0174475 -3.9741590 -0.4030248 4.3687439 -6.5913720 -2.7929950 -2.2107482 -5.2425466 -6.0453148 2.0593829 5.7431026 6.9212484 3.4676783 -54.7246246 0.3149880 -5.2563086 -0.6425412 -5.2043605 0.5802978 2.3057945 1.4911906 -2.9528766 5.8582549 32.0269394 -3.4986904 14.2240829 0.5420696 -5.7513795 5.8375731 3.1480927 -2.9095991 -2.1303577 20.0640697 16.2377510 1.6060492 -3.3512750 -0.6354443 -2.1601326 -5.0958843 -7.1473975 -0.5020540 14.9856119 -92.5758133 9.4586248 3.4460313 -1.6498390 -2.2677250 -2.7118177 -14.0736742 -6.4775057 5.9304914 0.9874393 4.2615757 -5.9097457 -4.9670587 3.5122459 -5.1752791 -1.3795555 18.2530537 -8.5721979 9.0030537 1.2223579 2.0054295 -37.8847466 -3.9212637 -86.7322769 3.8576641 -0.9891389 2.5144219 37.2970009 -4.1177917 -8.5576124 2.2839680 3.7287326 14.9217415 -6.9878216 -0.9077576 -14.3245134 -0.5045533 2.0947766 0.5520068 11.9646130 -2.7562301 4.5933375 -6.7565894 1.2571009 -0.7889435 -2.4168520 -3.8753018 17.7000465 -14.6552916 1.9431255 -2.3547225 -0.0358521 3.4963155 0.8134519 -4.8304338 -1.5605993 -3.5930457 -3.6923389 -2.4660120 2.9257264 -6.5522900 1.7410669 4.6039762 13.9027386 14.9963446 -1.8298541 3.6371932 4.2098222 -4.4824872 12.3432178 8.7859650 -8.8057928 -2.3816049 -7.5806708 -10.5757561 -0.7190236 9.1116657 15.3322535 -9.7202053 -7.9747953 -12.5161228 2.0761645 30.9221020 -40.6384468 8.8750439 2.8806033 22.2442970 -5.4686413 0.7451690 6.6237311 -8.8095179 -3.0833199 -2.8705893 -8.4947853 -5.1953025 5.7132993 6.7391362 10.8457317 4.5781364 -48.0503120 0.1231518 -7.7825727 -1.5184212 -4.9757905 1.8734454 4.9558067 8.0002069 -3.8706582 10.3538322 49.7919617 -8.9659081 22.8161736 1.9776608 -6.6684022 10.5411644 6.0812197 -4.3842392 -2.6712830 17.8331985 12.7928715 -1.7060547 -5.2773490 -0.1291842 -3.4705076 -10.1124458 -7.5797043 -2.0702410 21.2406883 -13.5483589 16.2600861 3.4850712 -52.5723686 -2.1330485 -4.3798451 -17.5745544 -8.3665428 8.4209051 0.1279350 2.9736371 -8.5890245 0.6912398 4.5467052 -5.5398383 -4.2940774 27.8935947 -9.7144337 13.7979765 -1.3488394 0.7754336 -18.6116238 -5.9987845 -16.8223343 1.3914669 -10.1002998 5.1575403 69.5310745 2.6372716 6.6831646 2.9141695 5.0424399 22.3221073 -20.0142078 -2.7258399 -19.0010433 -3.7221043 4.8985591 1.6876818 18.0596180 -3.9210691 5.4787564 -7.8401132 0.2275533 0.9639640 -2.6180391 -5.8568091 16.4854259 -8.8673210 2.6047041 -3.5032837 -1.2435095 3.6036570 4.1396718 -6.4627614 -0.2491576 -4.2879381 -5.0877085 -3.5076394 4.8310537 -7.5095439 -3.9173627 1.7680937 7.5416026 7.9874601 -3.4663157 -3.0875561 4.5267277 -1.2501806 4.2926326 10.2473183 -6.7107782 -1.4074320 -11.6296635 -5.2654743 0.5199215 3.6669135 -3.6848071 6.9139752 1.8974451 -6.5752573 8.7539082 21.3295879 -7.9997315 5.7999563 -12.1600142 9.6167736 -5.2816586 1.2942662 -7.3053460 -6.0291591 0.3750290 -1.3542438 3.0323789 -0.5858546 7.1404004 0.0291614 8.0094738 2.7773726 1.3406515 -1.1706128 -6.3415799 -2.5160186 1.0333307 0.0910330 0.9742556 -10.5652418 -3.1794326 10.4463301 36.5879250 -10.1619120 17.5314865 -2.9983828 -1.1135136 -0.6588079 9.5076761 -3.5407333 -1.2605039 -7.0611787 -7.5829906 -8.2749844 -4.3423848 1.6547232 -3.4045603 -5.3082380 -1.8580570 -2.9136047 -3.0973356 -36.4166641 14.7636261 -0.0382935 -3.6037910 0.2006700 -4.9223847 4.7206845 -3.9703691 4.9887266 -3.1596618 -4.0024290 -4.8616867 -47.7332153 1.0697155 -1.2935905 -7.5976453 19.7898579 -1.2619390 9.1995516 -0.9811723 -1.2824861 -2.3196666 -2.1350310 9.6584854 -12.8232374 -0.8671504 3.5861785 63.2395020 5.9762206 -7.0023174 1.9144423 3.1720712 15.7872686 -1.6348977 -3.8570709 2.4464276 -1.9654847 6.1318989 2.7456694 16.8423901 -3.1938050 3.0458927 -0.3862924 -6.9199362 1.5916750 1.8234185 -6.3118382 -2.8737369 1.1370649 -0.1555309 -2.3639765 -1.5092635 -1.5540880 -0.9267440 -5.9267659 0.3630218 -0.7668299 -3.7064786 -0.6171085 4.6020513 -1.0721785 1.0190843 1.2259558 3.4003913 2.3814704 -1.2071177 0.4512531 0.8097601 -1.1173285 -2.4328694 -56.5165100 -2.1524856 -0.7893525 -3.5019941 -1.9304416 2.6725767 1.5662053 -1.0106002 -2.3592238 -0.5408860 -3.0179944 2.6948712 9.9189472 -32.5228081 3.1869607 -0.0588394 6.6844950 -4.7238946 -0.2027282 -0.0827390 -1.4216125 0.5695566 -0.5749767 -1.2163230 3.1895416 2.0322671 0.5177212 3.8990717 1.1559221 -50.1715813 -1.4194949 -1.0426321 -1.3015783 -1.1441182 2.1448267 1.2462502 -27.8835239 -1.0386094 3.6694996 16.5432434 -5.8179588 6.6781359 -1.1179942 -0.9347188 4.6887689 4.4959183 -1.1702057 -0.2386050 -0.9907723 -2.6056237 -1.8968648 -1.8097703 0.6925212 -2.0952048 -8.3152523 -0.6580962 -1.4824558 2.0072045 -41.9187202 6.0215497 -1.7566848 -13.7415142 0.7511525 -0.2424465 -2.0515919 -1.1983954 2.8682005 -5.0288472 -0.7571785 -2.8091893 -27.0217648 0.9928601 -1.1051850 -0.6801460 8.3948898 -1.2553947 3.6586530 -0.7924539 -0.8750823 -36.2310410 -1.4784770 -6.7967458 4.1461606 -9.5933771 0.4828700 32.9400024 -0.2575968 -21.2024555 0.9554633 0.8753772 2.3937387 -38.3459167 -0.9562846 0.1036331 -1.9574169 0.1906613 0.6418602 8.3944492 -1.1143577 1.1014498 -1.3486933 -1.8124448 -1.3185414 -1.1400975 -1.9208739 11.4357138 0.2766744 0.9397435 -1.4361906 -0.0592570 1.6290460 1.0233479 -1.4248579 2.5029240 -1.2779866 -1.2304918 -1.3842821 2.2211585 -1.0050926 2.6331370 2.3308036 6.7007928 5.5444584 -3.7038462 4.1093378 2.1001546 -7.6301117 10.4842463 -10.4177780 -6.9495115 -2.0737629 -6.3432131 -7.1265326 0.2692768 2.1425688 -0.1613857 -2.8054562 2.1766360 -5.9656954 5.3398395 19.9711895 -9.9660997 6.0893216 -0.2942072 15.3348055 -6.9056849 0.1611634 -3.0659971 -4.4229836 -0.5062026 -1.4921765 0.3343605 0.4461609 1.1803298 -0.6217141 7.0581927 2.6613288 -18.8119335 -0.4101403 -2.0244644 -2.8378685 -4.4705472 -0.9649584 2.6852486 -31.6889439 -1.9408120 7.4951267 30.9687061 -7.5417295 10.5002909 -1.1896728 -1.8044496 12.9134798 -0.7475261 -2.7627289 -1.1415348 -2.3672917 -4.9768462 -3.6100094 -3.2948828 0.9110143 -4.2316198 -1.3255030 -1.8339441 0.1446040 0.5667641 -59.2566948 10.9019890 -11.2004957 -2.0227733 -2.5522325 -0.0542237 -5.0079026 -4.8586016 6.4429893 2.2077227 -1.4113286 -6.4371066 -9.2127094 2.2478874 -5.3014169 -1.4082774 14.5693989 -2.1344898 6.3279529 -0.8602312 0.7423018 -2.4056857 -2.5992901 -24.8095570 3.6872289 -5.1459489 2.8384967 35.8889999 -8.7394609 -12.9231005 2.8802311 5.6521626 4.6346245 -9.1162376 -1.3564810 -11.0564680 -2.3243022 1.6487378 1.6793679 14.0930262 -2.6603327 2.3234758 -1.5392165 -5.2280264 -1.0984026 -2.9021256 -4.4704356 7.8432808 -22.8694344 2.8372388 -4.6694417 -1.1900395 3.1456339 -4.5672946 -3.7367454 0.7678382 -4.3349023 -3.6643000 -6.2343640 3.6615171 -2.6062083 2.3610611 3.2499564 8.3729496 6.3480191 -5.4980412 4.3421397 1.5870558 -1.7820427 10.7189999 -5.9549370 -9.0672827 -2.4945750 -2.7770820 -9.5854197 1.5674570 4.3123164 1.0161315 -5.3519993 0.5615658 -8.7993565 9.4922295 30.1289101 -14.8378725 9.1908445 -1.5302534 21.1500473 -11.3191328 0.5743459 -8.3251514 -6.1235070 0.0586362 -1.5697305 -1.4094849 0.5280035 -22.6318150 -0.1539902 10.0373516 2.9144859 -0.5476683 0.5611227 -3.8604527 -4.2449183 -10.1675491 -0.6135067 3.0014477 -0.8075313 -2.8399923 10.9748688 48.2797585 -13.7761250 17.9059620 0.4676186 -2.9183762 21.6702919 3.5631824 -3.5440431 -1.8567318 -4.1056185 -6.9081159 -5.9408307 -5.7607384 1.4284519 -5.8576698 -13.7741327 -2.3400421 -0.8104097 0.4086401 1.3010968 15.3840837 -19.8848209 -13.3055744 -2.7583334 -0.8430774 -7.0368743 -6.3575749 9.1097136 0.4074512 -1.8379780 -8.1919165 -7.7410321 2.7721143 -5.2092705 -3.6593859 22.2766724 -3.2491214 8.7953043 -4.2769690 -2.9265053 -0.8888648 -3.7976854 -15.5572777 -2.0745211 -9.5112743 4.3741956 61.0842438 -4.0863557 0.8589795 2.8591180 -2.9482129 -2.0328860 -8.0357466 -3.0039105 -9.0391722 -2.8180966 -0.5108667 2.5567615 18.3267288 -3.2840586 4.0635662 -2.4804959 -7.5577178 0.3152469 -3.9731045 -6.9277554 6.4791284 -11.0024424 4.3641658 -6.2244959 -1.3363605 -4.0292954 1.0412784 -5.5662193 2.2901456 -5.5850811 -3.9279602 -2.0914979 4.0921092 -4.3983121 4.0128050 4.5659013 7.7653604 1.2409750 -6.1754808 -1.3640833 7.2451158 6.8404136 -9.7360926 2.9646039 -6.2506070 -3.0391874 8.3265495 -3.3545299 6.1044488 2.4663479 -4.1914387 1.0834900 3.9578619 -5.2561312 7.6963115 17.5000916 -0.9610286 5.5676260 -7.0192561 -1.2264581 2.1498568 -2.1979060 1.2959186 0.2960131 1.8395085 -1.0034540 -7.0810251 -5.1412506 -0.7203251 1.2830967 3.2576454 2.7081983 -0.5558693 0.8691177 -5.0105367 -1.8858857 -6.5558634 3.2061121 -2.9896190 -0.4362359 -0.1511936 8.1067476 28.7534943 -16.6146641 9.9690180 -0.3284051 -8.3895206 20.7242908 -1.3470466 -0.6114936 -2.4470184 -7.0627394 -7.2513237 -9.6208620 -6.9753747 -0.3063435 -1.3809630 3.2697365 2.1630294 -5.1182437 12.0201836 2.6643159 11.7823534 0.8048393 2.0842795 2.4911957 -0.2257538 -5.7367663 -2.7263384 4.6869774 -13.6063938 0.3334577 -8.4094515 -6.9050384 -1.4127802 -3.1925137 -5.0041251 14.2866430 -2.1562643 6.7809200 3.5030723 -1.0177238 0.2810074 -0.7555334 7.0733728 -2.5148718 -5.0359445 2.1244831 26.8458672 11.1530323 9.2906170 -0.9277897 0.0589389 -8.8148727 -5.9935284 -0.3485358 8.6701088 -3.0702620 7.4390807 1.6831545 -7.8843427 -3.0491860 2.9589996 -10.7061205 -8.4623976 9.5727558 -10.5769882 -6.0489221 -0.1805380 7.0560246 -0.9873145 -0.0566666 -0.2003058 9.2030239 2.6771691 -5.6715975 5.9565372 -4.4285965 2.4140937 4.6719832 2.4236040 -4.9126163 0.5924380 0.7264338 2.7178373 1.4741631 -1.7654024 -4.6351457 1.1528788 -2.3053296 -3.6299250 -45.3250389 -2.1764169 -1.2181600 -3.1306665 -1.6731278 1.7839615 1.1183612 -0.6131299 -3.1767626 -0.7706164 -2.9117980 2.6210880 9.5839128 -34.0547295 3.2242851 0.2885867 7.1711817 -4.0970531 0.4319974 -1.1538086 -1.0280368 0.6231926 0.1110939 -2.0462718 1.8048135 1.1451453 0.0763174 2.9610476 0.9376661 -34.2657852 -1.0634711 -1.3640939 -1.2466056 -1.7304544 1.4439573 0.7190406 -31.1566525 -0.4779785 3.3371091 16.2013435 -5.1648645 6.6617098 -0.2873980 -0.8433148 5.0509892 4.2860827 -0.8711377 -0.7450499 -0.9635738 -2.3806853 -2.3025157 -2.1072152 0.6333584 -1.9697045 -7.1592550 -0.8132034 -1.0047114 3.1655707 -39.6838760 5.8104496 -0.5097955 -5.6378069 0.5534362 0.5621299 -0.8964011 -1.4822284 3.5704615 -5.8041539 -0.9694592 -2.7653217 -42.0842400 0.4169663 -1.3150188 -0.4748127 7.6914587 -1.3800987 2.8396738 0.1375664 0.6780766 -23.1507206 -1.7462360 -8.2404327 0.9354485 -11.7178726 0.4901188 29.8356056 -1.9169301 -25.5496883 1.5059497 0.8618265 4.4254794 -16.6666870 -0.5155829 -1.6116844 -3.1340625 1.0973547 0.7026594 6.2229090 -1.2156413 0.3650899 -0.7764557 -0.9702027 -0.8221596 -1.5981225 -1.7516282 0.8236955 -3.0332992 0.7560759 -1.5031766 -0.6703366 2.3215005 -2.0823157 -1.2810009 1.9969507 -1.7771642 -0.7679902 -0.5101074 2.1921685 -1.0909047 1.2885814 0.7721176 5.2268062 3.0325792 -3.7799942 -10.8526449 -0.6458089 -8.6092672 10.1556358 -11.3453588 -5.4304423 -2.5943072 -2.8377869 -4.7117429 0.3138206 2.0504110 -1.0816978 -8.5681038 -0.6936062 -6.3709593 4.5401778 19.4618015 -8.6663704 6.6234207 -2.4384708 13.8764763 -4.1801152 0.4791338 -0.3536761 -3.5955355 0.2586640 -0.7940051 -2.4585745 -0.0010308 0.4103516 -0.6184571 7.4959621 2.0276594 -7.5992160 -2.6661446 -2.1637964 -2.0564113 -4.8449659 -0.4706137 1.3523459 -23.1591702 -1.7367387 6.5970230 31.1402283 -9.8742046 12.6245775 -1.3387994 -3.3176508 11.3351154 4.7006922 -1.9612577 0.2714823 -2.4217210 -5.4809251 -5.7603402 -4.0441070 1.1154474 -4.5746408 -3.2499003 -0.5433724 -0.8618407 -3.5212288 -39.4553680 10.6521730 0.1296268 1.0132365 -1.0789129 0.6941788 -3.8372524 -3.7774897 6.9068074 1.4797232 -2.1910918 -5.0917015 -7.6633363 0.8165445 -4.5637541 -1.3586020 14.2568789 -3.6646080 5.5813155 -3.2853470 -0.4121027 11.4995193 -3.0385916 -30.8939972 3.6140492 -8.4007959 2.5763426 29.6343575 -12.3948374 -17.1940479 2.6359525 4.4452419 1.8925831 -7.0886030 -0.8978785 -5.4045992 -4.2235327 -3.9964328 0.9845763 10.6412201 -2.6802230 2.5190277 -2.0102277 -3.4658048 -0.1648029 -2.4083428 -4.7932844 0.4552365 -41.5038338 2.2763731 -4.3696189 -1.4821652 2.9256105 -7.9133153 -4.3804207 1.0632669 -4.4884677 -2.3448186 -3.5606046 3.6795466 -1.8645903 1.4586295 1.3674982 6.6465044 1.9292779 -5.4194994 -18.2243176 -0.0689560 -2.9755344 8.0737724 -6.7363763 -7.2709694 -3.4801385 -8.9544668 -6.9315853 2.6164107 4.0980272 -0.3618875 -19.7461205 -2.5394607 -8.8517170 8.2988672 29.1677113 1.2443714 10.0727472 -4.2577143 20.1036625 4.4049058 -0.0156164 -6.0601311 -4.7345562 0.7931279 -1.0031234 -5.0121865 -0.0212195 -7.0610509 -0.3359568 11.6998358 2.6493776 -1.5368905 -5.1088319 -3.1441762 -3.0378685 -8.6762943 0.2380551 3.1316736 -4.0565472 -2.5359545 10.2370720 46.8100929 -15.3000355 17.3397789 -1.2772634 -5.2328882 14.2224874 5.1853461 -2.9158120 0.8591005 -3.7967939 -7.9633818 -7.7113914 -6.4341779 2.0230758 -9.0043564 -13.9544907 -0.6205298 -1.6904175 -9.1614780 -17.5860157 15.7534552 -2.6474640 10.8143797 -1.3713024 0.7282504 -4.2488475 -5.1023598 10.1413155 -0.7464809 -2.8350344 -7.1111789 -5.5568304 0.8182772 -4.3096886 -2.4832454 21.3532772 -5.2533956 8.6551275 -6.0231118 -2.8955274 -1.0900131 -4.4090991 -1.2006733 3.7034826 -18.3712864 3.3006415 66.5608063 -6.9040165 -21.5625114 3.7222409 4.2430739 -3.2540402 13.6474810 -2.1000147 -11.6252127 -8.1258116 -4.7710495 1.6168941 18.0742626 -2.8613391 3.6881332 -4.0983248 -5.0592771 -2.3016512 -3.3673780 -6.9243264 -0.5378109 -11.9385386 4.9461122 -5.8230019 -2.1666427 4.8238530 -7.5487337 -5.8742061 3.5365760 -6.0745549 -3.2306280 -4.9918017 4.9649453 -2.7577841 -1.8611442 -1.9525793 1.0652052 -0.2865506 -2.3959627 -11.6098604 3.7598796 -2.9822550 4.4607358 1.2650726 -7.0538344 -2.6212518 10.9479904 -2.6992075 4.3702021 1.2458558 -12.4430351 8.5449467 -0.0501904 -4.2294455 15.6165266 19.8211174 0.2162707 7.1832576 0.1086698 11.6586637 -16.6921711 3.7380009 -15.5434618 -3.6713345 1.9357738 -0.9218381 -1.1506177 -0.1482650 -16.1378269 -1.0865500 5.1193795 -0.3070384 -0.4322852 -2.8427970 -4.1993217 -2.7260237 -18.8775311 -1.0200919 -2.6144936 -1.3733476 -1.1950663 7.4459515 34.5746651 -5.7529926 5.8483343 0.1217808 2.7472277 -2.1624026 9.8109236 -1.8624972 -1.2046460 -8.8585253 -11.7166395 -6.6411915 -4.2140617 1.3608180 1.1144197 5.0033550 0.3111017 -9.2757311 -4.6355734 -2.4184022 10.3303490 -3.0262899 2.2831054 2.3212631 -0.7831165 6.2334790 -1.5021601 9.8398819 5.8096366 -2.2700245 -4.8416228 8.1971426 -1.1331252 0.3510924 -6.9952950 14.5331764 -0.9461049 2.1517825 -9.7138128 0.0541539 -0.3559118 -2.7555482 -16.0006561 -8.6021414 7.2293353 1.4039365 35.0579834 5.6307893 -1.2434999 7.0132875 0.8316599 16.8510647 13.5331020 -3.0275462 -0.5044365 14.7290154 3.6354680 0.7799260 13.4149008 -2.4203756 2.2258880 1.9720923 -3.9914446 2.9992170 -4.2167363 -7.7892003 -0.8022420 2.1261244 0.5190056 -3.7360597 0.5786287 3.0107353 8.4282465 -8.2793598 4.1987181 -1.9294876 -2.4151523 3.7289190 2.6665461 -0.0705063 -0.3586136 -0.2727686 1.8281082 0.4503023 -1.8005599 0.1977723 1.5850049 -3.0105956 -5.0411744 -38.4538460 -1.8703634 -1.4675993 -2.9654922 -1.1647310 1.7724358 1.3884819 -0.7956862 -4.1970196 -0.8078132 -2.5248466 1.9349307 9.4145565 -25.1934280 3.6732192 1.1921370 7.2209139 -1.7838724 -0.0445097 -2.5650084 -1.1446213 1.0060138 -0.2345068 -1.8084363 2.2064028 0.7329046 0.2273307 2.8659019 0.4403934 -53.9112015 -1.4140631 -0.7679914 -1.2048497 -2.2884102 1.4918550 0.2281978 -30.0860138 -0.5560791 3.2246399 15.2859116 -5.7064042 6.7875042 -0.6575379 -0.7172738 5.3928990 3.1367161 -0.9509578 -0.3059750 -0.7481498 -2.5846298 -5.4894013 -2.1181808 0.8430775 -2.6396437 -7.7431507 -0.2301141 -0.9382176 3.8246410 -32.2606964 5.4350367 -2.6030028 -5.4223676 0.5047787 0.9885289 1.0779432 -1.3244615 3.8855882 -9.5861893 -0.8531858 -1.9478154 -31.9189301 -0.2177956 -1.2121310 -0.5298182 7.3510132 -1.5410330 2.2064435 -0.6917838 -2.6955574 -43.2907372 -1.7500700 -6.1012073 -0.2555901 -10.6009340 -0.5698838 30.8015442 -3.3631096 -32.8284836 1.5875490 -0.2570900 6.5249648 -13.1781273 -0.2893086 -1.5488110 -2.5202446 1.7490705 0.3028983 6.9902616 -1.5713416 0.3350846 -1.2581071 -0.4973553 -0.7023190 -1.8007244 -1.5888925 0.2425294 -4.4866414 0.7446841 -1.4698601 -0.4508690 2.4954267 -4.1769619 -1.0124338 2.0309601 -2.0202644 -0.6369649 -0.6685481 1.6624359 -0.6740070 -0.1388322 -0.5121521 3.9673462 1.2649626 -4.2415838 0.2246120 1.0054158 -9.4175158 11.6305151 -5.7302785 -5.1365886 -2.9699981 -4.0670738 -3.6892245 1.2221626 3.0484326 0.8290114 0.4111533 -0.2784118 -5.4388437 4.2789602 18.9711609 -0.5450602 7.2882872 -0.4415569 13.7872105 -2.5483396 0.9390088 1.0547841 -3.4648256 1.2140815 -1.5896766 -2.1078835 -0.9185736 1.8485246 0.3258524 7.3528528 0.9893539 -35.5533295 -2.8757558 -1.4037477 -2.4258082 -5.0020061 1.4119692 0.3087100 -22.8960190 -1.2109139 6.1005683 28.5774307 -9.2505341 11.1207800 -3.7941844 -1.8828582 12.5695906 2.7807784 -1.8798350 0.9603410 -2.1943610 -5.4958396 -13.0482912 -4.2189360 1.3786885 -5.5931072 -4.7569723 -0.7175912 -0.7534922 1.2246169 -30.1964493 10.1022940 -2.7675986 3.1616788 -0.8098543 1.2344818 -0.5004340 -3.0828688 7.3089833 1.2220608 -2.2298331 -4.9942689 -23.2936420 -0.1534306 -4.0817881 -1.4938756 13.4703846 -3.2599647 5.5053864 -6.0828948 -1.1108572 -17.2957001 -3.0750644 -19.0766258 2.7670748 -9.3088188 1.3161622 30.6504288 -11.4160156 -2.8050301 2.2012687 4.3026853 -1.2284787 -4.2879186 0.1060770 -5.7617807 -2.9116206 -3.5331924 0.7183983 8.2007980 -1.7687696 1.8542722 -1.5444876 -3.2914100 -2.3024335 -3.2302186 -4.3917561 0.1659070 -43.4112778 4.2218828 -3.9384675 -1.7115510 3.3767231 -5.7773871 -3.6867232 1.9762858 -4.5741625 -1.3497424 -5.7850008 3.1209261 -1.2609123 -1.0563135 -1.5384104 5.2486658 2.3595245 -5.1357045 1.3959732 9.2213411 -6.1136193 15.4611301 -6.0999360 -6.1949520 -3.7830784 -7.2846556 -4.8406367 2.2338190 4.6555471 3.7928793 -1.5395271 -2.9040632 -7.4596863 9.1610222 28.1266098 -0.8233227 11.5138159 -0.5927793 19.1970978 3.7263601 2.6916721 1.2688864 -6.0961299 2.8049774 -1.4984125 -5.3036890 -1.9029920 -1.3220582 0.0604957 9.3778048 0.8103630 1.0384506 -6.6223645 -2.2735262 -3.3185775 -9.3908854 1.5889070 -6.8129883 -2.3991115 -2.8547873 8.6028786 45.4777870 -13.8440723 18.2745972 -11.9754944 -2.4162219 14.8145866 4.7275095 -2.9362416 0.5461156 -3.3439837 -7.4054356 -31.0878735 -7.0581594 2.6515543 -12.5629272 -3.2746489 0.7141892 -2.7325034 -7.1315050 0.2775041 13.6149712 -5.4005990 0.4099766 0.0170158 1.9445984 -1.3460361 -3.8285573 11.3044147 -3.1986866 -3.2545588 -7.0787859 -6.6422749 -0.2101926 -2.3066504 -2.8856637 20.5480061 -4.1490998 7.9583335 -3.2275071 -5.5492630 -0.0697625 -5.3740163 -1.8321317 1.0367928 -17.3775120 2.3234513 53.3277054 -4.9867764 -9.7698479 3.9719436 10.4152985 -2.7405660 8.9628315 -0.7626095 -2.7051580 -21.5446205 8.4794407 1.3124573 9.0243034 -2.7853839 2.3854373 -0.5441641 -4.7162609 -6.4804330 -5.2276340 -5.7813249 -0.5010552 -20.9548836 5.3308907 -6.1708322 -1.9264107 -5.4769721 0.5494164 -5.2693906 3.0870950 -5.4355822 -2.1054707 -9.9054356 4.0741048 -1.7259010 1.5035931 3.0928562 3.0494130 -0.3101749 -0.3944027 0.2086201 9.8409357 -2.3641601 4.8735876 -1.0141088 -11.7385054 -6.4707699 0.9287019 -2.2040741 5.5119257 -1.9990441 5.1637058 -5.6519432 0.3300190 -7.4199147 -3.1361916 13.9103861 0.0906044 4.3193173 -6.9548802 1.0370369 -0.1316932 -1.4899048 -1.4927208 -2.9464352 2.4212027 0.7484552 -5.2259059 -15.5720787 -2.9292004 -0.8040712 14.4139709 0.0298887 -0.2429208 7.0830665 -2.1545420 -0.2861044 -7.0432467 5.2057958 -0.7312459 -0.2396344 -0.7727572 7.9377923 20.9485283 -4.5970726 -4.2007971 1.7899404 0.6967066 4.6291909 -2.0958800 -3.4948773 3.6649055 -7.7330828 -7.9814391 -1.6828309 -9.2028370 3.2210667 -1.2252359 -0.9718592 -3.3990676 -8.1165409 -4.8768392 0.1841529 8.0133657 1.3469121 0.9601586 2.7105391 2.0426931 -0.4221538 -3.9205875 12.9882803 1.1549152 -0.3761451 -8.3718758 -0.7285350 -2.5864737 12.1533222 -2.8012595 12.1548462 -2.3958759 1.7186378 -1.4365929 0.0044705 -0.1097299 -0.6071803 -0.0895026 -3.5003335 -0.5341336 -5.6672306 19.3832188 1.1350247 0.6618584 7.2897863 -0.4434423 -4.9518161 -0.4837813 -2.4590700 3.0774240 -3.1115391 -1.6328807 2.8129191 -1.6977462 2.8986285 2.5353703 -8.6473465 -3.8167872 -2.8647830 -10.5673246 -4.7494912 -2.2916057 0.1259627 7.0766134 2.4316049 0.5090803 0.7808138 0.7210907 -2.9809237 5.6299644 -5.6535845 0.6923955 -2.9176247 2.5903220 0.6300026 -1.5786867 -0.8196706 1.3206779 -0.8157909 -2.0081565 -0.5644077 0.3376013 -4.5958877 -6.0293121 -38.4849434 -1.6542493 -1.3252330 -1.7184936 -0.7694294 1.8095253 0.6479532 -0.1652832 -3.9804456 -1.2860317 -2.2146077 2.3475037 9.1697416 -13.7886171 3.7069969 1.4132568 7.7668915 -3.1297481 0.5645243 -3.3174245 -0.5342919 1.3219609 -0.2937446 -2.2929759 2.3722396 0.5039670 -0.1570321 3.0439174 -0.2165339 -45.3126144 -0.8223162 -0.3146233 -1.3843753 -2.7423186 1.3456999 -1.2610009 -30.5325470 -0.4361823 3.2934484 14.9433527 -5.8273993 6.5887280 -0.4674497 -0.7752741 5.8638344 2.1697164 -0.6574881 0.4686189 -1.0190318 -2.5294018 0.2432662 -2.2626050 1.0832492 -2.6783209 -6.2558088 -1.4731704 -0.6660866 2.7085836 -26.8855057 5.3141890 -2.3306239 -6.1803889 0.4124231 1.1524873 0.7454818 -1.1639798 4.0131278 -8.0342751 -1.1200314 -2.1409085 -24.0185223 -0.4737085 -1.5514565 -0.6475512 6.6927662 -1.1561111 1.3216689 0.6504375 -4.6978822 -35.8492584 -2.0158987 -15.8081207 1.6059210 -8.3888445 -0.8344485 30.4876823 -7.7544398 -35.9090614 1.8093617 -1.1632284 8.0803490 -12.4386606 0.3964209 -0.4078730 -3.6078908 0.7597011 0.2272374 6.9140835 -0.9884055 0.1891508 -0.1915850 -0.9045134 -0.3511479 -2.0163224 -1.4051710 0.0162323 -6.9461503 1.6291571 -1.8801966 -0.8386213 2.7940979 -9.4517269 -0.9685761 2.2300875 -2.1517212 -0.4262324 -0.4096864 1.1246626 -1.1109332 -3.3716292 -1.0107304 2.1708410 -1.3077639 -5.1539798 -0.8797469 -1.7262416 -10.5467119 11.3819475 10.7201014 -4.6983442 -3.7826014 0.8699167 -3.0093584 2.9954436 1.5830877 1.0019951 -1.5551699 -3.0930762 -5.1959720 4.4766393 18.6268635 5.1549034 7.2505622 -2.3957655 13.7765608 -2.8376577 1.7619985 -0.4956238 -2.0547471 1.9715966 -1.3206328 -4.3084521 0.2190461 1.4176444 0.3761956 7.0480099 0.0646679 -36.2105751 -4.1886668 -2.0209434 -2.3197973 -5.4847517 0.7228162 -1.9848949 -12.8802929 -1.5398837 5.4447632 28.2608891 -9.0992804 8.5433168 -3.7552423 -3.0853996 10.9361591 1.4253728 -1.6027533 1.1400632 -2.3309345 -5.5693049 -0.1168811 -4.5710444 2.0089796 -6.5510764 -2.8434105 -0.8870732 -1.0946826 -0.1952750 -5.1996593 9.7160788 -1.7799332 8.2639618 -0.1660010 2.0057764 0.5299390 -2.0865819 7.1456351 -2.0812337 -2.6705768 -4.5013127 1.2838924 -1.2159675 -3.0676088 -3.1467471 12.7999916 -2.6244509 4.4813123 -10.3332462 0.2603953 -15.2928352 -3.8473732 -14.7446041 7.8960195 -8.1452131 0.5370077 26.7479019 -5.3508487 -8.5174484 1.0611709 5.6240854 -5.0341573 7.1732464 0.4656125 -3.6124249 -5.5962076 -8.2983322 0.1471105 8.6857176 -1.9097480 0.4323964 -0.5558987 -3.1364470 -1.1720557 -4.7230220 -3.3677664 -0.8654227 -42.8787956 3.5482171 -3.9864950 -1.6028429 -10.9519463 -20.9129219 -3.0858040 3.7408872 -5.0683923 -1.2786273 -4.7339239 2.8055961 -0.5396548 -6.4223523 -3.8353770 2.6511905 -3.7800472 -5.8627696 -1.7677131 5.1898446 -19.0690880 16.2276192 1.8817298 -4.2793555 -4.0399566 2.6785200 -4.7562408 9.8297796 0.5842069 1.5699193 8.5846777 -1.1684361 -6.6083536 8.9627924 27.3470497 0.4462951 10.8298874 -2.6182482 16.5970764 -21.2098961 2.0912156 -10.9172535 -1.0097791 4.4427776 -1.6756608 -7.1732545 -2.0458655 -1.1199936 -0.1099680 12.7947607 -0.2426693 0.3403511 1.3015803 -3.2916358 -4.3503785 -9.4573803 2.6923614 0.6834208 -1.2051383 -2.4126155 8.0985069 38.4715385 -11.4893599 11.6684303 -5.2791824 -2.7949882 16.1232014 -18.0581341 -1.9680487 3.0281336 -3.9165823 -8.6523399 0.3689938 -8.0959711 4.2648168 -15.4712639 -13.9614363 -0.5706108 -4.2775607 -9.0452433 0.1088228 14.3581867 -4.8411574 4.9388661 -1.2604971 1.9082342 5.9343171 -4.4832530 11.6335936 -21.8650360 -3.1279175 -7.0272551 2.6429555 -3.6528444 -5.9475760 -5.0527983 19.5601597 -1.7670979 3.1203117 -5.2428703 4.9877028 -0.0087189 -4.9757047 2.3538449 5.2920427 -12.8955240 -0.0413365 44.3436394 0.2925975 -3.5886803 2.4547801 -0.0708685 -27.2020016 -6.0913682 0.6034890 -4.2010736 -4.7850523 -7.5982661 0.9822940 14.0641594 -1.0558146 1.4988270 -0.4542947 -1.7424208 8.7494144 -8.6966791 -5.3149452 -0.0848811 -17.8032780 6.3828559 -5.0589247 -1.7350246 -6.8478575 -12.2890472 -5.0324459 8.2692699 -4.4637899 -0.0798008 -2.9194520 4.0943623 -0.1023817 -2.5455110 0.8972276 0.8483158 -0.6642473 -6.1938953 7.2125964 0.6765067 -0.2902553 -0.0495294 -0.2482902 0.0763920 -3.7246673 -1.4337851 0.8795933 9.3036308 5.9031773 3.5845478 0.4151890 7.5871115 0.9445392 0.8485503 9.2418575 0.0533534 12.0056076 -2.3171043 1.4164295 0.0094910 2.1932845 -0.1743334 -1.0068582 -2.4324150 -0.8712246 -2.2751579 -5.6075768 -2.2218802 1.5577936 5.8919272 -1.8399084 0.0129371 5.4887013 -0.5494576 1.0265681 1.3209099 1.9824460 -1.4310840 -0.0427400 -4.5197692 4.5170794 7.0773821 -7.8261414 -1.1457678 -1.3463243 -2.4815636 -1.6237242 0.3207886 7.3967023 -0.5549892 -8.5633259 -5.3647976 -3.6291580 -9.4105902 -2.3710325 0.2837838 2.2908306 -1.5720387 -0.0358993 -2.9244602 -0.1692046 5.1606770 -3.5478401 -0.0718412 6.3288655 -4.4521461 -0.1299411 0.0948831 14.9539356 -0.9537299 -5.4677835 3.7460666 0.1010120 -12.2960835 6.1880956 -8.5645714 16.6428108 1.7608000 1.5530479 4.6956892 0.0202883 -0.0685169 -6.9977875 -0.6470527 0.4287570 -2.6648219 -1.3283614 1.8968557 -1.6309597 -0.1199213 -0.8394411 0.0513575 0.0104148 -0.1286570 -2.8193634 1.5976268 1.1352235 0.2814936 -3.0814567 -1.0983988 -1.7798702 0.6469313 4.1062350 0.9129848 1.5425142 -1.0932257 -2.2033379 10.6308823 0.8059363 -2.1219683 8.7452698 -4.9386358 -0.5650414 0.3876180 -2.9939711 2.0863433 0.0543757 -1.6756461 -0.2213454 1.7084680 3.5382440 -0.6658556 -1.2611448 0.2895308 -2.0572498 -2.7364452 -0.6078898 -0.7940637 -5.4288058 -7.9698625 -9.1083879 -0.6137397 -2.0222592 -2.4032633 -0.3410070 1.1894625 0.4831040 0.7882656 -3.8272464 -0.6029724 -1.7527921 1.7354679 8.9309282 -7.4861941 4.1029296 2.3531597 7.6281629 -5.4214358 0.2968348 -4.0125089 -0.9824646 1.6666138 -0.7287347 -1.1321108 3.1990683 0.0687633 -0.1375090 2.6757863 -1.1293758 -56.1932564 -0.8650085 -0.2008798 -1.2629817 -3.4046052 1.3144730 -1.7859797 -24.3167019 -0.3664780 2.8724489 13.9713507 -6.1128016 5.8640170 0.0732998 -0.5678949 8.2726221 1.6938431 -0.7789767 0.7667914 -0.6085184 -2.1041114 0.0326344 -2.2894826 1.3778634 -2.9561620 -5.5549393 -1.0527962 -0.4493349 0.5905614 -26.6538620 4.8351340 -3.5692301 -7.5598617 0.5208997 1.4602462 1.8946766 -0.9032544 4.0225210 -6.9578867 -1.1388966 -1.3276962 -15.0636883 -1.0217079 -1.4367312 -0.6822511 6.3502369 -1.0253888 0.2418924 1.2766126 -2.7445071 -48.1376572 -2.0077190 -5.8178334 0.5964159 -5.4078813 -2.3271368 29.6072979 -11.5090342 -34.3836403 1.5766696 0.4512544 9.3645868 -13.6426859 0.4473301 -0.6849799 -4.1285434 -1.0810790 0.0532385 7.2092018 -1.0181298 0.0453475 -0.1771967 -0.8250913 -0.8369633 -3.2163777 -1.1779158 0.0562209 -9.1707706 2.4038727 -1.8395264 -0.6817195 1.3850510 -9.5862322 -0.7790877 1.7265115 -2.8985660 -0.5766098 -0.7490746 0.2922599 -0.4848866 -1.7200768 -2.3648419 -0.1267560 -5.4530683 -6.4536490 -0.7158644 2.0713749 -14.7558842 5.8601151 -8.7321215 -2.9152744 -3.7762206 0.1433486 -2.9764185 2.4245684 1.3965594 4.4081583 -12.7155695 -2.2089555 -4.5813465 3.5006323 17.4974670 15.1134062 7.7980113 1.0152063 14.0566893 -6.4568620 1.2210493 -6.9500556 -2.1243296 2.5195935 -1.8810240 -2.2362869 1.0557870 -0.6839679 0.2430709 7.1819448 -0.9345068 -9.2267122 -2.8808367 -1.6848099 -2.4904845 -6.4599757 0.5050019 -0.4969682 -13.6962032 -0.7196826 4.5740132 25.5762424 -9.1648493 8.2168818 -4.5192857 -2.3393264 12.3685179 2.2717264 -1.3323312 2.2037041 -1.3438064 -4.5868273 -0.0464848 -4.4756808 2.3702233 -8.4551430 -4.0603132 0.6504511 0.0699780 -7.8674970 -10.5639772 8.4031897 -4.0227690 -11.2960863 -1.4845310 2.3307269 3.1539967 -2.0779183 7.1532459 -0.3483415 -2.1562321 -3.6719291 4.5143523 -2.9341362 -4.5719519 -2.3256795 12.1886110 -2.6367774 3.7830949 -13.9266624 -3.5557892 9.3390255 -3.4394956 -9.7430420 1.9658419 -6.0650024 -0.8166771 24.8717499 -14.2712688 -18.8574448 0.9362120 3.1299746 -9.4477491 -12.5242281 1.2247250 0.0090619 -7.7184124 -2.0851462 -0.1803670 3.0638947 -1.2887279 0.9198848 -0.5552233 -1.9556477 -0.0119907 -5.0791950 -3.0913382 -1.1925112 -22.8761501 5.4132318 -4.0952396 -1.2790372 6.5755415 -29.9479828 -2.4134810 3.6464520 -5.6316381 -0.4871117 -5.8728652 1.7249666 0.7362784 -0.3742514 -2.2189381 0.1942796 -12.1554289 -7.9700813 -1.8443038 15.6474676 -10.1325741 8.9370890 0.0861655 -2.2914004 -5.5323896 7.1689358 -2.5100553 -1.9534590 2.8836153 9.4042749 -18.0536060 -3.6242948 -5.5843086 5.1649337 26.4662704 4.9896989 11.9099083 1.5051733 20.7882957 -3.0765171 2.6102591 -20.4369144 -4.4511771 3.8988214 -1.5589890 -4.0053058 0.5167520 -4.3996434 -1.4053469 6.0723996 -0.5409961 8.4507742 -1.6703550 -1.8191853 -3.9061627 -11.7662039 -0.0214042 -3.7462726 -3.6754639 -2.8286402 6.5223460 40.3683167 -11.9636679 4.4621196 -4.9223037 -3.0761147 8.0761747 1.9834051 -1.5104340 2.6774032 -4.8400559 -8.0221491 -2.5384924 -7.0260048 3.4046252 -11.5693150 -6.8511329 0.3300982 0.5177804 1.1161747 0.3712773 12.4308653 -5.5484209 1.0531033 0.6607099 4.1994638 0.6933605 -3.6534665 13.2841940 -0.6414691 -3.3237224 -5.7780681 -1.0401087 -2.6428499 -4.0024724 -2.8628719 19.4135075 -4.1659546 4.0783501 -1.8673545 0.8791603 -0.9483427 -5.3940988 -0.8708304 1.2271785 -10.2933989 -0.7391572 48.5846596 0.9238144 -3.2207279 6.4590960 3.1273539 2.0961959 1.1338083 1.9862118 -10.0143957 -9.0112219 -0.4841377 0.8711895 17.3336506 -2.8971848 1.8006442 -0.0729767 -4.7726378 5.4080920 -6.8642316 -4.6560941 -1.6500499 -6.5202742 9.0396318 -7.8387375 -2.1393778 9.6232071 -13.1308184 -2.9143739 0.3438033 -8.9018803 -0.2562700 -1.8058381 3.6695898 -1.0159373 0.9955812 -1.6012759 -3.7468448 -17.0979099 -3.5871215 7.9653358 0.8395110 1.7271583 0.6110238 -0.4460880 -15.8728189 -6.8485770 0.0817960 -7.1072841 5.2019763 -4.9155459 -3.1009157 20.8296947 -1.4277402 -10.9045782 9.4149265 10.2473993 -0.0316018 -7.5156512 -1.1188687 -23.3857956 -4.5056515 -9.5232048 0.1715621 -1.8939184 11.9154272 1.9002988 2.8426857 -5.0263076 0.0233915 -0.6454414 11.5172234 0.6152308 -0.1354362 -1.6484566 0.7319678 -3.2623799 -7.5471277 -3.1155393 0.6857590 0.3086866 2.9651842 9.3442612 28.7816219 -3.9108236 3.4619412 -1.3893267 2.9712131 8.2114420 -6.0926962 -2.5267186 1.8434539 -0.1882764 4.0643744 -22.1926880 -8.3285046 5.5064316 0.4871417 -8.3973694 -6.2146993 -5.5891781 -2.7757311 0.3414662 -2.9471970 -0.9256853 0.1383863 -9.8958092 -8.6908054 -6.7715549 3.7973680 18.3529739 -1.0588330 -1.5738537 -6.6298661 0.0364359 -8.8259668 -8.7262983 -3.9092088 12.7392254 4.2983074 -1.7443728 -3.2230897 0.4117163 0.0280326 -0.3732655 -0.0877066 10.1028862 5.2562194 7.8328123 23.8061543 -0.6025935 0.2490878 -0.5914909 -0.1106320 -1.3506476 -0.2984810 -4.2784781 -3.6890006 -0.6053799 -0.3980651 -1.8892084 -4.2988005 2.1449754 7.6078820 -1.6652797 -7.8056669 0.0531502 -4.0052590 -11.6801386 1.1103536 -1.3046046 4.0477915 -3.1286201 -1.5750420 -0.9755921 1.0252179 -11.6730089 3.9208708 -7.7004094 -2.0295963 1.4132154 -2.1135702 -5.6655073 -0.1117880 -2.1424754 -0.0988372 -3.0703850 -2.3860431 -1.8910900 -1.0894167 -6.8730936 -10.2230711 -3.1787889 -0.1735912 -1.8457657 -1.7303469 0.2689976 1.8383882 0.1705402 1.9314109 -4.0501251 0.0280854 -1.4017889 1.6446705 8.5278111 -10.8456898 4.4513879 1.6237576 6.8950624 -3.9321408 0.5080653 -6.2406116 -0.1008176 2.0753515 -0.6840075 -0.4551499 2.2858295 0.6085336 -0.4853026 2.7462292 -1.7333897 -44.7655258 -1.1755440 0.1946384 -1.5281600 -3.5419161 1.6200953 -2.6319733 -29.2873211 -0.6781480 2.7990248 13.6026993 -6.2822089 6.3471556 1.3089236 -0.9787940 8.7344131 0.6104553 -0.3653745 1.2414041 -0.7132751 -1.9232408 -0.7253581 -2.4837577 1.5520257 -3.4036946 -4.7722449 -1.8580325 -0.6021011 1.0186368 -26.3685169 4.5376506 -5.4459472 -4.0284653 0.8097623 1.4315095 1.8695178 -0.6591839 4.1053710 -6.2869263 -1.4504671 -1.3051630 -12.8068218 -1.5881670 -1.5400802 -0.6498189 5.4461761 -1.1246138 -0.4136853 1.2765383 -2.6500382 -35.9063835 -2.1219079 1.3958684 1.1056700 -2.9525230 -2.6777673 29.3592377 -13.8768902 -35.3783684 1.4054158 -0.0270228 10.1295481 -10.1906309 0.9021891 0.5669743 -5.1992235 -1.2094371 -0.2645119 7.5241985 -0.5762182 0.1124003 0.2350538 -0.9012238 -0.6131110 -3.2110713 -0.8356628 0.2624713 -11.0361099 2.5991752 -2.4302440 -0.5792752 1.7653068 -7.2910957 -0.4754095 2.3382041 -2.5308418 -0.1017537 -0.1407143 0.0639974 -0.7041307 -0.9348631 -3.6103461 -0.4724024 -7.0676355 -5.8181634 -5.1542487 4.1954508 -15.5572834 9.6868067 3.3699055 -2.9250035 -4.1663184 -1.5602155 -0.7375222 3.6005719 0.9037741 5.2124176 -3.4928014 -0.9118271 -4.0965114 3.0982766 16.9465580 -4.8096323 8.8501682 0.5317780 13.4256983 -3.7150784 0.6863330 -5.4985156 -1.0200549 3.1928017 -1.9587218 -0.7177830 1.1976029 -0.9039471 -0.7053834 8.3638811 -3.2832935 -15.1720877 -4.0095038 -0.6482487 -2.6676126 -7.3584962 1.4624801 -4.8864679 -4.5092082 -1.9707581 4.5992398 24.4243908 -7.2425785 8.3374434 -5.5755897 -3.2855279 11.3846474 2.2334819 -1.4454682 3.8007865 -1.7522466 -5.0914803 -0.9642908 -4.6842403 2.9090312 -8.4525366 -4.7930279 -2.2205157 0.4303643 -11.6804705 -3.2614038 7.0467319 -6.0493875 5.7432199 -0.6186066 2.2671137 3.1990576 -1.6694864 8.4683943 -2.7597971 -2.5457621 -2.8605711 7.8938980 -4.3282108 -3.8181438 -2.0572069 10.8573875 -2.7384658 0.4487876 -12.6921921 1.0519201 1.9875454 -3.7534082 3.0594072 3.5185375 -1.9477483 -1.7550939 20.9921341 -20.9157677 2.3966606 1.6198066 5.7014351 -10.9493608 -4.1633544 2.3135135 -3.1376963 -9.3306141 0.8399778 -0.8604550 3.0141397 -0.2316133 0.7382811 -0.1098693 -3.1182733 0.2828516 -6.3039455 -2.9556556 -3.1633396 -37.3954353 6.2711053 -4.3328438 -1.6495490 -1.0181128 -16.2554989 -2.6394954 4.3277435 -6.0177851 -1.0191325 -7.6430421 0.0367860 -0.9624918 -3.5208211 -6.7277727 -0.5132299 -10.0526285 -7.8570113 -4.5643883 7.5413709 -22.8962860 -0.4098310 4.6337519 -1.5265918 -6.1680012 9.7598515 -1.1674378 4.7908788 0.9744718 8.3402939 -16.3505745 -4.6356101 -5.8163800 4.4920144 25.7270317 7.4204745 13.3938780 -0.4258833 17.5981770 -10.7084980 0.6349880 -4.1544862 -1.2493252 5.6574831 -0.3778602 -3.5535669 0.8706195 -22.3544674 -2.1528990 5.2354813 -5.5079226 0.8005403 -9.6180334 -1.8722572 -3.9478984 -13.7789021 0.4086259 3.0587664 -2.7177966 -2.0410247 7.4299603 35.3603821 -10.6182499 13.3904963 1.3539069 -5.2532907 18.8160858 -6.4586754 -2.1825175 0.2898039 -4.8049221 -8.9454441 -1.6996777 -7.4102783 5.2090659 -24.1993790 -14.9511166 -3.5379472 1.3307078 10.8850803 -2.2142546 11.6957140 -8.5060291 -3.7350779 -0.0810254 3.0312340 10.7647982 -2.5533290 11.4156885 4.6702209 -3.0864904 -4.3921285 7.5540376 -6.9159846 -3.8221087 -4.9466763 17.2018013 -4.6397762 -15.3463478 1.0635144 0.4499126 -0.4246568 -6.2788072 -6.9898496 -2.6957812 -1.7484455 -3.0535297 44.6586533 -3.0649738 -2.5073948 -7.0963192 5.2433424 -14.1963835 0.8363249 3.3941090 -13.0880728 -8.9315987 -4.0717373 -0.3938508 -0.1289983 -2.3472893 0.3998668 -1.0085620 -3.5496144 5.0764885 -9.1009302 -5.2932968 -6.0585027 -6.5675874 7.4162483 -7.3850045 -3.0445619 -7.6272144 -10.2936459 -5.5961571 6.0621815 -9.3933535 -0.5795899 -7.2776194 0.2577770 -2.0678086 -2.2371466 -4.9390397 4.0259886 3.3133950 -7.0521340 -3.3521440 -3.2301583 -7.1317554 -2.1621900 -2.1546602 19.9503784 -6.5068240 -17.7815247 2.0241117 -6.2015834 -3.8881302 14.7970381 -22.6984100 0.0560939 -4.2439017 8.3460588 12.5801992 0.0066755 6.7165956 2.5589254 10.9711370 -10.0479326 2.4736919 -4.6233516 -3.6901486 4.8934712 -1.1814153 1.3154509 -2.0118630 -3.6162064 -1.9048716 12.4548826 6.9188805 -0.1830402 -8.1052055 0.4041789 -2.0963211 -11.8908424 -13.7833576 0.7214721 -0.9196725 -0.3929246 6.9270945 30.4930229 -10.4882736 16.8287945 -15.2600527 -10.8062515 9.3925524 -5.3350286 0.6791384 -0.1193939 -1.2126806 -2.6825862 0.1440566 -5.4412193 8.8582487 3.7935374 -0.9607355 -3.4907105 -4.1975021 15.2957592 -1.4618782 4.3023801 -8.6113558 -1.5031741 3.1065288 1.6905842 -10.7902088 -3.9382317 15.5105772 -24.4367580 -2.7855036 -4.4888411 2.2102396 -5.1288161 -1.8055775 -3.1753676 16.4664307 -0.5404764 -2.1518776 -9.3121700 -0.0432201 -2.0216835 -2.4722323 -3.5581205 -2.2485106 -1.0011905 -1.8734388 23.0306454 -6.7943830 -0.9759811 -1.6542792 -0.0429902 1.9019589 0.8286057 -0.8665623 -1.8960551 -6.4666781 2.8964007 -5.2416573 -3.0282054 -3.9383433 0.0687379 2.9802926 -6.1939511 -0.0754021 -5.9531455 -3.3653846 -12.2727728 17.6504021 7.9258127 -2.7144732 0.0534822 5.0838304 -0.6558841 -3.3345184 -1.7988318 -9.1519070 -3.7248549 -4.8147449 7.5178127 -1.3345659 0.1183919 -2.5156848 -0.9134212 -3.8641605 -2.7238059 -0.9144638 -1.2157869 -8.5047741 -10.2084551 -14.8857679 0.4550166 -2.0037179 -1.8281305 0.6899621 1.8808690 -0.7618230 3.6526523 -3.8988407 0.5517499 -1.1309856 3.3105466 8.3199558 -12.6018057 4.5482740 2.6431499 6.5652733 -4.0918198 0.7433508 -7.3943872 0.0367459 2.3816237 -0.5061736 0.1898649 0.7001575 0.2348939 -0.8926398 2.9802108 -1.9118351 -45.8075104 -1.8700855 0.6991692 -1.7022084 -3.8732910 1.8510258 -3.5033233 -21.5407906 -0.5883034 2.2006299 12.9768753 -6.4219046 4.6358514 0.8871524 -1.8260568 9.3678408 0.2179240 -0.1659454 1.8045933 -0.9495163 -1.8281587 -0.3686485 -2.5946112 1.6487837 -4.0226989 -3.4169014 -1.2491713 -0.5576591 -2.1821315 -24.0461731 4.0527000 -7.1371269 -6.0251269 1.0273031 2.2234871 3.3864095 -0.3558733 3.9007483 -5.7801127 -0.9014789 -1.2104932 -11.1699114 -2.0598125 -1.4557713 -0.1922992 4.4746203 -1.0247270 -1.0476724 0.6031234 -1.7947862 -37.9612122 -1.8585894 -1.7530072 0.4257527 -1.2575029 -2.4121933 30.5609703 -16.1992722 -38.9584656 0.2561325 1.2430313 10.7795868 -9.1267576 1.3380953 -0.2533352 -4.6588945 -1.9202222 -0.5468186 6.4705458 -0.3697588 0.0169528 1.2163773 -1.8250351 -1.0424830 -3.7901659 -0.6590183 -0.0039683 -11.7882528 3.3755484 -2.4896057 -0.1965837 0.9099681 -9.8857660 -0.3244030 2.4474986 -2.8800890 0.2862685 -0.2279238 0.1704269 -0.5905496 -0.2343191 -2.4627075 -2.8009853 -12.2432413 -6.1024461 1.6459908 -1.9464287 -13.8690977 -2.6329584 11.1187706 -7.9998493 -4.8394170 -1.6307112 -0.6739211 1.7368810 0.6129413 0.9598497 -4.5926929 -2.1828749 -4.4270334 0.9271329 15.7584782 3.1562040 8.0586796 1.1223537 12.8596344 -1.3258934 -0.6078133 -7.1789250 -1.2541751 3.0658214 -1.1089157 -0.2759410 2.4744456 -7.0439868 -2.2530930 6.6057401 -5.1918874 5.6591148 -1.4951319 -3.1459577 -3.2608166 -9.8487120 1.9671253 -1.3715500 -19.5383930 -1.6708158 2.9984803 23.3068542 -10.1162214 0.8324322 -8.4436150 -8.0845003 11.2279024 -2.0534465 -0.7152028 3.9907806 -1.2374114 -4.2767463 -2.7092109 -4.3136706 2.2257469 -12.2621603 -11.9457273 -1.8886145 -0.9635394 -14.5985193 -30.2633228 4.5730495 -3.7772312 -18.9551411 -0.0794438 2.1011620 -0.4113888 -1.7043979 3.8489957 3.8579817 -2.5432515 -6.3551702 -9.6182652 -4.4251728 -3.0725629 0.9468358 9.0566549 -3.1228027 -2.1740279 -6.9295487 -0.0529143 18.4197502 -2.6147406 0.8529143 3.9680510 -1.6339837 -1.9408220 13.7793913 -6.3132644 2.4765439 -5.9978666 2.0479829 -17.0590401 -6.4977360 3.3865263 -7.2754073 -8.6057158 -12.3126526 -1.0075246 0.4987885 -0.5617107 -0.0073941 -2.9414825 -2.2221310 -0.7556579 -7.0158582 -2.8405783 -6.1983604 -15.6299267 6.1946406 -5.6307468 -0.7409297 -4.9455657 -8.3805571 -2.1763182 2.9659436 -6.6608963 0.2124111 -8.7880650 -1.9855624 0.4674225 -0.0062833 -4.9753509 -6.6431389 -16.0710564 -8.6663342 0.3541514 11.1747837 -17.8601074 -4.3650408 -2.7602224 -8.1516695 -7.0919905 3.2527823 0.1606672 2.3832519 1.3058699 8.9195976 -8.6846342 -1.0035386 -5.2273121 1.9656342 25.2478123 -1.1307153 11.5068693 1.2339170 18.8752632 -8.9095907 -2.2276132 -14.5419054 -2.7537289 4.7493010 -2.3392975 -0.8526539 1.2557307 -22.9133682 -2.9182405 8.2814751 -5.5260210 -23.7397690 -0.4925854 -3.6026068 -4.7727804 -16.4293346 3.1126828 0.3920905 4.4035463 -4.2206497 5.4901662 34.6756516 -11.1681986 0.1614288 -7.5797062 -9.1959276 25.5655365 -4.9037032 -1.5465008 4.6539955 -1.5310280 -5.1892462 -3.6548181 -7.0404921 3.8894072 -26.7950802 -17.7172775 -1.8990264 -1.2962811 -5.7879519 -0.1535127 7.0868092 -7.8523998 -1.2275178 1.3261387 3.5980911 3.9981334 -1.8026882 10.9705820 3.9184093 -3.2663200 -7.1519985 -9.4819193 -7.1934052 -5.4205174 -0.2707905 16.0336056 -3.8324671 -1.9043750 -4.8476157 1.2077736 2.6184504 -3.5248330 -11.6617088 -1.4895192 -4.7092280 -3.6067989 30.8231564 -7.5280948 -8.9840612 -1.8858511 -5.2219577 -20.4195957 1.6086535 4.4896250 -0.1045943 -8.4142990 7.8198853 -2.0502911 8.6072483 -1.7968653 -0.3485708 -4.8284764 -5.9372387 1.4007952 -10.3360987 -5.0784831 -7.7312717 -12.6644936 7.9246736 -7.3070440 -0.9077740 9.4813671 -13.4317064 -3.5243261 4.2203312 -9.4087973 0.0225727 -9.1502008 -1.3603779 1.2665933 0.3003763 -5.8018174 -14.4800806 -4.9903932 -7.0885744 -9.6753159 20.1802788 -15.2175541 0.4569440 0.2035968 -4.2940950 -4.2255802 -18.0121613 0.7243682 3.4597428 1.3991154 -4.6909552 -17.8332710 -2.8624570 -1.1291354 9.1245575 17.4041862 -0.2604661 8.4632549 10.3396816 15.6566811 -23.5182610 -1.4808621 -8.8526020 0.3382506 4.6727457 -3.1392670 0.6269169 -1.3668691 -3.1676290 -1.1420650 4.3355937 -7.3608913 -0.2717937 -5.4821963 1.5518298 -2.1962755 -6.1741948 3.5211265 22.2738094 0.0118446 4.5407696 5.1208577 21.8149738 1.6454834 -3.5173578 9.7232075 -3.5569525 -2.9413726 1.8267932 -0.1773067 2.5831108 -2.0600331 -8.0045271 2.3445311 -4.1551318 6.0357556 3.6097007 -4.7985539 -1.9119595 3.6686234 3.4337504 -1.0775998 5.5943775 -11.2647161 -2.0744524 4.5588078 3.6103556 4.9987569 0.7752215 16.2339745 10.3809967 -2.7247407 -1.7901480 -0.6185590 -5.1873312 -4.5245481 -3.0224547 6.5208735 0.1671614 -10.3143826 16.2769947 -0.2639813 -0.2945384 -3.6372592 2.5637128 -17.8728218 3.9138970 -2.9783876 10.5778179 -2.1606662 0.5565199 -2.1896176 -1.6986065 2.9538949 4.0641394 1.4679780 4.1147995 -11.7948427 -9.6365080 -2.6123512 8.4714251 -0.6058550 -2.7449777 1.3081170 -6.9315495 28.8477669 -9.5931492 -2.5443242 -5.9019423 -2.2594175 7.6675086 -5.4158273 -2.2295167 -10.4130354 -6.7349491 -2.1441581 4.8358951 -7.6564231 1.0391924 2.2541687 -0.5119255 -0.4275086 -1.2330055 -2.7657495 -1.7238584 -5.3191757 -2.6179743 -3.7566888 -2.1805348 -9.9305487 -11.7972193 -16.0824528 1.0639001 -2.4758732 -1.5587136 1.2064809 1.8218956 -0.8813763 4.1107640 -4.0328050 0.6162342 -0.7217604 3.1118741 7.7549262 2.9934819 4.6240101 1.9932481 6.7624888 -4.5834446 1.1190963 -8.5326691 0.2534608 2.7419269 -0.4390450 -0.1532624 0.3390135 0.2763321 -1.2333436 2.4409647 -2.9599690 -41.0212097 -1.3971438 0.6076853 -1.6080341 -4.2783084 2.1083064 -4.5761256 -14.3361216 -0.4231373 1.8572552 11.7424784 -6.5424347 5.3265772 0.8764121 -2.4058020 9.3611603 -0.5994619 -0.2066216 1.6553314 -0.9682939 -1.9081315 -0.3429155 -2.5615535 1.8801477 -4.3749957 -2.8988898 -0.4557425 -0.4748236 -0.6619607 -21.6597919 3.6973410 -5.3608251 -10.5405169 1.1922323 1.9224309 4.2476397 0.1161948 3.8073239 -5.9528823 -1.1425805 -1.6457521 -13.7822657 -2.8689632 -1.6192011 -0.3462093 3.7772143 -0.7881317 -1.9193438 -0.2063319 -5.1768003 -31.8098736 -1.9953331 1.0911252 1.8531762 -1.4660524 -2.6210194 29.3322964 -17.1965370 -39.1598778 -0.3630764 -0.4295198 9.5498648 -10.2726965 1.7573515 1.3306488 -5.3973856 -3.2616920 -0.8730665 6.7622590 -0.4582934 -0.3995816 1.8428961 -0.8504774 -0.1701639 -4.1756973 -0.6622585 0.2398612 -13.1563759 3.1889160 -2.7237298 -0.5457419 1.7491562 -10.8648453 -0.2984117 2.4604681 -3.5127490 -0.1058859 -0.9636423 -0.6947379 -0.0660622 -2.1965625 -4.6839237 -3.7515433 -15.1381741 -6.9036345 -2.4097359 -0.7271561 -13.7302761 -1.0574323 0.0969472 -6.9054613 -5.2455215 -1.9374031 0.5495569 2.2022712 -0.6799251 -0.9082156 1.9480338 -2.9712191 -3.7548280 -1.1987998 14.9872408 -6.0947318 8.8542423 0.0095181 13.0373096 -8.4844227 0.7145901 -7.5684166 -1.4112886 3.7174730 -0.7288832 -1.0291566 1.1369522 -6.3171310 -2.8945975 5.7830524 -4.9441972 1.9221187 -2.4011972 -3.0200131 -3.0227339 -9.8634014 0.0683407 -2.0397871 3.0808270 -1.8531507 2.7101769 22.9925518 -10.0533991 3.0617700 -7.7643437 -9.0112104 9.7035542 1.3284116 -1.4801332 3.8659060 -2.5614464 -5.5735135 -1.7007638 -4.2860346 2.6261094 -9.7868271 -11.2008677 0.1494614 -1.2578886 -9.7260141 -3.7214293 4.5289474 -0.0512542 -15.3757515 -0.1809720 2.8926761 -0.4048863 -0.9961307 3.8266521 5.6672230 -3.2329121 -5.8527369 -6.3408194 -5.2766991 -3.2189231 1.7502123 8.9754086 -2.5652406 -1.7574394 -5.1339955 -13.2820072 11.6443214 -3.2246194 -7.3648987 4.7415881 -2.3886998 -1.8912582 18.1037350 -15.2975216 2.2611284 -4.8252778 -1.0038719 -13.8668385 -1.0006230 4.0558143 -8.2910833 -12.4199972 -8.9381027 -2.3887148 1.7721817 -0.8075590 -0.4507090 -1.3478137 -1.5151267 -2.5896075 -8.7781115 -2.3387456 -5.8389006 -15.3894711 6.8267508 -6.0542564 -0.9731140 9.5941391 -11.1342030 -2.1445513 3.3024178 -7.9645271 -1.4074962 -9.9457474 -1.4437416 1.5100729 -0.2485788 -9.0007334 -6.7492599 -22.4643650 -9.9087267 -1.1081692 14.4809132 -9.8138199 -0.2840055 1.4619040 -4.4311533 -8.5306063 5.3132777 -3.0285428 2.9479403 0.1045201 13.9822245 -3.2685351 -0.6383200 -4.1737728 -1.8138022 19.6098747 0.1151302 15.2224998 0.9167362 13.8107147 -18.5645561 3.0475736 -15.8525734 -5.0919180 5.2182646 -1.6699712 -3.0231137 4.6389127 -15.5775156 -4.0987983 14.0731497 -13.1511822 -11.5152836 -3.6387520 -1.4024414 -4.2592297 -20.3272400 0.6020259 -11.5103188 -2.3637171 -5.5927081 3.0293550 33.7106972 -7.5382247 8.1253757 -11.8274012 -13.4047842 15.1778307 -7.8125148 -7.4230819 9.6611023 0.1878152 -2.7748840 -2.7943282 -8.1298285 5.1457868 -18.9940586 -14.0223408 0.8282967 -3.0495512 -2.0543385 -0.7957430 3.3414123 -2.2823906 -0.3257588 -0.6382257 5.2012148 -2.0516384 -0.3718460 8.4517918 7.7166119 -1.6897794 -13.8972464 0.5116118 -9.5920830 -2.4620314 -3.1071882 9.7134447 -4.8824344 -3.4161854 8.1711702 -0.8219942 8.0037460 -4.6831675 -3.0230253 3.5464492 -9.0912123 -5.2490730 33.4813118 11.9411068 -1.2541970 -8.0176725 -0.1820184 -1.5915843 10.7420807 4.5138307 1.1796099 -13.5912485 -3.7580442 -2.7969201 -7.7623773 -1.7474530 0.8073907 1.2704077 1.0254394 4.5763063 -9.3706245 -3.9475377 -17.0564137 -12.9758539 -18.2571259 -13.2083139 -0.5961137 7.7549162 -6.6714711 -3.8071811 5.2818460 -13.9531736 -20.5790119 -11.2258358 -5.1596951 0.3764539 -2.6655064 -12.0735779 2.2996488 7.1649313 -6.0571370 -4.9175191 2.1925464 -0.7335371 -0.6473937 0.7538448 -2.4290738 -4.5106945 -0.1351583 6.9229455 0.4334170 2.5865359 2.2033670 -9.7947235 -5.6942034 -1.2050301 15.3553038 11.3452873 -0.2529280 6.9616170 -6.9513817 4.3836832 10.6666622 -4.3990445 0.5401840 1.3746595 11.7648869 0.0137254 3.3687804 -14.0224962 4.4048109 -4.3506355 3.9661858 8.3187380 0.0133813 12.5813990 -0.8567533 -5.6257277 -17.3374939 0.1552871 -1.8417159 0.8349018 -3.7661436 1.1362028 12.6592894 -8.1837015 -1.0388715 9.0163298 -4.3594589 -4.4982457 -0.9515697 -6.9566431 -2.5631292 -6.1074038 3.0977774 -0.4988024 -3.3184412 4.2596812 -2.1471810 -7.8494167 -4.4749827 2.7172678 -9.5996103 -1.1619548 4.0977974 -1.4444262 -0.7731403 4.2905335 -1.0946707 5.8091254 -5.4346004 3.4779119 0.1259724 -4.4234934 -3.1746662 0.8287178 -4.5570831 -14.0475216 -1.1929431 6.1025715 -0.1056733 -1.0054076 -3.2021756 0.1663930 -0.7621900 -3.8436308 -0.8466643 -10.5740099 1.6610506 -0.5475748 17.3330536 -0.2938930 -0.9277260 -0.9567227 -0.4221596 6.4732285 0.6108528 0.1568099 -0.2356643 -1.8933530 -0.3890486 3.7605064 0.1100430 -0.6711085 -4.0225525 -8.9971142 0.5644693 12.7025204 -2.0847404 -1.3296189 -7.5472260 0.0576074 0.0163083 -8.0892725 1.5985235 0.3437706 20.1702652 -1.3249660 3.3331013 5.3328805 4.8832197 0.9295138 8.2957363 -1.5105058 -2.0768545 -3.0408819 -2.5001025 -5.9689445 -2.9425285 -1.4151425 -4.2033343 -11.2536011 -13.4172926 -15.1366138 1.5058057 -2.9287889 -0.9543825 1.4694451 1.2408484 -0.8655484 4.7462168 -3.6115723 0.8237986 -0.5488531 3.6514916 7.4519968 -6.4872179 4.9316530 2.6804404 6.8793468 -4.4301658 1.2125337 -7.5695934 0.4820095 2.9206345 -0.5246039 0.1577470 -0.6242627 0.2051173 -1.3970135 1.8109281 -3.5029972 -37.7883606 -1.4757828 0.8526700 -1.7361622 -4.5986528 2.2244537 -6.0490561 -6.5975070 -0.3415135 1.7046720 11.8075857 -7.3605270 5.2967448 0.9915816 -2.5966263 8.9682207 -1.9767042 0.1256519 1.4819933 -1.1592083 -2.0617089 -1.0252655 -2.6407723 1.9878501 -5.1742101 -2.8758466 -0.6881287 -0.1375099 -1.9226873 -19.6367970 3.5586557 -6.1931934 -11.2155762 0.9214395 2.2898388 4.9456797 0.4568264 3.7115383 -6.6095324 -1.0458236 -1.2630593 -12.2187223 -3.5894897 -1.7456453 -0.2638846 3.0916591 -0.8839800 -2.7628148 -1.0056370 -5.9693646 -29.1366463 -1.8505683 1.3035572 2.4320598 -0.9115318 -2.9632533 29.4419365 -17.7253036 -41.0307274 -0.9101461 -2.1610184 9.1050816 -10.0987635 2.0155563 0.6453117 -6.7049432 -5.9804955 -1.0700576 6.4160233 -0.3967009 -0.6677730 2.2535462 -1.2172816 -0.6277035 -4.6034336 -0.4303167 0.2008696 -12.5998220 3.5563939 -2.9776537 -0.5111477 -2.1962481 -12.7736273 -0.0143225 1.9997538 -3.9678335 0.2487124 -0.8120436 -0.9508203 -0.3914918 -4.8205037 -4.3325763 -5.6095181 -17.1713600 -7.6483126 1.4040626 -6.0324063 -16.2950497 3.3408709 18.8081512 -5.5396533 -5.4964809 -2.6348619 0.9160146 1.4624985 0.7070137 2.1318238 7.0184236 -4.8155589 -2.6469820 0.1953412 14.7733841 11.3022203 8.4304008 2.9775009 13.5153313 -0.4199576 0.4045193 -3.6396556 -1.6161091 4.1359806 0.1993286 -0.9927709 1.1704761 -8.2304316 -3.3451982 3.5384238 -5.5215554 -18.1595535 -4.7065768 -2.6618764 -3.1492100 -11.6532745 0.6926032 -2.0388570 -3.1223154 -0.8502290 2.4235032 21.8050213 -9.4789953 2.9540658 -7.6400366 -9.4640579 8.5529222 2.1759038 -1.1636462 3.2647464 -1.9410117 -4.4033089 -5.1953521 -4.3330226 3.3346574 -8.8921547 -12.4864721 0.2662832 0.5678492 -3.5240700 2.9065955 4.7325950 -5.1616812 -15.5919352 -0.2678423 2.7852530 -0.1942259 -0.2010389 3.3598256 4.9180140 -3.5943384 -5.2671471 2.9529490 -6.5588927 -4.1808882 2.0409544 6.9664397 -2.5141628 -0.6636824 -9.5033417 3.2565594 -10.8847237 -3.4217248 -0.4924747 6.4979792 -1.7810698 -3.6766925 21.2032223 -10.8806782 -12.1121092 -2.6146190 8.3958426 -8.3766928 5.4558959 4.9993310 -7.1926947 -7.3730135 -12.3790646 -2.3587942 3.8104463 -1.7581267 -1.0634918 -1.2116027 -1.0661925 -5.4181514 -9.1268864 -1.8863989 -7.3975730 -17.5497017 6.0898771 -5.7933836 -1.6832949 -9.1422653 -11.6559620 -1.0408185 2.6098373 -8.1030712 -0.8726493 -11.3603296 -1.5950102 2.2001522 -16.1147766 -0.2288069 -5.0142241 -24.3622532 -15.4580116 -2.5008633 1.9078085 -27.2204304 14.0026064 0.0918613 -4.7357445 -11.7229681 1.9777864 2.5522377 0.7204861 -4.9652600 -16.0744152 0.6396761 -3.0693371 -1.9444700 2.0845788 19.6810913 0.0884361 12.3924665 8.2828817 13.9899559 -6.5193295 2.3076174 -12.2264204 -2.8426049 6.1372313 -2.7005172 -0.2579196 -0.3573470 -26.7381649 -2.8307030 -1.4294814 -7.3093643 0.6461898 -4.9246659 -2.8056765 -5.4640412 -21.2476730 0.3304045 -4.9659815 -0.6658935 3.1620517 -0.2729776 33.1776505 -15.9742193 1.4579964 -10.8541174 -11.0149164 -3.6650207 -5.3967829 -0.9286265 -3.2371454 -3.9673481 -9.0487194 -4.3313594 -7.6597586 4.3509498 -15.7754717 -17.4278831 7.4662781 0.6031281 -4.6585832 -0.3082401 4.7398920 -15.4938240 1.3775308 -2.5207062 5.3059835 3.3026745 -0.5021419 14.6880312 1.5540520 -4.2447128 -9.9668674 -1.0117643 -11.5795860 -7.1838183 1.4748114 12.2265196 -1.1946578 -14.1177778 -8.8107090 6.7087798 -1.3856447 -3.7667980 1.7818668 18.9709892 -1.5291216 -5.6444812 35.6443901 3.1259618 0.0258685 6.4729533 -7.7169065 16.0997086 1.6210827 10.9850330 -25.3888664 -9.5045347 0.4849527 -2.2231669 -16.8673840 -5.1630621 0.5145328 0.1886024 -20.0900211 1.5504619 -16.9785728 -3.1318271 -8.4838905 -8.5035286 -10.7255211 -7.5101438 -0.2092125 1.9313581 -8.6558018 -1.0981045 2.9944000 -12.8827333 1.1152760 -16.0343113 -3.8975296 7.2408280 -0.1394378 -3.3363607 -0.0396326 -5.7669406 -2.3113787 -0.0195709 0.9115213 3.7068326 1.2270814 0.0406257 -2.0315955 -2.8443537 3.7437048 3.9173927 -3.0925722 0.9017642 0.1664248 0.7904888 1.8697450 -3.0286028 0.5865663 -1.7019382 -0.0009319 3.9745660 2.8554296 -0.4661623 -0.0000059 0.5030106 -0.8330868 -0.2044025 0.6036494 -2.2091498 4.2291274 -1.2690564 -2.4283969 0.2638663 4.2968864 -1.0694803 0.0277525 0.4448373 -0.0957041 -7.2051206 -3.9722261 1.4790436 1.5702101 -0.0915374 -2.3777556 2.6038418 7.4114327 -1.5483458 -3.3046353 3.4208817 -3.0717504 -0.9352828 -0.9369726 2.3365893 0.0313039 0.0184035 -1.6187460 1.8324221 -3.6361418 6.7021446 -0.1742513 -4.9682112 3.3187821 0.8936582 -0.2404937 -0.1542565 3.9538012 0.4816874 -0.0826385 6.3790584 -0.5816780 1.7927625 1.6435465 -1.1218538 1.2497059 -6.4157109 -0.3549556 0.2487457 -9.7641039 -3.8231583 2.1065576 5.4004912 -1.5713396 0.7299665 -0.0139225 -0.0263418 -0.1086047 -2.6536090 -0.2143581 -2.7149940 -0.6958687 0.8739347 5.8528018 -0.2326078 -0.4320690 -0.8710687 0.0911057 0.2474675 -0.0273395 14.8768835 0.6303878 -2.1091671 0.7565432 0.4419243 -0.1688285 -0.7549188 -0.5309808 -1.6089573 -0.3837453 -3.5990424 -2.0021112 -6.1095619 -0.3865929 -0.0510140 -0.1542551 3.5588081 -0.6128873 -0.0492014 1.2857327 3.8871615 0.4295793 -8.1403275 1.0546499 -3.9284809 -0.2061096 4.5799184 -2.4427447 -3.5867889 -3.0727665 -7.0558929 -3.2960086 -1.9944581 -6.1048512 -12.6651411 -15.1882162 -4.6101127 2.2344275 -3.3334968 -1.4679828 1.7686250 0.9104139 -1.6569926 6.1068783 -4.0142946 1.1612399 -0.3263319 3.8855991 7.0810637 -3.4013126 5.0146985 2.7521224 6.7052546 -7.8229117 1.4099971 -7.4085951 0.4240090 3.2761104 -0.8428654 0.2873716 -1.2681867 -0.1805905 -1.7348895 1.9073967 -4.0988498 -37.9657784 -1.6858962 1.1822548 -1.9089754 -5.1535888 1.7141883 -8.2028532 -3.4531529 0.0017875 1.1819801 11.0617399 -7.4612513 3.5662875 1.1469907 -2.8892169 9.0971022 -2.8359666 0.0948361 2.2460599 -0.9089372 -1.6670682 1.2854402 -2.6896148 2.2801175 -5.6716776 -3.0895743 0.2569112 -0.1871890 -4.8807917 -18.4000969 2.8802614 -6.9123912 -10.0394630 0.9207284 2.5050130 6.6499496 0.6102975 3.6403189 -8.3316908 -0.9989270 -1.3546730 -12.9085655 -4.0789375 -1.7661273 -0.3695218 2.4475143 -0.5149456 -3.6022561 -2.4034593 -6.6433148 -31.0456638 -1.7809530 -0.2958059 1.4137112 -0.2324819 -3.1267791 29.8660717 -18.8354321 -41.9155617 -1.8818340 -1.2157328 9.8896112 -9.2536850 2.5363159 -0.3971288 -7.4668140 -7.6149783 -1.3761553 6.1665387 -0.2519775 -1.0377345 2.4405041 -1.3870775 -0.3277849 -5.2080379 -0.3609664 0.0575124 -12.0623646 4.3379769 -3.2142699 -0.4628163 -4.3098812 -17.2771835 -0.0509781 1.7995876 -4.4273591 0.2032845 -1.5739528 -1.6137220 0.6233968 -6.3520584 -4.1967916 -5.8760786 -17.7685413 -7.3620839 -0.6548759 -3.6864517 -17.6404285 2.1898193 -10.9061842 -4.7887559 -6.1362810 -3.4254079 2.3974922 -1.2654530 -0.0895004 1.4632171 9.1623049 -4.4050245 -2.6332965 -0.8433744 14.1718445 14.2439957 8.9424334 4.5060935 12.8596210 -2.6156619 0.0001861 0.9873077 -0.6674405 4.8720484 0.2724701 0.6709440 -0.7366884 -9.3607311 -4.6410866 0.9601974 -5.8102422 -9.1330175 -6.7493167 -2.6185021 -3.6419828 -12.6119251 1.3420404 -1.8809415 7.1024623 -0.3880747 2.7125554 20.4400005 -9.8543386 3.7517748 -6.1427255 -11.7646914 10.4607477 6.4462748 -0.0805380 2.3884563 -1.4953535 -4.4743080 -0.5290302 -4.5278430 3.8256180 -7.9367366 -14.2897863 -1.8351710 -0.0931903 5.2031155 6.4096508 4.0674419 -3.2925076 -10.1709156 -0.0496807 2.8569515 -2.4102211 -0.2232510 2.0219829 5.7330179 -3.3870060 -6.0910716 -7.4657931 -7.5531850 -4.4815116 1.9764521 6.6539826 -2.7592556 -1.0069073 -6.0909715 -1.1098138 -1.5089941 -3.1140289 8.0467396 5.9097710 -1.3728744 -4.5623689 23.8213463 -15.7901087 -10.2849121 -4.3466182 2.4245541 -6.1447568 8.2831306 5.9714766 -9.6469755 -2.0003192 -11.9580822 -2.8048096 3.0718942 -0.9553118 -2.8689511 -1.0629963 0.8532807 -7.1378984 -10.0225115 -1.6398228 -8.3161612 -34.2281265 8.2255936 -7.4209414 -1.4401814 -9.7972727 -4.7376528 -0.8911830 0.5447993 -9.4542952 -0.3099458 -12.5484352 -1.7496333 2.0081487 -2.5014534 -10.2378950 -7.2659335 -30.4095745 -14.0620584 1.7785205 17.8228397 -26.8362923 23.8340073 -1.4410131 1.3389686 -8.2363615 -3.6673348 3.8827116 -1.8798913 -5.6682439 -7.9586244 9.0645647 -8.5454178 -3.4268000 -10.9123888 20.0977001 1.1504629 14.1327400 9.4024134 19.0157490 -40.7783966 -0.7150199 0.8935270 -3.1485538 6.7294202 -0.9904823 -0.8731046 -1.3565284 -6.4903402 -7.6956863 3.9054639 -7.5750146 -3.9008589 -11.5170269 -0.8219205 -3.8537462 -18.8949966 -6.8266649 -0.6538647 -0.4392525 -3.2753553 -1.0837778 35.4731293 -13.0878448 -0.1764863 -4.2392588 -16.1418018 20.6930809 -7.1563067 -1.4682786 6.2804527 -0.1405057 -4.3406572 7.2236838 -5.8452249 4.4519701 -9.3055105 -18.1875114 2.6641152 -5.0080123 4.6675363 -1.5406429 6.8939505 -5.2268739 9.1180992 1.8859078 8.3915958 -4.3807769 0.0237541 11.6188469 8.9489164 -2.0567372 -7.3789930 -6.5145979 -12.5420589 -3.4780362 0.4962013 6.9521174 -3.3162334 -8.2627010 5.4521284 -1.4250679 2.7250669 -5.9040775 12.7238512 -1.8608688 -3.4168711 -4.0318594 13.8251038 5.2513103 -1.9498205 -1.4902583 0.9282503 -6.0655684 2.8074136 8.5369558 -8.0096836 -4.4358139 -7.3082108 -7.2860832 20.8521461 -2.2099047 -2.5419059 -1.0612938 2.7110686 -6.2740774 -19.1658020 -3.9729507 -15.6033983 -3.7491119 10.1296997 -11.3006754 -1.2153044 0.8322093 -1.3909543 -2.8406475 0.6530485 -14.1577024 -3.6049788 -9.7891531 0.0119434 1.1137193 -10.1072998 -7.7766995 -5.7080264 -12.9997330 -15.3106089 -16.7187614 4.0448313 -3.0803325 -1.5040277 -0.0293701 -2.1977222 -18.4217663 1.5734122 7.0814924 -10.2967243 -1.8704412 6.5227656 18.8883629 0.2196919 12.7570925 7.3341432 3.1233230 0.0062855 -2.8038974 2.9364269 7.9752746 0.4548914 8.7050066 0.8657460 -2.7211916 7.1468349 -6.4057508 -7.8906174 6.8860269 3.5121768 1.2749726 1.8156643 6.3697062 -0.0080837 6.6054363 0.0892316 -5.5963635 -11.7185373 -4.5972447 -1.2850122 0.2307304 6.5411758 1.4884492 9.6904793 0.1103128 7.0610986 2.1496165 -9.9141512 8.6008730 -0.1963737 -0.5351610 0.6714309 6.0159240 -8.9359245 -2.2637286 -6.3136444 13.3623629 -3.5774751 -8.2044601 11.0221605 1.9611169 6.0074940 -0.6576278 3.0407319 8.9499226 -0.9952912 11.6087942 12.0867167 21.0673523 -9.7412977 -1.3141459 11.0720377 -12.3550882 7.5947089 1.0045069 -11.6280174 4.5996833 -0.9489586 12.0941105 -1.1442078 -0.0545419 -6.4496732 -0.0405304 -0.0959875 -1.4847804 1.1447759 0.5912062 8.0555038 -7.9730010 0.9329330 -0.9077813 -1.0867758 -1.2038702 0.1627848 3.4398327 0.4057283 -0.3155043 -0.5240874 -4.8747177 -2.5247455 0.7947713 -3.3380165 -6.6152158 -4.3413000 -4.8307772 4.5878925 2.6128263 5.1867681 -3.7717052 3.3874927 -2.3617556 -0.4679562 -1.5473963 0.8003778 0.7741337 7.4669352 -0.6579804 -9.0928106 -8.8771458 -11.0445995 -4.7748699 3.5979531 6.8013539 -2.6627464 -4.1632624 -3.9624438 -8.0769663 -3.3712397 -2.3914661 -6.5081029 -13.3114166 -17.0371380 -0.8430005 3.2254002 -3.4305854 -1.7204111 2.3801062 1.1185609 -2.2986410 7.3429971 -3.2741530 1.4239757 -0.1947533 4.0365868 6.5904498 -0.8829025 5.2200732 3.2735789 6.8480630 -4.5663452 1.4997557 -7.3870244 0.6618572 3.5265734 -0.8710915 0.9797136 -1.7580782 -0.6443539 -2.0861056 1.4859895 -4.9419332 -35.8333626 -2.0606048 1.4247200 -1.9557456 -5.5245018 1.8196298 -9.4640198 -1.0252999 -0.2435245 0.3651947 10.0832272 -7.8098359 3.5993540 0.8405123 -3.0299621 9.7195177 -3.5077300 0.3047920 2.0497673 -0.8710491 -1.4326020 1.3022919 -2.7439373 2.4282739 -5.9485369 -3.5996933 0.3744861 -0.3188754 -4.1168199 -16.1978359 2.4225285 -8.0561695 -12.0558548 1.0105257 2.5318034 7.2952361 0.7362556 3.6831536 -10.2946863 -1.0844188 -1.5026391 -16.3670216 -4.8167520 -1.4334686 -0.5004616 1.7163395 -0.5213904 -4.5193338 -3.6585271 -13.4350100 -29.1013985 -1.7767426 -2.1799362 -0.5233061 -0.2314183 -3.4828291 29.6940975 -19.6255074 -43.5372467 -2.5794222 -5.1746001 11.4995575 -6.4812045 2.8749616 -1.7438120 -7.6026435 -7.4800134 -1.3823771 7.7636571 0.2045533 -1.2815117 2.9879432 -1.4173403 -0.1410216 -5.7260981 -0.2039997 -0.0683390 -12.0829191 4.2433782 -3.1410100 -0.3375293 -5.1485391 -17.1336536 0.0394469 2.1609704 -4.6698790 0.6109996 -2.0162909 -2.2275865 1.1912014 -3.3957710 -4.6983500 -7.4021320 -20.4367638 -8.5305967 0.6680712 2.5526583 -16.0208302 3.9254196 -1.1834053 -3.1526685 -6.8799601 -5.3293705 2.5741920 -2.5398812 -1.8610893 3.0916502 5.1369700 -6.5320559 -3.3709817 -0.6248441 13.5811510 1.7395356 8.4064960 3.7055070 13.4750242 0.8545005 -0.0720634 0.9928343 -1.3897185 4.8652945 -0.0912396 0.6101524 -0.7448453 -10.2576532 -4.9115081 1.6604290 -6.0661922 -15.7084589 -6.2893796 -1.5382504 -3.7764227 -14.3897924 -1.0416270 -0.6226835 -3.0541110 -0.5266865 0.7877187 20.0713787 -12.9352064 -0.1738857 -6.1158099 -11.8627815 8.6126413 5.1918564 -0.3187219 3.6588547 -1.6097847 -4.0724726 0.0566675 -4.7250237 4.2596421 -5.0782723 -15.6038895 -0.6551670 0.5360523 15.1074305 -3.3603077 3.2005117 -8.5508041 -9.8838139 -0.9702301 3.4361691 1.4453772 -0.4191346 1.2525685 5.3869610 -3.4119515 -6.6834631 1.2366556 -8.0283651 -4.8623629 2.5375571 5.1007090 -2.7533219 -1.8136044 -12.4010868 -10.2088881 -9.2011414 -3.0000563 -3.3525090 5.7821965 -0.7452993 -6.2046623 29.6844864 -3.2498226 -3.1967115 -2.3300471 8.1770296 -2.3597684 3.0642619 7.1525383 -21.5916691 -2.7821739 -8.3342485 -3.2845814 10.2753954 -2.8981969 -2.4883511 -1.6563523 1.1090329 -10.2630453 -9.0358667 -1.9328721 -7.4606872 -27.3860607 6.4509192 -7.0796423 -1.8531662 -2.7973497 -13.4775047 -1.7062674 -0.2202119 -10.4923229 0.0496898 -14.9648085 -1.4514598 2.7234526 -6.4564266 -10.9656954 -9.9049454 -31.5141830 -11.4770365 5.0885158 27.5926952 -31.4749088 4.3945141 17.8772125 0.9462781 -11.0305090 -17.7681961 5.5038829 -2.2390761 -2.6403396 1.2230486 -3.5906355 -21.2835751 -2.6698086 1.8335993 22.3999004 0.7503520 13.5570269 6.6670079 19.6133404 -15.7476444 -1.3664331 -0.6226802 0.0399916 8.0309744 -2.7563310 -0.3242681 -1.3577399 -13.3969469 -5.6159444 3.4579673 -2.1928971 0.8278612 -8.3121538 -5.0294061 -7.4967847 -17.6164169 2.2010310 6.9568415 0.2902942 -1.9033818 -0.0555245 31.5583134 -9.0358362 2.6146629 -7.5286570 -12.3436937 13.5430841 11.1498709 1.0074275 6.5000639 -3.4485612 -6.8075800 1.5702257 -7.0720015 5.0549779 -20.0966148 -28.1987896 2.4406133 0.8892570 18.0415516 1.6047506 4.5965886 -12.7459011 5.1572027 3.8724406 7.0276608 6.3617454 0.4067219 11.8051071 10.7510862 -3.6812778 -4.9228754 -5.5619087 -14.7224960 -2.4471061 1.1904730 4.1839705 -4.0571384 5.9124398 1.8363836 1.0866497 -2.5547345 -4.1469731 1.6450262 -5.0001521 -5.9964938 -4.6518369 63.8802185 1.1386142 0.8627136 3.6019034 1.4826181 -2.6239095 14.9022579 7.8099480 -18.4317837 -3.7093146 -1.5353925 -4.2037520 17.8033390 -1.2808399 -2.1325941 -2.9493003 2.8712320 -5.9160609 -14.1149578 -1.0460857 -7.0969343 -20.2678394 13.1946955 -8.6775665 -1.9122045 10.7554522 -7.2983475 0.7738863 0.7113807 -15.1312799 2.8143964 -24.5876427 2.0188317 0.5853742 -20.7662716 -15.5682964 4.3633323 -1.4376266 -7.8435960 -1.4517792 7.0330973 -7.7542343 -0.8309368 -0.9038507 3.8673775 -7.9511452 -8.3532286 0.6143978 -24.5793839 3.8962133 -1.3261597 4.0140228 -6.7549095 -2.5078003 4.1948133 14.8830223 -0.3455145 11.7513342 4.7847333 12.7140236 -0.7445372 0.3411851 0.1874994 -1.7039603 7.6691952 -1.9773635 4.8924427 -4.1357002 -1.7853884 3.1311121 -5.0059810 2.9290330 0.2608301 -24.1842136 -4.8510203 -2.1836634 -22.4367638 -13.6345844 0.1278876 1.7384344 -28.9598236 9.8678703 9.9504738 -4.3741922 -15.3796024 -24.1375198 -10.1289625 24.4065247 -6.4120650 0.8883588 -4.4739890 -7.5627093 -3.3888865 -15.1857834 -6.0567446 8.9565096 -0.6310425 -8.0731955 -2.9652519 8.8368378 21.0648308 -1.1612339 0.1502432 -1.6821070 -2.6525362 -0.2335394 -0.7771909 -30.4739132 6.8897076 3.2807209 -6.6632228 -6.3427219 7.6332316 1.2351408 -13.0367956 2.3030109 -8.7422075 7.5564017 -10.5886183 -2.4038148 -7.4843540 -0.7579459 -0.8498920 -3.1547060 0.5440541 4.9994941 3.6019535 -6.1453838 3.7755606 -0.0495126 -0.3351472 2.1469707 -0.5537364 -4.9485183 1.2310284 4.8680024 5.6089754 10.7715759 0.8808408 -5.6806750 23.4747677 7.4122033 -3.4707401 4.2903619 7.7921038 22.8570309 -1.2410319 -3.2578545 -0.3444908 0.5012049 -3.0832520 -2.1506140 -1.1708266 -0.6737884 2.9920223 -3.5111792 -14.2832556 -6.2548461 -11.2697029 8.0778694 12.1581497 4.0454865 -2.8143234 -4.7156529 -4.6507607 -8.9225960 -4.0770617 -3.1707051 -6.4648356 -14.4633703 -19.8735580 1.2088042 3.4524677 -3.9043558 -1.0929971 2.4514792 0.3000799 -2.7221303 7.8190813 -2.8507147 1.1333424 0.1402613 4.1380415 6.2481441 -10.1366110 5.5167522 3.0691676 6.7398124 -3.9870043 1.7799727 -7.4968963 0.8370881 3.6145148 -0.8666728 0.9490808 -1.8514087 -1.2533451 -2.4489088 0.8259298 -5.6844130 -34.3151169 -1.3554113 1.5484216 -2.0505168 -6.0813580 1.7489008 -10.3545351 1.7088892 0.0359966 0.1122330 9.7852058 -8.0660944 3.4248538 1.1498340 -3.7755811 9.6824560 -4.9573884 0.6171682 2.3210318 -1.0669991 -1.5300332 1.0758899 -2.8504236 2.6440849 -6.2620382 -3.7137897 0.3916814 0.0035532 -5.2070394 -15.0850592 1.6649505 -9.2343616 -10.0875320 0.7381516 2.4642889 7.2277761 0.6104650 3.7054443 -13.1873159 -1.2311521 -1.5327888 -14.9013309 -5.4966021 -1.3640697 -0.6470524 0.8459794 -0.6594167 -5.4575911 -5.9807591 -15.4538555 -27.6662827 -1.7418987 -4.0938821 1.3147019 -0.2144490 -3.5212324 31.0932617 -18.4965210 -45.7756233 -3.1830809 -7.5458298 13.4534864 -4.5440259 3.2419591 -4.0315828 -7.6182909 -6.1970100 -1.4893787 6.6952181 -0.1388501 -1.2953746 3.2435026 -1.5415822 0.3146214 -6.1876631 0.2543062 -0.1247747 -11.7348385 4.6486850 -3.4667315 -0.4559074 -7.0017133 -15.6418724 0.4845343 1.4721174 -4.9366598 1.0270634 -1.9677180 -2.9612024 1.1335651 -3.9392703 -5.9039378 -6.4679060 -22.5226479 -11.5767126 0.8011767 -2.7965610 -12.9634771 -3.7822394 -13.6345053 -2.3360786 -7.0723696 -7.8431211 4.8827329 -2.5268779 -4.1973825 2.3630157 5.7832675 -7.5120654 -1.4206673 -0.8202211 13.2949886 2.4760470 8.7931337 4.9640861 13.7763987 -20.6768169 0.3549030 -0.2117055 -0.8879688 5.5427909 0.5285903 -0.0411389 -0.3791151 -10.5113049 -6.5998740 -1.3295587 -6.8030910 -4.9438329 -9.1471996 -1.8200974 -3.6312790 -14.9361420 -1.2609575 -9.4068127 2.0319099 0.4371378 2.3205979 19.8218231 -11.7237892 3.8392425 -8.5018263 -11.1588030 9.5598660 8.2230501 -0.2009536 2.7692626 -2.1595533 -4.1559024 -0.7702253 -4.8824372 4.4286366 -8.6859522 -16.5201988 -1.9638182 0.9777018 6.5856857 -2.7766433 4.3416319 -5.7721090 -0.6505401 1.0936272 4.1376767 -0.0876001 -0.6367851 -1.4994836 3.4005709 -4.1764202 -6.2799935 -0.6862488 -8.9613667 -3.1840286 2.5443778 2.8718057 -2.6832023 -0.1825338 -29.9712696 -1.6781586 -6.7477436 -3.3854713 24.3439045 7.6318598 -1.5604637 -6.4636631 34.4020233 -5.2316308 4.8781805 -3.8421855 8.2474604 6.7672105 5.4662237 8.6412029 -11.8042240 -2.5189354 -7.2325196 -4.4065347 6.1256704 -2.7459204 -3.0175893 -0.8761392 -2.0514081 -12.2263975 -11.5875816 -1.4667147 -7.7482786 -28.2860546 6.5091662 -6.9843817 -1.9842716 -21.5154877 -8.9917049 -0.8868015 -0.2445878 -10.7717686 -0.2137809 -18.2474918 -2.0945635 1.7686574 -0.1200980 -11.9724979 -20.0407143 -32.4531059 -17.8157139 -10.2268038 19.3105793 -19.4038925 18.4787350 -1.8068058 3.6589484 -8.6273060 -6.7663388 6.4628997 -6.8842564 -12.0540648 12.7739487 -1.1324488 -8.6535406 -5.1934061 3.8130145 19.5270214 -1.6475915 13.5305567 9.3778467 22.3498859 -5.3093944 0.5368029 -3.9294066 -1.5268439 10.3962812 -0.6045179 -1.1283399 -3.0764251 -17.6504669 -9.4566717 -5.9840083 -14.2194071 -0.0560269 -11.6289310 0.8390999 -6.2798948 -21.1473808 -1.5705081 3.6405468 5.3185191 1.3177080 4.6707730 29.0292110 -5.7093477 6.5576715 -9.5732756 -17.2850323 20.5656872 4.5023932 -0.9245029 3.0063219 -3.2335675 -4.4996810 5.4453521 -7.7949824 7.8502579 -17.1219883 -26.5326672 -4.6733975 1.8309029 -10.7487650 6.1809325 6.3876219 -27.1656284 -5.1716781 1.3970948 5.3772864 5.0574584 -0.1517697 -12.0911503 5.8758378 -5.9316983 -8.4222994 7.6936779 -14.7010679 -6.9920244 1.2960454 6.9050689 -3.5426588 0.7336402 -4.0692134 -6.3441391 0.8305690 -5.5596409 1.6713530 9.6462278 0.1794320 -10.5058565 58.0953140 -8.9995670 -4.7804823 -12.6345720 3.5866261 16.2982712 13.5353498 9.6716671 -24.9471359 -2.7177529 4.7798228 -5.4932742 -10.1165771 -4.7933125 -3.9862254 1.3295496 -1.8769158 -13.5767469 -14.0836830 -0.7075430 -6.9505887 -15.2196665 10.8661528 -11.4971933 -4.1550617 7.1964712 -5.8551173 -0.2971744 -2.5321074 -14.5076065 -1.0681885 -22.4464264 -15.4746809 1.0716509 -13.3001966 -16.5260048 3.3614323 -3.4350901 -15.4335899 1.8654408 15.5109558 6.0901351 26.8585663 -6.1776810 3.4207706 -2.8681371 -11.7154837 -0.1487482 -5.2187943 4.2632170 -3.6994376 0.7704511 -8.8769903 5.0251656 12.8047457 11.3056965 -0.3219389 8.7124500 5.4850006 15.7841463 -15.1051598 -2.6629694 15.3625860 8.0846882 7.3359685 -1.6659936 3.3303936 -1.4837161 -4.5380592 3.1306922 9.0360584 10.2475090 -0.7585767 5.1161284 -7.1277370 -5.3217311 -14.0491695 5.2832403 -13.4633236 1.8341402 -2.0851574 1.3023207 14.4848680 -3.5294597 7.9929547 13.1322212 -6.1936336 11.0762234 -3.0165267 4.4304466 7.4367552 -3.8147745 -7.4571171 -7.9630828 -4.2931294 5.8050270 -3.3906784 -7.0699034 -3.9646337 5.6082006 -11.7874899 -2.3081467 1.8433257 4.9403896 -0.4806344 4.0410628 3.2102048 8.6723156 0.5138034 2.8193612 -11.2422943 -8.2144699 0.8858098 2.0396242 -14.3723249 -22.7333031 -3.6261292 1.8937206 2.4559145 1.2841296 -7.5733871 0.7440699 -1.2344404 -1.7816235 -1.8552420 -1.0791568 -5.7310319 -1.8271984 7.8109136 0.6251414 -2.5137711 0.2584994 -0.5943501 14.2600670 -3.0045443 0.7809387 0.0322681 -0.0395265 -10.8749361 -19.2122478 -2.9016006 2.0169048 -2.0167050 1.4907964 -15.4577503 2.5444889 -10.4143534 -4.0742812 -7.5466003 -0.9928930 8.2879658 -12.2113657 -2.0416946 2.1048405 -3.0081306 -2.2016351 -2.5305092 -13.0002346 4.0792928 7.2419453 6.6926603 0.1141389 -3.2349482 -4.0493932 -4.6995354 -9.5474052 -4.9752102 -2.4930949 -8.3882704 -16.2861519 -20.5444126 16.9335442 4.0762405 -4.6661487 -0.3347274 2.7975428 1.0179822 -2.9318793 8.9866619 -2.9653037 2.0192800 -0.2625644 4.8905506 6.0175056 -6.3036027 5.5211573 3.7614906 6.9207501 2.1947985 1.4616389 -7.8671660 1.1522882 4.0135612 -0.6525938 1.5410042 -2.3064768 -1.9730214 -2.9649854 4.6622396 -6.0675554 -35.6364288 -1.9605522 1.3004489 -1.8937324 -7.0136261 0.9424748 -9.9641018 1.5022349 -0.4196443 -0.8036827 8.3768482 -8.3050280 2.4311004 0.3398892 -4.3394136 10.7535849 -4.2932439 0.4270064 3.7207494 -0.8346987 -1.3876885 2.0028279 -2.8249407 2.6504288 -7.6741972 -4.4143062 0.2746853 -0.5421446 -4.3261509 -13.5240536 1.0583791 -9.2437487 -11.0983086 -0.2737870 2.1137886 7.0491872 1.6336631 3.6571450 -16.3169727 -0.7830052 -1.2858113 -4.9818821 -6.6493349 -2.2335360 -0.9947744 0.1531184 -0.5563774 -7.1375556 -7.1065817 -16.2531853 -30.3822155 -1.6010810 -5.5373659 -1.3410465 -0.1744463 -4.1277537 30.8974819 -17.4927807 -47.7249908 -3.9235680 -10.5899658 13.5643435 -3.7254825 4.6950212 -5.7663941 -6.6921253 -9.4174538 -1.8918303 4.4650936 1.8864238 -1.7859529 3.6525829 -2.1655622 0.9449559 -0.9309813 0.6571867 -0.4136064 -11.9291487 -5.6253362 -2.9182744 0.3492390 -8.3565359 -13.4097490 1.1990888 1.8514056 -7.3127513 0.7990414 -2.2764080 -3.2048130 1.4501454 -6.1163878 1.7273260 -6.2758527 -23.1499386 -8.7309217 0.4393944 1.8985592 -7.8579254 9.6991653 14.2075157 -1.7543851 -11.2203770 4.1801448 5.4119062 3.3225424 2.0971961 -0.4861774 -2.0841105 -4.7405043 -0.6476846 -0.3649133 12.8161430 15.0217524 10.0258732 4.4596705 14.4182825 9.0358925 0.5484314 0.9056892 1.7365036 5.9994698 -0.5542049 1.0470710 -0.2008992 -2.6466455 -5.1890340 10.7064228 -7.3586297 8.2167892 -4.6235051 -1.2528512 -3.1237984 -15.2822275 1.3638163 -9.4037924 4.0259933 -0.6654212 -1.5230322 12.3394556 -11.9224768 -0.5813256 4.0633225 -13.7921238 9.2452173 -2.1307976 1.5969548 -44.9461021 -0.2027771 -3.8651457 0.6965945 -4.5067616 5.2511401 -7.4128056 -13.6004333 0.4621176 1.5293493 -11.0438194 -9.9625759 2.2297451 -9.0639410 0.2498696 -0.5423869 2.5343649 0.5055556 3.1421883 0.9371615 -1.4458526 -3.4404433 -6.0153499 5.7299991 -11.1686611 1.6460447 3.2175739 1.8578413 -1.4473466 0.4559374 -11.1085882 -8.4532509 -0.3901655 -3.3049045 -12.7607737 8.2818584 -2.3360989 -7.4245868 30.8252411 9.7442265 -12.0369959 -2.2004929 -5.8013916 -4.7996922 7.2655978 10.8121090 -26.1908550 -6.9114242 -4.7887511 -2.5106876 6.4862466 4.0677547 -4.8767657 0.4852799 0.4285595 -5.9271698 1.5833198 1.9306982 -5.5374174 -15.9468679 14.7173700 -3.9988945 -0.2625260 -11.2993479 -3.7104692 2.9434416 4.9864078 -15.9795065 2.8960016 3.2550294 0.1040230 4.0910964 -9.1849327 0.7627059 -15.7359266 -31.3851433 -14.0476227 -4.2283139 0.1334211 -11.6320229 -1.6479580 -1.7446163 -2.2303727 -16.3274612 4.7101440 8.7908564 1.2118657 1.2096940 10.8950729 -4.0458417 1.3491077 1.0599556 5.9200916 19.2629261 0.7221351 14.9221954 9.0111561 23.0214462 -4.5144434 2.3620505 -3.5568445 2.6381865 9.7284803 -0.9305761 2.7675991 -2.8537147 -9.8737535 -4.9112377 4.7237806 -11.0105181 -1.2089907 -10.2769651 1.4578234 -4.9036689 -19.9799156 4.6759419 5.3439431 -0.2585511 -1.1593297 -0.2548903 21.2602444 -13.4273243 1.1806970 -12.3865499 -17.8135395 19.0670033 -2.0398674 2.8067071 0.2825685 -2.2015109 -4.6956863 -0.8913319 -7.2411995 8.5005579 -5.4320736 -5.3686233 0.9875219 2.3783092 -4.4846268 -1.4878360 -1.6291533 -18.3948021 -0.7468705 2.9201753 4.5102663 1.9240127 3.5578637 0.0954213 -1.8031397 -4.7958064 -10.5870228 -1.8555665 -15.9551725 2.4713795 3.3613663 5.8967600 -0.9512583 -5.5710249 -14.1040764 0.2281053 0.6816012 -5.1312070 -1.3780462 8.4528027 -3.6092520 -8.8509188 33.9457817 0.8633665 -0.4530842 -3.6098738 0.3055818 -9.2519817 26.2221031 10.2925148 -22.8280010 -6.2963786 -7.1268530 -5.4831152 0.4477733 -0.2998229 -5.7603598 4.7372303 -8.0492086 -10.0431728 0.8450479 5.4825063 -6.3548398 -4.2218552 -19.1238556 -6.4730210 -0.6629983 -5.3030090 11.4843254 7.9812899 4.9138546 -23.9331455 4.7663126 8.1005573 -0.9982589 3.8914404 2.3189406 -5.0411963 1.0360200 -19.5449162 -10.1048326 -5.8879933 -0.5549013 -0.4599101 0.6923466 0.0680614 -1.9242737 -11.6345787 -0.1130318 9.1965981 -3.9960318 11.1418076 1.0286989 -1.2009286 -1.7194436 7.6355333 3.4677022 14.9081650 -0.1482812 6.7825427 2.3286364 9.8088551 -18.8238163 4.1448226 1.3098320 1.2959008 3.8409543 -4.7041302 -0.5503020 6.7174916 0.9537298 5.1927681 35.0432014 -8.0976505 -0.1902759 3.0192196 -1.9675155 -7.2926879 -6.5863485 -9.1729784 0.4781387 -0.0344350 -4.6630821 2.2124684 -13.4299765 20.8379803 -3.2844701 0.1926701 -2.7213550 5.0295858 1.6201674 1.1276660 -12.0766792 3.3627098 -6.5648341 5.9270401 -4.4301190 4.1344309 -4.4012399 7.0486798 4.5584607 8.2269478 0.2599764 -0.3074593 5.6488633 -1.0475819 -0.1449132 3.7633293 -0.6830955 -4.8297114 4.0773644 3.4513676 1.5957432 -2.1595147 10.5634089 0.2509185 -3.8021357 2.8875799 -1.7716562 10.9245834 8.7959995 5.4504080 -0.8405696 -0.2888088 -0.2063725 -3.7735314 -0.2997201 -4.6610570 8.5262699 -8.6831961 3.4417961 0.2650467 -0.3297041 -0.0142450 0.1967966 -2.0947597 -0.1615835 17.9886074 -0.7732962 -0.1410890 0.3644904 -4.7465196 -0.7332075 14.4779472 3.3141785 -1.6870475 -7.4867501 0.0779616 -5.0464883 2.3741145 8.8429260 -0.5148231 -1.0066737 5.5845079 -1.9034632 1.1387742 -1.0574087 2.5464027 -4.7815452 -9.0247698 8.0299053 0.3949009 1.2303323 -5.2556286 -4.2491498 -3.8285348 -4.9269042 -10.3862829 -5.1371689 -3.8753631 -7.5534539 -21.0233383 -24.0822430 -5.0445409 4.6027451 -5.5653434 -0.2275270 2.5395865 0.2073796 -3.5001628 9.4896011 -2.6145644 2.5409961 -0.0361430 4.9645858 5.4638276 -8.7972813 5.4355936 3.4306698 6.5479298 1.4639031 1.7382945 -6.7330813 0.9022986 4.1196771 -0.5596498 1.5810151 -2.7422302 -3.0581110 -3.0348721 -8.2057514 -7.0549068 -32.4079208 -1.6073216 1.3151487 -1.9595007 -8.0783358 -0.1192958 -13.2069826 13.4921350 -0.4031460 -2.0062993 5.3411965 -8.7234602 2.7716682 0.4406048 -4.7637234 10.0119495 -7.3123603 0.3268908 -15.8049564 -0.8884094 -1.4213156 2.3688684 -3.0114131 2.7864983 -8.4386120 -5.0005250 0.3732887 -0.7588388 -5.9344440 -12.0698919 0.1109985 -8.8167133 -8.4865112 -1.2242119 2.0030286 6.5282793 1.6622931 3.5906911 -22.4277878 -0.7832006 -1.7365189 -11.9453850 -7.5978580 -3.5390308 -1.3924664 -0.6198008 -0.4516056 -7.9595695 -8.9439507 -18.5031433 -24.8638725 -1.4983940 -14.0623598 -0.0222926 -1.3550639 -4.7193866 32.3400230 -20.3333206 -46.4557152 -4.1385560 -11.7758598 16.9494152 -3.4779429 5.6517735 -12.7249336 -2.6078691 -8.1137705 -1.9749982 3.8896477 0.7888148 -2.1158459 3.9821422 -2.0952899 1.7093819 -1.6638180 0.7854353 -0.5320749 -14.2445488 -12.2950964 -2.9423039 0.8829517 -12.0040131 -14.7300329 1.0763046 1.3138056 -9.0470810 0.3553658 -2.8590879 -4.2572637 1.8095136 -5.7147260 0.3172641 -7.8386254 -24.9632568 -9.4767923 -1.9548304 -9.6312532 -6.0521555 10.5453396 -16.2222424 -1.3706685 -12.2553654 0.2328802 6.0167370 0.3671670 -0.9936845 -1.9491322 6.0968728 -6.6705437 -0.2112148 -1.3332609 11.8999720 -11.0811758 10.2642689 4.9916487 14.8029652 11.7331333 1.2729447 3.6562500 -0.2585005 6.0446186 0.1688750 0.6889142 0.9469687 -2.0178103 -7.0253139 7.3015676 -9.2643223 9.3998613 -3.9732115 -0.4585408 -2.4249027 -16.9966869 0.7684955 -15.9628010 9.8488569 -1.5206670 -0.5473697 13.0584698 -15.7631397 1.7876115 -1.7540889 -14.7257671 6.6112561 -3.8434951 1.1298553 -4.4708571 -0.3646654 -3.8731093 1.3754486 -4.5658798 5.6812429 -1.5813854 -14.5800095 -1.5554016 -0.2757653 9.9095402 3.6860840 1.2397062 -8.8817568 -0.9330352 -2.3140750 2.7544541 -0.9926730 3.3544984 0.7891501 4.4675860 -3.7059228 -6.8264065 -13.3841658 -12.0409679 -0.3140333 3.1498008 0.1020903 -1.2417812 -1.4141469 -25.2215748 2.2738309 3.3839512 -3.8017967 15.0143661 6.5506067 -4.6287189 -8.4092836 36.8352280 -14.2157259 -4.5459065 3.7707207 -10.8245106 -3.9240623 -15.6791592 12.0556479 -12.4457979 4.4570055 -8.3383780 -3.4888570 14.0547009 1.6204534 -5.1891360 1.4219788 0.9613287 -6.0926366 0.3368901 1.9732749 -6.2939463 -18.3186550 10.2685261 -4.5806451 -0.0366913 -14.6828060 -2.4519711 2.3485346 2.6194124 -17.1567039 1.7789359 -9.9989824 -2.1642418 3.6648412 -8.6459494 -0.1335820 -12.8243313 -37.1619110 -15.5464430 -6.5826936 -0.8910564 -11.5517721 -12.5286722 9.8817434 2.6408119 -18.6922188 2.8202803 11.5074301 1.0553514 3.2824535 8.5278635 6.5615106 -2.3750663 -0.0714870 2.3190985 16.9250221 -0.4263684 16.4353218 8.5301580 22.0051060 16.7363052 3.5379806 2.7849138 4.8731999 10.5374823 -0.0874409 3.1848662 -4.5895767 -19.2898998 -5.6646585 12.4726562 -12.8521976 -0.4136488 -4.8977265 1.8554966 -5.3998528 -23.8296604 2.6294248 -3.8306997 0.5760804 -1.8389848 -1.7755892 15.0022001 -8.6437931 4.3633204 -15.4637365 -20.3886414 13.7969456 -6.6171021 4.1231084 -3.0499868 0.0536125 -4.4588308 4.3823533 -7.4060645 8.7125463 7.5074534 -26.0085564 -0.5574976 -5.4824829 -1.1775692 -17.5633011 1.4868572 -17.4942436 -8.9945431 1.9352821 5.2012119 1.4016788 2.6486855 10.3482943 -4.0939684 -5.1776867 -12.0761271 10.2194462 -18.5892315 1.2737526 3.1441095 4.3676424 -1.1335322 -5.3166871 -14.5485334 -4.0330453 -0.8398695 -5.3098893 -8.5736017 4.9888496 -4.5028858 -11.2758484 72.9678040 -17.8397427 -17.6345100 -13.2018671 -0.1666824 10.0507622 20.1964607 15.4682579 -8.6903124 3.6682127 1.2223827 -5.2773561 -11.7765427 4.5377932 -7.7176614 5.3986921 -0.0436421 -2.0874479 -0.2406507 5.5802059 -5.8192582 -16.2997208 -7.9395280 -6.9503331 -0.2986250 -15.8747759 -3.6070502 7.3325725 4.7851629 -26.8768139 6.3065376 -33.0421181 -2.6025913 5.8142662 -8.9934397 -1.1855730 -11.7617264 -15.4590969 -5.8661957 -30.6701756 2.0280056 -15.1138620 -2.0472758 8.1573267 7.9810891 -19.2169361 -5.5395966 9.8988113 -0.3140407 -8.6103420 -0.1752838 3.1583006 7.8265047 -12.3630123 -0.0878857 15.8364153 -0.2803392 7.6415625 0.7572536 -0.1447674 -11.5753536 -1.2097435 -3.6659501 -2.9521189 -5.9429398 -2.5317044 1.0650491 -4.2499909 2.2692461 2.0886440 12.8528299 -8.0834808 -1.6629212 0.2010583 -10.0332928 -3.7846038 -29.1725101 -0.8472115 1.1053734 1.7095819 -2.7590551 -9.2063780 -14.5929155 1.1682028 -9.1829643 -2.8913782 -16.1481037 48.6875954 0.1351168 4.4133959 -0.1984878 10.7124338 -0.8477254 2.0061755 -9.4328299 4.9721265 5.8578629 -10.3006086 -0.1704719 6.6016603 -8.3003483 -1.1787380 -0.7346512 -12.8073559 -1.8488364 7.1113424 1.0713007 17.3548565 -5.3834238 1.0528921 0.3447441 -3.8604047 2.3944013 14.6922665 -13.9496593 -8.7716627 -9.0762796 2.6616986 -5.2623572 -1.2979213 -5.0919294 -2.2082307 -0.2890457 -3.5290501 -1.3304788 -12.5430593 -5.4137816 -22.4490929 19.1508217 -1.0695844 -0.6244125 -0.8790560 1.6790652 -5.2474031 17.8487759 8.7302952 -0.4918946 5.5748601 -3.2817054 -2.2013831 -4.3394923 8.1189604 -8.7913876 -3.4191341 2.8972876 -4.8310013 -5.6396480 6.7020960 -7.9009981 0.0799333 -2.0383241 8.4897976 0.9996163 -7.4218993 -7.4509945 7.6690502 1.1836998 -17.2527390 10.8823128 13.5088806 -3.1694059 6.4674139 -5.2365561 -3.8999608 -6.9068437 -11.1834869 -5.6759863 -3.3261979 -9.4838257 -23.5762806 -26.5386333 -0.6154067 5.2519774 -6.5939364 -0.8501225 1.7301991 0.1101076 -4.8082919 9.8574400 -1.9865320 2.3984432 0.0947092 4.7646289 5.2092676 8.9242620 5.1562743 4.2072186 6.8606405 -1.5665754 1.7522908 -6.3719945 0.5019640 4.5030227 -0.5230365 1.5405564 -2.2205169 -5.6507783 -3.6260588 -10.7915783 -7.8451400 -32.7560692 -1.8455515 1.7433357 -1.8899531 -9.0146255 -1.6189462 -12.8488894 9.2233925 0.1356622 -2.9280465 4.5327559 -9.0851946 2.5907917 0.2306156 -5.1893845 10.8065147 -8.5401230 -0.1580323 -19.4019051 -1.1530337 -1.7124935 1.9621336 -2.9723055 3.0045137 -9.0355482 -5.1474419 0.4986447 -0.1641671 -3.5698075 -10.0019560 -1.1193107 -10.0254564 -9.3389997 -2.6334810 2.0079815 6.6645107 1.2230134 3.7490232 -29.2483978 -0.9184154 -1.5621980 -12.0945215 -8.0216494 -5.4648004 -1.4124610 -1.8344603 -0.6097388 -9.2207813 -9.4801464 -19.8439140 -34.0122108 -1.5903021 -19.4669971 -2.4571874 -1.6210084 -4.9203815 31.7775230 -21.9465637 -47.9007797 -4.7600927 -16.9223785 17.9288445 -1.6501839 5.3424940 -12.7708664 -2.1067095 -11.0146275 -2.6802671 6.1639771 -0.3897023 -2.4420266 3.8035698 -2.1815779 1.6015196 -2.2475712 1.4515662 -0.6800206 -14.8386374 -18.7182045 -3.9184105 0.6464332 -10.5819798 -14.7261209 1.8598248 1.3822300 -11.0406351 -0.5809854 -3.3362501 -5.2552943 1.7740945 -8.7086582 0.6784422 -9.7458038 -25.0352001 -11.4826384 -0.2184694 -6.3994756 -9.0618963 -20.6007595 -2.4754725 -0.5516359 -12.8778162 -1.3055949 4.7747936 0.4139374 -1.1000609 -1.9018211 8.0579395 -7.1825647 -0.0243644 -2.8668127 11.5923500 -7.6959033 9.8072023 6.1900764 15.3006134 10.5631561 -0.0067036 4.5386825 1.0549209 5.9578552 0.4474848 1.5409182 0.9021070 -8.4091883 -8.7109709 -0.5739441 -10.7108755 -1.8530698 -5.3088665 0.1247103 -2.7335749 -19.9970875 -0.5817682 -9.4302349 6.7769361 -1.0502937 -1.8014798 11.2716274 -14.3330050 4.6887555 -3.3691294 -15.0625687 11.6248035 -8.2867870 0.5971651 -14.4965334 -0.3468383 -4.1801348 -0.3164192 -4.3180523 5.8893209 -2.5020046 -15.4870167 -2.2361491 2.0840802 6.1433764 4.5073233 -0.6472268 -9.2360973 9.4617119 -4.7232714 2.6493335 -0.4962167 1.2392515 0.7213097 -2.4437089 -4.1545405 -7.0603056 -7.5740161 -12.8462782 -3.9063358 3.5433567 -2.5598245 -1.5146115 -4.8831987 -33.9467850 -25.4117508 -11.0948639 -3.7411473 -34.8540611 2.9505415 -4.4368749 -8.8382750 46.4572830 5.4621501 -3.9837339 4.1542668 -35.7840424 7.3408079 -12.1448698 12.1540575 -17.0960217 7.0575905 -5.7884636 -4.4482565 17.4516716 0.2531343 -7.1273232 -0.3759577 0.5296192 -8.6525717 -0.5842651 2.3882751 -6.4490132 -10.5734968 -8.3970900 -7.4755030 -0.6290724 -32.7483063 -2.7579205 2.9751914 2.6917336 -19.9649220 0.6859048 -9.4960203 -3.8845630 3.1147468 -10.8918362 -12.2796125 -10.4415426 -38.1010933 -15.6509371 -6.3961873 -3.5933084 -25.3217564 -6.4985633 6.4037995 4.5446520 -17.3005352 3.1827729 10.0788498 1.5774896 0.0398218 7.6628251 2.1548905 -6.6134562 0.3118045 -2.3933623 17.4352608 -1.8470795 15.6196508 10.1727638 21.8297176 19.2060680 1.0688392 -0.9017311 -5.6006470 9.9454098 -1.0132703 2.6295102 -4.1606398 -26.5151005 -8.9689665 11.8627014 -11.4476624 -9.3481722 -9.5325317 2.6670768 -5.9823527 -27.4012909 0.6778134 -6.5371280 -0.9698190 -2.6089418 0.4417221 18.0149879 -12.2116556 7.0940127 -1.5976672 -19.2082405 17.2031460 -2.3479741 1.1150888 -0.8112048 -1.2172818 -5.6951547 -0.4433390 -7.4514847 9.7433243 4.4637675 -26.6083355 -4.2285028 -1.6734964 -10.0214701 -10.8356276 0.3263282 -21.2087326 0.8850421 -3.1177926 4.3188605 7.1783047 3.8834445 4.2559791 6.1195965 -5.5966454 -11.9367428 6.1529102 -19.5346775 -4.3706450 2.7575202 1.6101081 1.6719886 -11.2054319 -19.2079220 -11.6619453 8.8302612 -6.1395912 -4.3991590 2.5270140 -7.8880763 -12.6654778 76.5240860 -1.9359676 8.7348442 -14.7538395 -9.5634995 10.6443977 11.9682932 21.4525127 -19.1127167 1.4085205 -9.5123510 -7.1338253 -8.1607590 -0.1826968 -9.5293121 2.6026807 3.1798844 -6.3443422 2.5009031 5.6315942 -6.5448165 11.3238125 26.6402073 -4.2116976 -1.4640414 -30.7001991 -0.9473370 6.7966328 4.8049331 -25.1718979 6.2078466 -18.9632664 -4.9924068 2.5694695 -4.6584821 -1.8383619 1.3328565 -14.9309855 -13.3159351 -8.7741413 2.5096369 -10.3260880 -2.6138525 0.7549317 -1.7926191 -21.2142124 -3.7213809 8.1547146 -1.1972659 -4.3074794 11.0430441 -9.9594965 0.6596278 2.9527953 2.3727629 6.1610074 -1.2113557 11.1461506 4.2452188 9.8525400 -1.3698105 9.4935484 -7.7389717 7.8460636 11.5569000 -0.8564193 6.3366723 -12.4472303 3.0975964 -1.8437228 22.2400780 -15.3290424 -0.2007650 3.5381098 3.7518306 -7.2224984 -29.0534630 -2.4958889 7.1361971 0.7838019 6.6511812 -1.7151617 3.9357507 -7.6230297 -8.0434256 8.1869535 -15.7749548 -3.8688092 18.3285923 -2.4458342 12.2748098 -4.9640217 -12.4656534 -9.3025827 -6.5505962 9.1300592 20.2298412 19.9855175 -3.5479736 13.3463869 -4.0312252 3.6447771 -3.4239779 -10.0997801 2.2590246 3.4558983 1.4515604 6.5395656 11.4720469 -0.2842828 -2.8770282 -3.3799503 -7.7616644 -12.8717308 -16.4419250 0.2681424 -1.1152868 -11.0447035 1.1206264 2.2051127 -11.0480738 -0.4467216 -1.1520280 -2.6437306 3.7665460 -0.7474997 2.1526532 -10.2994194 30.9535923 5.3360329 6.3393965 5.0417557 5.4590187 6.2539029 4.3860431 20.5684643 -1.4863185 10.2149553 4.9560161 -1.8691288 -18.6771145 7.7627902 -7.1387296 12.5497627 4.9198818 6.1266508 -2.0708210 6.7230315 2.9705412 13.6532125 10.0127840 -1.3974922 -1.5340921 0.2147190 -11.2438049 7.4196329 3.0111964 -26.0629539 -3.9574614 12.9812489 -1.7706249 -1.6776993 -4.1723824 -1.3375666 -11.0211782 -11.9328823 -6.6680894 -3.2296209 -8.5472717 -26.7506084 -32.0479202 -10.0652561 4.9824414 -7.5963058 -1.2059427 0.1556159 -1.3785969 -4.3317480 10.4913731 -2.4323738 2.2708724 0.3505970 5.0291862 4.3067508 9.6603518 4.7160506 5.0304861 6.4619164 -3.7351584 1.9113860 -5.8857551 -0.3930147 4.9140325 -0.6374667 1.0571029 -1.8805091 -8.9482441 -3.9343042 -10.6619759 -7.6055908 -29.0281601 -1.6847817 2.0520687 -1.7952288 -10.6285954 -3.5529032 -13.8674278 23.8767548 0.4073401 -3.9020402 2.7188237 -10.0363331 2.1445758 -0.2565611 -6.1090255 10.7722130 -10.2410488 -0.1658450 -10.5420628 -1.3229918 -1.9443076 4.1096740 -3.1683791 2.7279100 -9.7114105 -4.6439333 -0.6573099 0.1549242 -4.2354298 -8.6458702 -2.5323718 -10.5171652 -14.3091831 -4.9922800 2.1613364 5.7731414 0.3991945 3.7069523 -40.6218605 -0.3223614 -2.0792322 -10.1044922 -8.5797577 -7.5790615 -1.7036755 -2.8627696 -0.5218040 -10.0462666 -10.0606499 -17.9623528 -26.8413734 -1.4606651 -20.9524612 -2.4915156 -2.1038218 -5.8206468 31.8815346 -23.6447163 -49.1884041 -4.9250836 -17.0676517 17.4534836 2.1508026 3.2885654 -18.3537521 -0.0536136 -11.2494717 -3.2069619 6.4162273 -0.7481881 -2.8106542 3.9337120 -2.2573743 1.5751022 -2.6767631 1.5508095 -0.9738411 -15.8370581 -13.0400181 -5.6934471 1.1432594 -8.7350378 -18.3210621 2.1676824 0.2757457 -12.7698727 -0.8262296 -3.6717424 -5.5846868 1.3808234 -7.4692225 -0.1905687 -16.5344143 -26.7220802 -13.5701323 0.0327927 4.3380556 -14.3869896 -6.9329376 15.7790184 0.4674989 -14.2474556 -3.3620036 2.0061011 -4.0414686 0.1792582 -3.4076128 6.2337470 -8.9861822 0.1689502 -2.3937638 9.8404951 0.0748352 9.0789194 7.4708052 15.1810732 -7.8883405 -0.3658160 4.2428770 1.3797266 7.1045027 0.2641219 -0.5571909 1.3888595 -11.7186909 -8.9556570 -0.0712963 -11.1800804 -12.6354475 -5.2628880 0.0254586 -2.2403867 -22.4275761 -1.2484922 -9.8970480 -4.5169101 0.4133958 -2.9545259 14.5542679 -21.4288616 5.7452779 -4.3369966 -16.9942493 11.2245321 -18.9762115 3.4601967 -2.5003920 -0.0622095 -4.6448636 3.8026531 -4.6703830 5.7539167 -5.6825905 -14.7581673 -3.9893990 3.7548943 21.3128071 3.5555799 -1.5970949 -10.7688494 14.4141111 -8.5606661 2.6235392 -2.2231748 2.8611810 -2.6584918 -21.7284184 -3.1607199 -6.7952480 -10.6508884 -14.3219643 -8.9413147 2.9294248 -5.1588669 -1.3186579 -2.8380427 -34.2716904 -13.7124777 -12.9470377 -3.6194377 -36.0984039 2.9181325 -5.2144814 -11.0104084 54.8311310 -2.4083710 -5.0570707 -2.4988630 -38.6071129 19.8509464 -18.7969952 9.1904917 -11.5307169 -2.4239209 -2.0172846 -6.1674705 18.2351646 -3.6768708 -7.9757080 -0.9482224 0.2521945 -10.2904119 1.0433122 3.1308498 -6.2179475 -2.6765747 -2.5553157 -9.9946117 -0.8663876 -10.1893473 -4.7763190 4.4175377 -0.2914641 -22.2662525 2.4471006 -11.6275673 -5.4003077 1.6384555 -10.4109793 -6.2931066 -15.8567324 -39.5258026 -16.7286434 -7.6414838 -7.7249732 -38.5119324 -15.6315012 2.6364291 7.6351886 -21.7887955 -1.1291575 6.4491439 -6.8799710 0.8088140 1.9434314 -2.7440503 -7.9171720 1.9002320 0.3491670 15.4477072 -11.1047173 15.4122791 12.5983982 22.2720394 2.7898297 0.2457197 -0.1562454 3.5599723 11.9247875 -0.6625363 0.7546945 -5.6836042 -26.4254894 -9.9509792 3.2099276 -16.3912182 -7.8066940 -18.9970169 1.7249188 -4.7774100 -30.6548882 -1.4713827 -4.1701555 2.1393962 -1.0667970 -0.1651362 17.9108028 -12.9320812 9.1522379 -5.8818483 -22.3996601 19.9760532 -1.9462365 2.0428255 -5.8337669 -0.5663469 -6.5473628 5.3314719 -8.2958698 10.0408134 3.6449890 -26.0667629 -5.8380675 2.1040404 5.4197063 -9.4776783 -0.7304879 -20.9578400 19.1477108 -8.9201984 4.6041622 5.1158357 6.3427939 5.5333796 -7.3741870 -4.1917772 -8.4535255 2.6772604 -22.7299500 -11.7757854 1.6710645 -3.5529313 -0.2023373 -19.5405369 -22.6517258 -19.2052097 9.6403809 -5.5055394 7.1436181 1.6078612 -7.2866521 -16.5256653 90.2915421 -11.3524914 15.7774353 -19.9918556 -10.5767384 13.2688742 5.6179800 20.2189560 -15.8243923 -4.4810653 -12.6501541 -8.4452105 13.8173599 -3.4218295 -9.4391813 2.0066888 -1.5737045 -10.0787277 4.3412976 6.5161567 -7.0583930 5.3381543 -0.0923621 -8.8226633 -1.9257494 5.4336753 -4.5658789 8.4524021 -3.1052003 -32.4000244 0.0851000 -31.3930798 -14.8482866 2.0940962 -10.8911743 -9.5899916 5.0894232 -20.2132645 -12.0435801 -22.5214481 1.8920984 -15.8091431 0.4144119 3.8787341 11.1909742 -10.3362646 3.6713836 6.2222023 -3.3177392 -1.8553845 13.2861662 -11.2135744 -5.7182999 4.7172904 14.9334717 9.9368963 -0.3348235 13.4351015 4.1720295 12.5051575 6.2004924 2.6052744 -1.4085364 2.3162680 10.2825775 -4.2780356 1.3619968 -7.7983088 15.8969841 -0.1202465 -0.6725057 -7.8595238 -0.0357471 20.4047871 1.9045483 -5.6857185 -24.2758713 -1.7823884 -19.0618286 0.0922700 -5.8835330 -1.4890263 13.7413568 7.6174846 -1.1746045 13.7117443 -3.9797666 19.3877316 10.5476608 -4.1518984 -5.1951680 -0.7992891 -2.9379890 -3.0040853 -7.2979736 6.5535507 11.7871933 2.0341592 -5.2425590 6.1338811 1.1325090 22.9547081 0.8062805 -17.5493793 11.7929230 0.4946623 0.3883734 21.3254681 0.2806153 -4.0349097 -10.2464781 -5.1280379 0.9222228 5.3812714 -15.1165924 -7.4003153 -0.0058644 4.0203514 5.3472953 0.1349815 -9.8203535 1.0232298 -0.6634337 -3.1829472 5.0845203 -2.7924690 1.1187152 -19.9478760 59.3399200 2.7188778 4.7568707 0.3936524 0.2665402 8.1350317 10.1725998 22.9223728 -4.6793733 10.6793642 0.6427324 -5.9636765 -32.9371872 11.2390242 -6.8404102 6.0293550 1.7549074 -5.3099294 -1.5629433 5.9096041 -2.4703946 17.8774853 2.1841829 4.5885768 -0.6826339 7.4115949 -16.0561314 5.8100915 2.6417446 7.8891454 -1.2016690 -6.3614364 -7.2166386 0.6452942 -4.6058612 -3.5874157 -15.8393307 -12.2275887 -8.3888083 -3.1481643 -13.8015528 -27.7494202 -27.7641621 -11.5400724 6.0483074 -8.8542118 -1.9580742 -2.6196108 -1.9852824 -5.0268340 10.4966040 -3.1175320 2.2430174 0.9429888 5.3118300 3.6643002 -13.4682226 4.0074058 4.4649024 4.9270244 -2.1958818 1.7779262 -7.1066546 6.4735093 6.1561866 -0.7502939 0.6385044 -2.2673657 -13.0453405 -4.5003190 -10.9827690 -7.8863902 -25.7954807 -3.6784658 1.3175616 -1.9936776 -12.2247458 -6.1829081 -13.3897533 26.8662357 0.3797298 -7.3667784 1.3814763 -11.3021574 3.5992436 -1.2371438 -7.1693811 9.6588440 -11.0024385 -1.0625179 -10.0831375 -1.7237172 -2.5825160 4.0165253 -3.7395737 2.4579704 -10.3137150 -5.4977360 0.3723883 0.8749245 -5.8138719 -7.0640531 -3.7861607 -10.9645634 -15.1268606 -5.0257130 2.3480282 5.3509927 1.6980981 2.7885721 -57.0207253 -0.1582448 -1.7155844 -9.2926092 -10.3688946 -7.5030751 -3.0076728 -5.9727535 -0.5674924 -11.9955225 -10.0080814 -17.2395058 -16.0134239 -1.3893063 -24.0503044 -5.0414166 -3.0391622 -6.7479458 31.6366959 -24.8597775 -50.3529968 -7.9910264 -18.0336895 14.8600864 5.6219378 -2.2062893 -26.8329105 -2.8688574 -19.4998646 -4.7487268 3.5984075 0.0643724 -3.6907902 4.7957978 -2.6098785 0.7192354 -3.6106293 2.4546688 -0.8867878 -16.4224701 -14.9322824 -4.0594540 1.5277911 -6.4357924 -20.1855392 3.7963541 -0.1790053 -12.5593395 -2.2937014 -4.8602357 -7.2483735 1.1841816 -4.0993376 -1.7286794 -25.1615238 -27.8497696 -14.4454250 1.1404475 -5.1751771 -19.0520859 -19.6436043 -4.0148301 1.0880520 -16.7128773 -6.1586323 -3.8736808 -5.5727081 0.1018508 -7.4438338 6.8647962 -10.9519644 0.9878411 -3.8928566 8.2801781 -12.8994827 6.5527515 5.4573760 12.9901800 -19.8359985 0.2367977 4.8135509 10.0258608 8.4988956 0.0262247 -1.8655579 1.0245477 -17.8290997 -10.7907152 3.5564964 -9.8145943 -14.7601366 -10.1119776 -0.9235617 -1.8464018 -25.9042568 -3.1239407 -4.4961057 -0.2816052 0.9218804 -8.3509474 3.3363619 -27.6572418 7.4666576 -5.7672362 -19.9554634 8.5532951 -12.7858210 2.5368857 1.7450216 -1.2003441 -6.4380126 2.7604721 -5.2792873 5.1283069 -5.4118581 -15.9021749 -3.0685277 5.9457521 25.5488586 3.6837151 -3.3253639 -11.9294538 11.7703743 -10.0415268 3.2193186 -2.6462471 0.9134670 -4.3218260 -31.5663681 -2.6205256 -8.7377729 -19.5849438 -16.1820297 -13.5166111 1.4574314 -11.3889780 -1.7526586 -1.8570397 -6.5097413 4.0738072 -20.7498169 -3.7311587 -27.0756702 -1.9075341 -7.0445576 -12.7582970 56.5673676 -17.8347912 -7.6901631 -27.0708866 -1.8923122 41.1009750 -18.0378551 1.8212022 4.5844092 -36.3989677 -16.0865574 -7.2216849 17.0898781 -0.6383336 -8.7846889 -0.0801074 -0.0211940 -14.9607544 -0.5852590 3.4422410 -5.1480227 -1.4509226 -23.3227463 -9.2256212 -1.3763855 10.2575607 -5.1394696 5.3236442 -0.9818236 -33.7050552 -0.2583472 -16.4912148 -11.1065617 1.2779883 -13.3122654 -8.9334240 -26.4187660 -42.2097054 -18.6079922 -7.7432213 -0.2896338 -36.1747246 -13.3198195 0.2946302 3.4967556 -23.1505356 -3.2529418 -0.7862349 -9.2224007 -3.6619067 10.0653257 -11.6281595 -10.4348640 1.2605375 0.1167651 14.1258898 0.2667010 11.6446600 5.1906548 18.5532322 15.3739882 1.8705752 -1.2167906 -0.3014852 13.5229187 -0.9473530 -2.6458044 -1.5927477 -16.6033344 -12.6544132 -18.0160885 -18.7896919 -2.5116560 -30.0537224 2.9221468 -4.9185300 -37.0059853 -3.0974700 -35.1182747 3.8381479 1.0721959 -6.3745179 14.4052429 -25.4700222 9.6231461 -1.4196453 -26.3187294 18.8890839 3.9688363 1.0789151 -14.6376104 -1.0560647 -4.9722347 4.3972144 -8.6960955 9.8396664 3.0347071 -12.9676495 -3.1552384 6.5916786 26.0377483 4.7441230 -6.0580959 -18.2709827 -7.1284776 -11.7196436 4.0749612 8.9770689 2.3440707 6.6986156 -10.5957527 -4.8229933 -9.2988348 -4.0920763 -24.8019543 -21.2188568 0.7782596 -10.7767982 -0.2748986 -20.1993465 -8.5550365 1.1548806 -2.4343028 -5.3240356 -11.1974211 1.1138242 -9.8814478 -16.0708256 91.0143280 -2.0127909 -1.0077326 -6.4855146 0.5931955 10.3277740 -2.1274946 13.5920782 -16.3585148 2.2325997 -16.5211048 -10.5072126 7.3396192 -3.7763331 -11.5945034 3.0446923 -1.9178931 -14.4328766 2.2457304 6.7064643 -8.1716890 8.0659781 -35.0034866 -10.4753714 -1.6343353 8.8793097 -8.4257889 9.1782942 -3.2492642 -41.6961594 -2.5648093 -26.8118954 -21.4661827 2.5332406 3.2734759 -1.7847055 4.6882534 -29.4751282 -9.1436729 -4.7031054 2.1538486 -5.6160026 -2.1662321 -4.2939005 15.0248938 -13.5662651 7.7702918 5.2846098 3.7824297 -1.7221771 6.9883852 -11.4263306 -4.3412089 -0.1050152 0.9000125 9.7033720 0.2925666 14.0075903 5.8386707 14.8806639 14.3058453 0.8465160 -2.5344462 -3.6946943 11.9334145 0.2365627 4.8248410 -15.7450113 26.3675060 -0.4722548 -13.6919909 -18.7207642 3.9190407 -9.3871565 0.0223278 -4.4933643 -30.7994766 -5.8115420 -6.3932648 0.8277091 0.0225529 -1.2325436 -6.8489509 -7.8070388 -20.8022594 20.8286705 -8.9530182 9.9369173 -2.2376390 -1.4315653 2.1335003 -3.6339693 -8.6948290 -3.5742021 -6.6869664 7.9314318 8.7091846 3.0934219 -4.9001527 3.7380984 -4.9082484 11.4609022 -4.2386370 -22.7415714 -2.0098853 1.2855603 7.2586837 19.8087864 2.2117205 -0.5793313 -3.9907594 -1.6016437 -0.8172064 8.1594458 -15.4086161 -0.6627748 -1.4894165 1.5906954 1.9788475 -7.9575901 -1.5366663 -8.6242743 -0.3614557 -3.7309077 1.0789077 -4.5439267 -2.2472548 -10.9308186 59.6785660 -0.1760416 -7.4573841 -3.6622679 1.5120335 5.2931600 2.8293211 23.2303982 -4.9741211 4.3552527 3.3739431 -5.0668626 -2.8538966 0.3268299 -3.9772940 4.7330217 8.7520905 -0.9926345 3.8616073 5.1516662 2.0282643 3.0426204 -3.9115717 -0.5858514 -1.5999694 4.5225415 -12.7125473 5.1818223 7.3161077 -7.5720811 0.4502659 -4.4505029 6.4918680 -0.5506454 -4.0285926 -2.4298544 -23.7352905 -13.2134733 -6.9437003 -3.0950217 -30.6214809 -28.5156403 -73.9083099 6.4615626 4.7377605 -10.9628363 -2.1221092 -8.9017925 0.2492556 -3.1971858 11.2944899 -2.7079339 1.0420365 1.4305084 4.1198936 4.5300274 -12.7977018 4.1489062 4.2624974 5.1754990 -8.4821386 1.3528922 -7.6606312 6.1484709 6.3502727 -0.0916979 -0.4864352 -1.4354204 -14.8522530 -4.8238955 -11.3843241 -9.9373856 -23.1052780 -3.7848172 3.8521349 -2.8217375 -14.6164131 -5.3167348 -15.6475983 28.9659538 0.2007803 -8.5573721 6.2128897 -13.4620886 2.5454731 0.3461828 -7.3380833 9.9795408 -12.1699018 -3.6108272 -11.8179665 -1.6553133 -2.6975822 4.4087977 -4.0126643 2.8097203 -11.9797268 -4.7493081 1.3758557 1.9919140 -6.0696654 -6.4785891 -5.2033682 -12.1069756 -6.3167343 -5.4447875 2.1201560 4.0690632 0.5611621 1.1040857 -59.8837357 -0.3577107 -0.0020121 -8.5385838 -8.0391083 -7.2587762 -2.4526162 -9.8044586 -0.3745660 -15.3638144 -11.3051777 -18.5351524 -3.5731049 -1.9609778 -24.1159859 -5.5002718 -3.3873336 -8.0064516 30.8933334 -27.4486446 -52.1981277 -5.6758318 -20.0478439 12.7293119 5.1659799 -12.2385406 -32.6630249 -5.0108004 -34.1987839 -4.9278455 7.6995535 -0.0220027 -5.9251733 4.1276617 -3.4395580 0.2664561 -8.1446209 3.8270788 -1.7735320 -16.9523563 -24.9931297 -2.5194449 1.7392719 -5.8733420 -22.7001743 5.2092934 1.1173050 -8.2867231 -7.8803191 -5.4723434 -9.9072380 0.4808203 -3.1662016 15.4444027 -36.9293251 -28.5419693 -12.0073500 2.9193456 -11.4829168 -19.2362728 4.7508349 -12.3169851 3.2709031 -24.1469059 -8.3495827 -11.1488075 -2.3665285 0.2045310 -10.7137375 8.5528164 -14.2354240 2.5073612 -3.1442685 11.0512543 8.1613646 4.6294560 7.0456586 13.8288040 16.1332169 0.0047817 7.3776889 2.7525342 7.8480954 -0.6052098 -3.6842501 3.1929393 -16.4331207 -10.1631088 -2.0016983 -11.4166212 0.2759570 -15.3295736 -0.0050200 -2.2531874 -28.7025032 -6.8003421 -11.7610226 -8.1560993 0.0678259 -27.2687454 14.7918854 -29.2287388 6.3191171 -5.8366427 -20.2231998 7.1851554 1.6146921 -3.2556009 -7.8680463 -1.3576701 -7.3685369 4.3791170 -5.7138634 4.7717552 -0.4738614 -15.1856709 -5.0411167 6.6562166 31.7110081 3.4465375 -4.9167399 -15.1853237 7.2575049 -9.8100481 2.3514113 -3.0994112 4.2459960 -4.4133501 -4.4208589 -2.6936128 -4.4519501 -17.1693535 -14.1707287 -13.5290413 0.6212156 -17.0904999 -2.0648110 -4.5174422 3.2487032 7.9046483 -4.5254412 -4.1100798 -12.3926363 -0.5364013 -8.4291878 -13.7480593 57.4971962 -19.3147240 -11.9878616 8.9727249 9.6004171 32.7971878 -15.6700153 -3.4520214 -10.8826742 -20.4408188 -44.5070076 -6.3134918 15.8493061 -4.6959653 -10.3017721 -0.4026102 -1.2671347 -20.1682129 -4.1442823 4.9451108 -4.5686312 0.6373243 -42.6064568 -5.8273191 -0.4737103 29.4340725 -10.4341984 6.6232343 1.6895316 -18.0474567 -8.3500652 -18.7326508 -8.1387997 -1.9034026 -5.5088916 9.1513586 -43.3254356 -42.2250862 -17.7056885 -2.4082816 -2.6984859 -38.9165993 -0.8880321 -13.1499920 9.9683638 -31.6551361 -7.8615470 -11.6631145 -6.1333046 -2.9316831 4.2566028 5.0643892 -15.3843651 2.4602821 2.0014987 15.9953346 -1.3950193 10.8531542 11.6969852 20.9854965 33.8460312 2.9707286 -1.7330546 0.6437884 12.4596996 -0.4006854 -3.3129103 -1.3509246 -0.6479945 -11.2949562 -17.9370937 -21.5278397 -2.5713716 -15.1140289 6.2960324 -5.0423045 -36.5871315 -8.0194674 -23.9058781 -1.0896617 0.9286672 -23.7064381 18.4218521 -30.3156109 9.9197350 2.0318213 -24.1774216 16.2469463 4.7565455 -6.6077390 -10.0458279 -3.2495375 -9.8409700 3.6306753 -9.3594265 9.1194229 -5.1410537 -20.3028793 -6.4773793 7.1388226 3.6248043 13.6276598 -9.6887617 -35.2996140 9.0686007 -11.6750727 4.8457718 4.8950925 6.8376374 -15.5683641 -4.1739235 -4.2892542 -5.7665448 -7.1809044 -22.2607632 -20.5732365 0.4823436 -15.4037371 -2.1511955 -19.7237282 -3.4650137 2.5162296 -1.7738271 -5.6853828 -14.5154915 -2.7590976 -8.7284937 -17.0659504 90.8234711 2.1456048 -12.7438602 -15.2569141 11.6653967 15.5822458 -12.6902790 9.4585123 -12.4268274 6.8881140 -28.1724186 -10.0316935 0.2699594 -8.4347067 -10.8537178 4.4707670 -3.9241705 -17.0987225 0.9010700 7.9158893 -6.9451375 -4.4743199 -43.0916176 -6.8551121 -1.0673546 21.4861679 -9.0383158 10.1984062 -0.0980784 -33.3101234 -13.1402960 -22.4394512 -8.7888269 -3.5405374 -7.2776837 -11.8903055 -4.7616439 -29.0749779 -9.3430939 -14.6673403 3.7361083 -10.2199783 -1.7496698 0.2942495 -21.5629692 -21.4350719 1.3972169 5.0466447 -9.1890278 -12.0596209 17.3901253 -20.5244865 -6.5022345 2.7181842 8.6504297 8.2249985 -0.1442347 13.3402634 7.1253514 11.9099083 -7.0905223 2.3991590 -2.9491072 -1.9800757 5.0416865 -0.8734527 -3.9075325 -7.1991968 18.7404060 -2.5249009 -24.9360180 -20.0330143 1.0792097 -17.6296120 -10.4124985 -4.4822598 -14.0186853 -3.1734982 -14.1938515 -1.2120274 -5.4783778 7.3849478 0.8432140 4.6318569 3.8692784 16.0371571 -10.4998226 16.6385498 -16.9200420 0.0308279 25.8528595 -8.4977636 -17.9558849 4.3834834 -10.1717081 8.7890959 -6.4090986 11.2274523 -10.3593769 -0.8352119 -3.0944459 -2.1264081 -5.8044205 -14.7383728 2.0789762 0.7394002 2.0173845 20.2968349 4.5863304 1.1220210 -12.2974243 -5.0318031 -5.8158741 -4.0044465 -20.4251213 -5.6223392 -4.8311033 11.3359270 5.3836403 -10.0470381 -6.6574507 2.4097133 0.1550920 -4.8313608 -4.2113471 -5.3034682 -5.8012300 -16.5749245 57.1074104 7.9605060 -4.2221060 -6.6869617 -1.8472024 6.2100663 -3.0473468 20.9343872 -2.0551479 -8.2758923 -6.8037081 -3.4315121 0.0786033 -8.5254250 4.1534591 7.4955950 -6.3803916 -4.8031654 0.6246275 10.7458763 3.3102520 -13.7300215 1.8279343 0.7222243 -0.1439760 0.9335247 -1.7722338 10.4458494 -6.6065702 2.5622027 -1.3249007 5.3303738 10.0918026 -0.2072136 -5.9829230 -5.5014009 3.5011895 -16.3494949 1.1468166 -3.4997959 -35.1052475 -32.2224426 -8.5782013 -18.7471485 6.9173026 -12.9016771 1.4583226 -4.6347823 -1.3357552 -7.3928771 12.4852266 -2.5824611 1.6743741 -1.7123017 2.8729200 -1.1316170 -32.8791885 7.2147093 5.3011136 3.8403623 -26.6744747 1.8306594 -8.7781315 -1.1373672 6.2134433 -0.7804123 0.3327763 -11.0212107 -15.2445507 -3.0129893 5.6688962 -10.1010361 -22.4078045 -3.1244156 3.9755421 -2.8073323 -13.7458744 -3.6591046 -14.9803829 34.7766037 -0.1009730 -4.3761430 3.5584602 -12.0045748 -1.1930196 1.7113391 -4.8428574 8.0820141 -12.5131531 -6.2188010 -4.8286281 -0.9557083 -0.7356855 2.9652798 -4.5764365 3.0626299 -13.8161058 -3.6228347 1.1853391 -1.2850424 -1.2732149 -4.1886606 -5.7592516 -10.4005508 -0.7399217 -3.4227538 1.5465415 4.5604062 -3.5740101 -2.7351620 -70.1195679 -0.2410674 -17.0578289 3.0382264 -8.2524996 -5.9486432 -2.2558377 -7.4830780 0.9297391 -15.8107662 -11.0205374 -23.6829967 -10.8012724 -2.3740695 -17.5447121 -11.4535799 -2.7106791 -7.6259317 25.8380527 -24.1519680 -41.8073921 -8.4366150 -23.8498707 5.8139119 12.9959860 17.9740429 -6.6055951 -20.4345016 -73.9835892 -4.8804846 12.2474833 2.8361766 -8.3269577 3.8578568 -8.8495121 0.8894960 -2.2225940 4.3050280 -1.4787462 -17.9380436 -30.4625683 -5.3724999 -0.2709025 -7.3300018 -17.8391266 5.9700661 -2.6361737 -19.2834606 -9.5872421 -1.3030608 -11.7911167 0.8245789 -1.3853042 -2.8106747 -5.7041597 -16.0563145 0.4800909 -6.3364353 -12.7894878 -49.9141121 1.7129703 -24.7739601 4.2417345 -18.4895077 1.6583842 2.6594567 -5.6092806 3.8871768 2.4257658 -1.9837979 2.5807736 -3.0508127 4.4224062 1.6293706 2.0512400 -6.6382027 3.8126323 8.2662697 38.6273460 2.2448869 -7.2879300 13.7155027 6.7474532 -0.6561958 1.0457463 -34.3575516 -2.6951482 0.0579633 -32.5509377 -10.4693165 -24.8411007 -2.1286702 2.3782396 0.2280978 -11.7173891 -5.6063128 -11.3909454 -3.4597421 -0.1455634 -2.7238910 3.9732668 -12.2954063 0.6440322 2.1154239 -4.1276350 13.0958700 -8.0185909 4.0772710 -28.4900513 -4.0847650 -3.7143278 -0.1724140 -3.6012936 3.4982293 -2.0094099 -0.8833923 0.5742486 0.1510812 17.6641636 -8.7392988 -4.4467487 -14.0591669 25.8221607 -2.2800143 0.6320492 9.7727613 4.7474422 -6.5440192 27.0327168 -1.2129345 -11.6115494 -25.4886189 -10.1374893 -11.5793819 -3.0500007 -2.4438307 3.1381972 -12.6103134 -5.4001822 -5.3959837 3.3486326 -1.7877506 -18.9458160 -3.3992240 -0.1974697 -5.9494224 33.4811096 -12.4278545 -15.4342146 -11.7223434 -3.8136005 -2.1766241 10.3035393 7.3458557 5.6441197 -21.4970512 6.9881611 -4.3499002 -6.4633465 4.4441452 -5.6553540 4.0684319 -15.6255369 0.1294236 -4.0980339 3.3253098 -0.6188824 -11.4121389 7.8312125 2.5193255 0.0271249 -7.0406547 -18.2496414 4.2666268 -4.1179338 -15.7046680 0.7598581 -1.0544527 -11.3635807 2.8012793 -1.3932648 1.2989931 -16.2830791 -11.3807764 -2.3329039 -3.5977309 1.5264931 6.4852166 7.4166760 -0.8235925 3.4147668 -11.2196255 -2.3405764 -1.0346801 0.1218031 5.1287689 8.6611605 -0.4777459 4.9434414 2.0089829 4.9139218 5.2645001 0.0446163 -2.4196813 -13.9749584 5.7174096 11.4678965 -0.3629616 -20.7337551 8.9042873 6.3924723 1.0728986 -2.4972668 0.9441779 11.7249632 1.9925821 -16.5043869 -13.2398729 7.5746722 7.8403649 3.7533205 -2.0095594 -8.5387344 1.1150744 -7.2003365 1.5313252 -5.9522429 -3.1502581 4.8968925 -6.1654072 -2.9851608 -2.3949833 -8.6643400 11.6837730 -11.5599003 0.7816480 -7.4337492 -3.0194438 -1.8795257 4.9748397 -3.2511818 3.8066916 10.8518009 -9.3113842 -4.6412144 3.6539776 -0.9726918 -4.7778826 -15.2169914 -1.8877307 4.0465627 0.7957736 3.4353163 -10.0260124 5.3022079 -0.5079429 6.2801971 -2.3193169 -6.2520733 24.9328117 -9.0916653 4.1024699 -2.6701865 -0.0462918 3.4769907 -15.8704557 -1.2611336 1.1079971 27.8603134 -0.9393364 -30.3115387 -2.1545773 -1.3821206 -3.5789866 32.1053963 4.6452289 -3.4747248 2.8026836 13.8625393 -1.6988592 12.0771866 4.5931377 -7.6411567 -8.9323301 9.6317482 -7.5786767 -17.0456905 4.9074831 2.7446446 4.9229980 -21.9126434 3.6451991 -4.7445860 4.6047554 1.2864591 -1.2659433 -17.9332542 4.4731059 3.2615404 0.4502629 -2.8253255 6.4237099 0.2882391 -2.8695731 -2.7009737 -3.8855779 -20.3477268 -4.2395840 -7.1745372 6.4992380 -8.0047522 -10.9526644 4.2282200 -13.2853317 0.8928115 -0.3083803 1.0605142 -0.7260108 -3.5804458 -27.6076374 -9.3614388 -6.0938511 -5.8774805 8.8884907 0.5127000 12.4137087 13.2997723 -6.9211607 21.7588825 18.6043282 -0.5455933 7.3501801 -4.3835049 10.2228098 -30.6904469 11.4483147 -4.9879808 2.9501493 13.2245693 -6.7133322 -7.7038560 0.7439497 5.9012756 -0.6960260 10.0331917 -2.3401508 4.4508386 -3.1031122 5.2797952 -6.6145697 -2.4253011 1.6651064 -17.2118149 0.0942493 18.0449791 -2.2013552 4.2397361 -9.0638494 -9.3456373 -3.1834800 0.0749637 -0.2493083 -1.5664387 -4.0563936 2.3707745 -7.6604519 18.6890278 -6.1865950 -3.2758517 3.2963908 -4.3885694 -1.2729867 -4.0246692 6.1264496 1.2545762 0.0442096 -5.0798144 -10.4323149 -0.2239759 2.3364151 -4.7259250 2.3519688 12.8640375 -1.6998489 -5.0370502 3.0408483 -4.1483712 -1.0733259 -11.8177052 -0.4834734 -7.8687644 -22.6314335 2.9680321 -2.2214880 -6.7970252 -8.9757280 5.5854974 -4.3694730 -2.0340779 -19.2120514 -9.9427261 -4.0333390 35.7575378 3.5507963 -0.6906830 -4.5590544 4.9079585 16.8813038 -1.2888647 1.0616839 -3.8512833 -0.2310810 0.6646080 -9.4690723 -5.9445810 19.3908691 -29.9647579 5.4135380 3.8826315 -8.3652124 -3.8568647 1.6086199 2.6338289 -11.3372011 -2.4064445 2.9717035 -7.1910219 -12.0930939 9.2787123 4.5180345 -8.3647089 0.1220392 -7.8264489 -10.9892788 0.1869008 -13.9968138 -5.0854297 -38.2834358 33.3102455 10.4380827 -6.5738268 -19.4449539 -12.7706432 39.6475182 0.1386867 34.3363380 -38.0669441 10.9664726 15.3119459 -32.2088928 -2.4935744 -10.4503069 -41.2179909 -1.8857286 -2.8418009 -33.7632484 -25.1326065 21.8806496 -26.0955219 7.5872130 -69.1778564 84.9811630 35.7988052 6.0767255 2.1384094 -33.9954681 -17.2724915 -6.7820172 -8.0012417 16.0184803 17.2307682 -13.4975233 22.0268154 -6.7047415 -51.2815208 23.2672596 -64.0117569 -10.5016556 -148.5399933 13.2730370 4.9548526 7.9691525 -6.1019740 17.5806370 92.0078278 -71.7463913 33.4957085 16.7634411 -2.4450648 36.4738426 44.3122902 -12.6107960 5.2810435 -63.9936409 -48.5586395 -22.5668774 -46.2438545 4.6456079 -3.0439878 9.2654247 4.0286913 -4.4121351 78.6725616 2.5122607 27.3006039 -14.5525370 23.9665699 -3.5608644 -67.2957153 1.8136507 -58.9943581 0.9924991 11.3357763 -16.8148117 -30.8817902 24.1498547 -4.7510986 4.2087698 10.9014502 20.3111649 -7.0550179 19.1285152 5.6381545 -5.2498531 -1.5337849 -176.4096680 11.6512136 -3.8008440 -3.9593620 21.2195320 295.5421143 15.6592827 26.3392429 0.3337957 -2.9665668 29.8767662 23.5853958 -26.5531082 15.2104120 5.8038521 -20.7718048 5.7969360 47.2841225 -6.5760317 11.6977205 -27.4733391 -27.9106312 23.6327724 5.3692379 -31.5244541 -47.8581390 14.8215265 5.9804311 -13.8115730 -7.1175694 -9.9911308 8.8027229 -12.5514050 18.0941277 5.0474334 -12.8704786 12.3711519 -12.6624222 5.2268143 -7.0738463 45.7744141 -4.6002717 16.3228931 -10.1702404 -5.0292020 -20.0502338 37.7987823 0.1818764 42.7431679 -29.2917595 -0.2400663 1.1593390 -48.6739197 16.9415874 -8.7374964 -23.9672489 1.6416849 -4.2073526 -14.3189573 21.0241432 10.2516537 -28.4178734 4.2385440 34.6959076 38.9433060 18.7776985 1.5007920 -0.8510134 -27.7751579 -11.8427105 -10.3745441 -9.5910044 13.0738049 11.4105434 -5.7775178 12.9671907 -9.3278809 323.2008667 12.8589602 35.6036415 -2.4245596 -9.3940144 8.6331911 1.7635094 36.9959412 -6.2272787 6.0375509 82.9110489 -18.1996326 34.5712318 8.4194269 1.9179982 39.2890244 32.2377052 -18.2176704 -0.7484243 14.0019999 -39.4205933 -34.1138954 18.7667675 3.2738538 -4.0709352 5.7681170 -1.5727258 -8.4472332 72.3351212 12.1481953 21.0293388 12.4928780 22.3972073 -0.2455491 54.7582436 4.2574887 -11.3092966 -4.4602628 9.4038353 -20.2028160 -23.0025215 23.0784454 -24.7505417 5.9869933 -10.2409983 61.2927666 -7.2849603 29.2753124 2.8663850 -10.0450668 218.6518250 -13.0628424 14.0040007 -1.1254339 -4.4805179 17.3860359 7.8653593 14.5243950 28.4279060 -3.4575036 -4.3582206 27.3170815 21.9718075 -24.7745972 14.0293846 -1.2304870 -36.2012291 5.0305800 44.6710396 -32.3811302 10.9827232 -45.4291687 16.6474400 15.6335430 8.4993925 -15.7687025 -15.2652664 15.5638523 1.9874961 -10.8186321 9.3290462 -11.2111206 13.2269363 -16.5840530 -16.7140179 3.0489142 -21.6229534 3.6807072 -114.8222198 2.3641429 -9.5027113 0.8853963 74.1149750 30.8119297 -14.5213747 48.7252350 -30.4495544 32.7592850 -20.0913258 -99.4021835 40.0865822 -4.2923408 -5.3799367 -5.4378419 -5.7062435 -34.8134995 11.3665447 15.6958380 -4.1054025 -12.9082098 -0.1617694 15.9706516 222.7427979 -104.8368454 -4.3897877 1.7060765 26.4531250 -3.1616285 -2.5772669 3.6811793 -15.4972963 -15.4477329 -9.6104193 7.4143906 5.4178610 -19.4830742 0.5680999 -27.8967323 -26.4477291 7.9954343 -5.3354082 -4.8723593 -5.3351297 1.2681395 -39.2599106 125.2304840 -2.2471304 -35.8696136 50.5005684 -19.4513302 16.8685265 4.7314734 17.2620487 -126.6430206 21.7667809 -7.8519325 -4.8257713 -7.3048272 -1.5728906 -66.4249420 12.9013281 -0.5172949 -12.6199226 -8.1424036 -4.9286828 -17.7390499 9.5440540 29.2562733 23.3566418 16.5762959 32.0991402 -4.2025032 -81.7889557 8.6065207 11.6647100 -48.5227737 8.7738562 -6.4768949 -42.8063850 40.1500816 -14.4972324 2.9337623 -13.5564013 59.4399910 1.0831345 29.0267677 10.0871773 -2.7120938 13.9226589 -7.8844156 8.0997086 -1.9970502 22.9555130 15.9574347 98.9725266 -20.0378113 28.2190495 -15.1853590 8.9041214 40.6979027 34.0322342 0.5005791 17.7469330 -1.4486134 -87.3623962 8.3677645 44.8021584 -1.9116448 1.8266236 -4.3171520 -7.7614918 6.5771489 12.9732523 8.0185328 6.7784176 18.9708157 8.1109285 -12.8330669 6.3845716 -11.2607889 10.6682129 -13.9684982 -20.6188927 15.7551537 -10.5128002 -8.5018196 3.1479509 -3.0011766 -15.4302549 13.0418873 -63.9903145 3.2983556 0.9316877 -15.9634428 -25.0022888 59.7969742 -43.9691505 -54.6446114 6.1209865 -12.3766909 3.9516618 13.0903530 38.1270142 -43.8406029 -24.9577751 -1.9998277 -7.0920181 -2.0756774 -3.0356314 -12.8347158 -28.0686283 -3.1866553 2.8622806 -17.7346706 20.9854622 1.0544660 5.2816763 -59.4266090 -5.4904237 5.6327214 3.4350998 21.2481403 -12.5780592 -39.5600624 -13.6674109 28.3892899 -9.1649771 17.3182545 -7.4128437 -0.4341737 15.1095734 8.0011158 -22.7771378 -31.9381638 2.0383275 1.7292418 6.5189018 -25.0329533 9.7344255 21.7028313 -8.4856501 -9.1481686 22.9547405 -99.5182190 35.8464584 -40.4049873 -28.3012257 -12.8975086 -4.3089519 3.0254743 -8.3586426 -7.1626129 5.3893766 4.6653905 18.3773880 17.0927811 1.0902654 0.2349428 -105.3776855 7.8969197 0.4676852 -2.2714720 4.6000490 -4.5509343 -8.6320305 -9.7093420 20.5165691 -27.1889801 5.9105334 16.0030727 11.4241590 12.3509893 -3.7793217 -155.7919312 -92.7350311 -15.9975958 -11.2743301 0.2510412 11.1533899 -7.3544531 -20.3477230 9.1974459 32.3838425 -31.8056011 -12.4521990 -2.1792810 -7.4094844 10.4822874 -81.0410233 -267.3204346 -116.6632309 62.4506760 28.1051903 -77.3336563 -24.8536663 -48.8523216 -10.6441517 4.1771250 -14.2682304 25.3124180 -27.7531319 -0.1960314 -18.6503716 -16.0406895 -8.6916895 -34.9386635 6.2733617 -58.2713470 0.5176886 -4.2014360 -10.9746408 -4.5088782 -39.9804573 0.7667883 31.9453850 9.1787138 7.6470866 -32.5009003 -61.1598511 5.8056517 37.1211395 8.2032738 41.4554329 20.6532555 7.2228537 -105.1570969 9.8022461 19.6413212 -9.2577305 -5.0992250 -40.7317505 8.6760054 4.8191299 -10.7751446 0.2296153 5.8257890 8.3476229 -1.6001545 -83.0443954 7.7877049 15.6776876 27.2308216 -62.9686928 7.8795314 56.6619797 -10.8152418 0.2790252 -5.3153353 7.8610268 9.4359655 -0.5686997 -6.1292381 -93.7975311 1.2856337 -32.8013916 -15.0262756 7.8709645 7.2878389 12.0591068 18.2769527 23.2598362 -93.9929123 2.7371676 18.8919983 35.0301704 9.0195723 32.6455956 -2.6357768 10.0947018 2.5733657 42.4895248 60.4648743 -32.4528313 8.8274050 8.8635368 -2.8164260 4.7957950 4.2993393 13.1786785 19.5798779 5.1781960 2.2924178 15.9952393 -25.1500816 10.5269346 11.3271780 -51.8324966 -3.1225183 0.0499676 -1.2907215 -7.9991241 2.8486996 32.8387184 -4.5878572 7.5917053 -12.0625849 8.1635733 5.1573162 9.6467361 21.2998505 2.4654808 10.3946648 28.9050922 -30.6698914 -37.5653839 -0.5583532 114.5564957 12.5384912 14.2793789 10.1595354 45.5221481 25.5256271 72.4069748 9.3725672 11.5090446 55.6967697 -29.6921730 -78.5375366 -11.7016478 -2.7501502 34.0650482 0.6522822 16.6453438 32.1497421 3.6476955 16.6332378 11.6168995 -7.9975295 16.5106945 9.2186327 9.8048792 21.0811176 31.5340576 50.7656097 -14.0871706 35.1610031 43.8555298 16.3536758 -44.6313667 5.5247974 54.4918556 10.3384876 1.4930344 1.8449929 -2.0983825 -34.1694145 -2.4881604 6.8087559 -8.9607544 -0.4718490 -23.0587425 3.9858863 -49.9020500 -31.9957924 5.9341483 6.2884207 -10.9977770 4.0955172 4.7423034 -11.4309635 -9.6723833 -26.9311123 9.9213495 0.5016741 17.4888382 2.8785539 36.6764755 -0.5907627 11.1366596 6.2877965 -17.8091125 3.7152524 -26.8547592 7.5824795 8.3870764 6.0818419 7.5002184 0.7235165 10.8029165 -3.6548104 -15.9771032 -1.0085516 -89.7578125 2.6745405 1.8245770 -4.1266851 4.7676835 2.1933596 -22.8839855 -155.4418945 0.7774320 8.2083101 16.6474476 -10.3740549 23.2384090 18.4468307 4.6577811 5.4212942 -9.7527428 2.9422512 -12.6380272 -14.4497051 -9.4238882 -1.3143158 1.3607521 0.6837834 12.5495777 5.9205427 0.1601630 -3.8383367 7.9984775 -93.2426529 8.9934959 -6.3340969 -44.3058624 5.0794792 -0.0081636 6.2129951 6.9115515 -0.7978799 -20.1061134 -1.6424038 5.8757224 -18.8297062 1.7455554 4.7016010 3.2336988 2.3320191 7.0277147 -5.6023846 12.6592960 -15.7462463 -85.1328354 -1.2225906 -16.1881351 -7.7884684 3.0680728 -5.0965271 70.8418732 9.2636490 -123.2950439 -3.1869128 -17.2998981 10.9989986 -33.4600563 -2.5699146 8.7318239 -15.9935112 -0.2119560 -4.8993249 54.5587349 -1.3655356 -3.6895533 12.0859652 -2.0150931 -2.3398154 -3.6786098 2.1465480 7.8924637 -4.3951387 -3.1371439 -5.2273269 2.2995915 8.2893286 -4.5351291 2.3960290 5.3232179 4.6702275 2.7594998 9.1246643 -0.0300820 -0.8269614 1.9155107 -12.7490282 3.6325631 4.0772481 -4.4914832 1.4611362 11.0592632 4.9840488 6.1901507 -33.7321625 5.5726547 1.6747432 -8.8857565 2.2232883 -5.0185332 -5.9074020 -10.8434267 -5.9111056 -4.4854178 2.0925705 1.5339396 2.8097386 -36.4040108 -0.0430061 4.6351485 3.4783943 13.1092920 -0.1165453 0.6304774 -1.0032132 0.0445764 3.0729949 -0.5119505 0.7113582 2.7246816 -4.1219192 -11.5161400 7.0870934 -28.1441689 -9.3704739 2.7727137 -0.7274240 -0.7351887 -3.7755792 6.0200791 -65.8318558 -0.2913984 5.2300448 8.5973444 -4.2715955 13.6748199 2.9186435 0.2810794 -0.0382639 15.7102537 0.2126668 -6.7539763 -3.8003323 -3.8752289 -0.2885161 0.7377138 0.0136031 13.1981478 1.4062048 -3.7769113 0.6165277 63.9905205 -28.9452209 8.1541662 -3.7462676 -26.9060879 2.0483897 2.0760307 -1.6730335 -2.0823140 -3.3726935 10.4212599 0.5445722 0.8025604 -12.7659054 3.1714909 -1.6830776 2.4834688 0.2048591 0.1900765 10.0486469 14.1696787 5.5305891 -43.1584053 -1.1633421 10.9866352 2.2987337 -0.2028276 -3.2799778 34.3998604 16.2683849 -18.3335705 13.6884298 18.4699631 79.4920349 -30.4566936 1.5413983 8.1240568 10.2612801 28.5102158 -2.4751852 22.3684273 -4.3559389 -1.0792304 1.1076077 -0.3236394 -15.4347878 -2.8248613 -1.8494471 4.0206971 9.5428333 -4.8119283 -3.6106548 -1.5155559 28.0075626 8.4153471 -1.9834890 -4.0380206 0.8907322 -1.4426712 -6.6410918 7.8655429 -4.5893359 0.0134167 -0.8959290 -67.2607651 4.8970876 2.0946271 0.0309039 -1.5573810 -11.9318981 -5.3897266 -6.7743425 -6.1224298 -1.3198781 -1.1553721 -10.2216463 -21.8813114 6.4752069 5.3988299 1.6663450 -1.2572070 -32.1116257 -0.5291093 -16.9763699 1.6962947 -6.3720384 -0.0405084 0.7437638 3.8025372 -0.1344487 -2.4812174 -29.0464706 4.6653819 -1.1067431 1.2744286 4.5760231 -7.5000787 5.5316572 -9.3634377 -6.2153049 -1.1789552 -0.5025470 -8.9716587 -6.9957776 -5.6928287 -0.5151709 -2.9456770 -11.8919926 0.9394296 -5.6466231 2.8816116 -26.1439571 23.5700684 -2.4999516 -0.2813654 -28.5066166 -4.9350815 -17.3269215 -14.7741356 -2.6420059 -1.8560361 -1.9800706 -1.9745497 -1.9282212 -3.1074128 0.2961924 -2.2556088 0.8545153 0.0180784 2.6379848 -8.1976299 -5.8662748 13.5089941 -22.2934208 -3.6121447 0.8894984 24.4980812 -2.7034564 -9.4022417 0.2716219 -9.0460415 3.9671149 -9.5230684 -18.8871574 -5.7725477 -4.3581533 -11.4694748 3.0630763 -6.1591263 5.7565594 2.5533650 1.0458579 7.3588090 3.0789587 0.5837457 -1.7060792 -2.3532009 2.2347405 1.2502444 -4.3983617 4.3779616 -74.3191376 3.3116524 -85.2908401 -9.9735165 -2.3325336 0.0693435 -7.5326476 11.4223948 -53.7785492 6.7744546 -1.0863550 0.3703360 -0.6240242 -5.0017023 0.8874342 -9.4595699 -2.5158672 11.5234261 -3.9396465 0.1268164 -0.2108436 -1.3474083 -0.6140375 -21.9503536 -2.0212584 -16.1352596 -2.5483756 -7.5735765 -0.4253332 3.1809759 -2.4731970 -7.5733190 7.0599537 -5.7262416 3.7201312 -1.2398401 3.4789107 -0.6946096 0.7831615 3.5484407 -5.8056402 2.3796659 -1.4482158 12.9930315 2.2767506 6.3658538 -2.4749072 1.9770039 7.7869368 3.0313344 3.7339683 3.9177127 3.5296433 2.9132757 6.5223308 -5.9133286 1.3226976 -2.2272329 3.2282441 -0.6415305 0.3366868 2.8187723 -3.6936402 3.0125849 -18.9779415 -1.8037028 -1.1144168 -1.6022788 -0.6544490 1.2448560 2.0039728 1.7850426 -2.1894825 -0.1537921 15.9829330 -0.2488560 3.8345461 -11.8640890 12.1433420 5.5460811 2.9546928 0.8553848 3.6509891 4.6124487 -9.2733583 5.6292086 8.7135048 8.4550505 2.4472842 2.6661103 -0.5277188 1.1340253 6.7323270 3.6971166 -0.9545467 2.1945972 -3.2457185 4.4509249 9.1484938 -0.7194127 5.0484977 3.8761933 3.1929872 -63.9970207 -3.2432246 1.2110385 1.7031949 4.8529177 1.6822275 1.9613889 5.5332608 0.0380093 -8.1965742 5.3184390 -0.3114704 4.0411954 4.5202627 -4.2051215 -0.1181554 -8.8692970 -1.0753978 4.8472204 0.2088218 3.1093683 -1.4418123 -0.9655813 -5.0861278 0.4214109 21.3950405 3.9412441 6.2972245 -4.6175237 -3.2678416 -0.6360323 8.8703327 -17.3321362 26.8590317 10.3846884 3.6256077 -1.1951963 -1.3360389 9.6820097 -0.1475689 -0.6572056 4.7565460 -33.5686569 -7.7481585 0.5083894 -1.3851275 10.5005522 0.8034799 15.9904594 -0.2039361 -11.8095493 3.5427835 -2.5657532 -0.2076825 -1.8162730 4.3848062 27.0854435 2.2082922 4.6943378 -3.4250276 15.7766571 -3.3268077 22.5537243 6.2068591 -1.6396477 -9.4676676 -3.6396286 0.9331568 2.9025397 -1.4363421 -7.8112726 -0.9641528 -4.9278560 -16.3182907 -1.0900607 2.8468819 -9.7226362 -3.6464171 2.4758401 -7.5130134 -5.7366476 -1.3102349 -1.0935047 -7.1678090 -0.9447272 -1.1877240 -2.1308782 -0.4468261 -3.4566071 9.8873386 8.6717501 -0.6189458 -1.5562871 -4.0079174 -0.9398564 0.2255063 -5.3280807 -1.9266430 2.1521986 -7.9753242 -1.2824498 -3.2869864 13.2609873 -16.6304817 2.7066138 0.9246549 -3.7022729 11.2952404 -4.8892384 -21.1439362 -8.5135984 0.8409289 -1.1792706 -0.1600842 -3.0860388 -1.0918471 -0.6017911 4.4587717 1.3137689 1.5981693 18.6850719 0.6846847 -6.4048886 -6.2962866 5.6705241 0.1586164 0.3310485 2.2973292 -10.0852385 -2.7350559 -10.4651718 1.5126641 4.7369895 6.3822308 -0.2762310 -3.6378233 -1.2337379 -11.6620760 -0.7879437 -2.1121802 3.7801225 13.0476713 0.7064751 -0.1865464 -0.0099251 -9.5003958 -5.7990847 -2.8509808 7.0726762 2.1231771 5.0924625 -3.4574313 9.0320492 1.7901144 -6.7606649 14.1487131 -3.3567348 3.4262090 18.5096550 -27.3245602 -5.0040030 40.3774567 8.9631996 -1.0416433 -4.0248208 -1.6542320 -18.5522137 -3.1759114 1.6403857 -6.2599330 -19.6631126 22.1772289 0.7438778 -0.9155737 6.7924733 -4.4049020 -6.9346671 4.7220249 -20.2945271 -4.0685306 -2.2102277 -1.9919970 2.8317878 -14.2909279 -8.1526270 -8.2424965 -14.1308374 -18.7303181 6.8092237 -28.3294888 0.3034634 -58.3791695 -0.8316773 -9.2019920 -13.0973597 8.1685829 0.4782243 -31.9915981 -16.7925491 -2.8796256 2.7203767 -3.0218687 -11.9758606 -0.5619598 -15.0333128 -3.6825402 -0.8657532 4.8096004 -36.9976768 0.1534626 5.2037086 -10.0558176 -0.3600302 -2.4014740 -6.2965255 -12.3305664 7.0934038 -6.0294390 15.5047112 -9.4458485 -53.4900894 4.3848162 -5.2629037 -3.3525841 3.4245565 -9.1484528 -0.0792098 15.1225882 0.7718805 0.3400449 32.7160721 -4.0805931 22.3918858 12.3809080 -5.1597543 15.0725927 -10.0200529 21.0304203 18.5751839 -18.2095470 -10.8741865 -5.5579286 -1.2172856 -3.4323127 -5.1924291 4.3588386 1.3913929 -6.1166215 43.9088364 -22.7510548 4.6603971 -11.6232080 -41.8678360 2.9517705 -4.6576219 1.5192509 -7.4440088 10.4271431 12.5449667 -2.1093926 -4.2736011 -36.5647240 -0.4062136 -5.9590445 -7.4067230 2.7789803 0.1614269 2.0405529 -7.8519006 -19.3498154 -52.4562035 0.6398951 -49.1013527 6.9559736 0.8146523 -4.7012129 106.7031479 -27.0135746 -21.3338127 4.5976076 -39.8264275 46.9615746 -24.8070641 -25.1604691 -6.2815413 0.2647619 32.0028267 5.6700888 3.4828432 29.1474514 6.1477828 -2.4650269 -9.7208462 2.1009922 19.7593784 2.7196364 -15.9279623 -29.9045639 8.0169230 10.2894545 -2.7515445 3.7858601 -22.2905655 4.5784621 6.2580066 -13.5824623 -5.7009797 -4.1319270 -0.6577131 0.2736955 -7.7648287 15.3687420 15.4547291 -6.7978568 -0.0787400 -15.9914112 -20.2788219 -11.8158894 -61.3060112 -16.1191597 15.0650253 -1.4771085 -18.0713978 -0.9258528 18.4785309 -44.2439461 20.7171726 13.8208580 -7.1357031 5.4330163 -5.8491197 3.1919703 -4.0154881 3.2538493 9.3672905 15.9984951 -12.3849525 -0.2239718 -0.9225425 -9.7657309 1.8117474 3.2065182 -4.3321929 15.4965954 -1.4199966 -7.9968362 -15.5495014 -3.9334404 16.7929955 -15.3961515 -16.1458073 -2.7094128 0.2162692 0.6638911 -3.4944396 -63.2319412 1.9743197 13.0360546 52.0557175 -28.1943054 13.0403566 9.8015480 1.6701399 6.5266795 -0.1442406 51.5510292 25.3419971 -5.3014526 13.1041384 6.9490767 1.3464239 -2.2241032 -0.6390073 5.0388570 -2.5975535 -6.9187140 19.8557854 39.4317665 8.8703918 -8.6198568 0.3538547 -8.5234089 -4.7666039 4.2220607 -57.3509903 -4.4257498 -8.7036085 -2.5316095 6.8776894 -8.0031881 3.4414356 -4.1941590 -17.1293240 3.1199355 -0.2753378 -0.6134290 4.2055445 -20.7705822 3.6823924 -0.5384752 -51.4400253 -7.8601232 2.1353226 -0.9052879 75.2762222 -36.2880249 -16.5714569 -11.0769749 -33.3843346 -0.9308351 -13.5215998 5.6205349 -33.2720833 -16.0089684 -28.0570583 9.1979847 15.2672415 -0.6343628 9.6224108 0.0264633 -15.6188803 -8.0920811 17.4565067 -4.2283468 -9.5319128 -37.9275322 2.1865976 8.7504606 -2.6535585 -0.2255161 -9.3718195 0.2378669 15.8050652 0.4905172 -9.1972713 -7.8821206 -4.7281761 -7.3797269 4.3468175 -59.2657890 8.8649101 1.5126469 -1.5422024 4.9248657 -7.5303459 -11.8563032 4.8285418 -8.9090834 -10.1907005 -1.2712182 13.1218100 -0.4665295 -4.3299184 31.5778351 -16.9407787 -17.7945309 0.8609895 3.0612321 -1.4644617 -4.8778691 -29.6371002 -5.9549603 -20.5388203 -23.0738583 -30.0857143 1.7274525 -3.0947227 -9.6194630 -1.4785243 -10.3875761 -1.6245010 -9.3512564 -6.0624089 -15.3714275 -10.2101288 -6.4421711 -17.6171932 15.7442369 14.0231781 0.7554923 -13.2989645 -41.3113976 2.7604365 -19.0903988 -3.3141513 -15.3986540 -11.9808502 5.5935731 5.6236672 1.4015580 -7.7776494 30.8568535 -43.3797607 -18.5575962 -39.9761162 6.2088971 -9.5637455 0.0576927 -1.7707182 0.6620690 -12.1703987 -12.2392645 3.7988975 2.3295126 31.9930706 12.4405594 -12.4160242 6.9301157 -15.1097345 8.1784878 2.7761652 12.3397150 -18.8682594 0.9667392 7.1479025 0.9877799 -7.2394576 -8.4129677 -0.9049397 2.0991049 18.0543919 -35.1543808 -5.5462437 6.3943667 6.2951832 -0.7175381 32.5119324 -1.0620575 3.6664336 18.2363911 8.3251104 -1.1861241 37.8371315 -3.1642783 34.2327843 -0.9419311 -15.9952726 -13.6625299 -16.6375542 84.6437454 18.7133217 -7.1678429 -19.7457867 1.6215496 15.8619022 8.2697353 -29.5885830 -2.2003591 21.4205608 -1.1706852 -10.2061596 0.2670328 23.2415390 17.8206425 -9.1699142 1.9675006 -1.0102760 -1.1639936 -19.0350609 -9.6716194 13.6198339 -5.4702711 0.9732963 11.5914364 -10.3232889 8.9492559 -1.8579133 -2.5380394 -3.3200440 -1.0219955 -8.6188126 -15.9965487 13.0084658 39.1178131 -26.5133934 38.4706841 29.5348415 4.0665717 12.7866211 6.2773719 9.5940399 -11.7692108 15.9968338 20.9276333 8.9545536 0.5079902 -11.1366138 1.2355074 -15.5650444 6.3111768 13.5298157 30.2982140 4.0142055 4.8277760 7.5234890 -3.7661150 -1.5430764 -0.3655710 6.3063879 -2.1283917 9.0518932 -13.6577530 7.1113362 3.5644937 13.4340973 16.7164803 -5.6904221 1.9352167 12.0233898 8.3096561 32.4101295 -45.1165848 8.0402794 10.5386858 2.8109303 10.6028929 -1.4321963 -6.4431467 27.4627266 30.9354153 11.9820185 -2.6730847 5.4481478 -16.1534195 5.4930248 -2.6115408 1.3113434 4.1214066 -2.8472064 5.0622039 6.5151181 3.0561926 12.5313911 -23.1955261 9.4779549 3.1643674 28.4704628 10.1086435 11.5088625 11.5114326 5.8027420 5.7878160 18.9489384 -5.8166337 -7.9936042 -30.6919651 -4.0743437 13.8347282 -18.6573162 2.0470500 7.8633986 1.8289958 -11.2273169 6.5700555 21.1196671 -1.9535707 74.3032990 6.8543229 27.2784214 4.1096630 40.5724831 -10.2403812 7.9351363 18.3898315 -0.2315407 16.6899891 40.5132599 1.4019310 30.3258667 3.6239059 8.5035706 -1.5475163 -26.8617401 -0.2475505 -0.5936621 10.1777048 -22.5665741 21.7468243 6.9573112 -1.7223383 9.5768042 34.1837502 -4.6037812 -1.7163727 -8.5749836 0.1165289 47.4934769 1.0454468 8.2407932 6.3780150 0.7146343 4.4054604 4.9578438 0.4495068 0.3349918 3.2727201 2.7282686 -2.3792262 5.4604268 2.0733254 -24.1819096 -18.4035187 -6.5655794 -7.9981747 -13.0352173 -0.2869520 -3.7032456 2.8133914 3.1661079 10.9543762 -14.5722685 -11.1967630 -18.3164158 -3.4574888 7.7418275 -1.1264536 -8.9434299 -4.7199302 -7.1868491 -29.7195969 -6.4436846 -10.3011465 3.0083168 6.4436817 4.3808036 4.2391772 -9.8039112 4.8860011 -16.2205391 14.9929609 -4.6295867 -2.0245564 16.8025799 -37.2412643 3.7501719 -0.3755983 -7.7637410 4.5371633 -25.4472980 1.9771818 -4.7057228 -10.1842537 5.6554651 -16.9000587 1.0733131 17.1561890 -26.8937035 -23.0383625 5.0340500 3.0222473 -3.5791619 8.6170282 -3.9718792 4.4617500 -4.3753142 -2.2398927 4.1233306 -47.0426979 -5.9055166 -6.4517274 15.9932041 2.0212514 -4.7283111 -15.9967299 5.0687289 0.0181882 -4.6579299 -15.9418297 0.8645717 -4.8930516 -23.8429337 3.6678183 9.6768646 33.9903030 1.2669989 -6.1166000 12.5013371 2.9961019 -10.7672367 0.9168772 -4.3261704 -18.9901295 3.0195510 1.0593230 26.7615089 -12.8140202 -24.8729668 -9.2814760 24.5237694 10.9748240 -123.5264053 -12.6953545 -2.1115725 -19.2379341 -1.2194433 -0.7833672 -19.7045841 -13.8295746 -29.3075848 0.1272233 19.4326134 1.2753800 5.7636971 -16.6078472 11.9353237 -13.5241680 -0.7336839 2.5379913 -0.1528775 -20.4009533 -0.3996590 5.3744555 9.9805040 -4.3916874 -25.8118095 0.8213554 2.9481075 1.6581161 3.0237200 -0.3374029 -1.1717037 -0.0688500 24.7042542 40.8940086 1.7179780 86.4774933 19.7722149 1.5378743 -69.4364548 -47.7764053 0.5965561 -25.4188423 -39.2312088 12.6663027 16.2659645 -56.2193108 30.7884235 13.4635363 -45.8763275 0.9622344 -31.3230286 -25.1133461 4.5288692 36.9842453 -9.2791624 -11.2574472 -18.0643024 5.9257159 0.6092275 4.7753153 8.7712650 -4.6987138 -20.3572826 2.1486695 -22.9426594 -24.1674442 -3.7063725 18.8299313 5.4538932 -8.2676153 -63.9909096 -24.0539265 -4.9128008 13.7923794 -15.7063923 -11.9564056 -9.5220375 20.5731907 -3.8559566 18.0229111 52.7297058 -27.7619610 32.9033356 19.2228661 50.5124969 16.0411263 -21.3166866 0.5724698 -63.6491280 -9.8780012 -10.3303432 -19.9180412 -2.7647371 -16.5415592 -25.0770531 39.1752090 7.5049920 -27.0014744 6.1543503 -8.9232216 6.5557842 -6.9708056 -15.7309618 -12.8238611 -9.3803015 3.2527716 -16.1177425 -71.2852020 4.6685753 9.5812101 -16.0474033 -52.5826454 50.9766998 -42.4967842 -26.4187927 -30.1392975 -12.1526976 6.4225802 -7.3391404 9.1734591 -29.8840084 1.9556426 -310.7977295 16.2738075 12.9184942 8.1433620 5.2048073 -84.0046844 -99.2642899 -65.8330688 18.0548134 -187.9736938 -3.1130245 -58.2781868 -18.6174297 -40.4464226 -85.0300140 34.1818199 -34.1140022 -0.7004832 23.5646076 -11.9493437 -25.7487564 -20.9604549 28.8368168 -7.9578581 12.9843769 -34.4594498 -58.9904938 24.7006931 1.3568033 -103.9923630 -24.7571144 -1.6386807 19.6607380 -6.3476663 -4.5000725 27.2049904 -29.9158497 -21.9911919 1.8397804 -5.9920273 0.9254017 4.0317492 3.2137046 5.3408546 -7.8264074 -4.0616956 -0.8960807 26.0048523 -0.0626238 2.4197805 0.6190226 -0.4511645 2.0668628 2.0791516 10.4220753 -4.7100062 -1.0881115 0.7247831 1.2798942 3.5275156 -68.8153687 -0.2607109 -7.3774443 1.9461819 16.6172085 -1.7441700 -1.1692019 -1.5075349 -0.1579155 0.6055775 0.5747105 -5.4691191 -4.0512853 -0.2476970 -2.8694594 1.6254407 -7.0360603 -6.1690989 1.2225132 1.7714131 -2.4292953 0.0236954 -1.1716597 108.2289276 -1.5387746 0.1072242 -0.0179917 5.1686430 3.3360908 0.2338260 -2.3402479 0.3999053 1.8121313 -0.3513364 -0.4155231 7.6201644 8.4238491 3.7123947 0.5093215 0.1183416 -2.0264440 -4.3252430 -0.2124708 2.1619678 5.9264288 -2.0070763 -1.8897592 6.4530573 -7.4231482 -2.5193138 5.1453071 -0.9020284 -1.1152221 1.9832602 -3.4135952 0.2245276 1.5660584 4.1705217 1.9018501 -3.3966637 3.8004394 -1.7000414 -5.0517502 2.0977316 -3.9097028 0.8935000 8.9641237 -1.3637358 1.8774769 2.5468709 1.3587445 -0.1068434 -6.6694174 -3.1809711 1.3760805 3.5837622 0.8851815 1.9099644 -17.4790115 0.9821779 9.7467203 1.6132396 -6.4537406 1.2516890 0.5109922 -4.4241180 2.5046587 0.1864599 6.4497147 -2.3711412 6.5959597 -1.3949587 5.6306734 0.5978056 -4.2156410 0.8243757 -1.9970199 1.6903790 1.5097393 0.0347573 2.9165833 1.5358988 0.0318158 -0.6438633 2.9630668 -3.1127441 7.8620043 -1.5705967 -13.5973577 2.1045496 13.7799625 5.7171412 -31.9014053 -2.2880530 56.4073486 4.9379125 -13.2371616 59.8490334 0.5008997 -21.1048717 8.8052826 28.9229832 16.1864777 -9.0709295 -8.7908268 5.9865975 5.5345006 25.1918411 -24.6281853 -9.7253313 -5.5000815 -0.0273640 -26.4542046 -9.7503405 -4.4985561 61.0502434 12.1412687 -1.7346525 -7.4858651 -32.7600708 -15.0627832 4.6163168 -7.5766630 -6.2296348 1.1272782 -14.1768990 0.6753536 -17.4438496 -5.2365370 2.3592312 -7.1433458 22.9597549 -1.8497027 -9.0218678 15.9311724 3.8586926 8.0148106 2.3714511 -3.1322033 -4.9437270 -8.4861498 -2.2440205 10.6309834 -3.1810935 -1.8748915 -0.5750474 3.0050170 -1.6910243 10.1669912 -3.8329995 2.1429694 3.6148374 -3.7150278 -6.2331500 -6.6614270 -0.0415624 14.9909525 -2.5985653 -5.3434539 3.2472842 3.6326158 -8.7037458 -9.3224325 -2.6071429 58.0496483 -24.0671329 12.2335930 -4.4697247 4.4315190 -1.2115866 5.6238370 -5.5000176 14.5431423 9.1035089 19.7913322 3.8637590 2.0694077 8.2097464 -1.5881379 6.4539366 10.4743633 -18.7389412 -18.8344479 2.5741138 5.0490656 19.5304718 -12.7511578 -15.6466532 34.7775269 16.5603275 11.4659853 0.1046497 44.5523872 -54.5312347 5.9298382 -3.4687886 27.0769730 -3.3603578 31.8716698 0.7895461 9.9094610 1.3997114 -11.2918186 12.7290182 6.4891419 -0.2522370 -7.0891438 3.3280890 11.4265118 -3.8936520 -4.8547211 0.2970934 -0.6375829 -1.0630336 4.5033607 5.9072757 15.4929132 9.2433462 17.1848049 -1.0345091 1.0180216 5.1096206 -3.3345869 1.7212784 -6.8456192 -12.2462082 -3.8034184 -8.7787867 -106.9885254 0.5553972 18.9772816 2.7947679 19.6944828 11.6513863 15.8645487 33.4636116 -2.3019381 3.8172352 2.8971045 12.1927929 -2.4745984 6.7865081 -26.8256760 -8.3269281 -31.8012619 -5.9457407 17.1628723 0.5407429 6.6256118 4.3564095 -1.6850914 -1.2627634 4.2283654 -0.7096567 0.8380420 -8.5176630 10.3883600 6.3864737 -2.2136445 -0.2390481 -31.9830627 30.6624851 39.4148102 54.4051170 30.6493626 17.2901516 -4.9782863 8.3669071 -9.5172482 -4.9304695 -4.9482141 21.2469368 15.6590118 -6.9487576 12.0075598 1.7587354 3.7090724 1.6079733 -24.7788296 -2.6307216 4.6133513 6.2885380 8.7178011 24.6869869 -0.4817662 -11.6007071 -22.5214729 -13.1568384 -15.6382093 4.3191891 -5.7188468 2.8863964 14.4793682 0.2567104 -7.4462042 -4.8418732 -3.4523880 7.7486358 6.5341043 0.4565201 -1.9131629 -81.8365936 3.6501615 5.4532857 84.9481735 -16.8957520 1.7272019 -3.3065202 9.0022583 2.3280330 0.7405916 6.4941869 -48.4858665 31.5093803 0.0068575 9.4227324 0.4509494 -0.2132679 3.8194063 8.7984524 7.9514046 -74.0226746 18.9357357 23.0656948 -44.6144485 7.2078681 -12.7389708 -3.5747728 4.1370630 -2.6181788 -19.9243298 15.2535906 7.2577829 -0.5862479 -2.9829316 -0.0592953 -13.1329479 -7.6950154 23.7510471 5.4416723 -0.3925303 9.4500914 0.7445332 15.1131001 -9.1416636 -12.7511997 7.2842712 20.7523537 -80.4542770 18.4941807 -45.9251404 116.9571762 -32.1464958 -0.8641604 -12.8444662 -4.7119389 -1.3203235 17.9331284 -46.1362114 14.8531904 -18.8144073 -2.7117381 -22.6225643 -0.8083366 -27.7511253 -4.0976419 -3.9140575 1.9663209 41.8677940 -6.7082634 10.4687996 -4.3715057 -3.1295743 3.7632415 -2.5393379 14.1759167 -37.2539444 -4.5631738 -5.1050487 -7.0718908 -3.9319139 7.3196163 -10.3899202 1.7180712 -7.8185682 5.7203169 7.0915151 -9.3596458 -0.5485910 0.8238714 4.4112139 -15.9303541 -11.4249773 -6.5207448 -11.5531855 -19.4933243 -17.5401974 5.7154980 4.9254861 2.6755714 -2.5708294 -7.8939648 4.1997504 -2.2369061 -14.7244663 -30.9054527 -4.4246936 1.2731870 3.9978554 -52.2842216 -5.2787795 31.9849739 -4.3261461 -4.9787250 -5.6106477 -31.6880550 -4.2188430 -24.2451401 16.3746510 -5.2328424 -8.0009031 -9.7540426 6.1772313 -2.7946558 14.2385817 -7.4018044 -1.2076923 1.1628543 23.3229961 6.8502102 -41.3671913 -0.0733866 -15.9992533 17.0537415 -4.8369193 3.0448642 -11.6572361 16.6492958 -97.9976730 -32.1997299 -11.2091188 -40.0400085 9.1660509 0.6896104 -13.7628307 -26.5510712 -125.1165466 -0.4473409 6.1751881 -5.2104492 -2.0776277 -16.9142780 11.1108532 -15.9970741 8.6525002 -2.6168110 -6.6978273 -3.2866862 7.4710689 -10.3243189 -1.4485430 15.9955511 15.8115606 -2.3364589 1.9095044 22.5219879 5.3378367 -4.1689348 -9.6580944 4.0827227 1.3421310 13.8319349 2.7323148 1.5181724 2.5747533 2.8875177 0.1583833 0.6325322 5.0365744 6.2306767 0.3249487 -0.8144635 -0.6445175 0.0190234 -1.6232423 3.7876246 -4.9770589 -1.2081062 -4.9007907 2.3167031 -4.3839889 -0.0233044 -26.2584209 0.5329314 -0.5934265 0.4285873 21.3333035 -0.3048610 3.7610507 -0.9640492 -2.7935867 -1.0993198 -2.8244596 0.7464288 -0.4097338 0.7697341 3.2671452 0.6594983 -4.8994498 -1.6949173 2.1801898 1.7424940 -0.9240068 0.0178936 3.6854656 0.3988779 -0.9756293 -1.4679251 -1.5722336 -3.4210401 0.9798124 0.0742934 -0.5132578 1.8557459 1.7608364 0.6229076 3.9680393 3.9298589 1.5489192 0.6488802 -0.0247429 0.4927798 -4.6948767 2.7467756 -1.7414306 0.9420717 11.5201397 -49.3219337 -0.7544838 1.1175504 3.6197226 0.4286320 0.8076802 1.3579780 -2.8528886 -0.3853200 -0.7650869 0.7671875 -1.1959974 -4.5893822 0.9921989 0.2347273 0.9523411 -0.9993488 -1.9334111 0.1747036 -1.9243881 3.0117877 -5.6060491 -0.3702994 -4.9845853 2.7069168 -1.7010022 0.6165986 3.4747741 -26.6835670 11.1154270 2.4196329 3.4570832 46.6374855 1.7820542 1.1723696 -0.1341865 3.6816223 -1.3769227 0.1213755 -3.4373963 -0.5859472 0.5103055 -2.0729809 -0.5308576 -1.7948812 1.1032864 -0.3950274 4.5932784 -0.8890067 -0.2534416 2.5597305 -0.6782944 -1.0245789 -0.2812330 -0.1255890 -1.6021808 -0.9544231 -0.0036741 0.5058004 1.4061495 -0.5255617 3.8699214 -7.8460793 -12.2699556 -11.8731604 2.6520751 6.3131261 -5.9870520 -21.7497959 -9.9060001 -3.3392041 -0.3129763 7.7844119 -6.3459082 -10.6614304 -18.0170364 -10.4286366 2.6312799 -0.9994221 0.6947568 -4.0024686 -1.1429197 -0.3653780 -1.2120446 -2.3288081 1.0240457 -3.7566581 -7.5649242 -4.2627726 -1.7697045 -13.0899668 -0.5779724 1.5778338 -0.8017446 -3.1884527 -24.3415089 -4.6657948 -66.7648087 -16.0117340 3.2745683 -14.6504955 -6.2639313 -1.6071131 -11.4520731 -13.3032856 -4.8505096 5.2060933 1.5247432 -1.2960110 4.2025118 -5.7334089 -11.1715107 -23.4501457 0.2284199 2.8005052 -16.6638966 -7.7042947 -15.4173985 -0.2907802 -1.2980214 0.7789732 0.8548920 -4.4757390 -14.4956217 -11.6672106 -6.4983654 -5.3330669 -5.1255698 -15.3727694 -6.9334164 17.9755611 5.0008483 -14.8797112 1.8230641 -2.7157290 -7.1910152 -2.4742620 -3.2310934 2.3561928 3.5598428 2.0217578 -0.7073030 -75.8317642 -1.5664995 -7.0199537 -3.5673571 -33.9369049 -26.1154022 6.4784665 0.4958181 0.9089075 -15.7613344 1.2373129 -0.0367525 1.7809709 -24.6760941 -13.2716331 -17.9990616 -19.4335575 -8.9243870 3.9394996 6.9369974 -1.2342539 -23.9675045 1.6245561 -27.0305290 -2.8200955 -4.0085030 -10.7702074 2.8793218 -6.4958849 4.2404523 -6.5858383 -10.3790932 -9.6131716 -4.4425135 4.9696198 -33.7122536 -6.8135185 -1.2886237 2.3557451 -3.9085634 -10.5489826 -15.5552959 -1.0690438 -9.3663321 -18.6920586 -21.1216507 -5.9457369 4.3951426 -12.0058432 -1.3219230 -1.9766150 -1.2824763 3.2210164 -4.8971291 -32.2023811 -14.1362228 -5.0278997 4.8604255 2.2849789 -17.5264874 -1.3983009 -15.3568649 -15.8661776 6.6114106 17.0196018 -6.3759556 -1.2758636 -4.2844715 1.6978989 -1.6633502 -2.0767596 2.3495436 0.2638280 2.4242723 -4.1890235 8.6061535 -12.0840158 -0.7288254 2.4309161 -2.1707900 -0.7974313 -45.0714149 -6.8762493 -54.7911530 4.6617184 -18.8696384 -29.1058407 -2.0060937 -1.6238077 -9.1646461 -12.8074284 7.4174132 1.1447059 0.9961873 4.9030614 5.9715881 -2.1086779 4.1701875 -52.3307266 -1.7326658 -5.7550945 20.9089737 -6.7116456 -11.9380360 -1.8744441 -1.4323194 -1.5837431 1.1984563 -3.2806926 -0.3943543 -14.4792833 -8.7038832 -0.0556648 46.7626953 11.3746634 7.6229768 3.2708685 23.5168972 -0.1631670 2.6297679 -6.5191622 -7.4498110 -10.4949369 -22.6370773 1.9886812 0.4447014 -24.5616112 2.8339803 -33.7287064 0.1955335 -0.9322458 -2.2771740 1.4256909 27.8712769 -38.5937691 -4.2479911 -0.1335265 -10.5999022 3.0853722 1.7330916 -3.3095856 1.4385489 -5.3807034 16.7111244 -9.3084526 -5.5909214 42.2686920 6.3175421 1.9691603 -18.6528740 11.6896982 -4.0968657 -3.9147666 3.2261727 -8.6326828 0.7358332 -6.5004096 3.5547786 -27.1409855 -12.5401306 -8.8434877 -5.4606156 3.0719221 -57.9731255 -8.0470457 -3.4038885 20.7037907 -6.2109160 -10.3524485 -13.5438213 -3.0783377 -8.2640295 -82.7276001 -0.2673295 -9.5907488 -20.5531330 -4.5357294 27.4121017 -8.0252686 -2.3363538 -41.6426582 -57.9385300 32.0562401 -15.7935667 -13.6951418 -0.1410139 12.2135916 10.8206625 6.8401012 -8.1439829 -2.6471548 15.9972286 -8.8724394 -0.5495708 -0.6579401 -14.9744186 -5.1237969 -21.7515392 -5.9687209 -8.1397858 -7.5127101 13.0164423 -0.6066089 -7.3173680 -2.9039955 -0.0585984 5.9013491 1.7660885 -0.9965363 -32.5497704 2.6366558 22.9825687 0.9425026 -132.3583679 7.0325689 -9.6601639 -3.9564359 -4.9326901 4.3315501 -2.2287350 14.0669146 0.0283335 10.0606556 16.2015553 -4.0059528 6.2656822 23.4979305 -4.6912789 9.2143755 24.5885181 -15.2971067 31.4032669 -14.8128090 -9.7497940 -16.7402630 -6.2906742 6.2914014 4.1295137 26.4915733 4.2756662 6.2307520 -29.3021812 18.8449192 -5.3301716 -16.1247940 -62.5052414 -1.4758891 -1.0111659 9.2915325 1.5508665 -12.3714876 -2.0669665 -9.1902122 -0.5950682 -0.8458120 -2.6555212 -5.9868574 -7.1231780 11.6747770 0.9210697 -22.1707859 -35.7858849 -12.9250937 -84.0232925 1.5368338 3.1825030 -11.8540287 -30.3848801 0.7048782 29.9560184 -48.0205116 -12.8518763 -15.1924953 0.1456844 8.3670654 -54.2158508 10.2456388 46.8697205 22.6631451 -64.5758057 -3.2368989 5.0047684 -3.6263103 8.3092356 -2.4916286 0.4204683 10.1236067 15.4241543 0.3808985 -12.4389219 -0.5293629 13.9153099 2.9648032 1.9209940 -26.0487309 -0.2664392 -0.5725388 -10.2589493 21.8501225 -14.6765175 9.2565165 -10.0447388 6.8881607 -1.5150374 -0.8358025 4.2751360 0.0955781 0.2688256 -6.9024987 -4.3281918 1.3606532 -9.3985586 1.2728699 1.3701112 1.8099450 0.3381524 1.2084036 -6.5703826 1.6863835 -1.1286987 -1.2363015 0.2108380 0.8681998 -1.2063249 1.1697503 6.1094465 0.5343422 0.0356958 -0.7752127 -1.5334709 0.0136831 0.8319910 -3.0447574 0.5533847 0.0621754 0.2718365 0.5482363 -2.5053072 -0.1054532 -6.3999190 1.5875893 -1.8948193 2.1777122 -2.0808189 0.0061302 -0.8849338 0.0302308 0.9680480 36.9608231 0.9891402 2.1516721 4.8601127 1.5230204 0.7335474 1.3423790 1.0976948 2.8274624 -2.4596696 -1.9354508 -7.1874046 0.5588089 0.1294969 -2.6881840 -0.6014509 0.5428354 0.2978837 1.4410225 0.6291496 1.1994995 3.1327214 -3.9472833 -0.5077792 0.8398616 -0.8327599 -0.6250955 -0.0957720 0.6105168 -5.7860785 -0.1573506 1.1523901 -1.5469494 2.2588902 9.3410397 0.9061344 -0.5140528 0.1613791 1.6033787 -0.2539327 0.0071516 -0.0185696 -1.1012180 0.5040563 0.0558158 -0.2370064 -1.3015419 -3.1369424 0.9542687 -0.0199393 -3.0982063 1.2891383 -0.7714967 0.1446871 2.8120000 -4.9223022 5.9604726 3.5129080 -2.9835789 -7.3042207 -1.5217868 0.5910335 0.2595489 0.7082073 -0.4382457 2.1799171 0.8713034 3.2099822 0.7331121 -4.5135236 2.1159408 8.6106186 -0.6790519 -0.1647956 -2.0704219 -1.6217345 0.5298142 -6.0647669 2.9825063 -4.3892784 -0.1583104 0.2479508 0.3732106 -15.1179237 -1.3858653 -8.7360125 -14.0819960 -3.5851421 -8.8398390 4.9714866 -31.7335491 -14.2253866 -56.0512199 -111.1588669 8.6254606 -38.0160561 28.1261139 32.1402855 -7.3314734 7.1905813 -3.2964594 -0.4138062 15.5126247 16.2145767 80.0547180 -10.6230354 29.9366150 -10.6695671 40.3350563 -52.9311676 13.4126062 -36.0014420 24.1144218 20.2671051 -8.2507677 11.6875372 -3.9990900 -40.2859154 4.7178564 13.7455025 10.6802874 -5.6115465 9.9583426 -37.3685722 23.9486599 -15.8344250 -3.4797430 -17.2803192 -1.9972062 -1.3063953 23.8885136 98.5433884 9.6206589 57.0814476 -33.0227089 -7.2341561 34.4821281 9.3735647 3.0184865 -6.8549595 14.8221836 1.5635983 0.3575850 -2.0152719 85.2811432 2.9803851 -4.1352129 -2.1136153 -24.4976044 2.9076934 6.4118276 27.9376278 -6.2207613 -1.9416783 4.4393339 6.9436617 -12.6459370 30.8230476 17.2621040 -0.2919197 -4.1948328 -2.2380216 -10.9585714 -18.5941486 -2.5801466 20.6835251 28.4716835 13.9077168 15.9458055 -3.4869857 -19.6218472 -54.8639221 -12.4038849 -34.3351898 -32.8543510 -9.3481884 -5.2043056 136.8379974 -17.6279259 -27.3369293 -10.1835480 -30.1182880 63.9957008 -8.4842329 -0.6342039 -20.9567642 -42.3827362 -70.0961456 10.3403587 24.6296349 -15.1944590 -9.7617645 5.8220634 -31.9950123 -23.5187569 17.5949631 7.2579274 -4.4847898 -9.7288370 -53.5254211 -19.2133694 34.9491844 4.4279375 -28.9894009 -2.8476756 -247.5657654 11.5774412 32.2722969 -41.0274048 -36.0234413 -3.2603960 -14.8500433 -11.9918766 -11.3502188 -14.3361950 -2.9570727 -7.9903259 0.2455615 -33.5383415 10.3022718 16.8633690 -8.2635307 3.1659808 0.3239659 23.6768608 72.1713028 -8.1895161 2.8934042 -33.7344551 -0.9891804 16.8631992 14.6534595 89.2806244 -16.5189629 29.7548542 -11.9433384 38.1550369 61.5668869 10.5651503 -44.1812477 31.8151150 26.5548191 -16.5579739 8.6535406 -3.1679375 9.5828276 2.2710989 50.7356796 0.4515933 -28.5366573 -11.7741375 -4.9213786 22.3859901 -23.2743835 3.1652033 -14.8851137 -8.6311817 -8.0334044 24.6778049 114.4385834 9.0287848 43.4273834 -64.0721436 -9.0411158 36.5892334 17.7188110 1.2187082 3.4479923 5.6896038 -2.1281393 -0.7921746 -8.1606598 -146.7206726 2.5019510 -12.3219652 -7.3974915 14.9391336 51.6115952 -1.8351294 28.7618904 -7.5604548 -4.2927742 4.5277233 4.2343197 -16.5300579 42.3970299 16.7034626 -3.0459514 -6.6111541 19.5599861 -14.2363195 8.9421577 -5.3076200 13.9692116 19.0206299 12.1513033 10.5845404 -3.6674640 -1.6700507 3.2465856 -12.2094145 -84.3629456 -11.5524693 -6.3665237 -6.9106340 128.6483765 -14.4382801 -3.7051690 -11.9034052 2.9431171 64.5251236 -12.0554829 -2.4778035 -20.4793186 -12.0784197 -12.6156368 9.7461023 22.3135338 197.4274902 -10.1377230 4.8596735 22.6337204 -41.6751518 14.5158691 2.4287634 2.3056293 -10.9177837 19.7696609 -19.3627987 13.1241627 32.2080383 -22.2367191 -6.7413917 290.2756653 7.4492879 29.2237358 -26.5930710 57.9194756 -5.6541057 -0.2613771 -33.0536461 -14.4909744 -23.3860569 -11.8898973 -6.3143053 83.2992630 -55.8187103 3.6467037 -8.6503334 -1.3689389 0.7248722 -0.0936649 24.9107685 -109.7520676 1.4537796 1.9057283 -24.8522549 6.7483840 20.1749783 23.4178658 79.1970749 -13.1081161 25.6215916 -10.7116413 34.1849709 19.3912277 4.8731585 -19.5028725 90.7996063 37.9850807 -1.4948337 7.3027062 4.2997484 17.7752781 4.9514456 29.4449921 -5.9396057 -14.9861908 -20.2555981 2.0201907 21.1541500 2.2963066 -23.5980911 -18.2123146 14.6196232 8.3240108 -12.7460651 -76.9693146 5.9434829 40.6532974 -9.2561378 -18.5083351 39.5327568 12.5095339 35.4003754 -2.4175656 11.1518126 1.1611296 4.6253743 -15.2647314 24.0739441 -0.1382690 -22.2744389 -5.3931551 13.4408922 31.5419235 14.0905313 26.8732433 5.1182032 2.3887837 8.6878614 -3.3074379 -34.1843414 20.6373997 16.2193718 -15.5658340 -5.6438341 23.1511135 -7.6157813 -0.5882994 -15.2491322 13.0543451 13.8517962 12.5611477 1.9870336 -3.8131292 -3.8767333 2.4885607 -7.4212270 -14.9673452 12.0631609 -4.2250085 0.5306789 144.9941559 -4.7163930 -3.3058202 -14.1039209 3.2757895 46.6431007 -5.8687077 -8.4672594 -55.8921204 -2.1223948 5.7256751 1.4596149 44.6819267 -27.3690224 3.1641705 6.7314959 19.5471077 -10.2735014 0.5896850 -11.9903822 15.4162054 -15.7209721 34.3896179 -28.0720596 12.8401117 -102.4417496 5.0504560 -17.6915150 -114.7574768 -174.7566833 56.9844208 4.8706174 8.6673927 -15.7093925 -5.6446047 4.0279245 -23.4763203 -1.8908269 -40.3182106 -10.5588293 -55.1726646 -14.3007498 -393.5909119 -19.5078564 -1.1419301 51.6339455 11.6395359 42.1691322 -70.4839630 17.1540604 2.4426193 7.3912997 14.7161121 11.0151339 1.4582640 40.1939125 -22.5154533 -48.0878296 -12.8142948 15.9989567 -15.4980450 -3.4306855 -25.1991768 -3.9719970 10.8703899 3.6753755 9.2222681 -29.4512615 35.2995834 -0.2211912 -111.3641815 8.8920860 4.3930998 14.2637997 -31.1878681 -0.8481898 9.6433706 -26.8788967 -10.3622522 -36.2887230 0.6432440 -3.1213160 31.9297066 -7.9989848 15.4739599 0.8237741 -5.9503355 -6.6197019 -8.0426283 -140.7321014 11.8282108 11.9126978 2.3466089 1.6702919 7.8327117 3.4777367 3.2281101 -8.4691296 2.2804143 -4.6656485 -49.3411942 3.5925844 5.0452452 -0.1449146 -69.5502396 2.1128337 9.4275141 21.0971680 -5.7676020 27.9209976 16.5759869 5.1252203 -15.9969063 -15.6307192 -33.8037605 -20.9750156 -18.8985291 7.5263758 -1.5155851 -1.9362831 -39.3469200 9.0384617 -1.5444298 3.7720244 -31.9932632 -14.8546877 1.8814398 0.4899975 2.3010564 3.5684967 -18.0330505 2.0002003 -5.0322304 12.5918112 -6.3926888 15.1322250 -51.5882568 -96.8268356 16.2790737 -14.4046068 8.7199049 -20.3533134 11.3610630 -16.4021454 10.9303398 11.6355257 -19.8839855 1.1805265 5.7004237 2.3377528 29.7156410 -31.5357342 13.5353670 6.8860154 -40.6403923 -9.4422932 26.6799526 21.1908550 -31.8033638 -2.0014873 17.3349419 8.6707888 13.1491623 -43.0702858 -24.1357861 -3.2173080 2.9799473 0.1730748 10.4136648 4.7719374 13.7354059 -15.9992361 -0.7135646 -3.2713418 8.9384260 28.6015739 -75.7216721 -6.4821868 52.8740959 3.5827806 11.0150299 -19.0736313 -3.8250885 35.0011177 38.0581207 10.4559746 -0.9950290 31.9982014 -44.6589851 5.6777258 -5.2174530 29.5979500 10.6375999 1.8225169 10.3582926 -5.4079728 11.7343950 18.3151340 -56.6859894 -31.9840221 1.5409247 11.8477907 24.3831139 19.6439342 3.6185033 4.4037967 -3.7197442 10.7203579 4.0830932 16.4876060 20.5076580 25.2806435 -8.9959335 6.4385719 -0.1343810 10.9357185 -2.2582617 -4.9809093 -51.5480309 29.8450279 26.1416874 8.6161165 7.8876505 3.8751817 -8.4322176 12.0204649 4.5540395 -1.4858479 31.9939480 -2.1207178 9.0533285 5.4862843 -25.1625137 12.6298838 15.4229221 6.6528568 -66.3411179 7.2300138 -1.2722716 12.8257904 37.9929276 1.6444966 -5.0002756 11.8108864 6.8370380 2.5012562 6.4521785 2.7291689 15.9009933 5.3846040 3.5806224 2.3353205 -1.2108414 3.4440436 12.8434668 5.8449764 1.8037560 21.0123425 0.5895710 5.5828886 5.4193568 -2.5110390 18.7783966 -16.7528439 -15.8961687 2.2724469 3.9387755 -20.4860477 15.4693480 -67.0222397 11.0817394 5.5090451 9.6421471 6.9129953 -2.5610957 -4.7578001 63.9029160 12.4018393 -73.6861343 -8.2165022 -6.9501009 7.7063065 -6.8444200 -3.6622005 -100.3672867 -2.9221110 -18.0398083 11.5106220 -19.8661976 -0.1388373 -11.3672638 -16.7731571 -38.0683022 -4.4516749 5.6919150 -8.1937475 1.7168812 -13.0526781 4.2935448 4.6085348 6.0458999 24.6438293 -2.5316312 8.6470213 -116.4149094 -21.7526340 -36.4050369 6.7417326 12.1685181 21.6267567 12.7114449 -48.3956299 2.0066273 19.2498646 -4.6163473 51.3812714 3.0797763 1.2999190 -8.1017637 -38.6612740 -35.4930496 5.9884782 3.3292174 10.6177263 0.7714676 0.6414534 9.6062212 -1.8487763 0.0911193 6.8650432 5.2790160 -27.3380775 1.3488133 5.2941680 -0.2947099 0.1446832 0.6231310 17.0701485 33.4834633 -47.1297417 22.3084354 14.6230822 -3.1970558 0.2402487 -7.6312866 -0.3349462 -7.3787541 -30.8846455 -37.0535431 -0.1177551 4.6275554 3.5638032 4.1697130 -1.1030993 10.6081467 -1.0726635 9.0719318 11.3896933 0.7860935 -2.8547518 0.8498493 -8.1489553 -22.1497841 -6.1130471 9.6140833 6.4528341 1.8342959 10.2894793 -21.2387733 1.3094702 -2.0697052 -3.4409430 -0.2412549 -0.4272506 6.0440550 2.9483733 -1.2472061 6.6811719 -0.9254023 0.7626708 -0.0451938 -10.1444836 3.8089263 3.8416409 5.3264384 2.0994253 1.4708903 4.4927483 8.2439747 2.2340617 1.0357511 -92.7923126 3.4097333 3.0262644 10.3655195 2.7285452 7.2522297 -75.7001343 5.3803577 12.7584705 0.2057784 10.8150654 2.2838941 -2.3404570 -4.8823867 -2.8348908 -1.2853051 -8.1497030 2.2501800 -0.4340482 -0.5633406 0.0263335 -94.1517410 -14.1546898 -52.0486832 1.4812250 7.5260906 3.9863358 -1.9335136 -5.5260663 9.5669689 -0.7071350 0.7935680 -1.6289458 -1.6956760 4.4270353 5.6421676 0.3898153 2.9852219 9.1334190 1.0238922 23.2017269 10.8099422 -2.5456057 -0.1179260 0.6330314 8.3304787 14.5361423 5.0621209 178.1892853 0.7185245 12.1706181 -6.7409968 64.6852112 -3.2581708 -0.7983230 1.4377549 -19.8415203 4.3388042 1.3786436 6.4811153 22.0900173 1.9150661 2.1837292 21.0182877 -5.8241577 -1.4948851 2.2674258 12.7955322 7.2147679 2.4696527 0.3326240 -2.3060391 3.9933898 1.9585168 14.5718832 122.0727386 -25.9812126 32.2074738 3.5160606 -2.2718687 -1.2722124 1.0363966 -17.4994011 -5.5243039 -7.9993258 -2.5015192 3.2442887 6.3819466 1.0465248 -2.1232946 -0.7866578 -1.0566921 -1.6360964 3.9069803 0.2155985 -0.3985054 3.1427660 -1.2053719 17.7516689 4.1763630 -1.9174994 -9.8786325 -2.3372331 0.4349186 4.0114107 9.6200409 -1.1780760 0.0649540 9.9891424 4.8433051 6.6994562 5.5675268 0.2513929 -0.3202126 4.5254154 -1.3876996 2.0529363 1.2151159 -5.5101252 0.2557692 -0.5841195 8.7126217 -2.2060220 1.4447688 2.2143888 7.6291952 59.0634117 -1.3319206 40.8798485 1.3381186 -0.3087339 -0.9832449 -2.3057532 11.0388365 -63.7424507 3.1030717 -0.7172661 -5.0745249 1.8716140 -6.2106538 -2.2974968 28.9160042 -0.7544320 9.3874731 -1.9144244 1.5298496 -0.1763175 2.8989539 0.1877277 -4.6601381 -4.1660609 -21.8689919 3.2400587 -14.3799906 0.0129253 -2.0030701 4.0447011 -14.4028873 1.5243530 11.5505447 -1.8983473 -0.0463082 -0.8813370 -22.7421322 -3.2887931 -0.0983811 -4.0895834 0.6060122 1.1360446 -7.7083344 -4.4354920 -1.7583793 -0.1978156 0.1844815 0.4641678 -0.3995946 -1.9555604 31.6048985 -1.4610668 -0.6208820 -2.9529216 7.0610108 0.5273439 0.6925659 -11.8402824 -3.4913898 -0.3434602 -1.1632732 12.4746037 0.4907512 1.4882916 11.9903765 0.1864489 4.3014545 -1.1455554 -2.0830061 1.8350765 -1.3746738 2.5018671 1.2840240 -16.6076908 -1.8617114 -1.1038109 -4.3801422 -13.5609150 4.0686250 2.7460170 0.0621765 12.9379272 -1.7681632 -2.6937184 -2.8125875 1.8007115 1.4798129 -1.8160511 -1.2327291 -0.7141317 2.5214753 2.9661427 -2.4961896 0.8238989 1.3283330 3.0795500 0.4877867 -5.9081669 -14.5026150 -0.9346681 -2.2117038 0.2552865 -24.5816879 -1.3662714 -3.1628184 -0.5433297 2.0404279 -1.1222174 -0.1556444 -3.3004079 -2.1915367 -1.9047396 -1.9688754 2.6451886 -3.3611255 -1.5868793 3.1871262 -0.4241399 -27.0482025 3.2987642 -4.3818493 -3.4140263 1.5414383 -0.3003019 -0.8736189 -2.7564902 -0.9836416 -3.8498273 1.4718668 -26.0461502 -3.9051790 0.8802454 8.9355736 -2.2244020 -45.0028801 1.9394008 0.1745806 -0.1725526 2.1505067 -0.3853332 7.6990905 0.5499753 3.8083034 -3.1436305 -18.7298813 0.3723167 0.8700656 -0.9174042 -3.4620268 0.6570718 -4.3908429 0.2384758 -12.4900970 -2.5134015 -0.5644407 -0.4977563 1.1240474 -5.8410912 6.5125656 -0.0752543 -0.2017356 1.9074614 -1.3145410 -1.4700027 37.7057495 19.1836433 1.3576096 4.6179686 1.2501031 -0.2091278 6.3713775 5.8756676 7.4436755 1.3021461 -0.5440934 1.5735716 2.0351880 6.0730829 -24.2484493 3.4098971 0.0450518 2.7166758 -9.1829510 0.1341221 1.1280961 25.9739170 4.8360147 1.3434803 -0.1895319 -6.5015488 -2.1366551 -0.0230890 1.0451558 -0.3966144 0.2811695 -1.5657060 2.4976463 -0.0178517 0.1047830 -0.1923706 -1.2769092 7.1963968 2.0546119 0.8511394 -4.3806481 15.5329084 -2.8920386 1.2069064 1.0636331 -6.8971243 -2.9679356 5.2395539 4.1501288 2.8162165 4.3077493 2.8470380 1.0019027 0.7074656 -2.3810918 -0.1859029 5.4286337 1.1100684 4.4434891 -1.1028308 -1.0889006 -1.2103291 32.0861511 0.7602808 3.7372639 4.0350666 15.0457268 -0.2614787 -0.0426792 0.0638755 4.1672139 2.2325122 1.9741014 1.2492347 1.6306108 3.4354324 0.3264317 -2.1667552 3.2448738 1.3450909 3.6208415 -0.6115174 5.8876157 -5.6667633 4.8962111 1.4663268 1.1439304 1.0680494 6.7731519 0.3011750 0.6226802 7.5640459 2.1862459 10.4463406 9.2194071 -0.1581001 -13.2264013 -2.1575663 -2.9380565 -2.8361001 -0.0853705 1.0090575 -1.4695514 -0.9956104 -5.2602696 -0.4815341 -2.6093316 0.3010663 16.5681210 -0.7595575 -0.6505807 -3.1584921 1.6889744 -0.9817595 3.3753963 -1.6590025 6.0464640 2.0982940 -0.4535419 2.0888596 -3.1038659 -0.8743639 21.9898338 0.4900566 -0.7628491 4.6003828 -1.4369190 0.7819438 -19.0982075 -63.8845482 0.4576730 -4.4302454 0.1830850 -2.5327601 12.7723217 0.3537565 -6.0729194 -0.7547520 -3.1091835 3.5029466 -0.4916578 1.5152694 -0.5459107 -0.8756673 -0.9905840 -2.6042073 1.5978327 0.3613080 1.4908173 -2.1287620 1.7710029 0.6400713 1.0510113 -7.0783739 -0.4241018 4.2358065 -9.6006279 -0.5731925 0.7096832 -1.3404840 3.6677411 -1.4203826 -0.9858301 -3.0817711 0.6025589 -6.5536556 -0.1854406 -1.9527950 1.8219057 -3.5422988 0.4775162 0.4039667 0.0113167 0.3271087 3.4972196 8.4555426 -21.2877197 3.9514828 -1.3970401 5.1056843 0.5499339 -0.1436970 1.3402433 1.9868958 0.9287252 -2.4252839 0.2223295 0.9466305 -1.3110372 3.1522160 -9.6422758 -4.2604179 3.7461581 -2.4751885 1.2321663 -1.8731335 2.3791871 0.5766705 0.5320632 3.7996433 1.2264129 -0.7930697 2.8290944 -4.4061565 2.0725121 2.2622631 -9.7770042 -6.0588160 -0.0559282 -0.3269662 7.3419423 1.3076273 2.1360753 1.3730253 2.5208800 1.6344171 -6.4671035 0.4651506 -3.9400270 3.9222133 -4.2817259 20.2332382 14.3438873 4.2676711 -8.5670357 -3.0724843 -7.5942545 9.3604612 -0.4642509 1.2420681 5.6141324 0.0751749 0.5088475 0.1428031 27.9375153 1.2252098 17.4103546 5.7614293 0.0378445 2.8991990 -1.7964255 0.2081612 2.2969558 1.0186948 -6.9426370 1.2321750 -1.7440203 -1.2462008 -2.0013678 2.2323368 15.8457909 -17.1292591 -15.9462538 14.7353277 -1.3908067 -0.3034473 -60.2335587 95.4841385 0.2470276 -27.6478500 -4.6041617 3.9272950 -30.0403805 10.1087322 -26.9368420 -4.6521482 5.1142936 -14.8278131 3.5023010 57.6976738 -6.0803027 -1.0257581 7.8457899 37.2513351 21.7884331 0.2570181 -0.8569245 -31.9940281 3.6716056 -0.1075062 -4.6236358 11.5118752 2.6588044 0.2896216 -24.7006817 -14.1249952 1.0230448 -0.5482973 2.8443713 -49.8515434 3.0336096 1.2893124 3.2614648 7.9861460 -1.3974694 27.0072479 76.3415604 154.5337982 7.7209940 5.7540431 -5.8728185 -6.6429081 1.6570039 -53.2690392 15.9123135 -5.4202738 -19.4975281 2.7401950 10.5417604 -0.9380208 5.7478223 -2.3201303 -3.7925475 -4.3446460 15.9977665 0.6181528 1.7950900 -7.7513843 19.1096306 -3.2334821 7.5425997 -8.9620590 -32.4473839 11.6680470 2.5058172 2.0989389 -31.8261070 -18.8401814 -7.7889805 3.4357276 -2.2892342 2.4160101 -13.7590179 4.2009797 -16.9131432 -8.1916456 6.2050362 6.6085825 40.9137917 -23.0010033 -3.5916097 1.4259629 51.8436012 1.7017945 12.0130148 13.5508022 4.2700562 45.0605545 8.4442711 16.3372822 6.0091972 -2.5422421 18.2837391 30.9551563 23.5783215 -15.2251616 -5.1613550 -3.3872139 -8.7763472 2.3299398 -20.8562660 2.2215049 -27.2965431 -3.0454555 -10.3959675 3.3759954 3.1685290 -7.9025965 -17.4755802 3.5583842 -15.3993025 -15.0013361 -47.8196373 4.6670132 -16.1844177 -1.1906552 1.9660723 15.4685392 -6.6721959 -2.4753795 3.8282893 10.2470179 26.4906158 -12.4893866 15.5641804 31.9909554 -15.7048950 -47.7132263 3.7240071 14.0681381 17.8607540 26.6684856 3.5765429 7.1369381 -3.6841562 -4.9822316 15.4886608 43.4559135 -32.1554718 7.5312891 -6.0079041 -2.8846209 -20.4478111 -5.0556979 6.8782258 22.2667255 19.7925091 -0.1832898 -16.0178680 -0.4610051 2.1280172 8.4202223 13.9275627 -10.4750137 -17.6890316 4.5563583 -3.2983472 -51.2671547 2.7424436 8.3173475 15.8126240 -4.0640397 3.4349418 7.9601769 41.2065353 201.1947327 -13.8448849 24.7479610 7.0115643 12.0589981 -4.1808491 11.9678507 -2.4356458 -9.0259800 -16.4676819 8.3594084 -0.8363641 -5.4464049 -15.7152691 3.3861563 -9.0607843 -0.1204679 1.1339738 5.1283445 7.1018291 -15.0969067 15.3198214 -13.6091070 -5.5862279 -11.2074223 50.7865143 0.1457928 -2.3019171 3.6887584 -1.1753262 15.9911766 -5.6968451 -8.7138796 -6.1362615 -1.7726307 -6.8349228 11.8133821 -2.8143079 5.6465840 -16.7815552 4.1994891 -32.1681213 -4.9160056 -7.3403773 -5.0967813 42.6747704 10.1604004 13.5892467 2.6606753 21.6461906 26.0626678 10.9037104 21.2964916 9.9006262 -1.7643030 34.3232307 31.9836807 50.3997040 19.5265942 -16.7710819 -11.3685989 -11.5595798 -5.3072276 16.9801979 9.3115120 -29.6117210 -8.4846926 16.1515179 -15.1330328 5.8660860 2.3605421 1.2467308 5.5768123 16.2687931 -15.9864388 6.4700856 11.8175821 -1.2933127 -5.9049716 3.5139532 -10.3823376 6.0967221 -6.9381537 -6.9312453 0.0758026 -25.9839649 -10.1739607 -51.9918365 35.3508186 21.7709846 -4.4423628 2.8261485 -24.0981522 -20.1505890 -25.1407833 -137.7723083 -14.8960133 -0.2867721 -30.3788166 -21.5279198 37.0317383 -31.9943085 -22.9987354 12.5976067 59.1928291 -6.2636385 11.6667280 -10.5298567 -12.6595173 -55.5359268 5.6715961 2.6606104 -7.3637257 -8.8942041 -5.7326746 -48.2905121 -18.0274143 10.4854174 -8.1064510 -1.2473736 27.4394741 -14.6369896 -3.8662455 -14.6907158 -11.4019489 -9.3099518 21.4561043 15.9980135 -3.3231523 26.6489334 -14.6799412 -15.1303158 -0.5996227 4.5517368 4.0265517 -56.5358658 -16.2113972 -38.0815353 -24.3911743 11.3569870 9.3741856 2.1927497 0.8461491 4.4011455 -1.1353232 -2.8655357 0.1287127 -17.0124130 6.3596354 -13.5435944 -12.9623470 10.6678438 0.2775014 13.4860125 2.0448968 4.9563327 -3.1018112 -4.3362441 -28.0153751 -18.4049721 -14.4938564 -0.0483862 -12.1305656 -9.1220770 -2.9033799 -13.2675581 94.9844284 -18.5825386 1.1693637 12.8100290 -0.4944531 -10.1079540 2.3853910 7.1813264 -20.3655643 -17.4848919 5.8719640 105.0177231 -13.0678501 8.1632748 -12.8638172 -29.4697990 12.4022522 -7.6207371 -6.4117188 -26.7049637 7.4311471 26.1251698 -3.8438845 2.2622967 8.2494841 -52.9761047 -15.8927135 -5.4030495 4.1448436 17.5570374 30.8921566 -23.2936382 -2.9404607 -3.9857209 -4.0659485 -0.9905508 10.9572020 13.4275360 0.5623202 -84.1727676 9.0909252 29.2090015 49.3970222 -39.4111977 4.9711847 -5.5937982 9.4869061 -2.4374692 5.0601711 6.2535496 -1.7925785 9.1172686 -18.8030319 6.4571118 11.8733768 -24.9594078 23.1848793 54.6836395 -1.3644634 5.8459668 6.3378258 -14.9674807 11.2409801 -1.5042136 -0.1680900 -15.1520824 14.4853220 1.5166731 4.6048059 -1.2875727 -19.5212612 -70.3899155 3.3887901 11.6853771 15.9927635 2.9207220 0.4699283 16.6252384 1.0931914 -10.0937576 -1.7813364 8.2895803 40.9694023 1.5457602 -0.5299845 2.0884266 6.0249176 -14.5536413 19.3779526 15.9966488 -15.9948492 14.1679220 -14.8258677 -5.9238577 -0.0515336 5.2516909 -25.6428051 -5.1724167 24.2518501 39.6880836 -3.3569634 -1.3995590 -1.0843774 -3.3937771 20.4291000 5.9216413 4.0871172 5.7924466 -5.5398364 3.7871404 -6.0595632 -2.6392148 12.6915789 0.4486777 5.4669819 -7.9998631 11.2596426 2.0362027 2.7898068 -3.4200537 -2.8810396 -5.1748261 9.1570091 7.8761978 11.7088165 -11.6127844 -4.1488080 -1.2486134 -13.4566927 -10.2107201 7.1276875 2.7248764 -22.5352230 5.8436666 6.2722406 36.9476357 -7.5108514 -4.3628874 13.0752087 -65.7757797 8.1013927 -1.7435474 -42.2987175 2.9024792 -3.2326431 4.0477862 4.7214885 -31.9954185 22.6893635 22.2622318 7.3748569 -6.1097751 2.2458808 -1.6115576 3.9743083 6.9994345 2.0940421 -98.1026764 -13.7672777 1.0268642 11.4318638 4.8466020 5.5480413 -15.0789032 -35.3147545 -15.9993591 2.1003258 -4.7205229 2.2264931 -30.1313877 -19.6385040 56.7421875 -0.7519821 1.7943047 -11.5526695 3.2042799 -7.8704309 -4.6238236 2.0205479 -19.8042316 9.3829441 -6.5914636 -16.3449440 -5.7436132 -8.5361738 -29.9489784 6.5495782 -2.3582594 -18.8084908 16.2390957 -6.2473774 1.1680926 -1.8248175 6.2270570 -22.3758564 2.6180284 -9.4498844 4.7893386 -8.9545727 -18.3716545 -3.0244577 -0.2020224 -34.1033669 -2.0487649 -0.4824986 -0.9997819 4.7817106 7.8212638 -0.9457606 -6.3026586 -47.1536026 -1.3160641 2.6874189 -0.9178239 -2.8703246 19.4216061 -24.0714054 -6.2641511 41.4097824 -13.4618425 3.5890336 7.4609470 3.2148232 0.2361069 31.9965553 3.5050120 -20.7136631 -41.4980240 5.8353295 2.1490753 1.3662258 3.3042400 -14.2099152 -9.3934917 -3.8525572 -0.5669333 5.3661742 -4.5651860 5.9762554 2.5642722 -16.4924660 -18.7029381 7.6696024 -9.3372765 -18.0037708 0.3229516 -1.0192786 -17.6705341 2.3016765 0.4506316 -11.3621101 -2.9836223 -6.7013130 12.4339743 -2.3902996 2.2774093 -1.2305363 8.7203417 -3.6494296 -2.0434957 3.7003875 -7.4302163 -5.8514385 -13.8453579 3.7214968 0.9704259 -14.3025703 38.9468498 5.8138638 2.5137341 31.9965973 -1.4179642 2.8246710 6.5264449 -5.8228812 25.3469772 7.6928725 -24.4941273 -2.9587023 -92.6259155 -9.8647242 14.1992369 -0.4231023 19.2068825 -0.4529025 32.3471184 -7.2660284 0.6441125 0.5582994 3.6066470 -4.0484400 -23.0916538 30.4030857 36.4009628 -3.6054869 11.0013638 -4.0042124 4.7986536 22.5844498 2.6188512 8.5274334 88.4362488 30.1616268 -26.1650982 -50.7707977 -8.1691360 1.7197734 -0.7906122 -35.4555893 9.5586061 -84.7464371 -25.4694977 15.0869417 22.2820454 0.5022030 6.5379105 12.6734276 15.8047390 -25.3345852 -48.8498077 10.4146633 3.2128122 20.4352989 14.0902853 -9.1179276 -9.8011837 -18.1849518 0.7648852 -7.5514908 22.4337997 -0.0186078 -32.6030045 13.8352814 -29.0873928 -5.9305935 -18.6540356 -25.1964817 5.6742077 -6.4559064 -5.6177239 11.7653303 10.4237547 -12.1124125 -1.4642812 12.0887756 20.6396351 -63.9993095 -24.3682842 -45.0627670 16.5264988 10.1116762 21.0585785 22.0739899 8.7220612 21.3232193 0.5725826 72.1184692 17.8322964 -8.5313988 14.0325155 -14.5056810 -23.1103477 -4.5347452 57.7112770 11.6402826 -2.6484485 62.9422226 8.6044254 -43.2894783 14.2037373 -8.1024675 0.9669926 -30.9859295 -16.1212788 12.1874800 -23.7636185 5.8394270 1.7372161 5.6101546 15.9950256 -11.3181534 0.3083869 10.6986885 25.5652695 -7.1987863 -25.6365585 1.3880346 15.8834143 -9.6273661 7.7038560 -10.0042562 64.0427551 -32.9304314 -9.0584030 -23.8854465 7.9959517 30.9953346 6.4232426 13.5197048 -121.9622192 -7.7289233 -135.6516876 22.3077736 32.6518402 -19.0874672 -50.1530952 -12.0714178 -5.4363275 -25.2570190 12.5904770 -4.3340182 -17.8015747 -6.9517508 12.3185186 5.1311436 -4.6999035 4.9658685 -11.7927961 4.9940686 26.6524048 24.7743130 -19.8482094 -2.6855626 -41.1924934 -9.5438967 2.2728379 9.9102163 4.4405813 -0.2772527 -1.0212399 1.9838778 0.0911273 1.5072687 2.2808676 -0.0928170 -1.7383311 -0.3671114 1.4284964 -2.8753443 -16.2638435 -1.3739275 -0.1283001 -1.1531082 -0.0586038 1.6563874 1.4763848 0.8183201 -1.7229457 1.4670199 3.2450984 4.6573563 2.0308373 -0.8080092 0.6457186 -85.3249054 -2.7013018 -0.5806004 0.9872465 1.3132288 -1.2416408 -4.4567900 -0.3404481 -2.6393363 -0.3625519 -3.2549591 0.2980958 2.9651530 -0.7045152 2.6055005 2.7182057 -0.1686317 -2.4767964 2.4238076 6.7092199 -0.6943973 -1.7592241 3.8251693 1.2122629 -0.8155658 3.4650798 -2.1071725 0.7374614 0.4494598 -1.0495452 2.4709823 2.2201343 0.7392008 -3.7837086 0.8740917 -0.9889643 0.6845317 14.6243601 -1.2509779 -0.9395011 3.2871101 0.7315514 -0.4244111 2.4188452 2.2750132 5.3830786 -3.3836150 0.9866288 0.8415734 4.0902271 0.5861957 -1.6192333 0.9462940 -2.0620954 -7.0974956 -1.5670180 -7.8273087 -0.8206898 -0.9275458 -0.2064557 -1.2224178 3.6628933 4.8661585 4.0308647 -0.0394720 -10.4006948 0.3955280 -0.6358117 -4.5109334 -0.8556508 -11.3338604 0.8369884 -2.7977326 0.1690835 0.6907274 -2.1575329 -2.6032844 6.7993679 2.9652879 0.0338107 0.4023826 16.6444912 -3.0396907 2.5658748 -0.1573355 -1.4841479 1.6280297 0.0427830 -7.5298238 0.7502438 -2.7441916 0.2986988 0.7095501 -41.3030167 -1.3472508 -5.7029586 4.0371037 -4.4819851 0.2883489 1.4182361 -28.2787170 3.1894379 -9.1725454 0.3513210 -0.8722541 13.1271572 -10.8155241 31.9759216 -16.1830578 2.2723382 5.2929134 -3.6158316 -15.1220436 -64.4435730 17.4645367 -5.5572147 -4.9404216 10.2952347 -0.6276521 -0.6819249 -4.6806054 29.4749699 2.7967370 13.4154196 19.9428024 21.2174530 -2.6723635 -4.1076570 5.5577760 -4.5034800 2.5012386 0.9345784 -5.4911418 -1.5930985 -14.6145372 -4.6056967 -10.5447865 -51.5544853 6.9735451 -1.8683218 -0.7128479 -4.5463223 16.5575085 4.8773894 2.1241589 0.0363435 4.7023325 -3.2719069 -4.7555256 -2.3039286 -14.4158268 11.0544748 -0.9215857 4.0002470 65.9507370 -7.9445300 -2.4765000 -2.7372842 7.7412558 6.2604752 -0.0157840 5.3381934 8.1165504 6.9809914 -0.1422919 21.2932262 43.3619308 2.8781581 5.2534137 3.4044049 -12.0033302 6.8968911 5.2070885 -67.6121521 0.0153955 -17.7301960 2.7363703 0.9718482 3.9727991 -4.4500785 -5.9645472 -7.6509390 -13.4782219 14.0102348 -6.8615918 -19.8908844 5.3126168 -61.1274414 -1.0660715 -12.3885279 -12.0513105 -5.6351824 6.9108849 -7.5917039 -0.6369520 4.2630658 0.9551219 7.7971263 17.3341656 18.0779819 -19.2699280 -0.0870610 19.6663132 28.6053085 41.0676346 9.7659025 -5.6953859 1.2542589 -2.6632218 3.1475792 1.9545531 28.7098598 -2.0557334 -8.6670494 -12.3486910 42.2432175 -10.3103065 -1.5205164 -1.5502599 10.6133194 -2.3685968 -37.4452286 6.2240129 4.6934261 -6.3220377 -18.1513271 2.4535775 -6.4964681 -3.5948346 0.3423952 13.6310320 -4.0903974 -4.2870169 -16.4116135 7.8922062 3.4642770 30.0062027 2.0080173 -1.4554554 10.3801661 3.1822577 6.9114752 -8.2643337 -65.1148300 -7.9621949 -1.7395203 5.7025657 22.1104927 13.7501869 13.7054157 0.5264278 -26.7296734 -14.6204109 -12.1770401 0.0311525 -8.4040165 8.9706955 18.8835335 9.7262983 -0.5859714 30.8449497 -0.0406822 -10.6151581 0.0809776 6.1083999 -29.6409836 -4.9468274 6.2491469 -1.4277407 11.5934944 -1.8148086 0.5378486 -85.6245193 -1.7222314 10.6753702 9.3502054 -15.9965734 18.4873638 2.2597299 12.5249119 15.9978456 -5.5423303 1.6212052 1.2279630 -33.5017395 -33.7100983 -19.5231304 -1.2780565 3.6929233 -16.5070267 3.0367129 20.5717907 -6.1345639 8.9903069 -286.9699707 8.7836933 1.7347132 -2.3936155 -4.0634365 -0.4872436 42.7214432 10.4521151 -7.6583538 -0.0829336 -9.7947054 19.1004124 12.7768240 6.7803087 -2.1919060 -0.5013856 1.1634377 13.2453337 4.6643071 11.8078966 1.1369665 -47.3275375 -1.5981737 -31.9967918 -12.9952946 -4.0163136 8.0636816 58.3114662 13.8849392 -11.3711338 -8.2764969 11.9503984 -5.9165249 3.4574537 -2.2316554 14.6565905 -24.0405197 -21.4394150 7.7946815 7.1978493 0.2481967 5.1239872 11.2525406 -2.7376111 1.6443626 4.9110336 -1.8692833 -48.5190315 0.0992222 2.1239874 2.5651538 -3.3624265 -26.7761669 -13.8559990 0.2421748 8.0192089 2.0652034 3.0817327 4.7885056 13.9530840 16.8263340 -14.3724022 0.0144464 -271.9219055 -4.5384274 -9.8620872 1.3231242 -4.0309734 -17.0573978 6.3344584 -1.6954867 2.6429095 -0.8014386 -16.0517368 -39.4233742 -44.8894081 -56.9589729 19.9265461 -2.1687264 -16.0642548 19.7808495 -10.9526424 -35.8197517 -1.3122226 -11.8610783 -32.0283165 -185.6921844 -7.7856727 2.5223095 -15.0366316 -7.9966283 -47.2921715 -6.7298131 -0.6376063 6.5755105 -4.8067660 -3.2726161 10.8367910 0.2051359 1.2475375 -4.0748882 5.0054765 6.7715373 -11.2305508 -18.7513180 -1.1094002 6.3962822 2.1038618 -45.0565109 -73.1658783 13.9907837 -10.3677816 -69.2270966 2.6567633 1.9466544 3.5660391 -70.0862579 -1.6902601 24.9889164 34.4918022 1.2330906 -33.7671127 -3.7557392 4.2642193 8.5056505 -21.1657162 0.4018917 10.6276026 3.8182352 -8.1641283 -15.9847279 -1.7695893 -18.1444817 15.0724039 -0.0609761 0.4124975 -5.8787608 2.2071831 -5.3061666 24.0822926 0.5763617 5.6061897 -22.4629955 -4.0035639 -17.6485538 -13.9777527 1.3372996 -1.7021896 -7.9964252 0.1677938 8.6075554 -35.0867577 -1.0874877 -4.5785055 -0.4381015 10.4546165 -1.2774811 0.3524871 -1.3719171 -38.0973244 8.2663126 -2.1244445 -307.0060120 -4.6816726 -4.8112507 -2.9973185 8.0550547 -40.9764252 -9.0466213 -1.4246163 -42.6492882 -2.0103686 -6.3585782 9.7970533 7.8856168 -1.5003711 -0.2817417 -15.7879171 13.0411882 3.2910409 19.6578236 0.5072262 6.3875856 13.9329262 13.4828014 28.1313515 -38.1346626 -3.6680975 -4.8967996 4.1413021 5.4971452 -2.3662415 2.4184122 -0.2115874 1.3651776 -0.3796278 -1.4503247 -0.3868273 -1.1755747 -0.5863842 -2.5806916 2.1969783 -0.5516695 31.1259880 5.1796947 0.8732315 -2.3911865 -3.3394117 0.5903905 -1.8093396 -33.0695534 -0.3398266 1.8860455 -1.3266383 8.3336477 -1.9414206 -0.0884881 3.9077797 0.9309461 3.1419611 -1.8049531 -1.0513084 3.9819014 1.8286146 -0.9991935 0.5035084 -0.1296815 0.2989436 1.4899539 3.9645512 -4.4690666 -0.1145744 -2.7767234 -0.2238510 0.6354665 -1.2362213 3.1935027 29.9272442 -13.6779261 17.8337593 -3.2998939 -0.2858470 -0.4398355 3.9302189 13.0877237 2.2902780 2.6552942 1.6815047 1.3769991 1.3085073 -0.6113620 -1.3142283 1.1273857 -0.3673241 -1.1967785 0.4157949 -3.7928879 0.6069318 2.8761241 -0.2675661 -2.9769292 6.1627493 1.6248629 -9.1755104 -0.1943212 -0.1127013 0.0640931 -7.5749679 -0.6719714 1.7429823 -3.6618128 4.3610725 -1.0046679 -0.8880039 -2.3777516 1.5714718 2.8778830 0.5864002 0.7774112 -0.6037810 1.4115232 -2.9569874 -0.5502409 3.4280434 -2.4195619 -0.0713237 0.5856047 2.0603075 14.4976463 -0.1936292 16.8531303 -1.9730554 -1.4110847 2.4615891 -2.0322104 1.7422303 -1.7891093 2.0177534 -0.8143381 -2.7517672 -1.3762279 -3.6576488 -0.0805784 -2.7585092 1.2474177 8.9879045 -0.3387354 -1.3612229 -0.6281999 5.8005614 0.3268666 33.9801674 4.1046000 31.1934376 2.0511758 -0.3559058 -0.4507598 0.2839745 -3.6589224 -17.0400028 1.1480136 -1.1737170 -0.5494599 -8.9965715 0.2226215 5.7456040 -7.4587383 -10.9484062 -12.8180046 -4.1797600 -21.7846775 6.7742896 0.1602857 -2.1901808 2.5597341 5.3893628 -32.4387894 -1.1141362 -2.7691045 -0.2340928 4.3171239 4.2614431 -6.8922997 -14.7233315 -2.6859517 6.6282840 -0.2561971 -9.6389551 1.2071254 3.8356156 8.6940928 -5.5705056 -6.4765773 -30.1849518 -3.4310284 -4.1049695 -8.8914309 -4.3847971 -19.7682590 -2.9286304 -61.7135162 -8.9124289 -34.0837440 4.5561438 -63.5372772 -16.5719967 8.8347015 -9.1060619 5.1113458 3.2125421 -3.3004997 5.3284812 0.4013606 -13.8247700 17.0029125 23.3209038 -1.8753042 -3.0353100 -0.1387478 -2.7639596 -2.5353816 -14.6141529 0.5253220 -16.1748772 0.3060964 -27.1664314 -5.4426079 -4.8995328 -13.1293468 12.1629705 -1.4225502 1.0010532 -49.9171295 -0.4153548 -6.9615107 -6.4153919 -5.9519253 -30.1528645 -40.4234009 -32.3113289 -0.7564009 -20.6488667 -3.2833250 -7.5980701 -5.7572594 -3.9373939 -1.3979044 -4.8921804 -4.6938767 -7.4941230 -4.6769886 -0.2796212 -1.9842085 -3.4560916 0.5084054 -25.5574226 -25.6905060 -5.6887116 -12.5300159 -13.6531801 -5.5072570 -38.7717819 -11.1004009 -39.8879852 -0.9876991 -13.2014885 -4.0424671 9.1249952 -9.4922237 -16.6650352 2.9956698 -7.3508964 -4.7095575 -6.9536963 -3.4642794 -0.5900239 -0.2535873 -11.8209143 0.4743532 8.7411089 -2.1886768 0.6323537 -2.4222836 -41.1629868 -4.7589660 -1.2821018 -5.4976058 20.5796299 -0.9069617 -4.1160593 -5.9706588 -9.0743790 22.7498150 9.4691477 -4.8099236 20.1016579 0.3403182 -2.4772663 2.1604581 1.0050207 2.6412187 34.1420135 2.7074299 11.9584370 10.3033867 -5.4292583 8.2875786 2.2724710 1.9529588 -6.2786822 36.1959496 -11.2259493 -2.6944382 6.9592381 -13.3568811 10.2668781 3.1450453 7.5358448 34.6047707 -1.2224610 2.4051175 22.8442326 -7.7288303 -0.7543475 -5.2050891 5.9126344 5.7173486 1.3092989 -11.0394411 -7.9071269 -8.9530773 5.7938247 -32.2452583 37.1779022 -25.5282040 6.6079001 2.5673842 1.8784510 -3.3918493 4.7393460 -0.6789621 -13.3081312 25.2444496 58.4191895 5.6054983 -7.7245698 0.5285940 -3.4260454 -2.7214119 -4.7732549 -0.8146796 -7.3420067 -0.0029001 -9.0417786 -0.7780080 -3.5817888 -7.2194538 9.4160938 -1.7346834 -8.5585604 -32.3972969 0.3826827 -5.9698620 -23.8460369 -3.2758832 -1.9214467 8.1917076 -26.8069954 9.9962044 9.3707666 0.4651519 -5.4878311 -0.8080675 0.0163609 0.6830919 -2.0164592 -9.8065615 -2.1788769 -4.9924612 7.5904851 -4.4595799 -0.1284726 1.8692729 -1.7414961 23.5835190 -4.2599044 6.8613753 29.3632698 -4.8396449 -14.5598154 -26.3372173 -1.9513191 4.3649697 -7.7976737 -13.9392452 -6.6843400 -5.3950462 -10.7864256 2.7975929 -12.2795515 -3.8655539 0.0982696 -3.2642586 4.2669978 0.1702278 -10.3195286 0.5543779 6.2016611 -4.3257761 -10.7876863 -0.0085111 -63.9909096 -2.6644199 -6.7186036 -6.3465090 -53.9874611 -8.8732967 5.0099893 6.1630998 14.0497417 -31.9215908 -10.5258064 -8.1709328 -11.6818533 45.4933510 -7.0397577 4.2510080 -26.0845680 14.5245113 10.2274027 2.1538811 -1.9945356 8.8414097 7.9117994 41.7042465 28.8524132 -11.5487671 -9.3159895 3.4514418 6.0950851 -0.7340670 -1.7499094 -15.9591074 27.2820282 4.9093823 -0.1052384 -13.9045515 0.8509921 6.1422091 18.2354202 2.7501545 7.4504075 0.8768611 -10.1736088 -9.9546432 -4.3861818 2.5959778 2.2448516 10.4398403 -4.6230011 -25.6260529 11.1646671 55.8753929 -21.0841713 -13.5011148 -3.2678754 8.1701403 -7.7914820 -91.2670059 10.2109833 12.3798075 1.5884135 5.8853021 4.9558239 -1.4863827 5.3940787 -3.2166767 9.6526499 5.0435653 -10.8588810 6.6546459 -1.4094669 1.1980146 -1.3667597 -15.9977579 1.7215166 1.8085788 3.2701859 0.5532638 3.5737560 5.2703424 41.0742836 -3.1241941 6.0488863 -29.4305477 1.5488884 0.2261423 -8.6691427 -2.0070255 1.1382557 -16.0000153 7.3857398 -3.2668047 -38.9104195 4.0192385 10.1680145 -5.1279693 -11.8266096 5.8966446 -8.2062416 -6.0095248 -52.1673164 7.4744434 -0.1728361 -23.9987106 8.6584816 6.2728739 25.2739525 -8.6132612 11.4590673 -42.8737869 6.9266844 -14.0892820 17.0451221 -1.7726977 -0.8424926 7.7631211 7.5710678 1.3413211 -22.2705040 -10.8358669 -0.4664765 1.9779224 -8.1932449 -5.0775065 -20.6593475 2.1628449 7.8058653 -16.1965580 -7.5719810 1.9486121 -1.2042364 -4.3840442 -8.7773676 -1.0369582 1.1326127 0.2756777 4.6031418 -1.5366379 4.8411593 -0.7200202 -2.6520438 -0.1610379 -3.6792450 0.6480570 5.3568163 0.2674819 -2.0659904 0.2847748 -0.0000016 -0.0173499 1.1652296 1.4523985 7.8507867 -1.4631591 -1.0886180 -1.3335190 0.3383608 -0.1686590 -0.8647809 36.0773239 -1.0946349 1.1261388 0.2539018 -0.4787384 0.9695862 1.7898582 8.3235722 -1.2511640 -0.8692084 3.1482794 -0.5163090 0.1436666 0.0836206 0.4022194 1.0878876 0.1682980 -1.1521667 -3.2558799 1.5111976 -3.1820240 -4.0725451 -5.6621094 -0.6345844 2.4308529 -0.6251961 9.5402069 4.5940762 -1.0828313 -1.3023536 -0.5451897 -0.1400761 -0.0979151 1.5196251 -2.3309035 -0.4719973 1.4440161 2.3773017 1.1450597 -0.6933924 0.8568046 1.5204827 -0.8380816 -0.1905998 -0.3109902 11.4611378 -0.4672991 1.1016306 -0.3816417 3.9727633 0.7173636 1.1825997 -1.1964960 -0.0602622 0.7666706 1.5017986 -0.7077995 1.3252982 -191.2638550 -1.0800053 -0.2864310 1.7322661 1.4977459 1.0144616 -0.2897439 -0.6268132 0.3799307 -2.3796499 -0.8659904 -61.4572601 4.5220718 1.1317542 -0.6229650 0.1124805 1.2459706 8.9121151 -0.6223320 3.4817803 -0.2580531 0.7405838 0.0726043 0.6824601 0.6446277 1.3792425 0.1664058 -0.4444612 2.0884399 1.2987454 1.6474550 0.2121788 2.5574174 0.0362769 -0.3069218 4.5210648 4.0649152 10.6738558 -5.2873483 -3.3491094 0.4736681 -59.7852859 42.8082581 0.2528385 1.8730084 -1.9141884 -172.7386627 -0.4429462 -29.3238602 10.4700804 -141.0413818 -0.0297435 -1.2197318 6.1833253 178.2949829 -4.2541437 2.1708925 -345.7582397 -19.8449326 4.0019069 4.0642366 -18.0216179 -4.0221977 -18.7277641 -16.7711277 -4.9384675 -0.1102694 1.8530114 -6.6343412 -3.2118320 6.7399483 -7.9526920 -3.9441974 -3.0542691 1.1822968 -2.1610954 -3.4408374 -1.0962716 -0.2004615 -1.6146878 1.6322405 -3.8842883 -3.6424487 0.0696245 8.4592552 7.4284272 95.0052414 7.5737205 -1.1532054 -7.3351331 3.7845414 -1.5511556 5.0577044 26.2383995 -0.9474844 3.0564051 -30.4957657 -3.1901660 -6.4386578 18.7784309 -92.2704697 99.8916779 0.0073178 5.0287943 2.2146902 -132.2490997 -68.4496994 -0.0336968 17.3421497 0.5804471 -127.2182159 18.2011909 -9.8564415 7.0139360 -1.9982859 74.8072586 -30.1079140 -9.0668154 5.3280244 3.8467164 -35.4806938 9.9246349 14.3964252 -2.9098699 -0.0133993 -5.5689611 2.4961407 5.1417346 5.2431078 1.5086071 -6.7179956 8.0964422 -15.8823004 1.7116153 4.0671635 0.0495414 7.0682039 14.0688696 14.4536629 -51.6735649 -5.5722432 -40.8464890 -6.8277054 11.9221678 -2.1455503 0.1455066 -15.2373543 3.2809601 4.2463121 4.0935807 4.0550451 16.3577156 -3.5115142 -0.0364953 4.9649138 11.6693115 9.4736357 -0.9512175 61.1683464 -0.4119569 -3.1003287 -1.6926463 -4.5373874 4.6528044 0.9552271 3.5620527 -6.2311196 -0.3144176 3.3909471 -41.6847305 71.9401932 0.3223206 2.0308483 -1.2029744 -43.9824524 -10.4590063 1.4525537 4.5189219 -95.8013763 5.8136697 0.6271603 -3.7792470 -9.7373571 -35.9366570 1.9495850 -91.9540405 -11.5743246 1.4211141 8.3310871 -23.3820992 -53.8558273 -10.0670605 -50.6621284 -6.2716918 0.0023672 0.2698779 -16.1129913 -2.8587189 8.7179909 -49.2742500 0.1886460 -1.6646322 0.5738479 4.1198330 -1.4333200 -3.8103480 -41.4632950 -7.2577305 -1.3804920 27.4086018 -2.7492921 -0.0449342 6.6162415 10.2053623 13.6279202 9.2389822 3.4718242 -56.7168579 36.5132446 -55.8540916 1.3908184 31.4985943 -4.1919985 0.1751830 -4.5766530 -3.5444689 -6.2557096 4.9783483 -45.7420082 -11.9573040 -97.4609375 5.4539928 3.4265521 -59.1890335 51.5494461 0.0897586 6.3994441 -4.3875113 4.6186619 12.3201704 -7.4849763 1.1687375 -1.8091102 7.9994206 -34.0078697 -8.9580116 1.6923805 16.1253433 -24.3915825 -17.7350845 -0.0663328 -37.5855408 0.0551075 -6.7593784 1.7185749 5.0625572 -34.5951614 7.2903314 0.5270657 1.6191297 -26.2321053 0.7815644 1.8499770 0.0862041 2.7101815 6.9759622 6.2056446 44.2132988 -145.0824127 -28.9818172 -2.8620815 2.7605646 5.0768056 4.2713614 -20.3739853 1.0951306 -0.4881407 1.2842597 8.9671144 -25.9253788 -0.2039572 -10.3231220 8.3414450 3.8901765 12.6568918 -1.1126262 75.0713196 -48.4551086 -2.8664184 -1.4829446 -7.9018373 5.7471294 0.7067729 1.3314548 1.5608076 17.3702431 2.6117001 -18.3565311 24.9425392 0.1062199 1.7719235 -1.6608876 19.6808662 11.2739611 12.1359119 4.4129815 -37.2430305 2.2827072 0.3240690 -2.5374477 -30.1879978 -0.9394181 1.9859433 -34.0932693 0.7998213 3.3641672 0.5280076 -16.3602867 -43.5441780 -5.0306849 -103.4434509 1.2437853 -0.0670210 5.8601723 -36.6711044 -3.1991107 -0.2353076 -26.9457474 -34.9739456 -6.3034306 -0.0052620 2.1275110 8.3962908 -4.8112893 -69.1793365 -4.0056796 -0.2844574 8.4851170 -10.5848751 -1.3281624 -7.0756831 -31.9965801 42.0811691 5.9150658 3.3305035 -59.3261948 -0.7519293 -57.0966263 -0.6933680 27.5608387 -27.6494637 0.8110728 -4.5212340 -1.8448473 -16.1044540 8.3269930 -7.7220197 25.4867058 -63.9830971 4.0452957 3.5823190 -15.7115526 232.6994171 1.4404656 0.3597776 -3.6980746 43.9385719 5.2741017 -0.6860736 -9.1126423 -0.8013728 -0.0801504 8.9044933 -7.9033008 -0.8367484 29.3133888 -12.4454288 70.2579117 -4.4772344 -11.5551176 -2.1007123 1.5557595 3.5154593 1.4974637 -35.1195717 3.9975548 -16.0329609 2.1936541 -8.6251650 0.4890101 0.4012993 0.1639881 0.3092239 2.5949185 -4.0981827 -4.8168020 -67.8145752 -15.4230537 -1.9987650 -33.4646034 -15.6627970 -16.7871971 -33.9183273 -0.7026179 -0.1024217 1.2946514 13.7167740 1.4170563 0.8475513 -9.2564926 8.1977730 0.1449594 8.4787874 -0.0690976 52.6614799 -20.1554928 -4.6571093 -0.5657992 -18.1066666 1.0321018 0.2173279 -2.6614850 1.5974647 15.6248007 0.5866736 71.0047836 -73.5560913 -6.2499986 -1.5052321 2.5208340 167.4199066 -0.2801305 68.0090179 -50.6070595 50.7803841 -0.0181137 2.5795255 -42.8293076 63.8492546 8.1047974 -2.0907941 315.6244812 25.2636929 -5.8739009 -2.3379526 6.4208436 0.3209242 14.2523794 11.2794189 6.5669594 -22.7026653 -2.2621739 2.3573911 2.7205033 -4.4425001 1.7899809 7.8393741 0.4315768 -3.5042636 -4.4470983 4.0339499 0.2606975 6.9071007 -14.9196148 -10.3040409 6.7492909 4.0748096 13.9989805 -18.7423325 -14.4013567 14.1914263 -8.3115788 1.4541719 6.7165260 -0.3186458 0.6468558 -3.3145614 -6.3804998 1.0348594 -72.9254303 22.8416443 -3.5222979 -10.4036407 1.4905763 103.1316299 267.2067566 -0.1620977 -0.3883519 -0.7035626 141.8041687 29.2672901 -10.1493330 -68.0351868 -4.2662363 112.8398895 -23.6896229 3.2681742 -5.3920331 1.5090810 -44.9672852 -1.2982085 9.3276510 -7.0760331 -0.5521835 85.8324280 1.7549657 -16.9821510 -3.6694553 -3.5727572 3.4201641 -26.2075462 -3.9832280 -1.5535791 -15.5639601 418.4461975 -110.4103622 22.4593277 -3.3307440 -15.9795637 -115.6976547 -41.4060822 -63.9378853 -7.1106710 4.9480472 0.2366239 65.7491379 5.8205390 -7.4592772 22.4872341 0.3529398 11.9916105 -39.8983688 -2.8004231 -6.1631598 -0.8684181 127.7840576 5.7251201 0.1644752 -0.2971560 -15.9925880 5.2341237 0.1312647 -44.0613365 -1.6472195 1.9756452 2.6623034 1.1143866 -8.8111219 -0.7479174 -2.8215611 9.3030663 0.4226875 -3.2871139 58.6357117 32.4686089 -0.5219502 -1.8066857 2.9141150 48.2296600 0.5901922 2.8866277 -18.7857380 -17.5081234 -13.3652973 -7.8478608 -48.7093620 -7.5175409 2.9410667 -1.2630373 43.4800186 -8.8264322 0.4040619 -1.1703459 -1.8012618 0.3261896 9.6140738 5.5062461 2.9658530 -8.2308817 -5.3575573 0.1884840 -2.0451641 -0.0675871 -0.6256464 4.4256220 -1.4763407 -4.2403712 -5.7156634 1.0592210 -8.0029154 4.4304729 -12.0497303 -17.5952969 -9.2116718 3.9939103 7.1470051 -33.6190834 -39.2812195 -0.0432338 -0.3129326 -8.7851772 -49.9194336 0.6505321 1.4092917 -2.1724474 5.0669060 0.2410291 -32.2416115 -2.0320954 50.5973587 -8.2054062 11.1277447 45.9838524 260.7554932 -0.2237999 4.4914865 -1.4398092 -7.8079939 42.3550377 -14.3886223 -14.1184835 -0.9724463 -5.7909303 -6.4144716 -3.8827119 -8.9076052 1.1275805 -14.7690077 -14.2595196 -13.4539223 -10.5037670 -0.7885740 -12.1693850 4.3105426 -5.1098495 -2.7543960 -1.1995319 3.2326980 -25.2472267 1.3105857 2.2269220 -0.6078703 156.0604401 -32.8280869 3.6669526 -4.3383532 -12.2136927 -27.6842155 -61.6360703 -25.2562923 -62.9802704 -5.8712573 -0.0533372 -6.0802779 0.8193638 30.4881554 5.9441533 2.4806564 -6.4055443 -58.1563606 14.2044001 -9.2387066 0.0584225 112.1160278 6.7090907 4.5722895 0.9303448 -18.2105846 -28.8587074 -9.9321737 -20.4393311 2.8736587 -0.1671879 4.0404248 0.3653034 -3.8228414 6.9540176 0.4414462 9.3277559 0.9288335 -7.1828470 -31.9971237 -15.0762815 -23.8670254 -35.9148941 -25.7975502 -53.5744171 -63.3013496 -47.9508820 9.9455662 -70.6008759 -31.4349136 -26.9355450 -31.9947186 -148.8300323 -22.4394608 -0.6305034 -68.8963089 -12.9436026 -45.8243752 -29.9203148 -145.6517029 -834.7780151 -18.9208679 -190.6063232 -16.6948795 -473.4431152 -51.1144562 -60.9642830 -7.4566197 -31.9424114 -90.2869339 -15.4161444 -47.7949028 -108.9017792 -63.9747543 -15.9890938 -92.7925339 -12.8965425 -64.0033646 -15.5323477 -51.0779533 -31.9501648 -7.8730912 -92.5704498 -63.9634361 -63.9670410 -14.5896435 -279.8923950 -1072.4255371 -31.9831257 -446.0566711 -98.1838074 -24.5612564 -274.2492676 -206.8550873 -7.1191692 -5.4246016 -33.8167763 -22.6736393 -31.9660683 -39.7325287 -75.6149979 -31.4263248 -29.7769547 -61.1702499 -16.7613335 -533.4503784 16.0506687 -228.2620239 -53.7054901 13.4826002 -63.0664482 -77.1718445 -5.3507385 -49.0611725 -104.9621124 -106.4553452 -10.0337000 -15.9961824 -16.8784981 -31.9959278 -40.6803627 -49.3499527 -259.8202820 -30.6459274 -146.6623077 -44.9316559 -31.9965210 -34.7405357 -7.3474507 -104.7098846 -16.7530403 -24.7392960 -50.7348709 -1314.0495605 -61.1769104 -46.1732140 -61.1987343 -122.2750397 -706.0893555 -17.3104782 11.5213051 -21.5697937 -31.9694786 -129.2160797 -98.6447525 -383.5563049 -29.0990276 -64.7320557 -15.6716404 -15.9920998 -7.9998908 -75.5782928 -5.2695084 -127.7502823 -31.3506966 -16.7897434 -31.9893589 -41.9719849 -111.2145844 -7.8545246 -10.1016836 3.7803867 -31.8931160 -26.6083603 -15.2728434 -25.6545849 -6.1345983 0.3156946 -0.2038144 -1.4622425 -2.6295319 -4.0385032 200 16 5 0 0.1000000 1.0000000 -0.5710276 18.7520161 0.5920613 2.6863692 -1.9471474 -1.1981076 -1.8814205 -1.3246627 -2.4190915 -0.4274399 1.4535340 -0.9391261 1.8681396 -0.3801599 -0.4781401 3.8702645 1.0118128 34.7637482 -2.2540503 3.5792356 4.3821373 1.2358999 -2.5263555 0.1242628 -2.1987936 2.7414267 1.4347969 -2.8001204 2.0607696 0.5189249 0.5116698 8.6669302 1.0166337 51.3315964 0.6597801 3.8383524 3.4930041 2.1240866 -2.6361473 -2.5335274 -4.6951923 4.5298977 0.8983822 -4.3768392 1.6635321 0.0292025 0.2028699 11.3380728 0.5086936 33.8289833 1.7892029 -0.4096617 -0.1544780 0.9523614 -0.8459195 -9.0394592 -2.6921241 2.9734755 -1.1710253 -4.4344983 -0.1321232 -0.1936919 0.8195126 4.4486241 0.0913621 17.6149807 1.2108252 2.8474760 -3.0187337 -0.5156025 -1.8174189 0.4056022 -2.1038954 -0.2136584 1.3852463 -1.8151418 1.5583508 -0.6811851 -0.9374002 4.4654317 0.9579426 39.2500648 -2.2491043 4.2331896 4.2094631 1.2244155 -1.0966046 2.1124835 -1.8087057 2.4944072 1.7108804 -3.2103190 1.4839939 1.0163448 1.0869205 10.0854807 1.3239515 57.5325470 -1.2608311 5.2669077 3.3858211 2.2469110 -1.4124271 0.9420633 -3.7730553 4.3558102 1.7104527 -4.4188395 2.2542944 0.7758225 0.9529571 13.7734661 1.1897802 34.2361259 1.6921184 0.1665088 -0.3917626 0.9688451 -0.6477823 -4.2479010 -2.9716086 3.5624497 -1.1008084 -3.9546633 0.4914354 -0.3479931 1.1716808 6.1899056 0.0216634 17.8099728 1.7565804 3.2534904 -3.7869997 -0.5344932 -3.1721513 0.9780952 -2.2122808 -0.5653263 1.3980151 -2.4862432 1.3638626 -1.4283452 -1.1430819 4.8317528 1.1212007 41.7339096 -2.5713902 4.8273134 4.3300004 2.3469057 -0.8868710 3.1042683 -1.6576126 2.5819578 1.8453743 -3.2436657 1.8371632 0.5644445 1.2378342 11.0543575 1.6392864 59.4187508 -1.5519402 5.9951262 3.3908916 3.3633304 -0.5074340 3.2019031 -3.4805229 4.2823105 1.8043677 -4.4503531 2.7525678 -0.0231651 0.9922160 15.1825333 1.6075151 34.1953964 1.3333944 1.1196742 -0.3536306 2.2751462 -0.6729207 -0.6441439 -2.6581519 3.8540735 -0.6453444 -3.4370742 1.9313729 -0.6206194 0.8202233 7.9992070 0.2226125 17.2508469 1.7578737 3.3846490 -3.7961175 -1.4925679 -5.0483670 1.4709804 -2.0887921 -0.3155421 1.4250485 -3.2208834 0.9975085 -1.3227534 -1.0053819 4.9572449 1.1232853 44.5976486 -3.0751560 5.0891585 4.1858821 3.2601848 -3.1238773 4.0332046 -1.4377480 2.6926074 1.7685281 -3.2916484 1.8784510 0.3339886 1.5064282 11.8856220 1.5485997 62.3698158 -2.5414648 6.6957970 3.7108741 4.4143977 -3.8912981 4.7407069 -2.9966309 4.0460062 2.0997388 -4.3484221 2.7922659 -0.1617727 1.6140075 16.6028385 2.1859219 31.4421616 2.8215187 2.6829095 -0.2270837 2.6315563 -1.3562161 0.9499970 -3.1444163 4.9627504 0.3611408 -4.0405183 0.8841531 -0.7282214 -0.0333014 9.0477333 0.2762145 17.0875149 2.1893108 3.1705084 -3.4429040 -3.5847623 -8.2111378 1.7759184 -2.0109208 -0.1863452 1.1555306 -3.9892848 0.7558333 -1.5960214 -1.1355550 4.6222000 1.1387070 48.3545952 -3.4127192 5.1441998 3.9257958 4.1828938 -4.6603646 4.9444108 -1.2173579 2.8367603 1.5624335 -3.4552085 1.9412264 0.3699881 1.5965990 12.5612221 1.3903030 66.2092590 -3.5857294 7.0220766 3.5828991 5.3232517 -6.2934680 5.9143004 -2.4689171 3.7915924 1.9318479 -4.7491174 2.9246867 -0.3642921 1.8891919 17.5017719 2.4885786 33.9261589 2.0634561 3.2216671 -0.0089652 2.9146798 -1.5344104 2.0707757 -2.1380613 4.5854030 1.1350565 -3.7043810 1.7693934 -0.6429566 1.1272470 10.1102638 -0.1694240 18.4327660 3.3273721 4.5252414 -3.0167527 -6.5554643 -13.5246658 2.1722033 -2.9808168 -1.2194607 2.4302874 -3.4059625 -0.3391747 -0.7483422 -1.8017880 5.1821065 1.4004979 47.7720947 -3.2188380 5.9198647 4.0540061 2.3803949 -6.4506116 6.1912494 -1.4309200 2.9417036 2.0406888 -3.6651301 1.1452581 0.8271388 1.5751357 13.4016638 1.5661547 65.5741043 -3.1435366 7.8296418 3.8966093 3.8484535 -8.6953402 7.5085721 -2.6245158 3.7970779 2.3067231 -4.9306803 2.2386744 -0.0484192 1.9793315 18.4451542 2.1247187 35.9661751 1.2534238 3.7740974 -0.6459187 1.6500874 -2.5819550 2.4214671 -2.4973528 3.0709298 0.8989444 -3.4231203 2.3897643 -1.2269646 1.1287838 10.3458080 0.0684482 17.0910969 1.3415370 1.3891695 0.8785425 -3.6736042 -10.2063446 1.7601954 -1.0424320 0.5170659 -0.4826620 -5.6189208 1.3451980 -0.8913904 0.2208106 3.3691373 -0.0440062 47.0949364 -1.9920579 4.6146746 -1.6176282 4.4822783 -9.5250111 4.3126664 -1.6608652 3.6752548 1.0215974 -3.6870832 2.4749486 -0.8331496 2.2829852 12.3948364 -0.7135618 65.4266205 -2.1402247 6.5317230 -2.0943050 5.8500896 -15.3772154 5.4528208 -2.7903533 4.0862336 1.1189116 -5.4420824 3.8975630 -2.1113517 3.0721142 17.3725452 0.0929249 36.0413628 0.6809337 4.5181465 -1.0241252 3.3846157 -1.9571989 2.0148985 -2.1430531 5.1476998 0.8449936 -4.8059144 2.3617766 -1.6852689 1.4548993 10.6673288 -0.1359195 19.0056744 0.9149975 1.5917150 0.4239393 -2.6204746 -12.2353916 1.6578836 -1.0423841 0.5637665 -0.4054944 -5.1072598 1.7040039 -1.2461494 0.2550459 3.9057570 -0.6525989 42.6504707 -0.7050689 4.1347351 -1.5715064 3.7750719 -11.7413378 4.0143232 -1.9889235 2.5876977 0.3050755 -4.0211425 2.1501977 -1.7313803 2.0816109 11.5783587 -1.1108799 60.4673424 -0.2878783 6.1280403 -2.3053920 5.6377530 -15.6632347 5.9165015 -3.0382321 3.2569110 0.3618446 -6.1092801 3.2704039 -2.9945347 3.0601265 17.0843849 -0.8696702 35.9942436 0.6908110 4.1911077 -1.2633485 2.4207737 -5.5997329 2.5835805 -2.3395169 2.0909119 0.4973374 -4.1281533 3.2676339 -2.1472542 2.2223985 10.6712379 -0.5715994 19.4394531 0.9639868 1.1978660 0.1784793 -1.4607886 -12.3779259 1.9742382 -0.9261336 0.5387395 -0.9230200 -4.9443579 2.0069323 -1.5359286 0.4111519 4.0810308 -2.4299417 42.2358551 -0.8197541 3.4884191 -2.8014982 3.5328014 -14.9576178 3.8227341 -2.0543540 1.9698998 -0.9319202 -4.5049386 1.2673116 -2.4811110 1.9955025 10.8211241 -3.4564650 60.4871864 -0.6782777 5.4530845 -3.7908854 6.2569237 -19.7154408 5.6410980 -3.1597483 2.6134725 -1.1637121 -6.2599535 3.5082350 -4.0583749 3.0414031 16.0432205 0.3566967 33.7473831 2.6150815 5.0327253 -1.2521235 3.9961505 -8.6667585 4.1156812 -1.9145906 3.5632348 0.9624910 -5.9832220 1.8847426 -2.1071320 1.7354417 12.1691303 -0.7516018 19.5565796 1.0857131 0.7677495 -0.0604270 -0.8840836 -13.2870064 2.0283692 -0.9542890 0.5285446 -1.3581676 -4.7154841 2.2207634 -2.0257301 0.5315881 4.0407968 -2.8927212 38.6325531 -0.1534939 3.0137041 -2.6644509 3.6005993 -17.6714096 3.5610638 -2.3868051 0.8979425 -1.4215029 -4.2498574 1.9573381 -3.3490176 2.0693221 10.3604031 -3.6447101 56.8668709 -0.0164581 5.1492934 -3.9632545 5.4952254 -22.6132374 5.4768529 -3.3837218 1.4892710 -1.6104105 -6.5777006 3.4226830 -5.2893791 3.4352121 16.1466274 -0.5087420 38.6477127 -1.0772676 5.8046751 -2.0413787 4.6346908 -12.5466557 0.4842595 -3.4015150 2.3879571 0.4073273 -4.9619584 3.5906661 -2.0667458 1.5455599 12.1082487 -1.2110060 19.6510258 1.1772585 0.5721549 -0.3010516 0.1316877 -14.0960302 2.2027993 -0.9238172 0.5186369 -1.6553837 -4.6276946 2.3498905 -2.3313143 0.6355669 4.2357168 -2.7393019 35.8808746 0.8263680 2.4325166 -2.5575230 3.1113358 -20.2207565 3.9083531 -2.2943959 1.3349910 -1.8920115 -5.0228152 1.8092693 -4.0916243 2.0658731 10.1479120 -3.7171786 53.9597168 1.2378614 4.2171464 -4.3826394 5.0172911 -22.4150848 6.1243734 -3.2568023 2.7133760 -2.5408969 -7.4148474 3.4544888 -6.0180211 3.3277504 15.7449121 -4.5985231 22.5345459 4.1101141 4.3394628 -4.7437344 2.0846078 -6.2702022 4.3891616 -2.4420774 -0.5607494 -0.9149880 -5.3866191 2.1869409 -8.3476076 2.5830770 11.2344666 -1.2126269 19.7293205 1.4541453 -0.3989968 0.0723336 0.7792770 -14.8816738 1.9269582 -0.8262139 0.5587872 -2.5380883 -5.7213907 2.3107669 -2.5418093 0.6541635 3.8616533 -3.6768942 36.4921379 0.7100044 2.3793960 -2.3784986 1.8952338 -21.3963146 3.4754536 -2.2260866 1.6578754 -2.2861106 -5.3664522 1.7735809 -4.5019164 2.1479602 9.8183908 -4.4175458 56.1953354 1.2358902 4.3804355 -4.7001801 3.4928350 -50.3995171 5.3622642 -3.5848739 2.2147202 -2.7940617 -6.7071657 4.6515517 -7.6810350 3.2802148 15.5421553 13.4125566 10.6411276 -1.4018589 3.9175329 5.9680395 -1.7318227 7.5061460 -0.0406383 -5.7414832 0.2961349 0.2858233 2.3208208 6.6058598 -5.7449160 3.8299675 13.4998331 -1.6134157 19.5282421 1.8614699 -1.2261983 -0.4054743 0.1627067 -15.6187353 2.2910316 -0.9132966 0.6532808 -3.6820481 -5.9971738 2.5589931 -2.7751775 0.4292449 3.2520108 -4.0708561 36.1092072 1.5316699 1.5945015 -3.1369116 1.3774236 -25.2392845 4.2086186 -2.2864547 1.2501864 -3.1473019 -5.9857163 2.2827475 -5.1757851 2.0348954 9.3569889 -6.1179104 54.2416382 2.3932812 2.8955538 -4.9640121 2.5108786 -27.2896881 6.1395040 -3.4098918 2.0274942 -4.2085681 -8.5576630 3.6021063 -7.6437321 3.4453285 14.6383219 -3.8433118 34.8413391 3.5736918 2.0143294 -4.6476951 1.5651867 -5.7699952 3.5697746 -2.7475986 2.3734579 -2.7603397 -5.7230430 2.4063416 -6.6909714 1.9877111 10.2325115 -2.0542824 19.2024708 2.4424636 -2.1236494 -1.0583956 0.8191262 -15.4988546 2.1876571 -1.0853919 0.3989439 -4.3453221 -5.6701374 2.4430759 -3.7519357 0.2949470 3.0549138 -5.3769593 36.9380302 2.1541986 1.1860888 -4.3362083 0.8022300 -31.4085655 3.8853128 -2.3768919 0.8768445 -3.9730046 -6.3391113 2.0012991 -6.9693604 1.9438740 8.9685440 -8.3336611 55.5949135 2.9381225 2.2318087 -7.1745753 2.3593431 -49.6390190 4.5619006 -4.1596236 0.2044155 -6.0720129 -8.8210707 2.8076458 -10.2455378 3.0643117 13.7353153 -4.2625518 8.7571192 4.4374862 0.8796889 -0.1954902 -12.1374273 -5.8606629 6.6334248 -3.2808998 4.5547585 -4.1712756 -3.4510648 -0.1027892 -2.9104652 2.4300604 6.6522517 -2.5701141 19.3482132 2.4145675 -2.9524026 -1.2362220 0.3978555 -17.0543232 2.0267296 -1.1960163 0.2788752 -5.1447806 -5.6089373 2.4194400 -3.9492526 0.3020591 2.6828122 -6.1520925 36.4955025 2.6568112 -0.1011013 -4.9094100 -0.3915206 -46.8762589 4.0445991 -2.5077088 1.1334417 -5.3618121 -6.7134113 1.2536829 -7.2268925 1.6477946 7.9361730 -8.5456676 56.3635712 4.1393318 1.3345886 -7.7679648 0.5087302 -67.9289322 6.6039896 -3.3803825 2.6818779 -6.3617134 -10.2238817 2.3784394 -9.0241947 2.6924984 13.5298967 -4.9550734 33.9375229 2.4695742 0.8524352 -3.6903384 5.4401565 -9.6839399 3.1648448 -5.1318674 1.4699113 -5.7538919 -2.7579205 5.0899310 0.4168425 1.2041312 8.7320004 -2.9807491 19.3560390 2.8102751 -3.7591412 -1.2491306 0.2428662 -18.0978031 2.0429988 -1.3117937 0.5185475 -5.9968834 -5.4667664 2.4156210 -3.8436487 0.2875009 2.3142996 -6.6955042 36.5500641 2.6581175 -1.1831012 -5.3232560 -1.3940896 -69.5793381 3.8653309 -2.5062845 2.1426184 -6.7139330 -7.0824280 1.0280948 -8.3530502 1.6234673 7.2343955 -10.3392115 55.2877502 4.3828158 0.0389900 -8.6703606 -0.3679996 -60.9369774 5.7309308 -3.8371959 2.7234313 -8.6111145 -10.3235655 2.5357380 -12.3392000 2.5069916 12.1467371 -7.9117198 38.3086128 6.2513304 0.6595852 -8.3241272 9.6499166 -8.0429888 2.5805109 -4.9483271 -1.1118646 -4.8865151 -2.5031955 6.8819962 -5.1593742 0.4386436 9.9100828 -3.2457502 18.9914646 2.7639856 -5.8432870 -1.0514667 -0.1914252 -18.0040665 1.9107748 -1.3879577 0.6905716 -7.7649570 -5.1700215 2.5814121 -3.8149536 -0.0332812 1.4567987 -7.9421682 36.2360573 2.5460820 -2.3406901 -5.7356987 -2.5360675 -74.9457703 3.9055846 -2.4282045 1.8894089 -8.3251162 -7.2975154 0.7392224 -8.7415800 1.3669049 6.2740545 -11.7787304 56.6434860 2.0693700 -1.4226806 -9.0179501 -2.6705635 -52.5512657 4.7961359 -3.7214501 2.7765903 -10.4639225 -9.5045509 2.9345531 -11.3524904 2.7198470 10.8762817 -17.6840839 20.3828068 8.3724413 -1.7100873 -4.2562723 -2.0593498 -11.2184401 -2.3485060 -8.6887035 2.0766106 -14.7555676 -4.6914725 -6.1577926 -6.9264760 -0.4879391 4.9227781 -3.7632327 19.4194374 3.2391663 -6.4758601 -1.2292776 -2.1810427 -20.0265293 1.8921722 -1.5829512 0.3454360 -8.4956121 -5.3031478 2.7539771 -3.2851324 0.0575629 0.8870910 -9.0566664 35.1533699 3.9267907 -3.7124043 -7.3440080 -4.1523380 -139.1839294 4.0915642 -2.4830785 2.9184685 -10.3621178 -8.4110050 -1.0461226 -10.3030653 0.5229157 5.0475159 -14.2164068 53.4411812 5.5918140 -3.4244661 -10.8062820 -2.9737711 -77.9323807 5.1375332 -3.9687085 3.8651545 -13.9860039 -11.9678755 0.8890875 -15.9417028 1.1054010 8.5413799 -3.9152703 33.6445656 1.2721014 -0.7664439 -8.0982447 4.4245763 -22.9857178 2.4359260 -4.2761769 2.4271026 -6.9757276 -5.2572618 2.4295957 3.2247810 1.5658875 10.1816378 -4.7251630 16.9016380 3.8530605 -8.1161470 -2.3925822 -1.5901505 -19.0661068 2.0106978 -1.5301780 1.1995469 -8.8639717 -4.8295598 0.1539760 -2.8263571 -0.5775017 0.2551529 -11.0392084 31.7146091 4.1220908 -5.1596155 -7.3538079 -4.3304563 -59.0995216 4.4046187 -2.4271817 2.9278002 -13.3155565 -7.9926405 -1.8360888 -10.3226881 0.4485956 3.1027658 -15.2249537 50.5668831 10.6567564 -4.6216059 -8.0988178 -4.5249023 -70.1336517 7.4166508 -4.0954452 4.3789816 -12.8176489 -14.0440197 -4.1857839 -10.0827475 0.3557922 8.3967676 -25.3997192 1.0634958 11.5296068 -2.5039213 -7.0846906 2.6486197 2.1763878 -0.0228823 -8.5576324 0.6409077 -9.3820744 -1.4674323 5.6742578 -23.9495029 -6.0550838 2.9927540 -4.7923794 18.0563831 4.2379832 -7.0987744 -2.1795361 -5.7665124 -21.9111977 2.2881217 -1.7785261 0.5021920 -8.7104492 -4.7041397 0.9194548 -2.7036300 -0.2809304 0.1387314 -9.9770947 33.3734512 7.9324059 -4.2284207 -8.1855822 -6.2218556 -105.7678070 5.8527193 -2.5589521 4.2319088 -11.8857908 -6.8334179 -3.7290769 -9.1464520 -0.9609551 4.6767879 -15.0632801 50.6990166 12.7119999 -5.0884557 -12.1018200 -5.1447401 -69.5566101 8.1352482 -5.2105103 6.7339439 -16.9766598 -9.7202921 -2.1210973 -11.3095436 -2.1088538 7.6307092 -11.8239079 34.2985115 2.9702845 -2.6629884 -4.6213212 -0.2588595 -13.2905407 2.5921671 -4.5117769 1.1082150 -16.9159374 -8.5419226 2.9896312 3.0444582 2.3936853 6.6115189 -5.1006799 18.2784405 4.7743583 -7.7331662 -2.6331782 -10.1591949 -27.1931610 2.2682874 -2.0105734 0.5934067 -9.6566296 -4.6082792 0.5438023 -2.9543855 -0.6613961 -0.6976871 -11.4952946 32.4127617 11.4997902 -5.5389166 -8.9360199 -7.8642006 -94.7047501 6.5077295 -3.3750756 3.5249946 -13.6955385 -7.7381878 -5.1364942 -7.8548751 -3.4825199 2.9979448 -16.4640388 49.9102058 14.7603741 -6.8461361 -12.9870644 -7.2092881 -47.2807388 8.4474220 -5.3563471 5.7644973 -18.9534397 -11.7578077 -3.3871729 -9.0265245 -3.9964173 5.7836456 -11.4981651 36.5035133 1.0093307 -6.0974660 -6.0563216 -0.5342370 -20.1088657 2.6212101 -3.7148111 3.5095379 -23.1686478 -7.8617320 4.4397931 2.4997487 4.5071697 4.6436830 -6.1826506 18.5465031 4.8601236 -8.2743626 -2.8221695 -14.8399792 -26.0142040 2.3914328 -2.2726436 -0.5260079 -10.8256035 -4.3677721 0.3716873 -2.0727470 -0.7184469 -1.4411496 -13.0659618 32.3649979 14.9576263 -7.5659151 -9.7708817 -12.1011200 -75.1126862 7.3521919 -4.0160818 2.7438014 -16.1424427 -9.7263021 -7.8182149 -5.9968057 -6.3044395 0.7468325 -18.1437817 49.8936806 17.9846783 -10.7664967 -14.8446398 -12.8212662 -38.1324196 9.6601553 -5.7485323 5.2358041 -27.4039745 -14.0728340 -4.9312124 -7.6782141 -6.1943121 2.0383563 -8.8699141 34.5668449 4.2936273 -2.6182456 -9.8414268 -1.8984648 -13.1395741 2.1185312 -3.9962871 2.9251294 3.3949623 -7.9715519 3.5767415 0.0894797 6.4358668 5.6328683 -7.1069703 18.5935078 4.9348221 -8.8052654 -3.3922522 -20.9539261 -24.0275726 2.2127342 -2.4980283 -2.1490657 -12.0384769 -4.2921767 -0.1848618 -1.3999535 -0.7561660 -2.2118134 -15.5966501 32.4316711 15.9043198 -10.0500889 -9.7450247 -18.1373882 -51.7272758 6.5329995 -5.0985856 -1.3027370 -21.0082054 -10.8458614 -10.6430035 -3.6630087 -6.4582195 -1.9100062 -23.1622391 49.5651207 18.6254673 -13.4195127 -13.4006939 -20.2954960 -37.8058281 7.9452996 -7.5448947 -0.8259929 -37.1216774 -16.0713062 -10.0621367 -4.7814178 -4.0683494 -0.8567213 -9.9246292 38.9679642 10.5540752 -6.2489638 -7.0735488 -5.0284767 -81.9652100 -0.5253713 -9.4043884 2.4766848 5.5085044 -6.3525314 3.5979757 -3.5312963 2.7488461 -1.2903138 -7.2022896 18.7272415 5.1101055 -8.6130066 -3.5625644 -26.8588638 -25.2099171 2.4802468 -2.6432605 -1.7807838 -11.9706659 -3.7288902 -0.2627053 -0.1741051 -1.0951241 -2.8321311 -16.5516949 31.4004002 15.2957945 -13.6901321 -9.2385712 -50.8066254 -40.3675919 5.9715028 -5.6316218 -4.5696750 -28.4745903 -12.3658304 -12.9828634 -1.5356759 -6.1393332 -5.2522898 -24.3979340 46.5677872 19.1933517 -19.5386791 -14.0762253 -56.7768822 -43.4392586 6.5278368 -8.0857124 -4.6890388 -48.8129082 -19.8803673 -14.8059082 -3.2546647 -3.9621816 -6.6129575 -7.7206378 37.9482079 6.6110969 -13.0505667 -11.9029551 0.6784034 -102.5208969 1.9356548 -5.6341834 1.8155913 8.9171438 -12.4288387 2.6620483 0.5930918 11.4857368 -3.1552515 -6.5890398 20.9444885 6.7917514 -10.1150007 -5.2234716 -18.3270359 -22.6274071 1.3834816 -3.8087239 1.0545697 -13.2449579 -2.2358415 5.7823405 -2.1321261 -1.0900424 -3.5067568 -5.6697340 19.5438786 7.2087178 -11.4938908 -3.1045563 -7.1098919 -97.8310242 0.1459784 -3.6081259 1.1325958 -16.4146500 -4.9176545 2.5142963 -4.6140909 -0.4852410 -1.2983452 -6.8411231 19.0112553 6.0731335 -8.6977577 -7.4651995 -12.8754826 -29.1231689 -1.5852243 -2.8198950 -1.9610114 -25.7495937 -6.9089518 -0.2715827 -5.0837893 -0.2663877 -1.4705838 -30.8775120 36.9218063 12.2569542 -18.6106586 -19.8057938 -24.5758629 -25.4378719 -7.6880989 -7.9423585 -1.7418106 13.5996437 -16.0141296 -2.3235552 -4.8804698 5.7426515 -26.1816597 1.7246398 0.3957011 -1.9902135 2.9917576 0.9307458 0.7413061 0.0171116 0.3363010 -0.1224768 -0.2256344 9.7578297 0.5940439 3.0076871 1.1066723 -9.7028570 1.6597241 2.5928872 1.7002228 -0.1887831 5.0747795 1.4493985 4.4359293 1.9785643 -0.4707253 -0.8979587 -1.9754286 19.0894623 0.9856420 7.7067237 2.6578395 -19.3996391 1.8676559 3.2554111 1.9488213 -1.4618424 6.2812414 1.1146299 4.7412448 3.7713335 -0.4617263 -1.1625394 -1.5284511 26.3478546 2.0063410 7.7874660 2.3059628 -29.4122124 1.9075528 1.0746022 0.0400476 -0.8713504 2.2563205 0.2054252 3.2177987 2.5448532 0.2887044 -0.5956693 -1.3666447 13.5550871 2.7996197 2.3784733 -10.8166533 -19.5226154 0.8666723 1.5715067 0.8261195 -1.4451907 3.4564128 1.2855831 2.1236928 0.2296628 -0.0307172 0.0014505 -0.4038862 10.2836342 0.0099232 3.1944640 2.1597283 -9.7829342 1.7465004 2.1584218 2.3787520 0.4495001 5.8103566 1.4092989 5.1122804 2.2590873 -0.6773165 -0.7645316 -1.2348682 20.3393536 0.6302879 7.6346359 5.5925970 -19.3887997 1.9843208 3.0168982 2.8853717 -0.7411986 7.4787173 1.7903000 6.4581885 3.6486602 -1.0411488 -0.9110524 -1.1448598 28.8623505 1.2609707 8.1564083 7.2139893 -29.2156811 2.4731989 1.1466504 0.0347735 -0.4380456 2.2176843 0.7644951 2.2972493 2.8374469 0.2419783 0.2638766 -0.7823622 16.3655510 1.7948098 1.4626280 -1.5205488 -19.4851761 0.1915626 1.1763858 0.7198191 -1.2576349 3.7566109 1.6633195 3.2208600 0.3311672 -0.6977550 -0.1670179 -1.2445084 10.6257124 -0.0572034 3.1361589 3.3603511 -10.0003424 1.7291255 1.9939454 2.3375878 0.9503863 6.2777619 1.7114328 5.8838201 2.8186865 -1.5317454 -0.9113353 -1.4256811 21.0040665 0.3742447 7.5325198 7.3309669 -19.6381664 1.9964738 3.1226804 3.0058019 -0.0121514 8.1715279 2.5185289 7.5134635 3.9832013 -2.1980267 -1.0534798 -1.1007528 30.1441536 0.6494896 8.6739006 9.1578760 -29.3229980 2.5502679 1.4244210 0.7328944 -1.1759442 3.2507443 1.5408142 3.7229135 2.8042774 -1.0638691 -0.1240979 -0.9431798 17.2600422 1.1429801 1.3680297 0.9967218 -19.2909031 0.6572672 0.8753250 0.8476004 -0.7464705 3.7721772 1.9491574 3.8058040 1.0425267 -0.7940705 -0.1226800 -2.0835240 10.8654442 -0.2542228 2.9313042 4.6579523 -10.0955772 1.6132830 1.7933233 2.1465812 1.9389869 6.5564165 1.8820069 6.2244787 3.3765101 -1.8731884 -1.0224501 -3.2449498 21.5954227 -0.0240879 7.0225115 9.1202869 -19.9516830 1.9036361 2.9334848 2.7365043 1.9112918 8.9919682 2.6272969 8.3028316 4.4700489 -2.2356615 -1.1045316 -3.9050326 31.4362183 -0.1239360 8.5736599 11.2864285 -29.7139587 2.8605101 1.6485292 1.1652803 -2.6270058 4.1313486 1.2727690 3.9819751 2.6344116 -2.0144336 -0.1755770 -1.8668801 18.1865234 1.7673211 2.2210746 1.3592952 -18.6544418 1.4341888 0.8080591 0.8534622 -0.4449927 3.8367653 2.4245093 3.9565849 1.2914032 -0.9840519 -0.2064707 -2.8005631 11.1458378 -0.4347570 2.6742072 6.1027713 -10.1763144 1.5643488 1.5098366 2.0953305 2.8045611 6.6330395 2.0054317 6.4504795 3.7659218 -2.1348112 -1.2184075 -5.2172780 22.0117722 -0.3353783 6.3280106 10.9310322 -20.2302494 1.7978724 2.3924558 2.4650929 2.9319355 9.4324675 2.8791323 8.4495277 4.6907730 -2.5981581 -1.2690222 -6.9407115 32.2190094 -0.7465084 8.1247644 13.3632097 -29.9077854 2.7758129 2.6280074 1.4480397 -2.1773522 5.0466151 2.3248672 2.3766601 0.2435022 -1.3724002 0.5462708 -1.9357331 20.0730648 0.3994741 2.9939339 3.1788435 -18.3854713 1.8432777 0.8797520 0.3085584 -1.5675268 3.6295052 1.9746785 3.1591377 0.7720258 -0.0668036 0.5351675 -2.4747288 11.6033239 -0.2590605 2.5895801 6.0980625 -10.0111399 1.6399217 1.6063995 2.2272668 2.1835506 5.8670902 1.7649940 6.0684743 4.2763300 -1.5941987 -0.4626175 -6.6469870 22.1506577 -0.9748716 6.8349257 10.1399040 -19.7807198 1.2345293 2.3903210 2.4908092 2.0306106 8.7668056 2.8121817 8.2970638 5.0587797 -2.5170798 -0.4331227 -8.9047222 32.3975487 -1.5563385 8.8029451 12.6236725 -29.3476124 2.0484281 2.9852817 1.1373293 -2.0456846 6.0214238 2.2369263 2.7749012 0.8921791 -1.3293658 0.1768757 -2.8437705 21.2480736 0.8373879 3.6321292 4.9129510 -18.9252434 2.0918036 0.3531901 0.0936076 -0.5758411 3.5312135 2.7398260 2.9215996 1.8264005 -0.7833002 0.0652456 -3.6054449 10.7880411 -0.2060320 2.2264197 4.7355776 -10.1758089 0.8665333 0.6632597 0.8523759 2.3424566 6.8778811 1.9825571 4.8874917 5.0992489 -1.6077105 -0.6375145 -9.4737825 22.1705418 0.0694476 2.6630192 10.1668005 -20.9464912 1.7566580 1.4131720 0.8510289 2.1699524 10.0695362 3.5678933 5.7435389 6.0801926 -2.3491600 -0.4545258 -14.5123148 32.9350090 -0.2414011 3.7124450 13.3213472 -30.6575737 2.6304760 2.3955286 -0.0772145 0.0148371 6.5285029 3.5187902 2.4120293 5.4889479 -0.8487090 0.4301967 -1.9934341 21.2422562 -0.7089432 1.8704387 5.0336566 -20.2642651 1.7034281 0.1244605 -0.1276399 -1.0893651 3.3824944 2.6714590 1.7464629 1.1238025 -1.1080261 0.2617256 -4.3086467 10.7155218 -0.2770188 2.1843674 3.7335093 -9.9837456 0.5376733 0.0534461 0.3353978 0.5855916 6.7750001 2.2715693 2.3673716 3.8956048 -1.8933235 -0.0452690 -12.0401869 21.9992275 -0.3967531 2.3953958 8.5554190 -20.3183556 1.2109177 0.6342018 0.3227045 0.2162927 10.3030262 3.7745512 3.4101284 4.6870599 -2.7719326 0.2734009 -16.0293579 33.1645699 -0.7374519 3.1099274 11.7395191 -30.0146542 2.2136276 1.2499453 0.1372440 -0.9500573 7.0417190 2.7938104 1.2440112 2.0763109 -1.3211105 0.4203673 -7.8790531 22.0786228 0.7006280 2.0268364 4.9314723 -19.9424400 1.7919605 -0.2937340 -0.5105155 -0.7686045 3.2766416 2.7986865 1.2629050 1.1963676 -1.0669879 0.1451527 -4.3313851 10.6971130 -0.2270969 1.8018305 3.9073832 -10.2358627 0.1633546 -1.2054986 -0.3250381 1.2016335 6.6207347 1.4604468 1.2605940 3.8095365 -2.0561645 -0.0803247 -15.0068245 21.8208275 -0.7733310 1.0385513 8.4006042 -20.9140873 0.4984086 -0.9360081 -0.3893022 1.3158219 10.0900688 3.8054018 1.8932117 4.3239856 -2.9917107 0.1973561 -19.4898491 32.8160934 -0.9181511 1.6602416 11.7020807 -30.6838169 1.1243981 2.7398679 0.2139835 0.9861532 7.3900709 2.3532832 1.2555684 2.4243305 -0.8562555 0.3990444 -9.7767448 23.1753407 -0.2747995 1.4058878 5.5369081 -21.6548176 2.0857618 -0.6346823 -0.8009804 -0.9077615 3.2367558 2.9307449 0.2232937 0.9444921 -1.3065517 0.1025782 -4.7242403 10.7335606 -0.0123282 1.4506534 3.9059167 -10.2598906 -0.1046331 -1.8241891 -0.9216716 0.0337072 6.3418603 2.0949790 -0.4035104 1.6996188 -2.3203866 0.2959668 -17.0743408 21.5755405 -0.6105227 1.5134629 7.0292044 -20.6597424 -0.2201945 -1.8457574 -1.5479133 0.2810788 10.2373323 3.8067889 0.0561789 2.9872823 -2.9924221 0.6892688 -22.0954723 33.1402740 -0.9218780 1.7656654 10.3833246 -30.7756081 0.5649061 2.8364015 -2.4349229 0.9163231 7.9261947 3.2671957 3.2652729 5.6961317 -0.6446726 0.1603437 -11.3259163 22.9207897 -2.7796459 0.9912769 5.1224575 -20.8687534 1.9679346 -0.9173327 -1.3339243 -0.8471640 3.4114163 3.0704441 -0.2806327 0.8663797 -1.2151450 0.1481717 -5.3333826 11.0025692 0.0056104 1.0853300 4.2032523 -10.4007645 -0.1232416 -2.5469692 -1.4496018 -0.9651890 6.0903835 2.3296700 -1.7560688 1.5359290 -2.4770734 0.5012053 -20.1174946 21.5104694 -0.3586829 1.3193458 6.8007259 -20.5400696 -0.7857548 -3.2265565 -2.3801458 -0.9736679 9.8748522 3.6355419 -1.8280001 2.8327148 -3.4032426 0.8532848 -24.8354950 32.8786583 -0.8105128 1.3732657 9.7096519 -30.7519608 -0.4925154 -2.5398080 -3.2422438 -2.3190432 7.3832378 2.4481800 -0.5271152 0.9254442 -2.3494201 0.9430293 -5.9343033 21.7252026 0.1518512 0.6673908 4.2572579 -20.4105415 0.0456446 -1.6708440 -1.7462096 -1.0843332 3.5412464 3.3831244 -0.8220598 0.7900862 -1.3555387 0.1273056 -6.3586545 10.8951645 0.4878413 1.2892780 4.2089829 -10.4291582 -0.5242509 -3.7686296 -2.1634686 -0.9111969 5.9562716 2.7664115 -3.2452598 1.7536672 -2.7131040 0.2743337 -19.0139942 21.4312592 0.1702769 1.1384388 6.7173719 -20.4274120 -1.6443368 -5.1014366 -3.9216049 -1.9889126 9.9910269 4.5788789 -5.1642365 2.7560179 -4.4098253 0.3995369 -30.0639877 33.2626915 -0.0172065 0.4826058 11.4667234 -30.0869408 -1.4868770 5.4275975 0.3535615 -0.8791924 9.1823931 9.0655088 -16.6434002 1.7836214 -3.7019925 -0.4232951 6.4514370 24.4381542 -1.2318788 2.5828023 0.9161291 -22.4213314 0.8716501 -2.2660313 -1.6840049 -1.6909579 3.2281756 3.3109202 -1.5065309 0.8970177 -1.6659902 0.0101248 -8.0728788 10.7341413 0.5659878 1.1921163 4.3620744 -10.3748293 -1.1283273 -4.9122877 -2.4050684 -2.3287587 5.6963601 3.1523271 -3.8049784 1.3341475 -3.2923951 0.3573108 -29.5723686 21.2918110 0.6566383 1.4026324 6.9715095 -20.3144379 -2.4099195 -6.9456635 -3.7958539 -2.9171150 9.3262262 4.5170455 -4.7512388 2.5217767 -4.3088870 0.7856187 -170.7106628 32.7373199 0.5520065 0.9213881 10.3847942 -30.3985100 -2.3423817 -3.6888375 -3.8118441 -3.1216326 7.0500011 3.0888956 -2.9283731 1.6650324 -2.0798020 1.0788504 -64.2798080 23.1705551 0.9302459 -0.6251360 6.5119300 -20.1970730 -0.0552289 -2.9199283 -4.1493144 -1.7016821 3.1382892 3.2370079 -2.4530795 0.4973812 -1.2603050 0.2632137 -9.8206625 10.6805582 0.6022376 0.5246671 4.1786714 -10.4272184 -1.1700368 -5.9085832 -5.5212002 -1.7138100 5.1109409 2.9376812 -5.6003633 1.1604054 -2.7394228 0.2819482 -26.6728802 20.9764175 0.9465099 0.0911410 7.0506029 -21.0176449 -3.2189388 -8.1862135 -5.9329529 -1.4048558 8.5760813 4.9242420 -6.0047655 0.8185695 -2.9734657 0.7873200 -30.3657322 32.3627548 1.0049294 0.4406548 10.4723835 -31.2781658 -3.7066174 -9.8090477 -5.1598625 -4.2336698 6.5175314 -7.7774496 -2.5874634 -5.4698014 -4.5007730 -0.6960746 -13.8255262 19.5204830 3.5040791 -1.3031859 3.5463421 -21.9198322 -0.9101636 -3.6955526 -4.6796827 -1.8506134 2.6948376 3.2439890 -2.7754271 0.1818489 -1.4822146 0.1148484 -10.8553171 10.4503222 0.9599032 0.3872033 4.2889571 -10.4873447 -1.7168779 -7.3502865 -5.7787371 -2.6239171 4.1696024 2.3604038 -6.0450354 1.0452155 -2.9980485 0.3191190 -35.1312218 20.3821526 1.2299600 -0.2836101 7.3988771 -20.9162102 -4.3277407 -9.8943205 -9.0170212 -2.5582545 8.0096598 3.4574919 -7.1841164 2.5437002 -3.3620105 0.5280555 -67.2063980 31.9251900 0.8534334 -1.5242603 11.9889097 -31.9845390 -4.5818243 -14.3733835 -14.1111546 -4.5389323 4.6850080 1.3637526 -6.6053963 3.4111807 -4.4232216 -0.1886877 8.9250059 19.6062965 -1.7584671 -6.1801825 5.3133388 -19.3877220 -4.6436572 -4.3498664 -5.2390542 -2.0715172 2.5173748 3.1527824 -3.2033720 0.3976928 -1.4374897 0.2092493 -12.1883955 10.4983025 1.0670142 0.3612781 4.3722053 -10.5020599 -2.1515310 -8.0666008 -8.1120319 -2.9694674 3.3082292 2.2564318 -6.9445009 2.0670125 -3.2096107 0.4388694 -38.7542000 20.0901222 1.0040748 -0.8507266 7.1815801 -20.8622036 -5.5185843 -11.9678793 -9.6333723 -4.9544382 6.7267356 4.6260138 -10.8203354 3.4868746 -4.8231673 0.9185209 -49.2937813 31.3218422 0.7045885 -2.4368820 11.6779671 -30.6607094 -6.5093064 -11.9796715 -31.2811680 -1.5667328 5.9218531 0.4236445 -3.1931033 3.6011965 -1.1625363 0.0557457 -1.4781117 19.4720745 -1.8981262 -8.0849342 2.8509717 -20.1254692 -2.8125536 -4.9839010 -5.1419029 -2.1144741 1.7162195 3.4981446 -3.2447591 0.3040138 -1.9223675 -0.0483384 -12.6982241 9.8448677 1.4471242 0.6936251 4.2424808 -10.6282797 -3.0894532 -10.0454798 -9.6732101 -2.4076550 2.3488955 1.7103266 -6.9300680 1.5402021 -3.3441215 0.2168483 -41.5680122 19.3628311 0.8126348 -1.5224870 6.7833757 -21.3475342 -6.9721918 -13.3937912 -12.6515656 -1.5093893 5.2207651 3.3603237 -9.2459307 3.0116022 -3.3864057 0.5805380 -55.7673721 29.9958229 0.1365514 -3.0620956 9.5359745 -33.0246086 -8.2820854 -3.0038154 0.5136493 -10.3641329 10.1597443 0.1499882 7.8790889 6.3624253 3.9991927 1.2850807 -1.5321895 26.4471550 7.7714734 13.0352221 15.6396780 -19.4465008 3.6197569 -6.0720339 -11.4929419 -2.1368268 0.8392274 2.8576806 -2.8095648 0.1044551 -1.3627957 0.0964913 -14.2648592 9.4815235 1.6610363 0.2259281 4.1620040 -10.6599035 -3.9744902 -12.4281969 -17.4562035 -3.8814859 -0.1622351 1.2285608 -5.9631915 2.3584752 -3.7426736 0.2555118 -66.4605637 17.4643612 1.7942772 -1.4796555 6.7996216 -20.7194214 -9.3121462 -18.2838745 -21.0136089 -5.1744981 2.4423320 3.4995718 -9.9321899 3.4421377 -5.4059911 -0.1160340 -67.2487640 27.4634380 3.0133748 -2.1763663 10.4020119 -31.2563648 -12.0047827 0.9286903 -21.6055279 -5.5965471 6.8719544 0.6182221 2.0972090 0.9456385 -2.9670327 0.0340042 5.6770916 23.8753548 2.5069480 -4.6939702 6.4294963 -22.8038864 2.9295561 -6.4510369 -12.0511761 -0.6143949 -3.0602927 0.9585081 -3.3878839 1.4157709 -0.9517935 -0.5532190 -15.6942415 6.6159654 1.2585734 -0.1300181 2.6443861 -11.2724838 -6.3930697 -13.6970453 -38.8404770 -1.4711818 -4.3106413 1.2345051 -6.9721642 3.5922778 -2.2244430 -0.3531155 -35.4035950 13.2899818 0.4476993 -2.9565649 5.7103291 -21.3593998 -14.5944700 -18.3218765 -15.6440020 -4.6850824 -0.8435450 2.5990157 -6.4674835 2.5173626 1.7338475 1.9629316 -53.0418816 25.3871040 3.6781867 3.4444056 8.7188911 -31.4880333 -12.1166916 -25.8659821 -4.2296462 -0.1063788 7.9665117 -0.0511471 -14.8123560 4.4261456 1.5883605 0.2672578 -0.6842726 20.1233082 -1.7241851 -3.9295397 2.5160315 -21.2133408 -1.4526855 -8.2383308 -7.2779379 -2.1947246 -1.8565252 0.5271049 -1.9430871 0.4939111 -1.4452999 -0.0210970 -14.9375916 7.5823441 1.7790321 -0.0533709 3.5017281 -10.3868513 -6.3247442 -13.6365414 -10.6723080 -4.0944033 -2.0373671 -0.2495958 -3.8813968 3.0238748 -3.4086833 0.4200483 -35.5579529 16.2170181 1.1971598 -2.2850668 6.8261924 -19.3278866 -10.9246750 -17.8327065 -12.5267525 -5.0106187 -2.1070235 1.9375418 -7.1898732 7.4336538 -4.0769997 1.0651680 -30.4393234 24.3462276 0.1044728 -5.5048089 10.0038223 -30.5986538 -16.2639790 -15.0551395 11.0871191 -4.6644087 1.2912508 4.2764101 -7.8127618 0.2316542 -2.2042024 0.5300503 -5.9985561 19.5864162 2.1122386 -3.9098420 7.1743646 -22.6828289 -15.4504356 -9.2302456 -2.9300127 -2.9333799 -3.5710692 -0.0159229 -1.8699580 -0.5496231 -1.7810279 -0.0241322 -16.9844036 6.6966348 2.2000492 0.2060001 3.5246525 -10.4703484 -7.7317734 -15.5241356 -5.3396111 -5.1486931 -3.4614985 -1.0979390 -4.3680797 2.4256244 -3.1871614 0.6342546 -34.1448898 14.7434540 0.6083828 -3.1283228 6.8100305 -19.8152924 -12.7264376 -20.7084675 -4.8793855 -6.7031627 -3.1557326 1.7554681 -9.2223730 5.4760323 -4.1892614 1.3650742 -31.1329708 23.2905598 -0.4196807 -6.8607197 10.2640648 -30.9186478 -18.6323605 -12.9550629 4.7675943 -2.9608097 -1.1744369 3.1623039 -16.5689869 3.5063801 -3.8813417 -0.9940183 -11.6450043 18.9319191 2.9585271 -6.1875792 7.1445274 -23.4216213 -30.4324379 -11.5215178 -0.1910015 -3.2211483 -5.6904984 -0.3858242 -1.3698207 -0.6375108 -2.0005801 -0.0329372 -17.0265923 5.3532619 2.3626895 0.2586457 3.4542367 -10.8266649 -9.9197111 -17.8951664 -3.4170578 -6.5745997 -5.8333311 -2.1853688 -6.2334771 2.9970522 -2.6622508 1.0837132 -38.3331718 12.5485754 -0.2474872 -4.3634415 7.0732021 -20.2643929 -16.0312939 -22.9277153 -4.7030625 -9.3726845 -8.4168825 1.1828017 -18.0123596 6.0612359 -3.9371202 1.8019223 -33.9769173 19.7986622 -0.7163016 -8.2487793 10.6420507 -31.0468903 -39.6859398 -12.6373138 1.8401020 -5.1792893 1.6289760 3.1560664 -10.0338306 1.3259343 -4.4884853 -1.3381702 -16.3147106 21.7551098 3.8394220 -12.2849674 7.9087291 -23.2774067 -24.0106964 -12.8526011 1.1057376 -3.4189303 -8.3903627 -0.6381330 -2.1589093 -3.3565974 -1.7872002 0.0897737 -17.9669552 4.1263938 2.4643500 0.3418361 2.9861403 -11.1585684 -12.7778511 -20.6162891 -1.6114390 -6.5337400 -9.1259384 -4.2200484 -8.4597692 -0.4717369 -1.4371278 1.3127021 -37.6537094 10.1296768 -0.1661999 -4.3289704 6.2175341 -21.2925301 -22.8828697 -26.9237633 -2.8320305 -9.6742296 -11.1755934 -1.8366330 -16.3912525 0.8218389 -1.4145277 2.1050739 -39.2013817 18.4565945 0.8287103 -6.0734100 9.8614159 -32.1179276 -102.8015823 -10.1134033 -0.9463376 -7.9299593 -0.9237945 2.1414440 -13.6470404 -1.5482793 -5.3278661 -1.7710794 -272.6188660 18.0119877 4.0772524 -11.0134592 5.2854047 -25.4476528 -25.0307369 -13.0977097 3.5859036 -4.0489211 -8.7157383 0.0419193 -3.5503120 -4.0420809 -2.1284862 0.2042110 -22.7233772 3.8174067 2.2573383 0.4786442 2.8671856 -10.9303856 -13.6119709 -24.2469578 2.6559815 -7.7120209 -18.5643692 -5.3019681 -6.2155995 -4.3811288 -2.7091630 1.1394491 -264.2794189 5.0625753 1.3865638 -1.8068179 4.2284727 -22.2878933 -129.1376801 -42.8305740 1.0652926 -10.1514893 -18.5008430 -5.9811802 -7.4272022 -4.7009230 -1.8150069 2.3038828 -38.2273979 12.0802193 1.5348560 -5.4521518 5.4854364 -33.9763794 -126.7779083 -76.3626709 1.8983254 -5.5113335 -9.5826559 0.2299372 -8.7814999 -0.7189363 -1.6805922 -0.3906971 -16.1723576 16.3909168 6.4346914 -10.2282019 7.0299492 -25.1309013 -12.8253880 -10.9525623 -0.7977144 -5.1923609 -17.2613945 22.3499756 -2.3804069 -1.7237312 -1.3677857 1.6714035 -17.0229759 -2.6093955 -0.4095954 -1.1345928 5.0841122 -9.3969927 -13.0796680 -5.9376745 -7.1606240 -5.5701365 -3.3548458 5.7808528 -2.7083671 0.2771067 0.0303686 1.5492899 -20.3322926 8.9635143 -0.2418652 -3.7514992 4.8228817 -11.0204020 -2.9131818 -10.2339792 -8.1342058 -4.6278238 -11.3185654 1.3950109 -8.5123434 -2.1369879 -1.2114335 -0.0616284 -35.7570114 6.8048162 4.1575689 -2.4836931 3.2011228 -12.2480564 -54.1191521 -29.7313957 -14.1456728 -11.5390854 -9.6291990 -0.1305717 5.5121574 -5.6509571 -4.7943454 -1.2738800 -28.9153404 3.9338789 10.5656834 -4.7160659 4.9328399 -28.1810188 -20.9506264 -1.7189035 -56.6103325 2.3094735 1.4298761 -5.5239677 -2.4554424 -9.4160595 -6.6357870 42.4930191 7.9250789 -50.3835907 -17.4496136 3.5978844 118.7043457 0.3438383 19.9825745 -26.9337254 -53.0576515 -0.0557077 -139.7488403 -4.2769074 -4.1180029 -27.9328594 -1.8708438 -93.3231888 8.3859701 73.9142075 -124.9954987 5.4167337 41.4898529 0.0331668 30.9200382 -21.3561287 -1.6235999 -2.5122950 -284.5744629 -1.4311192 -114.2574768 -36.1260185 0.1548883 -227.8827972 3.7568657 36.3521042 -279.0063782 3.0126107 14.7981176 0.6545590 37.2413139 -33.3041267 18.8697109 -3.5656693 -95.8061218 5.0238905 -1.0053514 9.1711740 3.6206939 -19.3564053 -11.7225513 63.9780655 4.4401083 -1.5681282 -63.9201050 -50.0287476 17.3454914 -60.1962433 -11.9394102 -5.5789428 -84.5777130 1.1613219 2.9283810 4.4306216 4.3758821 21.9558163 -180.7989197 -33.8200836 3.2477434 3.1141505 -2.5227103 -127.9198074 -46.9868660 -26.4673958 -373.2945557 -3.0824337 -102.1586304 -59.8116570 -50.3339310 -20.8350143 -34.0293579 -23.6591530 -13.5106506 -191.8402710 -15.8354349 -60.7659454 -104.3844299 104.1947708 -105.4020691 -0.9662876 0.6115178 1.7920685 0.6732075 -1.3370186 200 16 5 0 0.1000000 1.0000000 2.3475289 -0.6921729 3.1712563 0.9343429 -5.7262745 -4.8521504 -1.7799748 5.7739859 -0.6654971 -2.0522277 -0.8824420 5.9970064 -0.2928656 0.2167690 -0.2886271 -1.0631036 5.5245709 2.0001462 -0.8052547 2.0927567 -0.8863404 -7.5709486 0.7794430 11.7557840 -0.2561330 -3.7820625 -3.3911114 9.6201792 1.2782853 0.2696002 0.9226453 -1.1261865 3.3062110 1.6793065 -1.5841300 3.4966092 -2.2361226 -11.5974293 1.6417297 14.3240595 -0.3808107 -4.9075570 -4.4911017 10.9675446 3.1628842 -0.3274567 2.9712496 -1.6298807 14.8992653 0.2055749 -0.8997350 2.0829041 -2.0351868 -8.1456089 1.2587681 3.6554227 0.9953147 -2.6689072 -3.6208255 5.5258055 1.2882190 0.0977886 1.8926018 -0.0253342 3.2332280 -0.5642753 3.4729908 0.6323051 -6.4863482 -5.8665438 -2.3007984 5.8701034 -0.9876453 0.3862914 -0.8255259 5.9607415 -1.3449090 0.1257901 -0.6236514 -1.3548282 8.3652792 3.6791635 0.6363283 2.5177486 -3.7382464 -7.5769062 2.7280943 13.0983725 -0.4237475 -3.6797361 -3.5592761 10.5359135 1.5466616 0.3065910 -0.2118449 -1.1125796 8.5299788 3.8221738 -0.2677821 3.6004395 -4.8900352 -11.4014788 3.3211403 17.5506783 -0.6772340 -5.8719621 -5.1656160 14.0490627 2.4605405 -0.6008180 1.3129336 -1.6278081 15.2300987 0.3548102 -0.8886650 2.1274436 -1.6920065 -8.1236238 0.6668540 6.1605420 1.3930266 -2.3322217 -3.7031531 5.1594896 1.3094414 0.2997145 2.2981391 0.0998976 2.4786847 -0.1947101 2.4566073 0.2263158 -7.8371568 -6.2975993 -4.4554853 5.5385160 -0.5327257 0.8395340 -0.7971699 5.4690123 -1.7811604 0.5946863 -0.4501128 -1.0653144 9.4740791 5.0013108 0.5289623 2.4128931 -4.9588981 -7.6037583 2.3328645 13.8577013 0.0809604 -3.0138364 -3.6946681 10.5553684 1.2824481 0.8198922 -0.2886636 -0.8678362 11.0097961 5.3055239 0.0302975 3.1852221 -6.1132903 -11.5564833 2.6670616 19.3009739 -0.9556723 -5.9423323 -5.6773958 15.0441456 1.2302603 -0.1153640 0.8870991 -1.7562041 1.5013685 0.3624902 0.1427013 2.6041121 -1.5924971 -7.2119932 0.9406050 6.8901439 1.5026958 -3.5953641 -3.2899354 6.2032304 1.9434735 0.2289656 3.3073721 0.0000261 2.4527538 0.7746457 -0.9973828 -0.8485687 -8.1192789 -6.5540304 -6.7396245 5.5776772 -1.0813043 1.1092076 -1.2987417 4.9254889 -2.7827885 0.6184341 0.1777807 -1.0263436 11.2010880 5.5517616 -0.4063665 2.3367248 -5.7901387 -7.6323061 1.7297678 14.7901545 0.6014330 -2.1240027 -3.8025954 10.6810942 0.4904219 1.4763023 -0.5644989 -0.5607983 13.7408419 4.9829445 -1.1733692 2.7043228 -7.8100615 -12.0640993 1.5350325 20.6206379 0.2226970 -4.7455101 -5.3930516 15.1302271 -0.5194052 -0.1434068 -0.1876959 -1.1436247 0.3605943 0.4353175 0.2438601 3.3728948 -2.3410809 -6.4203424 0.5750158 9.1465378 1.1329987 -3.7164540 -3.6160331 8.4901953 2.5136793 -0.2963032 3.0858784 -1.1058118 3.1833107 0.0437790 -5.5899782 -1.9959930 -7.9378185 -6.8543963 -6.9420347 6.0858879 -0.9473403 1.2263498 -1.2953602 4.3102193 -3.8350568 0.0851731 0.5097524 -0.9542724 13.0120239 5.1192436 -1.0992402 2.0018318 -6.9459000 -7.5526290 2.1966581 15.7916832 1.2967856 -2.2563245 -3.9334857 10.3782978 -0.4317532 0.9427118 -0.7880861 -0.1609576 16.1577816 4.3452430 -2.6903155 2.2022488 -9.8155432 -11.9349136 2.2612405 22.0166836 1.3362397 -4.4059844 -5.4347053 14.9876041 -1.7463597 -1.1201713 -0.7307017 -0.5022521 0.5156776 -1.0183860 -0.7584888 3.0730464 -2.8520236 -7.5676498 -0.2044972 10.7707148 -0.6543915 -4.3059754 -3.4041297 8.9863167 1.5851024 -1.5872253 2.7402337 -1.7491285 4.0363302 -1.3827620 -8.9005661 -3.0291893 -8.8168230 -7.5051608 -7.5107479 6.8073177 -0.2573988 3.3383825 -0.7962816 3.3423648 -4.8869572 -0.5684527 0.6563547 -0.7679024 14.2310886 4.1357851 -2.7951856 1.3114408 -9.4747229 -7.7524185 2.5412114 16.5235519 1.7693255 -0.2595964 -3.9268141 10.2157164 -1.5206977 -0.1459108 -1.2811204 -0.2051374 17.4975471 3.5367703 -4.1208401 1.3607378 -13.5298309 -12.4614677 2.7305889 22.7009983 1.7578728 -1.7074794 -5.3145924 14.6746998 -3.1936026 -2.2385695 -1.3966990 -0.7094510 5.4078312 -1.9860551 -0.6428716 3.3879006 -4.4863992 -8.0847836 -1.2575021 11.8972654 -0.3618877 -5.5013137 -3.3264513 11.9242153 -0.6979467 -3.1674879 -0.6719338 -1.2086931 3.3854399 -0.1227748 -13.0365343 -0.7342827 -9.7953043 -5.4957509 -1.4918358 6.1978316 -0.5269353 1.5912676 -2.2426972 4.4429970 -2.2191513 -0.6494591 0.5864870 -1.2102172 12.0159349 -2.5630484 -4.5576878 0.1732320 -14.8199968 -7.6448178 4.1047373 17.0861645 1.2611282 -2.9130192 -4.9027710 9.4633036 -1.8159600 -6.3839793 1.8089777 -0.5421517 16.0480232 -3.5957463 -10.5738125 -0.2396402 -15.0348577 -12.7410460 3.7054734 23.8048153 0.9361309 -1.9163833 -7.4930201 13.9119968 -3.3247213 -8.2556715 2.6910095 -1.7088377 3.7527199 -1.3844506 0.6873944 3.8538649 -9.8718977 -10.9120989 -4.1556773 10.6549578 -1.1011536 -7.0428925 -6.7420125 8.0384283 -3.5622122 -4.2497091 -0.2464269 -1.5926167 3.4151480 -0.0373317 -16.2275181 -0.7554657 -10.2415915 -5.4327083 -0.2714340 6.2164249 -0.7935577 1.5579537 -2.5476449 4.5655336 -2.2527051 -0.6280853 0.4710570 -1.4917928 11.2188311 -3.8409336 -8.9829721 -0.6907298 -12.6269579 -9.3305273 0.7646888 15.4517069 2.2090483 -3.1724362 -4.9593830 8.4032583 -4.0077024 -5.7843013 0.4409086 0.0301822 15.5812721 -5.6461573 -11.0029793 -0.8794041 -20.4402447 -14.6651182 0.9885914 22.0928211 1.6588070 -2.5465069 -7.8829131 12.5516500 -6.2319818 -8.5768528 0.7572116 -0.8422483 6.6582704 -1.9588555 -11.8965921 3.0667427 -7.3127184 -11.5976696 -2.6476898 11.4103155 -1.8444955 -0.7553082 -6.7166209 8.6072168 -3.2787476 -2.9875581 -0.5281404 -1.7708154 3.8400631 -0.0188060 -20.9428482 -0.6306178 -10.3703451 -5.4647670 0.2791707 6.3386583 -0.9298850 2.0960219 -2.9509075 4.5909038 -2.3574259 -0.3881754 0.4336730 -1.6989253 10.8244610 -5.8293624 -10.4217176 -1.3555595 -16.3196278 -10.4094095 -2.8258688 14.6966801 2.2300253 -3.4432230 -5.7934527 7.7121916 -5.9498129 -6.2989106 -0.2823288 0.4723095 15.4878168 -8.6911058 -18.3461647 -1.7392561 -21.3345356 -15.8661003 -5.7353911 21.4678421 1.1634982 -1.7294333 -9.7405386 12.1109858 -10.2233706 -8.1588898 0.4668941 -1.1558236 3.7917881 -8.0056105 8.1603994 10.4280310 1.4217213 -11.1478939 -10.4469452 10.3916492 -2.4278467 -5.0884295 -9.4773598 9.9653616 5.5953813 9.4148922 -1.8932678 -2.0378644 4.0333252 -0.0659525 -22.2172985 -0.7536484 -10.1099787 -5.4954333 0.6786955 6.3627071 -0.9917886 2.5086076 -3.3699682 4.4375243 -2.5044811 -0.4155306 0.4119813 -1.7611971 10.1708574 -5.2824740 -10.7177763 -1.6948124 -18.1043129 -11.4246397 -2.8538744 13.7755642 1.5385207 -1.0672381 -6.3520341 7.2375736 -7.3117285 -5.9413781 -0.6004511 -0.3342898 16.0483685 -12.8749571 -20.0834351 -0.6037496 -33.6529274 -15.5350513 -5.2864223 21.4811249 0.6983026 -0.8722589 -10.9618864 12.3717709 -7.9509435 -10.5922222 -0.5959926 -0.3228826 -0.6804956 8.2356930 -0.6809242 4.0619984 -3.9554045 -12.3952150 7.7347956 13.2810240 0.0309661 -11.8553696 -4.0382881 9.4891796 -17.0205727 7.1546636 2.4276481 -6.4318051 4.2468395 -0.3048057 -21.5563660 -0.9958072 -10.5477467 -5.5825386 0.5927565 6.5616994 -0.8920217 2.4853137 -3.6946516 4.4802155 -2.8334954 -0.9429489 0.4372494 -1.7605773 9.6306295 -4.4149432 -14.5964632 -1.8668661 -22.3251934 -11.5047598 -1.9145787 13.5176363 -0.3815654 -0.8711499 -7.4172688 7.5570836 -6.5560150 -6.2424850 -0.3505546 -1.1674142 15.5573530 -6.9881158 -15.7489243 -1.8916655 -22.3525696 -16.4578323 -1.3365963 21.2796936 -1.4395015 -4.7861671 -11.6029520 12.6670580 -14.1234303 -10.5418844 0.1097203 -1.7993509 9.8470573 12.7885132 -1.0088824 15.3903599 -8.1794567 -4.3546114 -0.0073936 8.0052233 0.1655508 -15.8504486 -14.4116249 16.5412807 10.0735378 -1.1043653 -9.1776276 -0.7449422 4.2591720 -0.4281778 -21.5114059 -1.1459258 -11.2337847 -5.6386437 0.7450448 6.6157522 -0.7218463 3.0239077 -3.9964693 4.1835074 -2.8592236 -1.1635927 0.6800289 -1.8927890 9.3967876 -3.8873115 -13.7858648 -1.7993170 -18.9714565 -11.8622408 -1.3730317 13.1698284 -0.3783864 -0.3589281 -8.3809853 6.8030987 -7.1411886 -3.6365163 -0.5721966 -1.1196454 14.8698282 -6.4749622 -14.6129198 -2.8199980 -16.3997250 -17.8933372 -1.4109651 20.8868275 -0.6473951 -0.7349247 -12.6443806 10.4500990 -16.8428917 -3.7937098 -0.3684240 -1.1390790 9.7512751 4.9788232 -10.6904030 9.7403002 -18.7903881 -18.4148178 -16.6187954 12.7466516 2.9446850 0.1911055 -4.0108771 12.1301136 -10.9778004 5.5190454 -0.4139436 -1.0387042 4.0409193 -0.4823749 -20.8784199 -1.5348746 -10.7066298 -5.7620659 0.6968669 6.5019093 -0.7469496 2.7446241 -4.6373997 3.9553397 -3.0905414 -1.1468872 0.6935515 -1.5748270 7.7419772 -2.6253355 -20.2811050 -4.1111717 -22.6325302 -12.8017473 -2.2559314 12.2241096 -0.3710245 -0.0771080 -8.9299364 5.6755838 -9.2713842 -5.8821964 0.0846699 -1.0412798 12.2477770 -4.2473688 -32.5939827 -5.0481348 -24.8005772 -19.9286594 -3.1804173 18.8850307 0.2331353 0.8650748 -12.5379753 9.0699062 -16.9148102 -8.6140280 0.4786613 -1.6448390 5.7195888 -0.2847623 -2.6561992 16.1466312 -10.6687489 -14.3634310 -8.1332617 9.2051210 -0.0169531 -1.2123084 -7.5193291 9.8866234 -34.3533554 -24.6363773 -2.6979103 -1.3971015 4.3248024 -0.5013736 -21.7907848 -2.2387028 -10.6803122 -6.0354996 -0.1681893 6.6077213 -0.3588547 3.0985661 -4.8878770 3.9019859 -4.0838714 -0.8591809 0.7007158 -1.5343704 9.1259651 -3.5820653 -17.1721096 -3.2752650 -21.7843018 -13.5360498 -2.4926517 12.3931351 -2.2745533 1.8542678 -10.2614470 6.0666780 -9.9298925 -4.3907804 -0.4694839 -2.2407665 12.2272673 -8.4717293 -21.2363071 -4.4939404 -37.8235207 -19.3722744 -0.6794048 19.3891640 -6.8358302 -7.8445253 -17.3851128 8.5487766 -18.0685196 -10.3826952 -1.0545782 -2.1770990 4.2292509 -8.1425133 -0.1314921 5.4443984 -2.8216920 -11.4093866 -2.4020879 13.3199167 -4.3228517 1.1052368 -21.7229652 10.3857307 -16.7569370 7.3865404 1.0193454 -3.6956573 4.3873205 -0.7558308 -23.1156998 -2.8034270 -10.4367523 -6.4224219 -1.0917341 6.5863652 0.1206466 3.4321036 -5.0756869 3.5666702 -4.7235680 -0.7507107 0.8286834 -1.3883635 9.1832952 -3.0599389 -21.4712048 -3.8709519 -23.7781868 -13.6698370 -4.2823782 12.6493616 -1.1793482 0.5905127 -10.6299067 6.1927476 -10.7508030 -3.8222191 -0.0700289 -1.3153609 15.1519632 -4.1116428 -14.0423765 -0.3479422 -34.3509598 -23.3521538 -2.4595432 17.8472881 -4.2235293 -1.2908599 -16.2636471 9.0592661 -23.1576157 -3.8217633 -2.5164533 -2.6292043 -12.1045113 9.8136234 -10.5742130 -0.5270910 -2.8957481 -9.4632931 -2.9169815 6.1817603 17.0529671 -0.4010226 -6.2541575 7.6469769 -4.8697367 -7.5324411 11.9183826 0.9949383 4.3837581 -0.7625372 -22.8846741 -3.2021654 -10.5447435 -6.7126279 -1.4914049 6.5646367 -0.1422705 3.3638279 -5.6181135 3.3050067 -5.4807043 -0.8916138 0.9023556 -1.4172491 9.4001818 -4.1188641 -25.0660439 -3.1174657 -21.8617134 -14.1100883 -4.4246197 12.8424759 -1.4708364 0.5008700 -10.8859491 6.7432656 -10.7875557 -3.8409517 -0.2470307 -1.7768080 13.7271233 -8.8481750 -24.0196342 -1.5030549 -35.1709061 -20.1907291 -2.6479065 19.1624241 -1.1215254 0.0058712 -16.2779522 10.7990513 -17.0567818 -5.2544403 -1.2560903 -1.8519514 8.7361889 -11.1696758 8.9599237 15.3228951 -4.8259320 -17.7090321 -0.7172505 17.2455978 -6.5353532 0.7584066 -11.5511570 3.8448865 -28.4856224 -5.0630622 8.7556171 -5.8261328 4.2753716 -0.6556158 -23.2623692 -3.4878118 -10.2666292 -6.9518013 -1.9912335 6.4666071 -0.5130511 3.0492508 -6.2503171 2.7891483 -6.0403495 -0.6853682 1.0925807 -1.3262017 8.3814764 -3.4414825 -28.8623142 -4.2208304 -22.9748688 -15.0213804 -7.2321076 12.0567245 -1.5161878 1.3105738 -11.7987585 5.7127323 -13.4986572 -4.2092390 -0.0464792 -1.8548336 13.0764351 -4.0739884 -26.9879475 -1.9395164 -19.4048691 -24.2549362 -13.5539980 17.2696667 -2.0363424 4.3922334 -15.7620192 11.2299891 -20.5324879 -1.5033252 -1.1346240 -3.4987032 6.7415609 4.5197306 3.7453821 27.0270691 2.6661072 -9.9052286 -2.7273319 13.3769693 0.7619087 -34.5982170 -19.6247272 10.2427607 -28.3813591 8.5986862 -1.3391448 1.8019660 4.4212046 -0.6810099 -24.4879646 -3.9029558 -10.1071310 -7.1868973 -2.7924116 6.4987121 -0.5925629 3.4196966 -6.8111219 2.6484773 -6.8362837 -0.6178266 1.2125239 -1.3303685 8.0934324 -3.8848515 -31.6302414 -5.3492718 -22.9112835 -15.3513632 -7.6242108 12.2240381 -1.3287302 1.6218630 -12.0451317 5.2718768 -12.8021441 -4.1349201 0.6079692 -1.6989025 13.5180225 -2.4770010 -35.9438667 1.9549638 -26.0660191 -25.3692627 -12.5547142 17.4425507 -0.8377866 1.7090548 -16.2891350 10.1896019 -26.1948948 -2.0422719 -1.0858154 -2.0507414 11.3563347 9.7702017 -15.8101816 4.8139615 -16.6757259 -13.5667000 -6.7384553 12.7219830 2.4723916 -2.2867429 -5.5367527 13.4606705 -13.3732767 2.1562281 -0.0364945 -0.6455181 4.0079937 -0.3593975 -24.5448990 -4.3137956 -10.0299854 -7.6418571 -3.5172293 6.1715031 -2.7164814 3.3657897 -8.1547537 2.3468800 -7.8896475 0.3814347 1.0472877 -0.4479377 7.7128768 -1.6525111 -43.8447075 -7.3203430 -27.4817104 -15.4851789 -6.6661077 11.9042931 -5.0774798 5.3504558 -14.6157360 5.0902033 -18.6197910 -5.9750285 1.2775207 -0.6441342 11.5824318 -3.4416473 -25.1712666 -6.3787522 -40.1817741 -23.1381931 -5.1523347 16.6867542 -9.9070978 8.6724119 -23.0724697 9.0724583 -30.3486004 -3.9991863 -0.1617460 -1.5918207 12.6801100 13.4765310 -2.7052786 -10.4423141 -6.9662967 -9.8298073 -7.4805236 17.1355743 10.2956200 -14.6080360 -11.2297163 10.9885626 1.8154484 3.6421835 3.1115837 6.2170062 4.5384340 -0.1063687 -22.7818069 -5.4530687 -9.6690149 -8.0463343 -3.9357300 6.3932648 -3.2969425 4.6332364 -8.7154503 2.1024861 -9.8053522 0.8389031 1.3566065 -0.2789182 8.1888990 -2.3802991 -60.8337097 -7.6195331 -23.2449646 -15.1509571 -7.8049493 12.2588720 -6.2077775 5.0865493 -16.7555122 5.4809718 -18.3271370 -4.4192934 1.2023162 -0.4254401 11.6401157 -4.5725188 -35.2507172 -8.0580940 -33.2554703 -22.3281841 -9.1646862 18.4351482 -7.9228110 9.5259600 -23.8230057 9.8559256 -30.4877148 -5.3055158 1.5400668 -0.6070482 11.5130892 -6.6291552 7.2992005 23.4137440 -10.8947792 -9.8607893 3.7850423 13.1541290 -7.6066113 3.0799816 -17.9315834 14.8151684 -25.1941204 6.2427640 -3.0030866 -1.4153984 4.7295938 0.2100296 -22.8425179 -6.4646106 -9.0226116 -8.3256836 -4.2440300 6.3939261 -4.9547725 4.6033473 -9.8913422 1.8182967 -11.8635721 0.8676168 1.5535951 -0.7030323 8.3358126 -2.7210791 -63.5402794 -9.5767632 -23.9488583 -15.6958923 -9.5970144 12.3622656 -7.0820351 5.8353667 -18.0223789 5.0309377 -19.2031822 -4.2499576 1.7093817 -0.5889093 12.7562828 -5.0666614 -32.7171402 -9.9819794 -26.0470524 -21.7456455 -9.2284327 19.2250710 -8.7969570 8.0837631 -25.7674446 9.7654200 -31.6749725 -4.5911217 2.2579727 -0.0769064 10.9802713 -7.5964293 9.5157633 -0.6685024 -7.7413406 -12.6758528 4.1593232 15.7862110 -7.1115599 6.9903793 -17.9855919 9.2080183 -38.4193535 5.0614014 2.7722824 -0.5099276 4.8262963 0.5178562 -22.1322346 -8.1695461 -9.2727861 -8.9157705 -4.4604173 6.2064071 -8.6083317 4.6125078 -11.7135668 1.7466582 -14.9303694 0.4857088 1.5179383 -1.2909170 8.2149677 -2.5674465 -82.9774704 -11.6149883 -23.2402363 -16.9274712 -10.8352814 12.0090027 -10.8522911 5.1851954 -19.9418221 4.6005034 -23.6893330 -4.5027070 1.1936353 -0.0853240 12.6719208 -2.9907699 -30.9169712 -12.7857599 -22.0329323 -22.3253193 -9.3006439 19.0889320 -14.2519131 8.2360229 -29.5831566 9.6847696 -50.8933487 -2.8658967 2.2211890 -0.2172173 9.9282112 0.0847436 -0.1197050 4.6240239 -11.5171452 -11.9000864 0.8602844 13.2115211 -6.6292319 10.5266705 -20.0100937 9.9643345 -27.8834896 4.6395488 1.7715377 -0.4313237 5.2872729 0.6964496 -21.6605225 -11.9961500 -8.7226524 -9.8903866 -5.0025477 6.0231080 -12.6047373 6.1553588 -13.7985382 1.2592725 -19.0891666 0.4657642 1.1458031 -2.7706549 8.1874399 -2.2906370 -82.6348114 -14.1583986 -21.4387989 -17.4405155 -10.3821115 11.4996700 -16.9134655 7.0215464 -24.4022331 3.5779722 -30.7312393 -3.9738293 0.5678777 -1.8720460 13.0118408 -4.0819683 -26.8917351 -15.4648380 -25.7845840 -22.5428848 -8.3697701 18.8413792 -21.5927811 10.2530317 -38.0431900 7.6114135 -74.6127701 -2.4575438 2.1610301 -2.1245954 8.5312452 -1.5096772 -4.7867351 -14.4239683 -13.3431683 -11.9092741 -0.2823887 14.4829292 -10.3478146 7.3873382 -20.6477757 9.4602585 2.2597742 4.4420304 3.0866323 -0.2595091 3.4015751 -0.9015359 -21.5942383 -14.6434288 -8.5060081 -9.6817150 -5.1245184 6.0551419 -18.8865051 7.9213576 -17.2025890 1.2551291 -20.8984184 -0.3429960 1.9641294 -5.2460928 6.5524511 -2.8713739 -35.1389351 -18.0466919 -21.1822338 -17.8312149 -9.0738478 11.3094435 -27.4959469 12.0209894 -30.4809933 2.4699857 -49.1458168 -3.9286222 1.8691288 -4.4322686 10.6487017 -5.1882219 -30.4577808 -34.3571472 -35.0119743 -24.3176460 -9.0616302 18.2852974 -38.1489258 17.8389549 -42.6273117 5.4307408 -78.1886063 -4.7617960 4.4344540 -5.2381968 10.4644766 0.3719620 -12.0226555 -15.9774809 -39.8752594 -14.2299452 -3.6020286 15.2010803 -18.0872555 16.1319809 -19.0748329 5.3298621 -0.4931671 2.1820543 6.7808495 -1.2239195 -0.5629330 -0.7151816 -20.5783482 -9.5369225 -8.2956181 -6.9160891 -2.0804904 6.5954628 -13.4123831 9.1758804 -15.7146530 3.1718223 -13.3367186 0.7897092 5.1680198 -3.1229270 2.7824686 -2.9628239 -8.3282795 -8.5363741 -10.0112104 -7.4005675 -1.3532481 7.5382113 -6.9018397 8.1754007 -12.2993355 3.7386608 -8.2567873 0.3229588 4.0874367 -0.5203601 6.2398820 -1.4800576 -7.7742167 -49.6111183 -8.6585398 -8.0237236 -2.9410808 7.2534404 -10.4067612 12.2216015 -11.6362820 4.1114941 -60.2558975 3.4024734 3.4406779 -3.0393677 0.7104347 3.8843126 7.7663612 1.1533843 -20.9150581 -23.2865944 -16.9581089 11.4818563 -16.5368195 31.9923859 -25.8709755 -4.7766418 -2.2160006 5.3774552 14.8675528 -2.5536878 -18.5821362 1.6144530 2.9735961 -5.1806483 -0.2999800 0.2874221 -0.7293891 -2.4969187 0.1661943 -5.4575524 0.2053496 -0.1252269 2.2040896 4.0923018 -1.6299361 -1.5150863 -1.7593299 2.8010986 6.5207028 -10.4251089 -0.3802962 0.6303869 -0.9572535 -0.0790299 2.6248703 -8.6098366 4.0557528 5.1124220 4.8898587 7.8794365 -1.7098548 -2.0011318 -2.9158514 3.3291321 10.3112440 -15.8433113 0.2705415 1.1552098 -0.6090315 0.3924968 3.2807446 -13.8192291 5.3105588 5.9930167 6.6009903 9.5377522 -2.4858882 -2.8879189 -3.0256774 2.1690431 5.3480492 -12.3807144 1.4708085 0.5228181 0.0094503 0.0032738 1.7224990 -8.8347435 3.1796181 2.0092790 2.4106810 2.3375728 -2.1517825 -2.3907945 -7.1323457 2.6531956 3.3509514 -5.2503452 -0.2624992 0.1069801 -0.5928587 -1.3660555 1.4075506 -3.5141203 0.9610942 0.7915597 2.0971649 5.5423841 -2.2232025 -1.7419455 -8.5975103 1.9086815 6.5308371 -10.5289459 0.0312977 0.9725167 -0.5463824 -1.3250816 1.8224909 -4.8969617 2.9040892 3.1652005 5.4848056 9.3953571 -1.1566284 -3.8882716 -7.7072468 3.4438298 9.3471384 -15.9943714 0.3336069 1.4579027 -0.4736252 -0.7834646 2.5428178 -10.2557220 4.3894415 5.0661983 7.7799177 11.4213619 -1.5858145 -6.4355097 -3.1955175 2.2341409 4.9394512 -12.3807850 1.7701428 0.6204190 0.1264223 -0.1616615 1.5791392 -9.2150087 3.2475846 1.6322877 2.2983754 2.8631446 -2.3480012 -1.0538502 -6.9104252 2.9637992 3.4666712 -6.0002956 -0.0459784 0.0287690 -0.2915412 -1.1330388 2.9903383 -3.4821320 2.2070699 0.5144188 1.3295819 5.9354854 -2.0996966 -1.1851975 -10.2962446 2.1317751 6.7483959 -11.1333227 0.1603044 0.9681470 -0.0740789 -1.1024640 1.4576744 -3.5260084 2.8347111 2.0060012 5.2262254 10.2711792 -0.5599369 -5.1242537 -10.6044254 3.5505707 8.9812851 -16.4713020 -0.0398862 1.5403481 -0.2915636 -1.1088240 1.6626294 -9.3118286 4.1091819 3.6125164 7.8989134 13.0454540 -1.3031627 -7.2928882 -4.6352563 3.8277183 6.2596064 -10.6165915 1.6173475 1.0635626 0.1745225 -0.6302350 2.8606057 -5.0010147 3.8902287 2.3669801 4.2637305 4.3528595 -1.5995388 -2.3875847 -8.0991688 3.5571377 3.7200198 -6.0295477 -0.1217755 -0.0125404 -0.0892679 -1.3006965 2.1698990 -2.1451526 2.0034101 0.5040803 1.2663966 6.6732941 -2.1228380 -1.6061400 -11.7405024 2.4116745 7.6224809 -11.2261133 0.2475606 0.8764858 0.1316763 -1.2676984 -0.0874975 -0.5384667 2.2269878 1.0290487 5.1025920 11.8475790 -0.7349693 -7.0881381 -14.3960314 2.9743929 10.0062695 -16.4129105 -0.1698090 1.2417198 -0.3589162 -1.8911598 -0.1761844 -5.1305881 3.1972909 1.7075583 7.9447885 15.1655235 -1.8045882 -10.5714178 -8.6352720 3.5653622 5.2622490 -10.3023911 0.8182032 1.1868845 -0.1784672 -1.2476557 2.5406067 -5.6243219 4.0751681 1.4889317 5.6307955 5.7687731 -1.0347110 -2.5382462 -8.1452866 3.9448137 3.5276794 -5.8485298 -0.2207141 0.0381971 0.2403586 -1.4497029 1.1268680 -0.8243611 1.6549033 0.6769103 1.5699940 7.3995180 -2.2981541 -2.3952515 -15.9866114 2.6818936 8.0078869 -11.3437738 0.4353578 0.4172819 0.1802424 -1.9823685 -1.2221096 1.4657805 2.1329982 -0.4593514 4.8976960 13.1084471 -1.0077362 -9.1972389 -20.7098885 3.9188457 10.8351698 -16.4565754 0.2177170 0.9732856 0.3056099 -2.8253839 -2.0559614 -1.7111512 2.5805719 -0.4112394 7.7890615 17.4386387 -2.3681066 -12.9892569 -9.2153225 0.8632599 4.9823432 -10.1584244 -0.5814914 0.9758815 -1.1761520 -1.2202680 1.1186426 -10.9802675 3.5773194 0.8382630 5.8777189 6.0486813 -1.5700932 -3.3926640 -8.5732365 3.6095054 3.9278677 -5.5688639 -0.6737942 -0.2389876 -0.0545198 -1.9941280 0.3263035 -0.7965081 1.4906182 0.2713385 1.6074700 7.7442236 -3.0241263 -3.3797781 -31.9940834 2.7950172 8.4903584 -11.3586483 0.0482825 -0.0423037 -0.6211412 -3.3266299 -4.6356406 1.9876050 0.7294562 -2.4047358 4.7142787 13.8940191 -1.7955645 -11.5211010 -45.3506203 4.5681739 11.8671560 -16.5940628 -0.1074439 0.3176319 -0.5845562 -4.5073786 -5.9182777 -0.8807760 1.0992703 -2.8545732 7.2161188 18.9496784 -3.5841541 -13.7605324 -10.0026064 3.1699388 5.8575721 -10.2457695 -0.9748671 0.3331841 -1.3552610 -3.2081368 1.5584505 -8.3460970 4.1183329 -0.2513857 5.4384499 8.3994150 -2.9178443 -1.2276940 -15.3832760 1.8972127 3.5884452 -5.6909347 -0.0514268 0.4158154 0.2362791 -3.0895860 -1.2705919 -0.7793639 0.1518785 -1.3516763 2.5545728 5.9205766 -2.3364589 -4.8975000 -39.7231369 0.5869204 7.3478303 -11.7462988 0.3658094 1.2882812 0.8098763 -3.7869658 -7.9644356 -0.2581973 -0.7856197 -4.3682480 5.6328731 10.9129181 -2.9870532 -18.0163174 -36.8825836 3.2530289 10.9589500 -18.3199368 0.3366855 1.3491515 1.1151687 -6.6946640 -11.8140612 -2.9220543 -0.7369584 -5.3113856 7.1887736 16.2021790 -5.2494125 -30.9818878 -7.0809212 2.0041358 5.5746098 -13.3498840 -2.1793182 0.5755973 -1.2709590 -1.8121744 -0.4473883 -14.2766523 5.2497382 2.3836014 3.9022706 6.0927615 -2.5061376 6.1167173 -17.2161140 2.1565127 3.7350323 -6.0581832 -0.2504651 0.1033886 0.2005105 -3.2434440 -2.4954355 -1.1924365 -0.1083938 -1.2253125 2.2712812 5.7747283 -2.5431106 -6.1894431 -42.9320869 1.1852691 7.5984621 -12.9950686 0.0678180 0.4962885 0.3406171 -4.1897659 -11.2995853 -1.4154634 -2.1879787 -5.6790743 4.4439926 10.4153299 -3.5484803 -22.6217518 -30.5127640 3.2117991 11.6013966 -19.6723232 -0.0048436 0.6637831 0.6745362 -6.4974623 -11.8964577 -2.9657793 -2.0105393 -8.4047480 6.2729478 15.9978380 -5.9770045 -35.4474144 -9.6966705 3.0790548 6.7580667 -13.2671356 -1.0550900 0.0571751 -1.5794793 -7.4882236 -6.5505352 -5.2007847 -1.0040897 0.3941705 3.4265859 9.3285780 -5.7490125 -20.4821129 -16.2771645 2.5705206 4.1720285 -6.3849301 -0.1269277 0.0370992 0.5264651 -3.3817275 -3.1021588 -0.6568519 -0.5405949 -1.5073988 1.8863564 6.3664436 -3.1495311 -7.9617109 -36.2907181 3.1079011 8.7028141 -14.0476036 0.3007643 -0.1712897 0.9484566 -6.1645131 -12.2646236 -0.5073119 -3.3103881 -7.9925938 2.7020376 12.0629091 -5.8089533 -18.7532578 -26.2285118 6.8252044 12.6474295 -20.9562263 -0.1343333 -0.1869780 2.1134086 -6.9301910 -12.9177265 -1.3341385 -1.3863635 -11.1977558 4.5313482 18.2325897 -8.5376358 -41.6529198 -1.8603945 5.4994817 8.4049263 -13.4286413 -0.7119676 1.7607166 0.5988090 -13.9770107 15.7250347 -8.1386042 9.0944366 10.8259487 0.7056075 11.0394230 -11.3071947 -0.5466634 -19.7484016 2.7157321 4.3906608 -6.9036865 -0.0944783 -0.0966119 0.5643546 -4.1536708 -5.2898293 -0.6626311 -1.7215527 -2.4112496 1.3136530 6.4133677 -3.4863613 -9.8391838 -27.7547989 3.8807743 9.5845680 -14.2797909 -0.0210305 -0.4481852 1.2485641 -6.3928404 -16.0980759 -0.2956762 -5.0491471 -7.0371766 2.1587775 12.4606609 -7.2702160 -21.2278748 -29.1785011 8.5287008 13.5794258 -20.6960316 0.1226939 -0.3249310 2.2001369 -7.7897978 -9.7282267 0.5961104 -1.9303131 -13.4046030 3.9067562 20.6426620 -11.9587917 -46.0497513 -5.6482725 8.5067968 1.9016696 -12.2928267 -0.6073068 -2.5018284 -0.4985113 5.5277596 -3.6911583 -12.2750473 8.4275246 8.3028002 7.6664743 8.9294481 0.2275230 -2.3211236 -17.8409595 2.6869016 4.5456300 -7.2164230 -0.0587643 -0.1272075 0.5271314 -3.8180311 -8.1982002 -0.6626063 -2.6972258 -2.4259453 1.1560735 6.4132257 -3.5802040 -10.9762993 -35.9307823 4.4459701 8.8591604 -14.6955318 0.1165270 0.0009342 0.8699334 -6.3855057 -17.8331089 -0.4308123 -6.6719651 -6.9432645 2.5337865 12.3801460 -6.9176502 -26.5764446 -11.2916765 8.8209772 13.3215942 -21.2946663 0.2848637 0.0286112 1.9247671 -6.4191966 -16.1067047 -1.7319491 -1.3539647 -6.3747015 3.7439017 19.6420593 -12.1866999 -37.2519455 -0.4972848 -1.4637057 9.5909491 -12.7001858 -3.0650935 3.6843793 -4.9240971 -0.6668247 2.5585506 1.0575565 4.8301873 8.2763290 6.4948077 7.4497466 -0.5445930 -2.7408597 -18.2913151 2.8732231 4.7671642 -7.6564012 0.0109781 -0.3235475 0.5580426 -4.3726931 -10.5917597 -0.4122643 -3.9746556 -3.3674345 0.6992326 6.6329041 -4.0878382 -13.0437775 -30.9677849 4.6083980 9.1658916 -15.3889370 -0.0756628 -0.4487799 0.5498848 -6.3574181 -20.5303535 -0.3287185 -7.5336280 -7.0717282 1.6470908 12.4950590 -8.1249056 -29.5682373 -8.9680452 8.5037918 12.9909468 -22.7137203 -0.3377575 0.6077974 2.4329791 -9.9472895 -17.6926613 -0.3613352 -0.2449957 -12.4880495 3.5066702 19.2607365 -11.9672308 -24.2099018 -17.5881615 -0.0684954 7.5360575 -18.9899921 0.2203597 -1.2698456 -8.0759945 13.4035950 -3.5104735 -6.3708763 -8.1686449 5.2842646 2.1945539 9.2426720 -4.4682555 -14.6195984 -17.6300144 2.8964956 4.9184952 -8.2597179 0.2104463 -0.5672823 0.5010773 -4.4334702 -13.5160112 -0.8100373 -4.8703589 -3.8223999 0.3088677 6.5380831 -4.2181001 -14.2801476 -27.6948795 3.8980970 9.0217333 -16.7975807 0.2888842 -1.0684129 0.3416409 -6.8806496 -24.3891430 -1.5316784 -8.8812723 -9.0801144 1.2251476 11.6379728 -7.7273827 -39.6355362 -24.6689434 5.9604592 12.6893454 -24.2614269 0.3381092 -1.1365260 1.0637262 -7.7393389 -33.6840248 -2.7924347 -7.8761811 -12.0819941 3.0740044 17.4293537 -11.5364647 -40.1522560 2.4013925 3.2586575 6.4731803 -20.5454941 0.3394329 -0.5570823 -0.0681441 -39.6412086 28.2122536 -5.1789308 18.5880108 -14.0263739 0.9978405 9.8173523 -6.2560906 -1.3341068 -17.4066124 3.3145251 5.2052865 -8.7298298 0.1652546 -0.8806354 0.4651764 -4.6612024 -15.8864841 -0.9221715 -6.0053573 -4.5872812 -0.2620379 6.7566056 -4.7502837 -15.4445200 -34.1783600 5.1436758 8.7823658 -17.5497093 0.1326810 -1.2020394 0.2559082 -7.0655427 -23.9687805 -0.8898002 -7.5361710 -9.8739166 0.5573862 12.4704103 -8.4912033 -34.7296600 -28.4525394 8.7579422 12.1223717 -25.7711697 -0.2152300 -2.5212440 2.1890924 -8.3261042 -30.2391605 -3.1704161 -8.7034140 -13.4895182 1.0953847 17.8149338 -14.0577726 -47.4671516 -12.1698875 -0.2752516 -0.1047582 -13.4852028 -4.0870318 2.5685413 -7.3996153 -1.0627698 -1.7073650 -9.4112396 -0.6282749 13.3429451 2.5609901 7.9598789 -25.8252945 -10.0778694 -16.7117290 3.4981797 5.5820918 -9.1488028 0.0698464 -1.1033882 0.4180876 -4.8041530 -18.5352955 -0.8739922 -7.2002306 -5.1644335 -0.5430759 6.7874379 -5.0565538 -16.4744225 -27.7730446 5.7226505 8.4995852 -18.2165203 0.3536051 -1.4227501 0.0266727 -6.4286132 -26.2996922 -1.4241488 -10.8299379 -10.7821655 0.4137239 12.5510406 -8.8619280 -44.1399841 -33.5936356 3.0768697 9.0770750 -28.4698143 0.8894589 -0.4360693 0.6928149 -4.4689074 -31.0038757 -4.3013320 -4.7050304 -15.5622873 1.5498102 15.9911327 -11.1784649 -46.6296349 -4.1359434 17.7515678 -0.2643269 -12.6915560 1.6213911 -2.6539838 -2.7667150 -4.3412361 -3.0923190 -0.5516444 7.7031827 5.7091455 11.3664103 13.2295713 3.8178546 -4.7850528 -15.5838194 3.6361225 5.5190187 -9.5866222 0.0627909 -1.2369807 0.4199266 -4.8410096 -20.6312428 -0.9379016 -7.7300572 -5.5135918 -0.7327298 6.7763810 -5.2050414 -17.3727093 -26.5059700 5.0683188 8.6764259 -18.8264198 -0.0604700 -1.3979985 0.8698072 -5.8489480 -31.3626938 -2.4288511 -9.7115774 -11.2214394 0.0656549 11.8610830 -9.4844894 -39.1592979 -26.5491047 5.1788220 9.8494329 -27.4998035 -0.8557160 -0.8567669 0.2812451 -3.1483948 -22.8494625 -3.8972402 -1.0350512 -15.5756111 3.0340140 16.1018085 -12.3469162 -57.1812134 -4.0085855 11.6702976 6.9267387 -15.6262922 0.1746580 -2.4321516 -5.0995498 -11.3147621 4.4447980 -7.1208563 -0.0810841 -16.9453259 -0.4364398 13.5299931 -19.2350254 -3.3988783 -14.8572416 3.7166133 5.3735085 -10.0103521 0.1719900 -1.2413287 0.3895260 -4.7882047 -25.3339729 -1.0635540 -9.0345812 -5.4036112 -0.9731568 6.7427926 -5.2164035 -18.0922909 -25.1206722 5.1448989 8.7318659 -19.8604069 -0.0542376 -2.2898026 0.3038269 -6.0792050 -31.4160995 -2.3098891 -9.3582306 -12.4688301 -0.5963563 11.8359509 -9.7350225 -56.5310707 -20.6656303 5.0327425 10.0152988 -28.9544449 0.3466769 0.0530324 2.9219375 -0.1465741 -29.1188107 -6.3257227 -3.7688189 -12.2098732 1.9723258 16.2890244 -12.0325661 -33.4554214 -12.1626644 57.5466423 12.7351885 -19.6281948 -19.3486843 -2.8376498 -1.6044677 -28.1945553 18.9735146 -8.9328651 11.3318558 -0.8549047 0.8430327 61.1703911 0.6384690 10.4404926 -14.2542009 3.5105598 5.4871306 -10.4438887 0.1024305 -1.2599063 0.6758980 -4.9298167 -28.9896908 -0.7983787 -10.2746696 -5.8352461 -1.0715932 6.5258460 -5.3632121 -19.9064980 -22.3148155 6.1958060 8.9496832 -20.9553089 -0.1424813 -2.4512506 0.4645314 -6.5659914 -41.2292213 -2.8412292 -12.1216908 -12.6597538 -1.4731784 12.1242142 -10.8952618 -63.8003883 -51.8598480 7.9038153 10.3451557 -29.3719711 -2.0577354 0.5170812 0.4588091 -4.7183733 -27.0266647 -7.3292155 -3.9972289 -17.0804710 0.4017262 14.8719416 -14.4400635 -83.4845963 -21.4506817 3.8132348 3.6500611 -26.7859097 -0.7596846 0.5923539 -9.9153023 -7.9526992 4.3724737 -11.0861273 -1.9647111 -33.9798851 -1.0716769 8.4825220 -12.7012005 -36.7571411 -8.4576759 4.3331890 5.1700850 -10.9112902 0.8168813 -1.4000015 -0.9660772 -1.5561774 -33.1853294 -0.7332953 -10.1879549 -5.0823755 -1.3207420 7.6999516 -5.3695421 -17.4229546 -15.6069021 7.7649469 8.9236660 -21.3793087 1.3898225 -2.6785617 -3.6804843 -5.3232403 -56.8076172 -1.7510206 -15.4527292 -13.1090670 -1.8199695 14.7526999 -10.0764771 -39.6837463 -1.8040742 8.6564817 8.2978783 -29.5744171 1.3674030 -1.1196595 -8.5659208 -2.6740010 -47.9238396 -2.5438366 -18.3629227 -7.9016061 0.2702727 20.5381527 -15.6696405 -45.8641701 -6.2023549 18.8019238 1.6397177 -25.7475834 -0.9072398 2.8456717 -3.0867658 0.8387547 -4.4316907 -14.2031555 1.0921223 -4.8419375 1.7241945 13.2308474 4.8209400 -3.2200124 -9.6024742 4.5280943 4.6215773 -11.0323906 1.0198071 -1.3973433 -1.6393807 -2.8418963 -38.0363274 -0.8276414 -12.1465693 -5.5116701 -1.4332556 8.1207581 -5.6535277 -17.8871479 -23.6172028 7.6970944 7.3203158 -21.7997627 1.5011209 -2.9287214 -5.1884775 -8.6321783 -71.2629242 -2.1282606 -19.9192390 -17.4328098 -1.8289996 14.7533293 -9.9394941 -58.1062317 -32.7562981 10.0208073 11.3230438 -29.4597683 1.5593301 -3.2554147 -7.0379286 -13.1008997 -40.8140755 -2.8031945 -11.7637005 -24.1974354 -0.1346410 21.7817020 -16.8374538 -61.4502678 -12.8872747 -1.3002257 4.3207760 -16.5075970 -0.1001700 4.3595753 -21.9255028 0.8127410 -5.1765404 -11.1255207 -0.8589318 -21.0456009 0.5465170 5.6548257 -10.5343790 -17.6923237 -9.3245087 4.2322297 2.5398824 -11.5588226 1.2438656 -1.6460871 -3.1582136 -2.9803836 -71.7048569 -1.1126695 -14.8382769 -6.1843476 -1.7093703 8.0042305 -5.5129204 -18.7068710 -26.8255978 7.9619155 5.7690020 -22.9181976 1.6919442 -4.1596112 -7.1453481 -8.5938702 -82.0053787 -2.8137062 -20.1707287 -17.9021091 -3.1258504 15.0382633 -10.9335022 -62.3080750 -32.3317642 10.7208195 9.2876740 -31.8777008 2.8138773 -4.9655414 -9.5154037 -14.1441288 -38.9352188 -3.7780423 -14.3116341 -35.9594803 -1.9156511 22.5152283 -17.6001015 -71.2809982 2.8948786 8.6304092 6.1652145 -19.3176785 -0.3677375 6.0596895 -6.4341388 6.1680202 4.1947837 -4.9090862 -2.2016079 -38.6961784 3.3416307 13.7809839 -7.9123230 -20.8165779 -8.0535269 3.2625577 -0.9670079 -12.8144598 1.4126061 -2.3263006 -6.5623527 -2.2547462 -89.6101074 -1.7502354 -16.3047466 -7.3462706 -2.4068568 7.4968553 -5.1439891 -19.1170750 -22.1662960 7.5039411 2.0028152 -24.3994560 2.2272301 -5.3193331 -11.8275194 -8.5065479 -89.0100708 -3.2724450 -22.2309513 -19.7584343 -3.9094911 15.4508467 -11.0465422 -60.5535240 -25.2564201 10.9381647 4.8691959 -34.3909988 2.0982318 -4.7475333 -16.4540882 -12.7576551 -43.1562042 -5.7858801 -23.2089767 -49.2859039 -3.0968363 21.6796513 -15.8661337 -98.6778641 -1.5435021 7.2527170 6.0386577 -19.5793571 1.5271037 5.1774364 -8.7146492 5.6046891 9.9049139 -3.7820704 10.8238869 -35.9131088 1.3156797 14.1089916 -11.4699707 -20.0571136 -6.7512188 1.1380529 -7.6627150 -13.9461613 1.2318605 -2.9874771 -17.5049114 -1.5537817 -88.4006500 -2.4937339 -16.7536068 -7.8370972 -2.7936823 7.3138227 -4.7249937 -17.9619827 -19.9151306 6.3218818 -4.6858482 -26.0503788 2.0482743 -5.5304441 -23.0338707 -9.8124313 -83.1529541 -4.7018170 -27.4566727 -24.0863628 -4.7928691 15.6760511 -11.7199316 -59.0048218 -19.7850266 11.3085260 -1.8587704 -36.7309685 1.9872104 -3.8882182 -26.0651169 -12.3124390 -32.7606621 -6.9205866 -18.5523338 -81.8041000 -5.3262944 22.4166164 -17.9064407 -76.9670105 -1.8179897 9.2727499 10.5958691 -21.1323795 1.3396670 0.2205760 -6.3534393 8.6152782 3.2895045 -1.9159292 6.8279290 -1.4642637 -3.0598586 17.4289608 -16.5050449 -13.2406693 -4.8530741 3.1141536 -17.4994736 -14.5434599 0.0306457 -3.3104403 -25.7407684 -0.6429588 -36.3185539 -3.6427741 -15.1663132 -9.7826233 -1.7768527 6.2550387 -3.8090200 -19.4009972 -15.8526316 7.2327147 -11.1467772 -27.9732780 1.0044166 -5.5673265 -37.6971321 -10.7412415 -58.9243660 -4.6767564 -25.1903896 -28.1811390 -6.1673279 14.7298260 -12.1206474 -52.0176582 -19.1263542 12.5558844 -7.9211841 -39.7406273 0.6626837 -3.2945387 -43.1182823 -17.1786575 -42.6642685 -6.9416647 -19.6101475 -39.8158340 -8.5574026 21.7175846 -20.6536598 -106.1015625 -22.3594837 15.1606674 10.6528339 -25.3051701 -0.1328438 1.4605457 -6.8965449 3.7135096 10.1382027 -1.5226322 4.9491549 -22.4840946 -7.1748509 19.8086529 -33.2433586 -57.3296318 -5.1688294 10.2151775 -19.3492851 -14.5913477 2.3081949 -0.6898436 -18.6900234 -1.0637534 -41.3133965 -2.3361075 -23.0079212 -8.5611467 -0.0372159 10.1570396 -3.5601375 -19.5005188 -6.4820180 8.4323196 -29.0115986 -12.2534418 0.7800983 -0.8366214 -8.5724573 -4.1955109 -23.0490665 -4.8106756 -33.0107384 -9.5639095 -0.4040622 9.2302542 -6.8635173 -94.2831192 -1.8997027 8.1088190 -20.3783073 -10.0110826 0.0744613 0.0208680 -7.3528671 -1.3460931 -4.2744775 -2.9626219 0.1559653 4.5547976 -0.2777232 10.7392530 -6.2509847 -41.3479652 -11.4505472 10.0343657 -0.3858747 -22.1339645 -3.3883054 15.3255081 -35.9762497 -10.0143623 2.1291063 -15.2304068 -0.1931650 19.0107536 -2.9318752 8.2571926 -9.1265812 -8.2434549 7.4546552 -4.9449492 -7.4486756 0.5706164 -62.8147812 -0.2527323 15.0206661 -22.8038483 4.0777521 -1.1120349 -4.8190684 2.9843242 -5.9177756 5.9124107 6.4291935 35.0265198 -0.5600220 -3.5115223 -21.4189262 0.2304554 -120.7347260 -220.3030396 22.2399406 -13.0331202 6.8928766 -1.2026038 -101.6080551 5.2428050 4.4262114 4.8254170 5.4774160 35.1208687 -2.2197297 -3.7058558 -0.0745463 0.2195439 -26.9992886 -63.8379974 11.2462292 -3.9223888 -12.0580721 2.4527659 -66.0376358 3.8619027 -26.3708420 0.7772697 2.8200240 75.8338623 -23.0158157 1.8706673 7.1438518 -1182.7377930 30.5911045 -0.2925719 -13.5123978 11.1508236 -2.0895627 -3.9552743 3.7132790 2.4043763 13.0465527 -1.8558660 -11.6093397 -286.2464905 -36.5158577 1.9047323 4.6540160 -132.2582092 29.7906246 3.3657327 -401.8402710 16.4186363 8.6056976 -3.3338425 -1.0916144 3.3251629 3.5219660 1.2472156 -11.1081152 -136.8114929 -77.2173233 -53.1294670 -62.4957809 29.5175304 -22.3955059 21.1320419 -33.2692909 -125.5661087 -6.4310718 2.2815228 -8.1465597 -76.7870178 -39.7948418 -87.4531403 -0.9695534 -11.3977566 -1.1952410 -2.1184518 -5.4281735 -0.3027123 -4.6344662 200 8 5 0 0.1000000 1.0000000 2.5178869 -1.2504656 -0.6578671 0.6010239 -2.4048753 2.2010918 -0.7813341 2.6928041 4.2993517 -1.5848659 -1.7043748 1.5669206 -6.6908073 3.0300155 -1.7423356 5.2503810 6.1962085 -1.8131732 -2.9412231 2.7544742 -10.5818348 5.4029174 -3.1472011 7.4747548 3.1793551 -1.8323264 -3.7700863 2.2838299 -4.5440650 2.9405918 -3.6602097 5.8716965 2.4399755 -0.6957905 -1.3266573 0.9427723 -3.5670259 1.0900860 -1.1842468 1.9296069 4.1881475 -1.4192442 -3.3036149 1.8950329 -6.5790401 3.0699017 -2.6378038 4.9843254 5.9053450 -2.3954597 -5.3072662 3.0851169 -10.2632828 4.9352684 -4.2017450 7.5463095 3.3243423 -1.3577986 -3.3255064 2.2426388 -5.3105712 5.4670258 -3.9338291 5.2741880 2.3285258 -1.5785412 -2.2154167 1.2178942 -2.4105461 1.5165817 -1.6792424 2.6745315 4.0383315 -2.1307039 -3.8226099 2.2907619 -6.4316201 4.2418261 -3.5054414 4.9009399 5.7991247 -2.9607944 -5.6089711 3.4948549 -10.0796852 6.6134601 -5.4449883 7.3203011 3.1944733 -0.8375099 -3.0689845 2.4101362 -7.0004926 6.0788431 -4.4329886 4.5378199 2.5002964 -1.4372219 -2.0238287 1.2180597 -3.8250041 2.0838010 -1.9106206 2.2467656 4.2037992 -1.5091769 -3.9004555 2.5140226 -7.6892085 4.6017189 -4.0166264 4.4635987 6.0446501 -2.3462272 -5.4268880 3.8630376 -11.6510000 7.1476207 -6.3251677 6.7834301 3.2603757 -2.0479751 -3.2806520 2.5903378 -8.1446295 6.1650820 -5.1591110 4.4736381 2.4147832 -0.7195692 -2.1033266 1.3697616 -4.1041832 2.7484744 -2.4724543 2.3008380 4.3363791 -2.0837185 -4.7758379 2.9154832 -7.7789454 4.8200598 -5.1969929 4.3911753 6.1103435 -3.1602242 -6.9426804 4.6219139 -11.0894461 6.8936791 -8.0906057 6.5634117 3.2947707 -1.9312513 -3.6609507 3.3133774 -6.0850558 6.0766740 -6.2330036 4.5936375 1.9970813 -0.6750594 -2.9224007 1.7428564 -3.8323891 3.4850979 -3.1072216 2.1136458 3.5876698 -1.1887335 -3.7913547 3.6176546 -5.5689111 5.4057198 -6.5486379 4.4078698 5.4173455 -1.4962059 -5.1492734 5.6726856 -8.9176807 8.0205469 -9.9489498 6.4577103 3.4613435 -2.2766767 -4.6247854 4.0642285 -5.9931269 7.0514874 -7.1165977 4.2509303 0.1268182 0.7313466 -44.5723076 2.5659006 -2.3164480 3.3273056 -4.0632405 5.1160221 -1.5254221 -0.7971495 -100.6303711 4.9346733 -4.1760926 7.7455168 -8.3153391 11.1474619 -4.2211919 6.8846960 -51.0784721 7.5294700 -6.4520512 10.2056637 -12.2845306 17.8619194 -3.8940880 -4.5836291 -71.9757233 4.8168559 -10.1393356 9.0722380 -7.6373820 11.6987286 -1.2588665 0.7047764 -44.9423676 2.8818805 -1.4807268 2.8493578 -4.4728742 5.8986239 -3.4776630 -1.1848049 -96.6963654 5.6664152 -3.9441385 6.3180461 -9.0953989 12.3841524 -7.0039988 6.4391961 -53.8508072 8.4754686 -6.9837389 9.4477987 -13.5419064 18.4332867 -4.0538282 -4.9611335 -43.2431679 5.6967421 -7.9360676 6.8150029 -8.8097448 13.5478649 -1.7553289 -1.2992018 -47.7861137 3.1224210 -3.6254573 3.3423162 -4.8853192 6.0806284 -4.7267456 1.6186826 -65.0948792 6.1519647 -6.9726095 7.3556857 -9.9727716 11.9044323 -8.1289043 7.9755406 -56.2214241 9.4401894 -9.2078238 8.9832926 -15.0220327 18.7340565 -3.9804494 17.2896748 -6.4118547 6.4207945 -7.7482877 5.6044531 -9.9781008 12.0970907 -3.0721936 -2.4662318 -50.8800888 3.4677136 -3.2867010 2.9249864 -5.3925576 6.6199584 -6.7731791 -0.5973988 -62.1904221 7.0156622 -5.9960523 5.2337790 -10.9225264 13.2172937 -11.2442408 -3.2234085 -72.5624084 10.6944714 -7.5548210 5.9088097 -16.4920406 21.0048161 -1.0254035 -0.4495553 -7.2150817 7.0701485 -8.8848438 6.1310945 -10.7812643 14.5311956 -3.9758990 -3.9062328 -56.2698364 3.8703012 -3.2360528 2.5485830 -5.9808927 7.0669036 -8.7660885 -0.1570540 -65.2694397 7.7152267 -5.9373770 5.1712213 -12.1153622 14.5143795 -13.1288061 1.9446427 -77.2450867 11.5829344 -9.8770933 6.3600373 -18.1492367 21.9746666 -8.3132095 3.4305654 -5.0662832 8.0318222 -9.7034664 -5.1851430 -11.2842712 14.8682213 -4.8928876 -3.4001784 -68.4993591 4.1534514 -3.3852715 2.5824912 -6.7106194 8.1458769 -11.4333324 -0.6608297 -82.6862335 8.2538385 -5.9429550 6.0329027 -13.3381433 16.3899460 -18.7381840 -3.9198053 -67.2997742 12.6859589 -6.4331708 8.1050539 -19.5742016 26.9328804 -8.2187128 1.3118140 -3.6006021 8.6372986 -10.1718702 2.5785460 -10.8871679 11.7821741 -6.0982747 -1.1513565 -99.4297638 4.4215817 -4.7400880 3.9675419 -7.2439108 9.7010174 -12.5733061 1.9297071 -88.7946625 8.9005976 -9.1138630 7.2503948 -14.2361841 19.5796413 -19.3814392 -6.6138330 -67.4990005 13.5686941 -11.1470547 7.3417978 -21.2678490 30.9138622 -10.7800856 4.4109631 -13.1509733 9.0087748 -6.5738668 -0.3635551 -14.6529408 23.5225277 -7.4389849 -1.0916448 -72.5341263 4.7494078 -4.1897511 3.2244496 -7.9778228 10.3724880 -14.5824194 3.4567449 -74.2332230 9.5442562 -8.8401327 7.3357315 -15.3971157 21.1358128 -23.3803368 11.8522558 -54.3915558 14.4969120 -11.4681244 2.4957852 -24.0922241 31.1371021 -13.0312586 0.7684373 -2.2503364 10.9758472 -7.7562809 1.5307888 -7.3715830 12.3962240 -8.5783501 -0.7509816 -69.2769241 4.9146881 -4.2367105 4.9618249 -8.5687618 11.2480831 -17.6261692 7.3594375 -70.6448975 10.2550611 -7.9418063 4.0276198 -17.2098942 22.2429028 -26.0572338 12.7689981 -54.8112259 15.6595984 -13.5172930 2.1409674 -24.6763821 33.3538094 -13.4172268 0.3415805 -2.6408863 10.9906006 0.7565925 3.6397154 -14.7426062 -1.0721284 -9.9503765 0.2072612 -64.9442596 5.2296953 -4.2829990 3.9775438 -9.3674335 11.8574009 -19.9348431 2.5099950 -79.3107681 11.0246916 -7.4532361 2.4297271 -18.4495506 24.3122196 -29.8689270 -1.1237402 -53.7956886 17.1380062 -12.8364906 11.2762575 -23.6679840 35.7705383 -14.0888100 1.2630527 -6.2804894 15.4771309 -10.0291023 8.6482401 1.3438952 20.8881550 -10.8705225 -0.6756330 -64.6956329 5.6225224 -4.6906996 3.2509501 -10.1138840 12.6331768 -22.1802273 -3.4947805 -70.9722061 11.9514866 -8.9652195 -1.6133058 -19.5853138 25.5340672 -35.3848190 0.4332115 -53.6661873 27.7354164 -6.3671279 15.7961321 -11.4307966 35.7043343 -7.8052478 2.4562163 -10.6562214 22.9445343 -9.3607216 5.4545493 -1.4839240 19.4102650 -12.3270741 0.2133150 -66.5559235 5.7818160 -5.1332693 5.3690310 -10.7868271 13.4240522 -23.8234615 -1.8969491 -76.1699295 12.6503096 -10.5995445 -4.6114302 -25.3779259 26.4193115 -34.9130745 -0.3415057 -54.6340599 22.5881634 -18.9925861 8.1043081 -24.2424297 36.6276245 -12.7230377 0.9913384 -6.8049531 31.3812771 -11.4658175 4.4995098 -0.7433885 8.8279800 -12.8928127 3.6037941 -72.1943054 5.7618561 -5.3406649 -34.8110085 -13.7264376 14.8043747 -25.5254974 5.4346113 -73.0031128 13.9877815 -11.7711744 -25.2850895 -19.8273697 28.0809593 -41.8873177 17.0967236 -53.2118988 28.7315693 -11.7354012 11.9421272 -11.2880774 39.8456345 -8.9839983 3.1960082 -8.3834972 28.5502663 -10.5233727 6.8243370 -2.4324360 20.2344170 -14.2827587 2.7806115 -80.5522614 6.7806621 -4.3644996 -37.1712799 -13.2409248 15.5484514 -27.7451324 9.5116558 -70.4279709 15.4459219 -10.9027767 -31.7256031 -22.6728821 29.3183270 -35.8929100 8.8365374 -40.6894493 28.9919434 -23.6586990 11.2554569 -18.4837875 39.8782654 -13.7951698 1.3463789 -13.6930666 34.5338173 -8.5734682 7.2321982 -2.0190408 18.6029835 -15.6768198 4.0835600 -83.5023499 6.8562799 -3.8043189 -34.3865700 -15.1835957 16.4878941 -31.1002903 17.5793343 -63.9089050 18.7345695 -8.8817749 -29.3413696 -22.1055450 29.1717358 -28.4416904 23.4765892 -47.1155891 43.5574455 -17.6745434 -2.4330533 -10.9418678 38.4811783 -17.7078857 1.1317812 -6.0024395 22.7159138 -10.4238367 2.7766800 -2.1158822 14.1675663 -16.9454174 5.6354346 -68.3403854 7.8496137 -5.3481278 -35.8604431 -12.6878672 16.0921078 -40.6132660 5.9559402 -59.2495766 23.3777256 -5.6447511 -17.4163265 -12.4510717 27.9804649 -38.7310600 11.9661942 -33.4403114 61.0752678 -27.3828220 -32.0253716 -8.5182705 -21.3708038 -6.1672797 18.4775906 -3.3494835 8.2147465 -7.6460748 -6.1597772 -2.0575895 -4.3467855 -17.7611485 9.9177084 -49.5620461 9.7314501 -11.8263187 -29.3470745 -7.7965612 13.7571001 -21.1436653 10.6967535 -71.2724228 43.4339790 -10.9211206 -42.4025078 -3.1388264 16.3926373 -32.3961525 17.5647068 -30.8934860 54.6458435 -25.5732269 -39.5289917 -3.2401850 -6.0542507 -0.7939494 12.2707958 -0.8961523 6.1629438 -8.1257029 -13.5594683 -0.6371673 -12.7893057 0.0015084 -0.0301310 0.0251429 0.0353280 0.0208815 0.0210072 0.0490947 0.0398394 0.0040389 -0.0124635 -0.0083836 -0.0390172 -0.0349928 -0.0039806 0.0231780 -0.0317804 0.0196726 -0.0474289 -0.0226227 0.0196243 0.0183593 -0.0309477 -0.0377952 0.0164472 -0.0151557 0.0288419 -0.0469923 0.0370622 0.0274415 -0.0377712 0.0456276 -0.0357087 -0.0293467 0.0035706 -0.0065949 -0.0221471 0.0483063 -0.0110782 -0.0177299 -0.0235997 0.0250716 0.0345773 -0.0343963 -0.0464026 -0.0436516 0.0167249 -0.0162085 0.0235631 0.0239038 0.0170737 -0.0214635 0.0246790 -0.0246154 0.0129410 0.0436247 -0.0035921 0.0400541 -0.0218126 0.0065279 -0.0261494 0.0459490 -0.0129825 -0.0303242 0.0213319 2.2196279 -6.3760443 -1.9789431 -1.1281648 0.8088945 3.6157558 0.5845705 -1.3337507 5.0578356 -15.7473907 -4.2458534 -2.0792241 2.0308766 5.0493989 1.8548114 -3.9618258 7.6698999 -25.9001007 -7.3480544 -3.3554952 2.9344361 6.6269689 3.3340330 -7.5791469 4.6205640 -13.1157703 -6.3012123 -3.3157387 2.0393004 2.9004076 2.8105042 -7.7802806 2.0708804 -10.1931124 -3.1716807 -1.4268796 0.9147742 2.4247055 0.8645043 -2.3756838 4.7281346 -20.1945496 -5.4407272 -2.7664039 2.0535812 4.2391968 2.1161423 -5.9098058 7.1038823 -29.5066624 -8.5183992 -4.2965031 2.9874902 6.2237339 3.5981615 -10.3195190 5.1555610 -19.5146542 -7.2374768 -3.5494080 2.4666600 2.6217756 2.9765894 -8.1328831 2.7524319 -10.6683807 -3.6630418 -1.6857432 0.9326671 2.0787807 1.2490115 -3.7643251 5.5100579 -22.1865864 -7.0065126 -3.4371724 2.1525545 3.5018466 2.5744791 -7.9919024 8.0858870 -35.8367424 -10.3196182 -5.2542853 3.0800242 5.2227917 4.1829014 -12.5661011 6.0986843 -24.4508247 -6.3609695 -4.0004516 0.2926685 2.5461967 3.2751951 -10.1421947 2.9564579 -12.5126114 -4.0556889 -1.9198939 1.3188859 2.3341150 1.4395926 -4.3092623 5.9744105 -26.6878815 -7.5152698 -3.9073517 2.2465205 3.8296604 2.9786234 -9.1999960 8.9262609 -55.2377281 -11.2453442 -6.0434694 3.0806856 5.6352496 4.6389470 -14.3598537 6.8285618 -18.5487118 -6.9807897 -4.4236917 0.2919528 2.3257957 3.6251698 -11.4267282 3.3619983 -14.6008358 -4.7240548 -2.2833648 1.2093816 1.9508821 1.8108022 -5.4558196 6.9743237 -34.4319763 -8.5635071 -4.7020073 2.1212387 3.9882948 3.6007555 -11.4041204 10.5269337 -56.2353592 -13.2101860 -7.2287130 3.0946856 5.1799898 5.5845704 -17.7274647 7.0019140 -14.8968201 -8.9787560 -5.2991738 1.2358299 1.9840790 4.0972199 -13.2139950 4.2901931 -16.6662922 -5.2905350 -2.8178248 1.3320680 2.1820607 2.2503924 -5.9674988 9.1521339 -38.3292809 -10.1839685 -5.6287274 2.1152227 3.1485119 4.4430327 -12.6132822 13.9323645 -36.2718697 -15.4041624 -8.4968863 2.9499667 4.2088408 6.8563018 -19.8239975 8.2984505 -12.3729124 -11.2215977 -6.0541840 0.9798861 1.6655620 4.7322383 -15.3051949 3.8980193 -21.5804634 -5.1702003 -3.1107249 2.6372495 -1.5650054 3.1625724 -9.7686787 7.3827124 -24.7524567 -8.7884312 -6.2054067 6.2358766 -5.0504680 6.2208080 -9.9381323 8.0943031 -1.2186718 -12.3805399 -9.3949738 9.7600203 -7.2619863 9.3537683 -32.3677139 1.2635597 15.2126589 -2.5810523 -6.2948236 5.0496683 -8.6231718 6.4620581 -8.1667957 3.0841637 -21.8368473 -4.2544723 -3.4851031 2.8794932 -2.5446529 3.4436760 -12.0647430 5.0378814 -36.9144974 -7.9260135 -7.0397992 5.6283636 -6.9089646 6.8424473 -37.3676414 6.3148508 -32.1466408 -12.0289612 -10.5087662 9.0100727 -11.2321606 10.4032011 -38.0652161 0.6873507 -10.7353220 -7.1727962 -7.0458970 6.2954893 -7.9725327 7.1172719 -11.9893904 1.6758013 -13.4896240 -3.9744942 -3.9346075 2.9947798 -3.4252362 3.8690486 -17.6064186 3.6040683 -4.6566715 -8.7112408 -7.6978726 5.5691538 -9.9847898 7.7830439 -22.1828556 5.1031742 -2.0469236 -11.2388735 -11.5518856 9.6579542 -15.1686258 11.6068621 -21.4712410 5.4091525 -2.4783854 -1.0842495 -7.9040813 4.5117865 -6.9110389 8.0632191 -1.3558116 0.8438005 -29.6437225 -3.3346515 -4.3375692 1.8673639 -5.1364989 4.2393475 -31.1907539 2.3373401 -34.3820457 -6.5953069 -8.5811300 4.5892701 -11.1075764 8.6913757 -22.3331566 2.7162986 -10.6082487 -9.0905685 -12.8833685 6.4369369 -17.7176456 13.2204962 -15.8007927 3.0983958 -1.8566915 -8.5510254 -8.4691210 7.8648906 -8.0900927 8.9333344 -10.7037039 0.8507599 -27.1449852 -2.5116816 -4.6749368 1.6902546 -6.9344468 4.7922983 -23.5440826 1.6145236 -18.4088745 -5.2219319 -9.3689890 4.8381743 -14.3675423 9.5221586 -20.8785782 1.5371037 6.3601799 -8.2751875 -14.1540318 7.5189009 -19.7983646 14.3926888 -13.9657021 -0.9301136 0.0157767 -5.7529573 -9.1403856 6.6395121 -14.5985451 10.0116997 -8.8487272 -0.0046495 -24.4989109 -1.7090083 -5.1619463 1.0602210 -8.6883068 5.1488004 -31.0949802 -0.3532568 -17.2936897 -3.3142478 -10.3325014 3.3791707 -17.4644012 10.3026924 -0.5830024 0.3826487 -9.4200230 -5.2879128 -15.1563158 7.3297887 -29.0483341 15.8723583 -1.3235848 7.7948442 -0.6772933 1.4841646 -9.9192762 -0.4910606 -2.8985467 11.0879135 1.3059399 -1.9505208 -21.0660515 -1.9097832 -5.5482483 2.4098592 -9.5016317 5.8605809 -22.9471989 -3.6627696 -26.1283398 -2.7718365 -11.1109247 6.0130749 -17.1469021 11.6183500 -7.7549577 -5.2348371 -5.5899591 -3.3869452 -16.4045753 10.0659637 -26.8663063 17.3208466 -27.7773247 -9.7013893 -0.2935639 1.9436948 -11.2632523 6.9182720 -7.4256783 10.7789364 -2.1596372 -2.0995898 -10.3531027 -0.9233402 -6.0335598 2.4876294 -11.4235487 6.1396875 -13.8944693 -5.2162180 -10.9140368 -1.7074747 -11.9316635 5.9155335 -20.9678097 12.3483372 -9.5255814 -8.8624277 -2.1551230 1.0031774 -18.8056393 9.7811003 -22.7672367 17.7985821 -4.9214373 7.3500319 -0.2056762 4.1974554 -9.9028406 0.9534310 -7.2665029 13.8340397 4.1680880 -2.5222075 -5.6280169 0.0703084 -6.3806520 2.2445571 -12.8348207 6.5889549 4.9784799 -5.9227023 -8.9395618 0.3663810 -12.8164606 4.8512845 -24.0277996 13.1925383 -2.4694567 -8.1824627 -2.1626000 0.4437862 -18.8929768 7.1272650 -37.3037529 19.9731693 -2.8519464 18.6936474 -0.2250537 1.4433467 -11.7009230 0.8922100 -6.7815509 15.3916540 2.8881750 -3.6449556 -8.2607603 0.7310134 -6.9733305 1.9570311 -14.3382797 6.8937621 -1.7339445 -7.3915462 -6.7106748 1.0536580 -13.9062204 5.0157771 -28.0346851 14.0013161 -8.1828032 -13.6250896 -2.8165200 0.7583418 -21.0494499 4.8949242 -34.1777649 21.5431900 -6.4585690 10.2391834 -0.5295570 12.2194920 -15.3213167 3.2658770 -11.5502481 11.8895454 2.2647083 -4.3975134 1.0889224 1.8149552 -7.5790863 1.4079416 -15.4682751 7.3201399 -1.7150209 -10.8251686 -2.1780636 3.6440575 -15.5225897 3.1575308 -29.2485867 14.5883713 -11.3642473 7.7853327 -6.5468998 40.9552155 -24.8359261 7.0338354 -38.5840378 15.8405581 2.3803179 6.7350888 -0.7984187 24.0277100 -11.8036203 2.9411879 -18.6012230 20.9147148 8.9131794 -5.4654918 13.7382288 1.8531421 -8.1683817 1.8377013 -17.5786953 7.7518749 -5.4683628 -11.6892996 4.3725839 4.0182090 -16.5448093 4.4169955 -32.4978180 15.4597263 9.9341955 41.8011436 -1.4369966 47.8711967 -35.6443367 14.0401936 -54.6532440 39.3291702 0.9868936 8.1344509 -0.9583625 23.5630245 -16.5471859 1.7208736 -15.4541187 24.4111137 8.6754484 -7.4268928 12.8491030 3.0544941 -8.6269941 2.7396035 -16.7894192 7.9738531 -3.4850667 -16.3560390 11.9733315 6.7161379 -16.9498100 6.2974558 -31.1069889 15.8141699 0.0819664 -22.3721275 -6.7707224 28.8257484 -16.5616817 9.1173954 -45.7287598 16.8855915 1.7208385 14.8299074 -0.6131330 17.7063160 -10.5395517 7.2150149 -9.7436228 17.2125492 8.1900597 -7.9381700 9.4744101 3.8130367 -8.9892359 2.6538568 -18.7535000 8.4553041 3.2295597 -21.0032883 1.1458555 8.9400272 -18.1266594 4.6458211 -34.1345711 16.0949554 -2.7053993 -12.7620659 -2.1154599 38.4523849 -19.7590942 16.0004997 -47.4703751 14.4708061 -0.1327288 9.8745012 -0.5744892 18.3081455 -10.5719147 2.5368972 -13.1220379 26.0594616 9.1686049 -8.3951025 20.6223564 4.1641583 -9.3932791 1.9797418 -21.5680504 8.9076395 7.1671510 -14.7054119 -3.4595921 4.3392777 -23.4924431 2.0387647 -41.3884735 19.3872471 1.3316351 -4.6699924 -1.4879042 54.4803429 -25.3522892 5.9754639 -49.8132858 18.0042839 10.3712759 6.4259043 -0.3126109 14.6655836 -6.2842550 1.5529300 -10.6992550 30.1154461 12.7510471 -8.9039564 29.3049335 5.4438176 -10.1977806 1.8667293 -22.6812897 8.9562273 -2.3201079 -23.4633522 -1.4017687 26.1813927 -9.9239445 7.1781340 -51.9639854 11.8954554 -1.6339447 17.3961887 -2.1546085 37.5902748 -19.3821335 20.7700424 -36.2937775 41.0792389 24.8988400 3.2037950 -1.1979600 9.0825005 -3.1869652 16.4772072 -9.2148180 12.5517178 9.6115675 32.7067184 -3.1461313 52.2068863 -4.9212785 7.0821848 -34.6782532 18.5047798 4.6478930 5.3913941 -0.7909020 37.0989876 -15.2967205 19.9949322 -19.9902515 18.1801624 33.9859467 13.9620228 -0.1235535 42.2184868 -14.1040182 22.7156906 -29.6722870 38.1997948 68.3178940 4.5510058 -0.3411796 2.0397820 -0.7730381 -0.2376515 -0.4521550 4.3193407 28.8145828 0.0069611 -0.0414035 -0.0066671 -0.0156546 0.0347898 -0.0068203 -0.0285197 -0.0466326 0.0114840 0.0436433 0.0152209 -0.0074379 0.0321818 0.0316244 0.0156932 0.0204711 0.0105011 -0.0479866 -0.0262406 0.0427519 -0.0369307 0.0142825 -0.0030159 0.0113251 -0.0385851 0.0193827 -0.0314223 -0.0289577 -0.0035788 0.0201854 -0.0254997 0.0154617 -0.0087822 0.0499439 0.0477543 -0.0252782 0.0036634 -0.0155989 0.0455860 0.0443218 -0.0042887 0.0078918 0.0139727 -0.0148530 -0.0324391 -0.0293934 0.0187026 0.0155855 0.0230472 0.0131703 0.0113666 0.0247549 0.0077060 0.0379071 0.0108720 0.0088625 0.0147799 -0.0059425 -0.0035397 -0.0114485 0.0482280 -0.0322321 0.0116540 -0.0289940 -0.6065395 0.4816957 -0.0524995 64.7793350 -6.3912001 1.1792265 -61.0045013 -1.6807468 -115.3067017 35.0680351 -61.7762451 3.7883921 -145.7450562 -0.0889851 -86.7193298 5.5362659 1.6789309 30.6925278 -52.6121140 3.9092667 -53.9355927 -130.5955811 -1.1395355 -1.0112584 -6.0816917 -112.5545197 3.3129356 -179.1917267 5.9724054 -116.7099915 7.2863913 0.3147163 1.2537336 -6.7742796 16.7874680 -4.5003395 7.2244864 1.7636479 -1.6983852 3.1956618 -75.9648514 11.1671762 47.2553902 -26.2025013 -17.3383942 -61.8542786 -33.9443588 -42.6539154 -0.4512386 -0.7947870 -5.2446609 -2.9216764 -21.8254299 gnubg-1.08.003/simpleboard.c000644 001751 000024 00000037700 14574155047 015310 0ustar00pmstaff000000 000000 /* * Copyright (C) 2007-2009 Christian Anthon * Copyright (C) 2007-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: simpleboard.c,v 1.30 2021/02/07 21:01:02 plm Exp $ */ /*! \file simpleboard.c * \brief exporting a matchstate and board to a cairo drawing context */ #include "config.h" #if defined(HAVE_PANGOCAIRO) #include #include #include #include #include "backgammon.h" #include "positionid.h" #include "matchid.h" #include "simpleboard.h" /*! \brief get number of checkers from a backgammon variation * */ static guint checkers_from_bgv(bgvariation bgv) { switch (bgv) { case VARIATION_STANDARD: case VARIATION_NACKGAMMON: return 15; case VARIATION_HYPERGAMMON_1: return 1; case VARIATION_HYPERGAMMON_2: return 2; case VARIATION_HYPERGAMMON_3: return 3; default: g_assert_not_reached(); return 0; } } /*! \brief fills and stroke the active context * */ static void fill_and_stroke(cairo_t * cr, SimpleBoardColor c) { cairo_set_source_rgb(cr, c.fill[0], c.fill[1], c.fill[2]); cairo_fill_preserve(cr); cairo_set_source_rgb(cr, c.stroke[0], c.stroke[1], c.stroke[2]); cairo_stroke(cr); } /*! \brief calculates the point position and direction up or down * * points are numbered 0 to 23 counter clockwise for the top player */ static void get_point_base(gint i, gint * restrict x, gint * restrict y, gint * restrict direction) { g_assert(i >= 0 && i < 24); if (i > 17) { *x = 170 + (i - 18) * 20; *y = 270; *direction = -1; } else if (i > 11) { *x = 30 + (i - 12) * 20; *y = 270; *direction = -1; } else if (i > 5) { *x = 30 + (11 - i) * 20; *y = 30; *direction = 1; } else { *x = 170 + (5 - i) * 20; *y = 30; *direction = 1; } } /*! \brief draws a string in monospace, left oriented, multiple lines allowed * */ static void draw_fixed_text(cairo_t * cr, const char *text, gint text_size) { PangoLayout *layout; PangoFontDescription *desc; gchar *font; layout = pango_cairo_create_layout(cr); font = g_strdup_printf("monospace %d", text_size); desc = pango_font_description_from_string(font); g_free(font); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_set_text(layout, text, -1); pango_cairo_show_layout(cr, layout); g_object_unref(layout); } /*! \brief draws the header text, max 3 lines * */ static void draw_header_text(SimpleBoard * board) { if (!board->header) return; cairo_move_to(board->cr, board->text_size * 3, board->text_size * 3); draw_fixed_text(board->cr, board->header, board->text_size); cairo_translate(board->cr, 0.0, board->text_size * 7.5); } /*! \brief draws the annotation text * */ static void draw_annotation_text(SimpleBoard * board) { if (!board->annotation) return; cairo_move_to(board->cr, board->text_size * 3, 0.0); draw_fixed_text(board->cr, board->annotation, board->text_size); } /*! \brief draws a string in sans, centered horizonally and vertically * */ static void draw_centered_text(cairo_t * cr, float color[3], gfloat text_size, const char *text) { PangoLayout *layout; gint width, height; gchar *f_text; gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; cairo_save(cr); layout = pango_cairo_create_layout(cr); g_ascii_formatd(buf, G_ASCII_DTOSTR_BUF_SIZE, "%.1f", text_size); f_text = g_strdup_printf("" "%s" "", buf, (int) (color[0] * 255.0f), (int) (color[1] * 255.0f), (int) (color[2] * 255.0f), text); pango_layout_set_markup(layout, f_text, -1); pango_layout_get_size(layout, &width, &height); cairo_rel_move_to(cr, -((double) width / PANGO_SCALE) / 2, -((double) height / PANGO_SCALE) / 2); pango_cairo_update_layout(cr, layout); pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(f_text); cairo_restore(cr); } static void draw_points(SimpleBoard * board) { gint x, y, direction, i; cairo_t *cr = board->cr; for (i = 0; i < 24; i++) { gchar *number; SimpleBoardColor color = board->color_point[i % 2]; gint point_nr; get_point_base(i, &x, &y, &direction); cairo_save(cr); cairo_translate(cr, x, y); cairo_move_to(cr, -10, 0); cairo_line_to(cr, 0, direction * 100); cairo_line_to(cr, 10, 0); cairo_close_path(cr); fill_and_stroke(cr, color); cairo_move_to(cr, 0, 0); point_nr = board->ms.fMove ? 24 - i : i + 1; number = g_strdup_printf("%d", point_nr); cairo_move_to(cr, 0, -10 * direction); draw_centered_text(cr, color.text, 8.0, number); g_free(number); cairo_restore(cr); } } static void draw_cube(SimpleBoard * board) { gint x = 150, y = 150; gchar *text; SimpleBoardColor color = board->color_cube; cairo_t *cr = board->cr; gint cube; cube = board->ms.nCube; if (board->ms.fDoubled) { if (board->ms.fMove) x = 200; else x = 100; cube *= 2; } else { switch (board->ms.fCubeOwner) { case -1: break; case 0: y = 40; break; case 1: y = 260; break; default: g_assert_not_reached(); } } cairo_rectangle(cr, x - 8, y - 8, 16, 16); fill_and_stroke(cr, color); text = g_strdup_printf("%d", cube); cairo_move_to(cr, x, y); draw_centered_text(cr, color.text, (gfloat) (12 - 2 * strlen(text)), text); g_free(text); } static void draw_dice(SimpleBoard * board) { gint i, x, y, move; guint *dice; cairo_t *cr; move = board->ms.fMove; dice = board->ms.anDice; cr = board->cr; if (!dice[0] || !dice[1]) return; for (i = 0; i < 2; i++) { x = (move ? 200 : 62) + i * 22; y = 140 + i * 4; cairo_rectangle(cr, x, y, 16, 16); cairo_set_source_rgb(cr, 0, 0, 0); cairo_stroke(cr); switch (dice[i]) { case 1: cairo_move_to(cr, x + 9, y + 8); cairo_arc(cr, x + 8, y + 8, 1, 0, 2 * G_PI); cairo_close_path(cr); break; case 2: cairo_move_to(cr, x + 5, y + 4); cairo_arc(cr, x + 4, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 12); cairo_arc(cr, x + 12, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); break; case 3: cairo_move_to(cr, x + 5, y + 4); cairo_arc(cr, x + 4, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 9, y + 8); cairo_arc(cr, x + 8, y + 8, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 12); cairo_close_path(cr); cairo_arc(cr, x + 12, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); break; case 4: cairo_move_to(cr, x + 5, y + 4); cairo_arc(cr, x + 4, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 12); cairo_arc(cr, x + 12, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 4); cairo_arc(cr, x + 12, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 5, y + 12); cairo_arc(cr, x + 4, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); break; case 5: cairo_move_to(cr, x + 5, y + 4); cairo_arc(cr, x + 4, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 12); cairo_arc(cr, x + 12, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 9, y + 8); cairo_arc(cr, x + 8, y + 8, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 4); cairo_arc(cr, x + 12, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 5, y + 12); cairo_arc(cr, x + 4, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); break; case 6: cairo_move_to(cr, x + 5, y + 4); cairo_arc(cr, x + 4, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 5, y + 8); cairo_arc(cr, x + 4, y + 8, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 5, y + 12); cairo_arc(cr, x + 4, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 4); cairo_arc(cr, x + 12, y + 4, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 8); cairo_arc(cr, x + 12, y + 8, 1, 0, 2 * G_PI); cairo_close_path(cr); cairo_move_to(cr, x + 13, y + 12); cairo_arc(cr, x + 12, y + 12, 1, 0, 2 * G_PI); cairo_close_path(cr); break; default: g_assert_not_reached(); } cairo_stroke(cr); } } static void draw_turn(SimpleBoard * board) { gint i; SimpleBoardColor color = board->color_checker[board->ms.fMove]; cairo_t *cr = board->cr; i = board->ms.fMove * 2 - 1; cairo_rectangle(cr, 8, 150 - i * 15, 4, i * 16); cairo_move_to(cr, 3, 150 + i); cairo_line_to(cr, 10, 150 + i * 15); cairo_line_to(cr, 17, 150 + i); cairo_close_path(cr); fill_and_stroke(cr, color); } static void draw_checkers_on_xy(cairo_t * cr, gint x, gint y, gint direction, guint max, guint number, SimpleBoardColor color) { guint p; for (p = 0; number > 0 && p < max; number--, p++) { y += 20 * direction; cairo_move_to(cr, x + 9, y); cairo_arc(cr, x, y, 9, 0, 2 * G_PI); cairo_close_path(cr); fill_and_stroke(cr, color); } if (number) { gchar *checker_text = g_strdup_printf("%u", number + max); cairo_move_to(cr, x, y); draw_centered_text(cr, color.text, 7.0, checker_text); g_free(checker_text); } } static void draw_checkers_on_point(cairo_t * cr, gint point, guint number, SimpleBoardColor color) { gint x, y, direction; g_assert(number <= 15); if (!number) return; get_point_base(point, &x, &y, &direction); y -= 10 * direction; draw_checkers_on_xy(cr, x, y, direction, 5, number, color); } static void draw_checkers_on_bar(cairo_t * cr, gint i, guint n, SimpleBoardColor color) { gint x = 150; gint y = i ? 50 : 250; gint direction = i ? 1 : -1; draw_checkers_on_xy(cr, x, y, direction, 3, n, color); } static void draw_checkers_off(cairo_t * cr, gint i, guint n, SimpleBoardColor color) { gint x = 290; gint y = i ? 280 : 20; gint direction = i ? -1 : 1; draw_checkers_on_xy(cr, x, y, direction, 3, n, color); } static void draw_checkers(SimpleBoard * board) { gint player, point, p, i; guint n, unplaced; SimpleBoardColor c; for (i = 0; i < 2; i++) { player = (board->ms.fMove) ? i : !i; c = board->color_checker[player]; unplaced = checkers_from_bgv(board->ms.bgv); for (point = 0; point < 24; point++) { p = player ? 23 - point : point; n = board->ms.anBoard[i][p]; unplaced -= n; draw_checkers_on_point(board->cr, point, n, c); } n = board->ms.anBoard[i][24]; unplaced -= n; draw_checkers_on_bar(board->cr, player, n, c); draw_checkers_off(board->cr, player, unplaced, c); } } static void draw_borders(cairo_t * cr) { cairo_save(cr); cairo_set_line_width(cr, 2); cairo_rectangle(cr, 0, 10, 300, 280); cairo_set_source_rgb(cr, 1, 1, 1); cairo_fill_preserve(cr); cairo_set_source_rgb(cr, 0, 0, 0); cairo_rectangle(cr, 20, 30, 260, 240); cairo_rectangle(cr, 140, 30, 20, 240); cairo_rectangle(cr, 0, 132, 20, 36); cairo_rectangle(cr, 280, 132, 20, 36); cairo_stroke(cr); cairo_restore(cr); } /*! \brief sbd * */ extern int simple_board_draw(SimpleBoard * board) { cairo_t *cr = board->cr; g_assert(cr != NULL); cairo_save(cr); draw_header_text(board); if (board->surface_x != 0.0 && board->size > 0.0) cairo_translate(cr, board->surface_x / 2.0 - board->size / 2.0, 0); cairo_scale(cr, board->size / 300.0, board->size / 300.0); draw_borders(cr); draw_points(board); draw_cube(board); draw_dice(board); draw_checkers(board); draw_turn(board); cairo_restore(cr); cairo_save(cr); cairo_translate(cr, board->text_size * 3, board->text_size * 7.5 + board->size); draw_annotation_text(board); cairo_restore(cr); return (0); } extern SimpleBoard * simple_board_new(matchstate * state, cairo_t * cr, float simple_board_size) { SimpleBoard *board; SimpleBoardColor black_black_white = { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f} }; SimpleBoardColor white_black_black = { {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f} }; SimpleBoardColor grey_black_black = { {0.7f, 0.7f, 0.7f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f} }; board = g_new0(SimpleBoard, 1); board->color_checker[0] = white_black_black; board->color_checker[1] = black_black_white; board->color_point[0] = grey_black_black; board->color_point[1] = white_black_black; board->color_cube = white_black_black; board->size = simple_board_size; board->text_size = 6; if (state) board->ms = *state; board->cr = cr; return board; } #ifdef SB_STAND_ALONE static SimpleBoard * simple_board_new_from_ids(gchar * position_id, gchar * match_id, cairo_t * cr) { SimpleBoard *board; g_assert(position_id != NULL && match_id != NULL); board = simple_board_new(NULL, cr, SIZE_1PERPAGE); if (!PositionFromID(board->ms.anBoard, position_id)) { g_free(board); return (NULL); } if (MatchFromID (board->ms.anDice, &board->ms.fTurn, &board->ms.fResigned, &board->ms.fDoubled, &board->ms.fMove, &board->ms.fCubeOwner, &board->ms.fCrawford, &board->ms.nMatchTo, board->ms.anScore, &board->ms.nCube, &board->ms.fJacoby, &board->ms.gs, match_id)) { g_free(board); return (NULL); } return (board); } #include main(int argc, char *argv[]) { SimpleBoard *board; cairo_surface_t *surface; cairo_t *cr; if (argc != 4) { g_error("wrong number of arguments %d, expected 3\n", argc - 1); return; } surface = cairo_svg_surface_create(argv[3], SIMPLE_BOARD_SIZE, SIMPLE_BOARD_SIZE); cr = cairo_create(surface); board = simple_board_new_from_ids(argv[1], argv[2], cr); if (!board) { g_error("Failed to create simple board from ids %s and %s", argv[1], argv[2]); return; } simple_board_draw(board); cairo_surface_destroy(surface); cairo_destroy(board->cr); g_free(board); } #endif #endif gnubg-1.08.003/board3d/000755 001751 000024 00000000000 14613451677 014154 5ustar00pmstaff000000 000000 gnubg-1.08.003/formatgs.h000644 001751 000024 00000002271 14574155047 014631 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2006-2015 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: formatgs.h,v 1.8 2019/12/21 23:33:11 plm Exp $ */ #ifndef FORMATGS_H #define FORMATGS_H #include #include "analysis.h" typedef enum { FORMATGS_ALL = -1, FORMATGS_CHEQUER = 0, FORMATGS_CUBE = 1, FORMATGS_LUCK = 2, FORMATGS_OVERALL = 3 } formatgs; extern GList *formatGS(const statcontext * psc, const int nMatchTo, const formatgs fg); extern void freeGS(GList * list); #endif /* FORMATGS_H */ gnubg-1.08.003/gtkmovefilter.h000644 001751 000024 00000002454 14574155047 015674 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2008-2011 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkmovefilter.h,v 1.7 2013/06/16 02:16:15 mdpetch Exp $ */ #ifndef GTKMOVEFILTER_H #define GTKMOVEFILTER_H extern GtkWidget *MoveFilterWidget(movefilter * pmf, int *pfOK, GCallback pfChanged, gpointer userdata); extern void SetMovefilterCommands(const char *sz, movefilter aamfNew[MAX_FILTER_PLIES][MAX_FILTER_PLIES], movefilter aamfOld[MAX_FILTER_PLIES][MAX_FILTER_PLIES]); extern void MoveFilterSetPredefined(GtkWidget * pwMoveFilter, const int i); #endif /* GTKMOVEFILTER_H */ gnubg-1.08.003/matchid.c000644 001751 000024 00000015667 14574155047 014430 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2004-2013 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: matchid.c,v 1.30 2021/12/18 22:06:37 plm Exp $ */ #include "config.h" #include "backgammon.h" #include "positionid.h" #include "matchequity.h" #include "matchid.h" #include /* * Calculate log2 of Cube value. * * Input: * n: cube value * * Returns: * log(n)/log(2) * */ extern int LogCube(int n) { int i = 0; while (n >>= 1) i++; return i; } static void SetBit(unsigned char *pc, unsigned int bitPos, int test, unsigned int iBit) { const unsigned int k = bitPos / 8; const unsigned char rbit = (unsigned char) (0x1 << (bitPos % 8)); unsigned char c; if (test & (0x1 << iBit)) c = rbit; else c = 0; pc[k] = (pc[k] & (0xFF ^ rbit)) | c; } static void SetBits(unsigned char *pc, unsigned int bitPos, unsigned int nBits, int iContent) { unsigned int i; /* FIXME: rewrite SetBit, SetBits to be faster */ for (i = 0; i < nBits; i++) { SetBit(pc, bitPos + i, iContent, i); } } static void GetBits(const unsigned char *pc, const unsigned int bitPos, const unsigned int nBits, int *piContent) { unsigned int i, j; unsigned char c[2]; /* FIXME: rewrite GetBits to be faster */ c[0] = 0; c[1] = 0; for (i = 0, j = bitPos; i < nBits; i++, j++) { unsigned int k, r; k = j / 8; r = j % 8; SetBit(c, i, pc[k], r); } *piContent = c[0] | (c[1] << 8); } static char * MatchIDFromKey(unsigned char auchKey[9]) { unsigned char *puch = auchKey; static char szID[L_MATCHID + 1]; char *pch = szID; static const char aszBase64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int i; for (i = 0; i < 3; i++) { *pch++ = aszBase64[puch[0] >> 2]; *pch++ = aszBase64[((puch[0] & 0x03) << 4) | (puch[1] >> 4)]; *pch++ = aszBase64[((puch[1] & 0x0F) << 2) | (puch[2] >> 6)]; *pch++ = aszBase64[puch[2] & 0x3F]; puch += 3; } *pch = 0; return szID; } extern char * MatchID(const unsigned int anDice[2], const int fTurn, const int fResigned, const int fDoubled, const int fMove, const int fCubeOwner, const int fCrawford, const int nMatchTo, const int anScore[2], const int nCube, const int fJacobyInUse, const gamestate gs) { unsigned char auchKey[9]; memset(auchKey, 0, 9); SetBits(auchKey, 0, 4, LogCube(nCube)); SetBits(auchKey, 4, 2, fCubeOwner & 0x3); SetBits(auchKey, 6, 1, fMove); SetBits(auchKey, 7, 1, fCrawford); SetBits(auchKey, 8, 3, (int) gs); SetBits(auchKey, 11, 1, fTurn); SetBits(auchKey, 12, 1, fDoubled); SetBits(auchKey, 13, 2, fResigned); if (anDice[0] >= anDice[1]) { SetBits(auchKey, 15, 3, anDice[0] & 0x7); SetBits(auchKey, 18, 3, anDice[1] & 0x7); } else { SetBits(auchKey, 15, 3, anDice[1] & 0x7); SetBits(auchKey, 18, 3, anDice[0] & 0x7); } SetBits(auchKey, 21, 15, nMatchTo & 0x7FFF); SetBits(auchKey, 36, 15, anScore[0] & 0x7FFF); SetBits(auchKey, 51, 15, anScore[1] & 0x7FFF); SetBits(auchKey, 66, 1, (!fJacobyInUse)); return MatchIDFromKey(auchKey); } static int MatchFromKey(int anDice[2], int *pfTurn, int *pfResigned, int *pfDoubled, int *pfMove, int *pfCubeOwner, int *pfCrawford, int *pnMatchTo, int anScore[2], int *pnCube, int *pfJacoby, gamestate * pgs, const unsigned char *auchKey) { int temp; GetBits(auchKey, 0, 4, pnCube); *pnCube = 0x1 << *pnCube; GetBits(auchKey, 4, 2, pfCubeOwner); if (*pfCubeOwner && *pfCubeOwner != 1) *pfCubeOwner = -1; GetBits(auchKey, 6, 1, pfMove); GetBits(auchKey, 7, 1, pfCrawford); GetBits(auchKey, 8, 3, &temp); *pgs = (gamestate) temp; GetBits(auchKey, 11, 1, pfTurn); GetBits(auchKey, 12, 1, pfDoubled); GetBits(auchKey, 13, 2, pfResigned); GetBits(auchKey, 15, 3, &anDice[0]); GetBits(auchKey, 18, 3, &anDice[1]); GetBits(auchKey, 21, 15, pnMatchTo); GetBits(auchKey, 36, 15, &anScore[0]); GetBits(auchKey, 51, 15, &anScore[1]); GetBits(auchKey, 66, 1, pfJacoby); *pfJacoby = !(*pfJacoby); /* FIXME: implement a consistency check */ if (anDice[0] < 0 || anDice[0] > 6) return -1; if (anDice[1] < 0 || anDice[1] > 6) return -1; if (*pnMatchTo < 0 || *pnMatchTo > MAXSCORE) return -1; if (*pnMatchTo) { if (anScore[0] < 0 || anScore[0] > *pnMatchTo) return -1; if (anScore[1] < 0 || anScore[1] > *pnMatchTo) return -1; } else { /* money game */ if (*pfCrawford) /* no Crawford game in money play */ return -1; } return 0; } extern int MatchFromID(unsigned int anDice[2], int *pfTurn, int *pfResigned, int *pfDoubled, int *pfMove, int *pfCubeOwner, int *pfCrawford, int *pnMatchTo, int anScore[2], int *pnCube, int *pfJacoby, gamestate * pgs, const char *szMatchID) { unsigned char auchKey[9]; unsigned char *puch = auchKey; unsigned char ach[L_MATCHID + 1]; unsigned char *pch = ach; int i; memset(ach, 0, sizeof(ach)); /* decode base64 into key */ for (i = 0; i < L_MATCHID && szMatchID[i]; i++) pch[i] = Base64((unsigned char) szMatchID[i]); for (i = 0; i < 3; i++) { *puch++ = (unsigned char) (pch[0] << 2) | (pch[1] >> 4); *puch++ = (unsigned char) (pch[1] << 4) | (pch[2] >> 2); *puch++ = (unsigned char) (pch[2] << 6) | pch[3]; pch += 4; } /* get matchstate info from the key */ return MatchFromKey((int *) anDice, pfTurn, pfResigned, pfDoubled, pfMove, pfCubeOwner, pfCrawford, pnMatchTo, (int *) anScore, pnCube, pfJacoby, pgs, auchKey); } /* * Generate match ID from matchstate * * Input: * pms: match state * */ extern char * MatchIDFromMatchState(const matchstate * pms) { return MatchID(pms->anDice, pms->fTurn, pms->fResigned, pms->fDoubled, pms->fMove, pms->fCubeOwner, pms->fCrawford, pms->nMatchTo, pms->anScore, pms->nCube, pms->fJacoby, pms->gs); } gnubg-1.08.003/gtkoptions.h000644 001751 000024 00000002027 14606176642 015207 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2003-2007 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkoptions.h,v 1.8 2019/11/01 22:07:26 plm Exp $ */ #ifndef GTKOPTIONS_H #define GTKOPTIONS_H extern void GTKSetOptions(void); extern void GTKSound(void); extern void GTKCommandEditKeyNames(GtkWidget * UNUSED(pw), GtkWidget * pwParent); #endif /* GTKOPTIONS_H */ gnubg-1.08.003/backgammon.h000644 001751 000024 00000122077 14605051561 015104 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2003 Gary Wong * Copyright (C) 1999-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: backgammon.h,v 1.477 2023/09/14 19:36:03 plm Exp $ */ #ifndef BACKGAMMON_H #define BACKGAMMON_H #include "common.h" #include "output.h" #include "analysis.h" #include "eval.h" #include "rollout.h" #define STRINGIZEAUX(num) #num #define STRINGIZE(num) STRINGIZEAUX(num) #define MAX_CUBE ( 1 << 12 ) #define MAX_NAME_LEN 32 #define BUILD_DATE_STR STRINGIZE(BUILD_DATE) #define VERSION_STRING "GNU Backgammon " VERSION " " BUILD_DATE_STR #define GNUBG_CHARSET "UTF-8" extern const char *intro_string; typedef struct command { /* Command name (NULL indicates end of list) */ const char *sz; /* Command handler; NULL to use default subcommand handler */ void (*pf) (char *); /* Documentation; NULL for abbreviations */ const char *szHelp; const char *szUsage; /* List of subcommands (NULL if none) */ struct command *pc; } command; typedef struct procrecorddata { /* Record handler */ int (*pfProcessRecord) (struct procrecorddata *); void *pvUserData; void *avInputData[8]; void *avOutputData[8]; } procrecorddata; #define PROCREC_HINT_ARGIN_SHOWPROGRESS 0 #define PROCREC_HINT_ARGIN_MAXMOVES 1 #define PROCREC_HINT_ARGOUT_MATCHSTATE 0 #define PROCREC_HINT_ARGOUT_CUBEINFO 1 #define PROCREC_HINT_ARGOUT_MOVELIST 2 #define PROCREC_HINT_ARGOUT_MOVERECORD 3 #define PROCREC_HINT_ARGOUT_INDEX 4 typedef enum { PLAYER_HUMAN, PLAYER_GNU, PLAYER_EXTERNAL } playertype; typedef struct { /* For all player types: */ char szName[MAX_NAME_LEN]; playertype pt; /* For PLAYER_GNU: */ evalsetup esChequer; evalsetup esCube; movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; /* For PLAYER_EXTERNAL: */ int h; char *szSocket; } player; typedef enum { MOVE_GAMEINFO, MOVE_NORMAL, MOVE_DOUBLE, MOVE_TAKE, MOVE_DROP, MOVE_RESIGN, MOVE_SETBOARD, MOVE_SETDICE, MOVE_SETCUBEVAL, MOVE_SETCUBEPOS } movetype; typedef struct { /* ordinal number of the game within a match */ int i; /* match length */ int nMatch; /* match score BEFORE the game */ int anScore[2]; /* the Crawford rule applies during this match */ int fCrawford; /* this is the Crawford game */ int fCrawfordGame; int fJacoby; /* who won (-1 = unfinished) */ int fWinner; /* how many points were scored by the winner */ int nPoints; /* the game was ended by resignation */ int fResigned; /* how many automatic doubles were rolled */ int nAutoDoubles; /* Type of game */ bgvariation bgv; /* Cube used in game */ int fCubeUse; statcontext sc; } xmovegameinfo; typedef struct { float aarOutput[2][NUM_ROLLOUT_OUTPUTS]; float aarStdDev[2][NUM_ROLLOUT_OUTPUTS]; evalsetup esDouble; CMark cmark; } cubedecisiondata; typedef struct { /* Move made. */ int anMove[8]; /* index into the movelist of the move that was made */ unsigned int iMove; skilltype stMove; } xmovenormal; typedef struct { int nResigned; evalsetup esResign; float arResign[NUM_ROLLOUT_OUTPUTS]; skilltype stResign; skilltype stAccept; } xmoveresign; typedef struct { positionkey key; /* always stored as if player 0 was on roll */ } xmovesetboard; typedef struct { int nCube; } xmovesetcubeval; typedef struct { int fCubeOwner; } xmovesetcubepos; typedef struct { /* * Common variables */ /* type of the move */ movetype mt; /* annotation */ char *sz; /* move record is for player */ int fPlayer; /* luck analysis (shared between MOVE_SETDICE and MOVE_NORMAL) */ /* dice rolled */ unsigned int anDice[2]; /* classification of luck */ lucktype lt; /* magnitude of luck */ float rLuck; /* ERR_VAL means unknown */ /* move analysis (shared between MOVE_SETDICE and MOVE_NORMAL) */ /* evaluation setup for move analysis */ evalsetup esChequer; /* evaluation of the moves */ movelist ml; /* cube analysis (shared between MOVE_NORMAL and MOVE_DOUBLE) */ /* 0 in match play, even numbers are doubles, raccoons * odd numbers are beavers, aardvarken, etc. */ int nAnimals; /* the evaluation and settings */ cubedecisiondata *CubeDecPtr; cubedecisiondata CubeDec; cubedecisiondata *MoneyCubeDecPtr; /* In case the cube has been evaluated at money. */ /* skill for the cube decision */ skilltype stCube; /* "private" data */ xmovegameinfo g; /* game information */ xmovenormal n; /* chequerplay move */ xmoveresign r; /* resignation */ xmovesetboard sb; /* setting up board */ xmovesetcubeval scv; /* setting cube */ xmovesetcubepos scp; /* setting cube owner */ } moverecord; typedef struct { /* SGF match information */ char *pchRating[2]; char *pchEvent; char *pchRound; char *pchPlace; char *pchAnnotator; char *pchComment; /* malloc()ed, or NULL if unknown */ unsigned int nYear; unsigned int nMonth; unsigned int nDay; /* 0 for nYear means date unknown */ } matchinfo; typedef struct { float aarOutput[2][NUM_ROLLOUT_OUTPUTS]; float aarStdDev[2][NUM_ROLLOUT_OUTPUTS]; rolloutstat aarsStatistics[2][2]; float aarRates[2][2]; cubeinfo *pci; const evalcontext *pec; evalsetup *pes; ConstTanBoard pboard; char *szOutput; int n; } decisionData; typedef struct { moverecord *pmr; matchstate *pms; const evalsetup *pesChequer; evalsetup *pesCube; movefilter(*aamf)[MAX_FILTER_PLIES]; } moveData; typedef struct { movelist *pml; ConstTanBoard pboard; positionkey *keyMove; float rThr; const cubeinfo *pci; const evalcontext *pec; int anDice[2]; movefilter(*aamf)[MAX_FILTER_PLIES]; } findData; typedef struct { move *pm; const cubeinfo *pci; const evalcontext *pec; } scoreData; /* Defining structures for AnalyzeFileSetting. Other defined structures throughout the files: - apwAnalyzeFileSetting (gtkgame.c); - "set analysis filesetting" (gtkgame.c); - CommandSetAnalysisFileSetting (backgammon.h) */ typedef enum { AnalyzeFileBatch, AnalyzeFileRegular, AnalyzeFileSmart, NUM_AnalyzeFileSettings } analyzeFileSetting; extern analyzeFileSetting AnalyzeFileSettingDef; extern const char* aszAnalyzeFileSetting[NUM_AnalyzeFileSettings]; extern const char* aszAnalyzeFileSettingCommands[NUM_AnalyzeFileSettings]; typedef void (*AsyncFun) (void *); void asyncDumpDecision(decisionData * pdd); void asyncFindBestMoves(findData * pfd); void asyncFindMove(findData * pfd); void asyncScoreMove(scoreData * psd); void asyncEvalRoll(decisionData * pdd); void asyncAnalyzeMove(moveData * pmd); void asyncGammonRates(decisionData * pdd); void asyncMoveDecisionE(decisionData * pdd); void asyncCubeDecisionE(decisionData * pdd); void asyncCubeDecision(decisionData * pdd); int RunAsyncProcess(AsyncFun fun, void *data, const char *msg); /* There is a global storedmoves struct to maintain the list of moves * for "=n" notation (e.g. "hint", "rollout =1 =2 =4"). * Anything that _writes_ stored moves ("hint", "show moves", "add move") * should free the old dynamic move list first (sm.ml.amMoves), if it is * non-NULL. * Anything that _reads_ stored moves should check that the move is still * valid (i.e. auchKey matches the current board and anDice matches the * current dice). */ /* * Store cube analysis * */ /* List of moverecords representing the current game. One of the elements in * lMatch. * Typically the last game in the match). */ extern listOLD *plGame; /* Current move inside plGame (typically the most recently * one played, but "previous" and "next" commands navigate back and forth). */ extern listOLD *plLastMove; /* The current match. * A list of games. Each game is a list of moverecords. * Note that the first list element is empty. The first game is in * lMatch.plNext->p. Same is true for games. */ extern listOLD lMatch; extern int automaticTask; extern char *aszCopying[]; extern const char *aszGameResult[]; extern const char *aszLuckType[]; extern const char *aszLuckTypeAbbr[]; extern const char *aszLuckTypeCommand[]; extern const char *aszSkillType[]; extern const char *aszSkillTypeAbbr[]; extern const char *aszSkillTypeCommand[]; extern char *aszWarranty[]; extern char *default_export_folder; extern char *default_import_folder; extern char *default_sgf_folder; extern char *log_file_name; extern char *szCurrentFileName; extern char *szCurrentFolder; extern const char szDefaultPrompt[]; extern char *szLang; extern const char *szPrompt; extern const char *szHomeDirectory; extern evalcontext ecLuck; extern evalsetup esAnalysisChequer; extern evalsetup esAnalysisCube; extern evalsetup esEvalChequer; extern evalsetup esEvalCube; extern int fEvalSameAsAnalysis; extern evalsetup *GetEvalChequer(void); extern evalsetup *GetEvalCube(void); extern float arLuckLevel[N_LUCKS]; extern float arSkillLevel[N_SKILLS]; extern float rEvalsPerSec; extern float rRatingOffset; extern int fAnalyseCube; extern int fAnalyseDice; extern int fAnalyseMove; extern int fAutoBearoff; extern int fAutoCrawford; extern int fAutoDB; extern int fAutoGame; extern int fAutoMove; extern int fAutoRoll; extern int fCheat; extern int fComputing; extern int nConfirmDefault; extern int fConfirmNew; extern int fConfirmSave; extern int nAutoSaveTime; extern int fAutoSaveRollout; extern int fAutoSaveAnalysis; extern int fAutoSaveConfirmDelete; extern int fCubeEqualChequer; extern int fPlayersAreSame; extern int fTruncEqualPlayer0; extern int fCubeUse; extern int fDisplay; extern int fFullScreen; extern int fGotoFirstGame; extern int fInvertMET; extern int fJacoby; extern int fNextTurn; extern int fOutputRawboard; extern int fRecord; extern int fShowProgress; extern int fStyledGamelist; extern int fTutor; extern int fTutorChequer; extern int fTutorCube; extern int log_rollouts; extern int nThreadPriority; extern int nToolbarStyle; extern int nTutorSkillCurrent; extern int fBackgroundAnalysis; /* define whether to analyze in the background */ extern int fAnalysisRunning; /* when analyzing a match in background */ #if defined(USE_BOARD3D) extern int fSync; extern int fResetSync; #endif extern matchinfo mi; extern matchstate ms; extern ConstTanBoard msBoard(void); extern movefilter aamfAnalysis[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; extern movefilter aamfEval[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; typedef movefilter TmoveFilter[MAX_FILTER_PLIES][MAX_FILTER_PLIES]; typedef const movefilter (*ConstTmoveFilter)[MAX_FILTER_PLIES]; extern TmoveFilter *GetEvalMoveFilter(void); extern player ap[2]; extern char default_names[2][MAX_NAME_LEN]; extern rolloutcontext rcRollout; extern skilltype TutorSkill; extern statcontext scMatch; extern unsigned int afCheatRoll[2]; extern unsigned int cAutoDoubles; extern unsigned int nBeavers; extern unsigned int nDefaultLength; extern rngcontext *rngctxRollout; extern command acAnnotateMove[]; extern command acSetAnalysisPlayer[]; extern command acSetCheatPlayer[]; extern command acSetEvalParam[]; extern command acSetEvaluation[]; extern command acSetExportParameters[]; extern command acSetGeometryValues[]; extern command acSetPlayer[]; extern command acSetRNG[]; extern command acSetRollout[]; extern command acSetRolloutJsd[]; extern command acSetRolloutLate[]; extern command acSetRolloutLatePlayer[]; extern command acSetRolloutLimit[]; extern command acSetRolloutPlayer[]; extern command acSetTruncation[]; extern command acShow[]; extern command acTop[]; extern int fInteractive; #if defined(_LIBINTL_H) && defined(__MINGW32__) #warning "libintl.h already included expect warnings under mingw" #endif /* now we can include libintl.h */ #include extern char *GetMatchCheckSum(void); extern char *CheckCommand(char *sz, command * ac); extern char *FormatMoveHint(char *sz, const matchstate * pms, movelist * pml, int i, int fRankKnown, int fDetailProb, int fShowParameters); extern char *FormatPrompt(void); extern const char *GetBuildInfoString(void); extern char *GetInput(char *szPrompt); extern char *GetLuckAnalysis(const matchstate * pms, float rLuck); extern const char *GetMoveString(moverecord * pmr, int *pPlayer, gboolean addSkillMarks); extern double get_time(void); extern char *NextToken(char **ppch); extern char *NextTokenGeneral(char **ppch, const char *szTokens); extern char *SetupLanguage(const char *newLangCode); extern command *FindHelpCommand(command * pcBase, char *sz, char *pchCommand, char *pchUsage); extern float ParseReal(char **ppch); extern int AnalyzeMove(moverecord * pmr, matchstate * pms, const listOLD * plGame, statcontext * psc, const evalsetup * pesChequer, evalsetup * pesCube, movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES], const int afAnalysePlayers[2], float *doubleError); extern void EvaluateRoll(float ar[NUM_ROLLOUT_OUTPUTS], int nDie1, int nDie2, const TanBoard anBoard, const cubeinfo * pci, const evalcontext * pec); extern int CompareNames(char *sz0, char *sz1); extern int confirmOverwrite(const char *sz, const int f); extern int EPC(const TanBoard anBoard, float *arEPC, float *arMu, float *arSigma, int *pfSource, const int fOnlyBearoff); extern int EvalCmp(const evalcontext *, const evalcontext *, const int); extern int getFinalScore(int *anScore); extern int GetInputYN(char *szPrompt); extern int GiveAdvice(skilltype Skill); extern int InternalCommandNext(int mark, int cmark, int n); extern int NextTurn(int fPlayNext); extern int ParseKeyValue(char **ppch, char *apch[2]); extern int ParseNumber(char **ppch); extern int ParsePlayer(char *sz); extern int ParsePosition(TanBoard an, char **ppch, char *pchDesc); extern int SetToggle(const char *szName, int *pf, char *sz, const char *szOn, const char *szOff); extern moverecord *get_current_moverecord(int *pfHistory); extern moverecord *LinkToDouble(moverecord * pmr); extern moverecord *NewMoveRecord(void); extern void HandleInterrupt(int idSignal); extern void AddGame(moverecord * pmr); extern void AddMoveRecord(moverecord * pmr); extern void ApplyMoveRecord(matchstate * pms, const listOLD * plGame, const moverecord * pmr); extern void CalculateBoard(void); extern void CancelCubeAction(void); extern void ChangeGame(listOLD * plGameNew); extern void UpdateGame(int fShowBoard); extern void ClearMatch(void); extern void ClearMoveRecord(void); extern void DisectPath(const char *path, const char *extension, char **name, char **folder); extern void FixMatchState(matchstate * pms, const moverecord * pmr); extern void FreeMatch(void); extern void GetMatchStateCubeInfo(cubeinfo * pci, const matchstate * pms); extern void HandleCommand(char *sz, command * ac); extern void InitBoard(TanBoard anBoard, const bgvariation bgv); extern void PortableSignal(int nSignal, void (*p) (int), psighandler * pOld, int fRestart); extern void PortableSignalRestore(int nSignal, psighandler * p); extern void PrintCheatRoll(const int fPlayer, const int n); extern void ProgressEnd(void); extern void ProgressStart(const char *sz); extern void ProgressStartValue(char *sz, int iMax); extern void ProgressValueAdd(int iValue); extern void ProgressValue(int iValue); extern void PromptForExit(void); extern void Prompt(void); extern void ResetInterrupt(void); extern void SaveRolloutSettings(FILE * pf, const char *sz, rolloutcontext * prc); extern int SetBoard(char *szGNUbgID); extern int SetCubeValue(int n); extern void setDefaultFileName(char *path); extern void SetDice(int n0, int n1); extern int SetGNUbgID(char *szGNUbgID); extern void SetMatchDate(matchinfo * pmi); extern void SetMatchID(const char *szMatchID); extern void SetMatchInfo(char **ppch, const char *sz, char *szMessage); extern void SetMoveRecord(moverecord *pmr); extern void SetTurn(int i); extern void show_8912(TanBoard anBoard, char *sz); extern void show_bearoff(TanBoard an, char *sz); extern void ShowBoard(void); extern void show_keith(TanBoard an, char *sz); extern void show_kleinman(TanBoard an, char *sz); extern void show_isight(TanBoard an, char *sz); extern void show_thorp(TanBoard an, char *sz); extern void TextToClipboard(const char *sz); extern void UpdateSettings(void); extern void UpdateSetting(void *p); extern void CommandAccept(char *); extern void CommandAgree(char *); extern void CommandAnalyseClearGame(char *); extern void CommandAnalyseClearMatch(char *); extern void CommandAnalyseClearMove(char *); extern void CommandAnalyseGame(char *); extern void CommandAnalyseMatch(char *); extern void CommandAnalyseMove(char *); extern void CommandAnalyseRolloutCube(char *); extern void CommandAnalyseRolloutGame(char *); extern void CommandAnalyseRolloutMatch(char *); extern void CommandAnalyseRolloutMove(char *); extern void CommandAnalyseSession(char *); extern void CommandAnnotateAccept(char *); extern void CommandAnnotateAddComment(char *); extern void CommandAnnotateBad(char *); extern void CommandAnnotateClearComment(char *); extern void CommandAnnotateClearLuck(char *); extern void CommandAnnotateClearSkill(char *); extern void CommandAnnotateCube(char *); extern void CommandAnnotateDouble(char *); extern void CommandAnnotateDoubtful(char *); extern void CommandAnnotateDrop(char *); extern void CommandAnnotateLucky(char *); extern void CommandAnnotateMove(char *); extern void CommandAnnotateReject(char *); extern void CommandAnnotateResign(char *); extern void CommandAnnotateUnlucky(char *); extern void CommandAnnotateVeryBad(char *); extern void CommandAnnotateVeryLucky(char *); extern void CommandAnnotateVeryUnlucky(char *); extern void CommandCalibrate(char *); extern void CommandClearCache(char *); extern void CommandClearHint(char *); extern void CommandClearTurn(char *); extern void CommandCMarkCubeSetNone(char *); extern void CommandCMarkCubeSetRollout(char *); extern void CommandCMarkCubeShow(char *); extern void CommandCMarkGameClear(char *); extern void CommandCMarkGameShow(char *); extern void CommandCMarkMatchClear(char *); extern void CommandCMarkMatchShow(char *); extern void CommandCMarkMoveClear(char *); extern void CommandCMarkMoveSetNone(char *); extern void CommandCMarkMoveSetRollout(char *); extern void CommandCMarkMoveShow(char *); extern void CommandCopy(char *); extern void CommandDecline(char *); extern void CommandDiceRolls(char *); extern void CommandDouble(char *); extern void CommandDrop(char *); extern void CommandEndGame(char *); extern void CommandEq2MWC(char *); extern void CommandEval(char *); extern void CommandExportGameGam(char *); extern void CommandExportGameSnowieTxt(char *); extern void CommandExportGameHtml(char *); extern void CommandExportGameLaTeX(char *); extern void CommandExportGamePDF(char *); extern void CommandExportGamePS(char *); extern void CommandExportGameText(char *); extern void CommandExportHTMLImages(char *); extern void CommandExportMatchHtml(char *); extern void CommandExportMatchLaTeX(char *); extern void CommandExportMatchMat(char *); extern void CommandExportMatchSnowieTxt(char *); extern void CommandExportMatchPDF(char *); extern void CommandExportMatchPS(char *); extern void CommandExportMatchText(char *); extern void CommandExportPositionGammOnLine(char *); extern void CommandExportPositionGOL2Clipboard(char *); extern void CommandExportPositionHtml(char *); extern void CommandExportPositionJF(char *); extern void CommandExportPositionPDF(char *); extern void CommandExportPositionPNG(char *); extern void CommandExportPositionPS(char *); extern void CommandExportPositionSnowieTxt(char *); extern void CommandExportPositionSVG(char *); extern void CommandExportPositionText(char *); extern void CommandExternal(char *); extern void CommandFirstGame(char *); extern void CommandFirstMove(char *); extern void CommandHelp(char *); extern void CommandHint(char *); extern void CommandHistory(char *); extern void CommandImportAuto(char *); extern void CommandImportBGRoom(char *); extern void CommandImportEmpire(char *); extern void CommandImportJF(char *); extern void CommandImportMat(char *); extern void CommandImportOldmoves(char *); extern void CommandImportParty(char *); extern void CommandImportSGG(char *); extern void CommandImportSnowieTxt(char *); extern void CommandImportTMG(char *); extern void CommandListGame(char *); extern void CommandListMatch(char *); extern void CommandLoadCommands(char *); extern void CommandLoadGame(char *); extern void CommandLoadMatch(char *); extern void CommandLoadPosition(char *); extern void CommandLoadPython(char *); extern void CommandMove(char *); extern void CommandMWC2Eq(char *); extern void CommandNewGame(char *); extern void CommandNewMatch(char *); extern void CommandNewSession(char *); extern void CommandNext(char *); extern void CommandNotImplemented(char *); extern void CommandPlay(char *); extern void CommandPrevious(char *); extern void CommandQuit(char *); extern void CommandRedouble(char *); extern void CommandReject(char *); extern void CommandRelationalAddMatch(char *); extern void CommandRelationalEraseAll(char *); extern void CommandRelationalErase(char *); extern void CommandRelationalSelect(char *); extern void CommandRelationalSetup(char *); extern void CommandRelationalShowDetails(char *); extern void CommandRelationalShowPlayers(char *); extern void CommandRelationalTest(char *); extern void CommandResign(char *); extern void CommandRoll(char *); extern void CommandRollout(char *); extern void CommandSaveGame(char *); extern void CommandSaveMatch(char *); extern void CommandSavePosition(char *); extern void CommandSaveSettings(char *); extern void CommandSetAnalysisChequerplay(char *); extern void CommandSetAnalysisCube(char *); extern void CommandSetAnalysisCubedecision(char *); extern void CommandSetAnalysisFileSetting(char*); extern void CommandSetAnalysisBackground(char *); extern void CommandSetAnalysisLimit(char *); extern void CommandSetAnalysisLuckAnalysis(char *); extern void CommandSetAnalysisLuck(char *); extern void CommandSetAnalysisMoveFilter(char *); extern void CommandSetAnalysisMoves(char *); extern void CommandSetAnalysisPlayerAnalyse(char *); extern void CommandSetAnalysisPlayer(char *); extern void CommandSetAnalysisThresholdBad(char *); extern void CommandSetAnalysisThresholdDoubtful(char *); extern void CommandSetAnalysisThresholdLucky(char *); extern void CommandSetAnalysisThresholdUnlucky(char *); extern void CommandSetAnalysisThresholdVeryBad(char *); extern void CommandSetAnalysisThresholdVeryLucky(char *); extern void CommandSetAnalysisThresholdVeryUnlucky(char *); extern void CommandSetAnalysisWindows(char *); extern void CommandSetAnnotation(char *); extern void CommandSetAppearance(char *); extern void CommandSetAutoBearoff(char *); extern void CommandSetAutoCrawford(char *); extern void CommandSetAutoDB(char *); extern void CommandSetAutoDoubles(char *); extern void CommandSetAutoGame(char *); extern void CommandSetAutoMove(char *); extern void CommandSetAutoRoll(char *); extern void CommandSetAutoSaveAnalysis(char *sz); extern void CommandSetAutoSaveConfirmDelete(char *sz); extern void CommandSetAutoSaveRollout(char *sz); extern void CommandSetAutoSaveTime(char *sz); extern void CommandSetBeavers(char *); extern void CommandSetBoard(char *); extern void CommandSetBrowser(char *); extern void CommandSetCache(char *); extern void CommandSetCalibration(char *); extern void CommandSetCheatEnable(char *); extern void CommandSetCheatPlayer(char *); extern void CommandSetCheatPlayerRoll(char *); extern void CommandSetClockwise(char *); extern void CommandSetUseKeyNames(char *); extern void CommandSetCommandWindow(char *); extern void CommandSetConfirmDefault(char *); extern void CommandSetConfirmNew(char *); extern void CommandSetConfirmSave(char *); extern void CommandSetCrawford(char *); extern void CommandSetCubeCentre(char *); extern void CommandSetCubeEfficiencyContact(char *); extern void CommandSetCubeEfficiencyCrashed(char *); extern void CommandSetCubeEfficiencyOS(char *); extern void CommandSetCubeEfficiencyRaceCoefficient(char *); extern void CommandSetCubeEfficiencyRaceFactor(char *); extern void CommandSetCubeEfficiencyRaceMax(char *); extern void CommandSetCubeEfficiencyRaceMin(char *); extern void CommandSetCubeOwner(char *); extern void CommandSetCubeUse(char *); extern void CommandSetCubeValue(char *); extern void CommandSetDelay(char *); extern void CommandSetDice(char *); extern void CommandSetDisplay(char *); extern void CommandSetDockPanels(char *); extern void CommandSetEvalChequerplay(char *); extern void CommandSetEvalCubedecision(char *); extern void CommandSetEvalCubeful(char *); extern void CommandSetEvalDeterministic(char *); extern void CommandSetEvalMoveFilter(char *); extern void CommandSetEvalNoise(char *); extern void CommandSetEvalParamEvaluation(char *); extern void CommandSetEvalParamRollout(char *); extern void CommandSetEvalParamType(char *); extern void CommandSetEvalPlies(char *); extern void CommandSetEvalPrune(char *); extern void CommandSetEvalSameAsAnalysis(char *); extern void CommandSetExportCubeDisplayActual(char *); extern void CommandSetExportCubeDisplayBad(char *); extern void CommandSetExportCubeDisplayClose(char *); extern void CommandSetExportCubeDisplayDoubtful(char *); extern void CommandSetExportCubeDisplayMissed(char *); extern void CommandSetExportCubeDisplayUnmarked(char *); extern void CommandSetExportCubeDisplayVeryBad(char *); extern void CommandSetExportCubeParameters(char *); extern void CommandSetExportCubeProb(char *); extern void CommandSetExportFolder(char *); extern void CommandSetExportHTMLCSSExternal(char *); extern void CommandSetExportHTMLCSSHead(char *); extern void CommandSetExportHTMLCSSInline(char *); extern void CommandSetExportHTMLPictureURL(char *); extern void CommandSetExportHtmlSize(char *); extern void CommandSetExportHTMLTypeBBS(char *); extern void CommandSetExportHTMLTypeFibs2html(char *); extern void CommandSetExportHTMLTypeGNU(char *); extern void CommandSetExportIncludeAnalysis(char *); extern void CommandSetExportIncludeAnnotations(char *); extern void CommandSetExportIncludeMatchInfo(char *); extern void CommandSetExportIncludeStatistics(char *); extern void CommandSetExportMovesDisplayBad(char *); extern void CommandSetExportMovesDisplayDoubtful(char *); extern void CommandSetExportMovesDisplayUnmarked(char *); extern void CommandSetExportMovesDisplayVeryBad(char *); extern void CommandSetExportMovesNumber(char *); extern void CommandSetExportMovesParameters(char *); extern void CommandSetExportMovesProb(char *); extern void CommandSetExportParametersEvaluation(char *); extern void CommandSetExportParametersRollout(char *); extern void CommandSetExportPNGSize(char *); extern void CommandSetExportShowBoard(char *); extern void CommandSetExportShowPlayer(char *); extern void CommandSetFullScreen(char *); extern void CommandSetGameList(char *); extern void CommandSetGeometryAnalysis(char *); extern void CommandSetGeometryCommand(char *); extern void CommandSetGeometryGame(char *); extern void CommandSetGeometryHeight(char *); extern void CommandSetGeometryHint(char *); extern void CommandSetGeometryMain(char *); extern void CommandSetGeometryMax(char *); extern void CommandSetGeometryMessage(char *); extern void CommandSetGeometryPosX(char *); extern void CommandSetGeometryPosY(char *); extern void CommandSetGeometryTheory(char *); extern void CommandSetGeometryWidth(char *); extern void CommandSetGNUbgID(char *); extern void CommandSetXGID(char *); extern void CommandSetGotoFirstGame(char *); extern void CommandSetGUIAnimationBlink(char *); extern void CommandSetGUIAnimationNone(char *); extern void CommandSetGUIAnimationSlide(char *); extern void CommandSetGUIAnimationSpeed(char *); extern void CommandSetGUIBeep(char *); extern void CommandSetGUIDiceArea(char *); extern void CommandSetGUIDragTargetHelp(char *); extern void CommandSetGUIGrayEdit(char *); extern void CommandSetGUIHighDieFirst(char *); extern void CommandSetGUIIllegal(char *); extern void CommandSetGUIMoveListDetail(char *); extern void CommandSetGUIShowIDs(char *); extern void CommandSetGUIShowPipsEPC(char *); extern void CommandSetGUIShowPipsNone(char *); extern void CommandSetGUIShowPipsPips(char *); extern void CommandSetGUIShowPipsWastage(char *); extern void CommandSetGUIUseStatsPanel(char *); extern void CommandSetGUIWindowPositions(char *); extern void CommandSetImportFolder(char *); extern void CommandSetInvertMatchEquityTable(char *); extern void CommandSetJacoby(char *); extern void CommandSetLang(char *); extern void CommandSetMatchAnnotator(char *); extern void CommandSetMatchComment(char *); extern void CommandSetMatchDate(char *); extern void CommandSetMatchEvent(char *); extern void CommandSetMatchID(char *); extern void CommandSetMatchLength(char *); extern void CommandSetMatchPlace(char *); extern void CommandSetMatchRating(char *); extern void CommandSetMatchRound(char *); extern void CommandSetMessage(char *); extern void CommandSetMET(char *); extern void CommandSetOutputDigits(char *); extern void CommandSetOutputErrorRateFactor(char *); extern void CommandSetOutputMatchPC(char *); extern void CommandSetOutputMWC(char *); extern void CommandSetOutputOutput(char *sz); extern void CommandSetOutputRawboard(char *); extern void CommandSetOutputWinPC(char *); extern void CommandSetPanels(char *); extern void CommandSetPanelWidth(char *); extern void CommandSetPlayer(char *); extern void CommandSetPlayerChequerplay(char *); extern void CommandSetPlayerCubedecision(char *); extern void CommandSetPlayerExternal(char *); extern void CommandSetPlayerGNU(char *); extern void CommandSetPlayerHuman(char *); extern void CommandSetPlayerMoveFilter(char *); extern void CommandSetPlayerName(char *); extern void CommandSetPostCrawford(char *); extern void CommandSetPriorityAboveNormal(char *); extern void CommandSetPriorityBelowNormal(char *); extern void CommandSetPriorityHighest(char *); extern void CommandSetPriorityIdle(char *); extern void CommandSetPriorityNice(char *); extern void CommandSetPriorityNormal(char *); extern void CommandSetPriorityTimeCritical(char *); extern void CommandSetPrompt(char *); extern void CommandSetRatingOffset(char *); extern void CommandSetRecord(char *); extern void CommandSetRNGBBS(char *); extern void CommandSetRNG(char *); extern void CommandSetRNGFile(char *); extern void CommandSetRNGIsaac(char *); extern void CommandSetRNGManual(char *); extern void CommandSetRNGMD5(char *); extern void CommandSetRNGMersenne(char *); extern void CommandSetRNGRandomDotOrg(char *); extern void CommandSetRolloutBearoffTruncationExact(char *); extern void CommandSetRolloutBearoffTruncationOS(char *); extern void CommandSetRollout(char *); extern void CommandSetRolloutChequerplay(char *); extern void CommandSetRolloutCubedecision(char *); extern void CommandSetRolloutCubeEqualChequer(char *); extern void CommandSetRolloutCubeful(char *); extern void CommandSetRolloutInitial(char *); extern void CommandSetRolloutJsd(char *); extern void CommandSetRolloutJsdEnable(char *); extern void CommandSetRolloutJsdLimit(char *); extern void CommandSetRolloutJsdMinGames(char *); extern void CommandSetRolloutLate(char *); extern void CommandSetRolloutLateChequerplay(char *); extern void CommandSetRolloutLateCubedecision(char *); extern void CommandSetRolloutLateEnable(char *); extern void CommandSetRolloutLateMoveFilter(char *); extern void CommandSetRolloutLatePlayer(char *); extern void CommandSetRolloutLatePlies(char *); extern void CommandSetRolloutLimit(char *); extern void CommandSetRolloutLimitEnable(char *); extern void CommandSetRolloutLimitMinGames(char *); extern void CommandSetRolloutLogEnable(char *); extern void CommandSetRolloutLogFile(char *); extern void CommandSetRolloutMaxError(char *); extern void CommandSetRolloutMoveFilter(char *); extern void CommandSetRolloutPlayer(char *); extern void CommandSetRolloutPlayerChequerplay(char *); extern void CommandSetRolloutPlayerCubedecision(char *); extern void CommandSetRolloutPlayerLateChequerplay(char *); extern void CommandSetRolloutPlayerLateCubedecision(char *); extern void CommandSetRolloutPlayerLateMoveFilter(char *); extern void CommandSetRolloutPlayerMoveFilter(char *); extern void CommandSetRolloutPlayersAreSame(char *); extern void CommandSetRolloutRNG(char *); extern void CommandSetRolloutRotate(char *); extern void CommandSetRolloutSeed(char *); extern void CommandSetRolloutTrials(char *); extern void CommandSetRolloutTruncation(char *); extern void CommandSetRolloutTruncationChequer(char *); extern void CommandSetRolloutTruncationCube(char *); extern void CommandSetRolloutTruncationEnable(char *); extern void CommandSetRolloutTruncationEqualPlayer0(char *); extern void CommandSetRolloutTruncationPlies(char *); extern void CommandSetRolloutVarRedn(char *); extern void CommandSetScore(char *); extern void CommandSetScoreMapPly(char*); extern void CommandSetScoreMapMatchLength(char*); extern void CommandSetScoreMapLabel(char*); extern void CommandSetScoreMapJacoby(char*); extern void CommandSetScoreMapCubeEquityDisplay(char*); extern void CommandSetScoreMapMoveEquityDisplay(char*); extern void CommandSetScoreMapColour(char*); extern void CommandSetScoreMapLayout(char*); extern void CommandSetSeed(char *); extern void CommandSetSGFFolder(char *); extern void CommandSetSoundEnable(char *); extern void CommandSetSoundSoundAgree(char *); extern void CommandSetSoundSoundAnalysisFinished(char *); extern void CommandSetSoundSoundBotDance(char *); extern void CommandSetSoundSoundBotWinGame(char *); extern void CommandSetSoundSoundBotWinMatch(char *); extern void CommandSetSoundSoundChequer(char *); extern void CommandSetSoundSoundDouble(char *); extern void CommandSetSoundSoundDrop(char *); extern void CommandSetSoundSoundExit(char *); extern void CommandSetSoundSoundHumanDance(char *); extern void CommandSetSoundSoundHumanWinGame(char *); extern void CommandSetSoundSoundHumanWinMatch(char *); extern void CommandSetSoundSoundMove(char *); extern void CommandSetSoundSoundRedouble(char *); extern void CommandSetSoundSoundResign(char *); extern void CommandSetSoundSoundRoll(char *); extern void CommandSetSoundSoundStart(char *); extern void CommandSetSoundSoundTake(char *); extern void CommandSetSoundSystemCommand(char *); extern void CommandSetStyledGameList(char *); extern void CommandSetTheoryWindow(char *); extern void CommandSetThreads(char *); extern void CommandSetToolbar(char *); extern void CommandSetTurn(char *); extern void CommandSetTutorChequer(char *); extern void CommandSetTutorCube(char *); extern void CommandSetTutorMode(char *); extern void CommandSetTutorSkillBad(char *); extern void CommandSetTutorSkillDoubtful(char *); extern void CommandSetTutorSkillVeryBad(char *); extern void CommandSetVariation1ChequerHypergammon(char *); extern void CommandSetVariation2ChequerHypergammon(char *); extern void CommandSetVariation3ChequerHypergammon(char *); extern void CommandSetVariationNackgammon(char *); extern void CommandSetVariationStandard(char *); extern void CommandSetVsync3d(char *); extern void CommandSetWarning(char *); extern void CommandShow8912(char *); extern void CommandShowAnalysis(char *); extern void CommandShowAutoSave(char *); extern void CommandShowAutomatic(char *); extern void CommandShowBearoff(char *); extern void CommandShowBeavers(char *); extern void CommandShowBoard(char *); extern void CommandShowBrowser(char *); extern void CommandShowBuildInfo(char *); extern void CommandShowCache(char *); extern void CommandShowCalibration(char *); extern void CommandShowCheat(char *); extern void CommandShowClockwise(char *); extern void CommandShowCommands(char *); extern void CommandShowConfirm(char *); extern void CommandShowCopying(char *); extern void CommandShowCrawford(char *); extern void CommandShowCredits(char *); extern void CommandShowCube(char *); extern void CommandShowCubeEfficiency(char *); extern void CommandShowDelay(char *); extern void CommandShowDice(char *); extern void CommandShowDisplay(char *); extern void CommandShowEngine(char *); extern void CommandShowEvaluation(char *); extern void CommandShowExport(char *); extern void CommandShowFullBoard(char *); extern void CommandShowGammonValues(char *); extern void CommandShowGeometry(char *); extern void CommandShowHistory(char *); extern void CommandShowJacoby(char *); extern void CommandShowKeith(char *); extern void CommandShowKleinman(char *); extern void CommandShowIsight(char *); extern void CommandShowLang(char *); extern void CommandShowManualAbout(char *); extern void CommandShowManualWeb(char *); extern void CommandShowMarketWindow(char *); extern void CommandShowMatchEquityTable(char *); extern void CommandShowMatchInfo(char *); extern void CommandShowMatchLength(char *); extern void CommandShowMatchResult(char *); extern void CommandShowOneSidedRollout(char *); extern void CommandShowOutput(char *); extern void CommandShowPanels(char *); extern void CommandShowPipCount(char *); extern void CommandShowPlayer(char *); extern void CommandShowPostCrawford(char *); extern void CommandShowPrompt(char *); extern void CommandShowRatingOffset(char *); extern void CommandShowRNG(char *); extern void CommandShowRollout(char *); extern void CommandShowRolls(char *); extern void CommandShowScore(char *); extern void CommandShowScoreSheet(char *); extern void CommandShowSeed(char *); extern void CommandShowSound(char *); extern void CommandShowStatisticsGame(char *); extern void CommandShowStatisticsMatch(char *); extern void CommandShowStatisticsSession(char *); extern void CommandShowTemperatureMap(char *); extern void CommandShowScoreMap(char *); extern void CommandShowThorp(char *); extern void CommandShowThreads(char *); extern void CommandShowTurn(char *); extern void CommandShowTutor(char *); extern void CommandShowVariation(char *); extern void CommandShowVersion(char *); extern void CommandShowWarning(char *); extern void CommandShowWarranty(char *); extern void CommandSwapPlayers(char *); extern void CommandTake(char *); extern void CommandSetDefaultNames(char *sz); extern void CommandSetKeyNames(char *sz); extern void UserCommand(const char *szCommand); extern void hint_move(char *sz, gboolean show, procrecorddata * procdatarec); extern void hint_double(int show, int did_double); extern void hint_take(int show, int did_take); extern void find_skills(moverecord * pmr, const matchstate * pms, int did_double, int did_take); extern int getGameNumber(const listOLD * plGame); extern int getMoveNumber(const listOLD * plGame, const void *p); extern int CheckGameExists(void); extern void pmr_cubedata_set(moverecord * pmr, const evalsetup * pes, float output[2][NUM_ROLLOUT_OUTPUTS], float stddev[2][NUM_ROLLOUT_OUTPUTS]); extern void pmr_movelist_set(moverecord * pmr, const evalsetup * pes, const movelist * pml); extern listOLD *game_add_pmr_hint(listOLD * plGame); extern void game_remove_pmr_hint(listOLD * pl_hint); extern gboolean game_is_last(const listOLD * plGame); extern void pmr_hint_destroy(void); extern void StopAutomaticPlay(void); extern gboolean save_autosave(gpointer unused); extern void delete_autosave(void); extern int get_input_discard(void); extern void SaveGame(FILE * pf, listOLD * plGame); extern int fMatchCancelled; extern int fJustSwappedPlayers; extern void ProcessEvents(void); #if !defined(USE_MULTITHREAD) extern void CallbackProgress(void); #endif extern void SetRNG(rng * prng, rngcontext * rngctx, rng rngNew, char *szSeed); extern int check_resigns(cubeinfo * pci); extern int quick_roll(void); extern int board_in_list(const movelist * pml, const TanBoard old_board, const TanBoard board, int *an); extern int GetManualDice(unsigned int anDice[2]); /* definitions for SmartSit and keyNames*/ extern void SmartSit(void); /* function that makes sure that player 1 is a key player, if there is one */ #define MAX_KEY_NAMES 200 /* number of defined key player names*/ extern char keyNames[MAX_KEY_NAMES][MAX_NAME_LEN]; /* array with all key player names*/ extern int keyNamesFirstEmpty; /* the keyNames array should be filled from index 0 until keyNamesFirstEmpty-1 (included)*/ extern int fUseKeyNames; /* whether to use the keyNames array*/ extern int fWithinSmartSit; /* whether we are within the SmartSit function: if it requests to permute users, no need to add the new player1 to the list of preferred users*/ extern int AddKeyName(const char sz[]); /* function that adds a key player name to the array*/ extern int DeleteKeyName(const char sz[]); /* function that deletes a key player name to the array*/ extern void DisplayKeyNames(void); /* debugging function to display the current key player names in the array*/ extern int fTriggeredByRecordList; /* whether history plot is launched from record list or from menu */ #endif /* BACKGAMMON_H */ gnubg-1.08.003/gtklocdefs.h000644 001751 000024 00000010434 14574155047 015134 0ustar00pmstaff000000 000000 /* * Copyright (C) 2011-2014 Michael Petch * Copyright (C) 2011-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtklocdefs.h,v 1.24 2023/01/01 17:48:19 plm Exp $ */ #ifndef GTKLOCDEFS_H #define GTKLOCDEFS_H #include "config.h" #include #include #if defined(USE_GTK) #include #if GTK_CHECK_VERSION(3,0,0) typedef cairo_region_t gtk_locdef_region; typedef cairo_rectangle_int_t gtk_locdef_rectangle; typedef cairo_surface_t gtk_locdef_surface; typedef const GdkRectangle gtk_locdef_cell_area; #define gtk_locdef_surface_create(widget, width, height) cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height) #define gtk_locdef_image_new_from_surface(s) gtk_image_new_from_surface(s) #define gtk_locdef_cairo_create_from_surface(s) cairo_create(s) #define gtk_locdef_create_rectangle(r) cairo_region_create_rectangle(r) #define gtk_locdef_union_rectangle(pr, r) cairo_region_union_rectangle(pr, r) #define gtk_locdef_region_destroy(pr) cairo_region_destroy(pr) #define gtk_locdef_paint_box(style, window, cr, state_type, shadow_type, area, widget, detail, x, y, width, height) \ gtk_paint_box(style, cr, state_type, shadow_type, widget, detail, x, y, width, height) #define gdk_colormap_alloc_color(cm, c, w, bm) #define gtk_statusbar_set_has_resize_grip(pw, grip) #else // GTK2 typedef GdkRegion gtk_locdef_region; typedef GdkRectangle gtk_locdef_rectangle; typedef GdkPixmap gtk_locdef_surface; typedef GdkRectangle gtk_locdef_cell_area; typedef void *GtkCssProvider; #define gtk_locdef_surface_create(widget, width, height) gdk_pixmap_new(NULL, width, height, gdk_visual_get_depth(gtk_widget_get_visual(widget))) #define gtk_locdef_image_new_from_surface(s) gtk_image_new_from_pixmap(s, NULL) #define gtk_locdef_cairo_create_from_surface(s) gdk_cairo_create(s) #define gtk_locdef_create_rectangle(r) gdk_region_rectangle(r) #define gtk_locdef_union_rectangle(pr, r) gdk_region_union_with_rect(pr, r) #define gtk_locdef_region_destroy(pr) gdk_region_destroy(pr) #define gtk_locdef_paint_box(style, window, cr, state_type, shadow_type, area, widget, detail, x, y, width, height) \ gtk_paint_box(style, window, state_type, shadow_type, area, widget, detail, x, y, width, height) #endif #if ! GTK_CHECK_VERSION(2,24,0) #define gtk_combo_box_text_new_with_entry gtk_combo_box_entry_new_text #define gtk_combo_box_text_new gtk_combo_box_new_text #define gtk_combo_box_text_get_active_text gtk_combo_box_get_active_text #define gtk_combo_box_text_append_text gtk_combo_box_append_text #define gtk_combo_box_text_remove gtk_combo_box_remove_text #define gtk_combo_box_text_insert_text gtk_combo_box_insert_text #define GtkComboBoxText GtkComboBox #define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX #endif #if ! GTK_CHECK_VERSION(2,22,0) extern gint gdk_visual_get_depth(GdkVisual * visual); #endif #if ! GTK_CHECK_VERSION(2,20,0) #define gtk_widget_set_mapped(widget,fMap) \ { \ if ((fMap)) \ GTK_WIDGET_SET_FLAGS((widget), GTK_MAPPED); \ else \ GTK_WIDGET_UNSET_FLAGS((widget), GTK_MAPPED); \ }; #define gtk_widget_get_realized(p) GTK_WIDGET_REALIZED((p)) #define gtk_widget_has_grab(p) GTK_WIDGET_HAS_GRAB((p)) #define gtk_widget_get_visible(p) GTK_WIDGET_VISIBLE((p)) #define gtk_widget_get_mapped(p) GTK_WIDGET_MAPPED((p)) #define gtk_widget_get_sensitive(p) GTK_WIDGET_SENSITIVE((p)) #define gtk_widget_is_sensitive(p) GTK_WIDGET_IS_SENSITIVE((p)) #define gtk_widget_has_focus(p) GTK_WIDGET_HAS_FOCUS((p)) #endif extern GtkWidget *get_statusbar_label(GtkStatusbar * statusbar); #ifndef USE_GRESOURCE #define gnubg_stock_register_resource() extern GdkPixbuf *gdk_pixbuf_new_from_resource(const char *resource_path, GError **error); #endif #endif #endif gnubg-1.08.003/gtkcube.h000644 001751 000024 00000002261 14574155047 014432 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2009 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkcube.h,v 1.12 2020/01/25 21:40:13 plm Exp $ */ #ifndef GTKCUBE_H #define GTKCUBE_H extern GtkWidget *CreateCubeAnalysis(moverecord * pmr, const matchstate * pms, int did_double, int did_take, int hist); extern int cubeTempMapAtMoney; // extern: for the temperature map when the MoneyEval button is toggled on extern int cubeTempMapJacoby; // extern: also for the temperature map when the MoneyEval button is toggled on #endif gnubg-1.08.003/sound.h000644 001751 000024 00000003574 14574155047 014146 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * Copyright (C) 2002-2008 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: sound.h,v 1.26 2020/01/05 19:51:24 plm Exp $ */ #ifndef SOUND_H #define SOUND_H typedef enum { /* start & exit of gnubg */ SOUND_START = 0, SOUND_EXIT, /* commands */ SOUND_AGREE, SOUND_DOUBLE, SOUND_DROP, SOUND_CHEQUER, SOUND_MOVE, SOUND_REDOUBLE, SOUND_RESIGN, SOUND_ROLL, SOUND_TAKE, /* events */ SOUND_HUMAN_DANCE, SOUND_HUMAN_WIN_GAME, SOUND_HUMAN_WIN_MATCH, SOUND_BOT_DANCE, SOUND_BOT_WIN_GAME, SOUND_BOT_WIN_MATCH, SOUND_ANALYSIS_FINISHED, /* number of sounds */ NUM_SOUNDS } gnubgsound; extern const char *sound_description[NUM_SOUNDS]; extern const char *sound_command[NUM_SOUNDS]; extern int fSound; extern int fQuiet; extern void playSound(const gnubgsound gs); extern void SoundWait(void); extern char *GetDefaultSoundFile(gnubgsound sound); extern void playSoundFile(char *file, gboolean sync); extern void SetSoundFile(const gnubgsound sound, const char *file); extern char *GetSoundFile(gnubgsound sound); extern const char *sound_get_command(void); extern char *sound_set_command(const char *sz); extern void SetExitSoundOff(void); #endif gnubg-1.08.003/dice.c000644 001751 000024 00000045727 14613445272 013717 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2003 Gary Wong * Copyright (C) 1999-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "backgammon.h" #include "randomorg.h" #include #if defined(HAVE_LIBGMP) /* * The condition is not entirely accurate, gmp.h is still in * the gmp subdirectory in Solaris 11.1 but no longer in 11.4. * Make it work in the up to date case. */ #ifdef __SunOS_5_10 #include #else #include #endif #endif #include #if HAVE_UNISTD_H #include #endif #include #include #ifdef WIN32 #include #endif #include "dice.h" #include "md5.h" #include "SFMT.h" #include "isaac.h" #include #include "glib-ext.h" #if USE_GTK #include "gtkgame.h" #endif const char *aszRNG[NUM_RNGS] = { N_("Blum, Blum and Shub"), "ISAAC", "MD5", N_("Mersenne Twister"), N_("manual dice"), "www.random.org", N_("read from file") }; const char *aszRNGTip[NUM_RNGS] = { N_("Blum, Blum and Shub's verifiably strong generator"), N_("Bob Jenkins' Indirection, Shift, Accumulate, Add and Count " "cryptographic generator"), N_("A generator based on the Message Digest 5 algorithm"), N_("Makoto Matsumoto and Mutsuo Saito's generator"), N_("Enter each dice roll by hand"), N_("The online non-deterministic generator from random.org"), N_("Dice loaded from a file"), }; rng rngCurrent = RNG_MERSENNE; rngcontext *rngctxCurrent = NULL; struct rngcontext { /* RNG_FILE */ FILE *fDice; char *szDiceFilename; /* RNG_ISAAC */ randctx rc; /* RNG_MD5 */ md5_uint32 nMD5; /* the current MD5 seed */ /* RNG_MERSENNE */ sfmt_t sfmt; /* RNG_BBS */ #if defined(HAVE_LIBGMP) mpz_t zModulus, zSeed, zZero, zOne; int fZInit; #endif /* HAVE_LIBGMP */ /* common */ unsigned long c; /* counter */ #if defined(HAVE_LIBGMP) mpz_t nz; /* seed */ #endif unsigned int n; /* seed */ }; static unsigned int ReadDiceFile(rngcontext * rngctx); #if defined(HAVE_LIBGMP) static void InitRNGBBS(rngcontext * rngctx) { if (!rngctx->fZInit) { mpz_init(rngctx->zModulus); mpz_init(rngctx->zSeed); mpz_init_set_ui(rngctx->zZero, 0); mpz_init_set_ui(rngctx->zOne, 1); rngctx->fZInit = TRUE; } } extern int InitRNGBBSModulus(const char *sz, rngcontext * rngctx) { if (!sz) return -1; InitRNGBBS(rngctx); if (mpz_set_str(rngctx->zModulus, sz, 10) || mpz_sgn(rngctx->zModulus) < 1) return -1; return 0; } static int BBSGood(mpz_t x) { static mpz_t z19; static int f19; if (!f19) { mpz_init_set_ui(z19, 19); f19 = TRUE; } return ((mpz_get_ui(x) & 3) == 3) && mpz_cmp(x, z19) >= 0 && mpz_probab_prime_p(x, 10); } static int BBSFindGood(mpz_t x) { do mpz_add_ui(x, x, 1); while (!BBSGood(x)); return 0; } extern int InitRNGBBSFactors(char *sz0, char *sz1, rngcontext * rngctx) { mpz_t p, q; char *pch; if (!sz0 || !sz1) return -1; if (mpz_init_set_str(p, sz0, 10) || mpz_sgn(p) < 1) { mpz_clear(p); return -1; } if (mpz_init_set_str(q, sz1, 10) || mpz_sgn(p) < 1) { mpz_clear(p); mpz_clear(q); return -1; } if (!BBSGood(p)) { BBSFindGood(p); pch = mpz_get_str(NULL, 10, p); g_print(_("%s is an invalid Blum factor, using %s instead."), sz0, pch); g_print("\n"); free(pch); } if (!BBSGood(q) || !mpz_cmp(p, q)) { BBSFindGood(q); if (!mpz_cmp(p, q)) BBSFindGood(q); pch = mpz_get_str(NULL, 10, q); g_print(_("%s is an invalid Blum factor, using %s instead."), sz1, pch); g_print("\n"); free(pch); } InitRNGBBS(rngctx); mpz_mul(rngctx->zModulus, p, q); mpz_clear(p); mpz_clear(q); return 0; } static unsigned int BBSGetBit(rngcontext * rngctx) { mpz_powm_ui(rngctx->zSeed, rngctx->zSeed, 2, rngctx->zModulus); return (mpz_get_ui(rngctx->zSeed) & 1); } static unsigned int BBSGetTrit(rngcontext * rngctx) { /* Return a trinary digit from a uniform distribution, given binary * digits as inputs. This function is perfectly distributed and * uses the fewest number of bits on average. */ unsigned int state = 0; while (1) { switch (state) { case 0: state = BBSGetBit(rngctx) + 1; break; case 1: if (BBSGetBit(rngctx)) state = 3; else return 0; break; case 2: if (BBSGetBit(rngctx)) return 2; else state = 4; break; case 3: if (BBSGetBit(rngctx)) return 1; else state = 1; break; case 4: if (BBSGetBit(rngctx)) state = 2; else return 1; break; } } } static int BBSCheck(rngcontext * rngctx) { return (mpz_cmp(rngctx->zSeed, rngctx->zZero) && mpz_cmp(rngctx->zSeed, rngctx->zOne)) ? 0 : -1; } static int BBSInitialSeedFailure(rngcontext * rngctx) { g_print(_("Invalid seed and/or modulus for the Blum, Blum and Shub generator.")); g_print("\n"); g_print(_("Please reset the seed and/or modulus before continuing.")); g_print("\n"); mpz_set(rngctx->zSeed, rngctx->zZero); /* so that BBSCheck will fail */ return -1; } static int BBSCheckInitialSeed(rngcontext * rngctx) { mpz_t z, zCycle; int i, iAttempt; if (mpz_sgn(rngctx->zSeed) < 1) return BBSInitialSeedFailure(rngctx); for (iAttempt = 0; iAttempt < 32; iAttempt++) { mpz_init_set(z, rngctx->zSeed); for (i = 0; i < 8; i++) mpz_powm_ui(z, z, 2, rngctx->zModulus); mpz_init_set(zCycle, z); for (i = 0; i < 16; i++) { mpz_powm_ui(z, z, 2, rngctx->zModulus); if (!mpz_cmp(z, zCycle)) /* short cycle detected */ break; } if (i == 16) /* we found a cycle that meets the minimum length */ break; mpz_add_ui(rngctx->zSeed, rngctx->zSeed, 1); } if (iAttempt == 32) /* we couldn't find any good seeds */ BBSInitialSeedFailure(rngctx); /* FIXME print some sort of warning if we had to modify the seed */ mpz_clear(z); mpz_clear(zCycle); return iAttempt < 32 ? 0 : -1; } #endif extern void PrintRNGCounter(const rng rngx, rngcontext * rngctx) { switch (rngx) { case RNG_BBS: case RNG_ISAAC: case RNG_MD5: g_print(_("Number of calls since last seed: %lu."), rngctx->c); g_print("\n"); break; case RNG_RANDOM_DOT_ORG: g_print(_("Number of dice used in current batch: %lu."), rngctx->c); g_print("\n"); break; case RNG_FILE: g_print(_("Number of dice read from current file: %lu."), rngctx->c); g_print("\n"); break; default: break; } } #if defined(HAVE_LIBGMP) static void PrintRNGSeedMP(mpz_t n) { char *pch; pch = mpz_get_str(NULL, 10, n); g_print(_("The current seed is %s"), pch); g_print("\n"); free(pch); } #else static void PrintRNGSeedNormal(unsigned int n) { g_print(_("The current seed is %u."), n); g_print("\n"); } #endif /* HAVE_LIBGMP */ extern void PrintRNGSeed(const rng rngx, rngcontext * rngctx) { switch (rngx) { case RNG_BBS: #if defined(HAVE_LIBGMP) { char *pch0, *pch1; pch0 = mpz_get_str(NULL, 10, rngctx->zSeed); pch1 = mpz_get_str(NULL, 10, rngctx->zModulus); g_print(_("The current seed is %s, and the modulus is %s."), pch0, pch1); g_print("\n"); free(pch0); free(pch1); return; } #else abort(); #endif case RNG_MD5: g_print(_("The current seed is %u."), rngctx->nMD5); g_print("\n"); return; case RNG_FILE: g_print(_("GNU Backgammon is reading dice from file: %s"), rngctx->szDiceFilename); g_print("\n"); return; case RNG_ISAAC: case RNG_MERSENNE: #if defined(HAVE_LIBGMP) PrintRNGSeedMP(rngctx->nz); #else PrintRNGSeedNormal(rngctx->n); #endif return; default: break; } g_printerr(_("You cannot show the seed with this random number generator.")); g_printerr("\n"); } extern void InitRNGSeed(unsigned int n, const rng rngx, rngcontext * rngctx) { rngctx->n = n; rngctx->c = 0; switch (rngx) { case RNG_BBS: #if defined(HAVE_LIBGMP) g_assert(rngctx->fZInit); mpz_set_ui(rngctx->zSeed, (unsigned long) n); BBSCheckInitialSeed(rngctx); break; #else abort(); #endif case RNG_ISAAC:{ int i; for (i = 0; i < RANDSIZ; i++) rngctx->rc.randrsl[i] = (ub4) n; irandinit(&rngctx->rc, TRUE); break; } case RNG_MD5: rngctx->nMD5 = n; break; case RNG_MERSENNE: sfmt_init_gen_rand(&rngctx->sfmt, n); break; case RNG_MANUAL: case RNG_RANDOM_DOT_ORG: case RNG_FILE: /* no-op */ break; default: break; } } #if defined(HAVE_LIBGMP) static void InitRNGSeedMP(mpz_t n, rng rng, rngcontext * rngctx) { mpz_set(rngctx->nz, n); rngctx->c = 0; switch (rng) { case RNG_MERSENNE:{ if (mpz_cmp_ui(n, UINT_MAX) > 0) { uint32_t *achState; uint32_t tempmtkey[SFMT_N32]; size_t cb; unsigned int i; achState = mpz_export(NULL, &cb, -1, sizeof(uint32_t), 0, 0, n); for (i = 0; i < SFMT_N32 && i < cb; i++) { tempmtkey[i] = achState[i]; } for (; i sfmt, tempmtkey, SFMT_N32); free(achState); } else { InitRNGSeed((unsigned int) (mpz_get_ui(n)), rng, rngctx); } break; } case RNG_MD5: InitRNGSeed((unsigned int) (mpz_get_ui(n) % UINT_MAX), rng, rngctx); break; case RNG_BBS: g_assert(rngctx->fZInit); mpz_set(rngctx->zSeed, n); BBSCheckInitialSeed(rngctx); break; case RNG_ISAAC:{ ub4 *achState; size_t cb; unsigned int i; achState = mpz_export(NULL, &cb, -1, sizeof(ub4), 0, 0, n); for (i = 0; i < RANDSIZ && i < cb; i++) rngctx->rc.randrsl[i] = achState[i]; for (; i < RANDSIZ; i++) rngctx->rc.randrsl[i] = 0; irandinit(&rngctx->rc, TRUE); free(achState); break; } case RNG_MANUAL: case RNG_RANDOM_DOT_ORG: case RNG_FILE: /* no-op */ break; default: break; } } extern int InitRNGSeedLong(char *sz, rng rng, rngcontext * rngctx) { mpz_t n; if (mpz_init_set_str(n, sz, 10) || mpz_sgn(n) < 0) { mpz_clear(n); return -1; } InitRNGSeedMP(n, rng, rngctx); mpz_clear(n); return 0; } #endif static void CloseDiceFile(rngcontext * rngctx) { if (rngctx->fDice) fclose(rngctx->fDice); } extern void CloseRNG(const rng rngx, rngcontext * rngctx) { switch (rngx) { case RNG_FILE: /* close file */ CloseDiceFile(rngctx); break; default: /* no-op */ ; } } extern int RNGSystemSeed(const rng rngx, void *p, unsigned long *pnSeed) { int f = FALSE; rngcontext *rngctx = (rngcontext *) p; unsigned int n = 0; #if defined(HAVE_LIBGMP) if (!pnSeed) { #if defined(WIN32) /* Can be amended to support seeds > 32 bit */ guint32 achState; mpz_t mpzn; #if GLIB_CHECK_VERSION (2,28,0) gint64 tv; tv = g_get_real_time(); achState = (unsigned int) (((guint64)tv >> 32) ^ ((guint64)tv & 0xFFFFFFFF)); #else GTimeVal tv; g_get_current_time(&tv); achState = (unsigned int) tv.tv_sec ^ (unsigned int) tv.tv_usec; #endif mpz_init(mpzn); mpz_import(mpzn, 1, -1, sizeof(guint32), 0, 0, &achState); InitRNGSeedMP(mpzn, rngx, rngctx); mpz_clear(mpzn); return TRUE; #else /* We can use long seeds and don't have to save the seed anywhere, * so try 512 bits of state instead of 32. */ int h; if ((h = open("/dev/urandom", O_RDONLY)) >= 0) { char achState[64]; if (read(h, achState, 64) == 64) { mpz_t mpzn; close(h); mpz_init(mpzn); mpz_import(mpzn, 16, -1, 4, 0, 0, achState); InitRNGSeedMP(mpzn, rngx, rngctx); mpz_clear(mpzn); return TRUE; } else close(h); } #endif } #else #if !defined(WIN32) int h; if ((h = open("/dev/urandom", O_RDONLY)) >= 0) { f = read(h, &n, sizeof n) == sizeof n; close(h); } #endif #endif if (!f) { #if GLIB_CHECK_VERSION (2,28,0) gint64 tv; tv = g_get_real_time(); n = (unsigned int) (((guint64)tv >> 32) ^ ((guint64)tv & 0xFFFFFFFF)); #else GTimeVal tv; g_get_current_time(&tv); n = (unsigned int) tv.tv_sec ^ (unsigned int) tv.tv_usec; #endif } InitRNGSeed(n, rngx, rngctx); #if defined(HAVE_LIBGMP) mpz_set_ui(rngctx->nz, (unsigned long) n); #endif if (pnSeed) *pnSeed = (unsigned long) n; return f; } extern void free_rngctx(rngcontext * rngctx) { #if defined(HAVE_LIBGMP) mpz_clear(rngctx->nz); #endif g_free(rngctx); } extern void * InitRNG(unsigned long *pnSeed, int *pfInitFrom, const int fSet, const rng rngx) { int f = FALSE; rngcontext *rngctx = g_try_new0(rngcontext, 1); if (rngctx == NULL) return NULL; /* misc. initialisation */ /* Mersenne-Twister */ rngctx->sfmt.idx = SFMT_N32 + 1; #if defined(HAVE_LIBGMP) /* BBS */ rngctx->fZInit = FALSE; mpz_init(rngctx->nz); #endif /* HAVE_LIBGMP */ /* common */ rngctx->c = 0; /* */ if (fSet) f = RNGSystemSeed(rngx, rngctx, pnSeed); if (pfInitFrom) *pfInitFrom = f; return rngctx; } extern int RollDice(unsigned int anDice[2], rng * prng, rngcontext * rngctx) { unsigned long tmprnd; const unsigned long exp232_q = 715827882; const unsigned long exp232_l = 4294967292U; anDice[0] = anDice[1] = 0; switch (*prng) { case RNG_BBS: #if defined(HAVE_LIBGMP) if (BBSCheck(rngctx)) { BBSInitialSeedFailure(rngctx); break; } anDice[0] = BBSGetTrit(rngctx) + BBSGetBit(rngctx) * 3 + 1; anDice[1] = BBSGetTrit(rngctx) + BBSGetBit(rngctx) * 3 + 1; rngctx->c += 2; break; #else abort(); #endif case RNG_ISAAC: while ((tmprnd = irand(&rngctx->rc)) >= exp232_l); /* Try again */ anDice[0] = 1 + (unsigned int) (tmprnd / exp232_q); while ((tmprnd = irand(&rngctx->rc)) >= exp232_l); anDice[1] = 1 + (unsigned int) (tmprnd / exp232_q); rngctx->c += 2; break; case RNG_MANUAL: return GetManualDice(anDice); case RNG_MD5:{ union _hash { char ach[16]; md5_uint32 an[2]; } h; md5_buffer((char *) &rngctx->nMD5, sizeof rngctx->nMD5, &h); while (h.an[0] >= exp232_l || h.an[1] >= exp232_l) { md5_buffer((char *) &rngctx->nMD5, sizeof rngctx->nMD5, &h); rngctx->nMD5++; /* useful ? indispensable ? */ } anDice[0] = (unsigned int) (h.an[0] / exp232_q + 1); anDice[1] = (unsigned int) (h.an[1] / exp232_q + 1); rngctx->nMD5++; rngctx->c += 2; break; } case RNG_MERSENNE: while ((tmprnd = sfmt_genrand_uint32(&rngctx->sfmt)) >= exp232_l); /* Try again */ anDice[0] = 1 + (unsigned int) (tmprnd / exp232_q); while ((tmprnd = sfmt_genrand_uint32(&rngctx->sfmt)) >= exp232_l); anDice[1] = 1 + (unsigned int) (tmprnd / exp232_q); rngctx->c += 2; break; case RNG_RANDOM_DOT_ORG: #if defined(LIBCURL_PROTOCOL_HTTPS) anDice[0] = getDiceRandomDotOrg(); if (anDice[0] > 0) { anDice[1] = getDiceRandomDotOrg(); } else anDice[1] = anDice[0]; #endif break; case RNG_FILE: anDice[0] = ReadDiceFile(rngctx); anDice[1] = ReadDiceFile(rngctx); rngctx->c += 2; break; default: break; } if (anDice[0] < 1 || anDice[1] < 1 || anDice[0] > 6 || anDice[1] > 6) { outputerrf(_("Your dice generator isn't working. Failing back on RNG_MERSENNE")); SetRNG(prng, rngctx, RNG_MERSENNE, ""); RollDice(anDice, prng, rngctx); } return 0; } extern FILE * OpenDiceFile(rngcontext * rngctx, const char *sz) { g_free(rngctx->szDiceFilename); /* initialized to NULL */ rngctx->szDiceFilename = g_strdup(sz); return (rngctx->fDice = g_fopen(sz, "r")); } static unsigned int ReadDiceFile(rngcontext * rngctx) { unsigned char uch; size_t n; if (rngctx->fDice == NULL) return (unsigned int) (-1); uglyloop: { n = fread(&uch, 1, 1, rngctx->fDice); if (feof(rngctx->fDice)) { /* end of file */ g_print(_("Rewinding dice file (%s)"), rngctx->szDiceFilename); g_printf("\n"); fseek(rngctx->fDice, 0, SEEK_SET); } else if (n != 1) { g_printerr("%s", rngctx->szDiceFilename); return (unsigned int) (-1); } else if (uch >= '1' && uch <= '6') return (uch - '0'); } goto uglyloop; /* This logic should be reconsidered */ } extern char * GetDiceFileName(rngcontext * rngctx) { return rngctx->szDiceFilename; } rngcontext * CopyRNGContext(rngcontext * rngctx) { rngcontext *newCtx = (rngcontext *) g_malloc(sizeof(rngcontext)); *newCtx = *rngctx; return newCtx; } gnubg-1.08.003/movefilters.inc000644 001751 000024 00000004645 14574155047 015677 0ustar00pmstaff000000 000000 /* * Copyright (C) 2013 Philippe Michel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: movefilters.inc,v 1.1 2013/03/21 23:27:48 plm Exp $ */ /* Default movefilters */ #define MOVEFILTER_TINY \ { { { 0, 5, 0.08f }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 5, 0.08f }, { -1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 5, 0.08f }, { -1, 0, 0 }, { 0, 2, 0.02f }, { 0, 0, 0 } }, \ { { 0, 5, 0.08f }, { -1, 0, 0 }, { 0, 2, 0.02f }, { -1, 0, 0 } } } #define MOVEFILTER_NARROW \ { { { 0, 8, 0.12f }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 8, 0.12f }, { -1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 8, 0.12f }, { -1, 0, 0 }, { 0, 2, 0.03f }, { 0, 0, 0 } }, \ { { 0, 8, 0.12f }, { -1, 0, 0 }, { 0, 2, 0.03f }, { -1, 0, 0 } } } #define MOVEFILTER_NORMAL \ { { { 0, 8, 0.16f }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 8, 0.16f }, { -1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 8, 0.16f }, { -1, 0, 0 }, { 0, 2, 0.04f }, { 0, 0, 0 } }, \ { { 0, 8, 0.16f }, { -1, 0, 0 }, { 0, 2, 0.04f }, { -1, 0, 0 } } } #define MOVEFILTER_LARGE \ { { { 0, 16, 0.32f }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 16, 0.32f }, { -1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 16, 0.32f }, { -1, 0, 0 }, { 0, 4, 0.08f }, { 0, 0, 0 } }, \ { { 0, 16, 0.32f }, { -1, 0, 0 }, { 0, 4, 0.08f }, { -1, 0, 0 } } } #define MOVEFILTER_HUGE \ { { { 0, 20, 0.44f }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 20, 0.44f }, { -1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }, \ { { 0, 20, 0.44f }, { -1, 0, 0 }, { 0, 6, 0.11f }, { 0, 0, 0 } }, \ { { 0, 20, 0.44f }, { -1, 0, 0 }, { 0, 6, 0.11f }, { -1, 0, 0 } } } gnubg-1.08.003/doc/000755 001751 000024 00000000000 14613451675 013401 5ustar00pmstaff000000 000000 gnubg-1.08.003/config.h.in000644 001751 000024 00000033615 14613451675 014667 0ustar00pmstaff000000 000000 /* config.h.in. Generated from configure.ac by autoheader. */ /* Define if you want to disable the SIMD CPU instruction test */ #undef DISABLE_SIMD_TEST /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* The package name, for gettext */ #undef GETTEXT_PACKAGE /* Define if you want to disable deprecated gtk functions */ #undef GTK_DISABLE_DEPRECATED /* Define if you want to disable deprecated glib functions */ #undef G_DISABLE_DEPRECATED /* Define to 1 to support Advanced Bit Manipulation */ #undef HAVE_ABM /* Define to 1 to support Multi-Precision Add-Carry Instruction Extensions */ #undef HAVE_ADX /* Define to 1 to support Advanced Encryption Standard New Instruction Set (AES-NI) */ #undef HAVE_AES /* Support Altivec instructions */ #undef HAVE_ALTIVEC /* Define if you have Apple CoreAudio */ #undef HAVE_APPLE_COREAUDIO /* Define if you have Apple QuickTime */ #undef HAVE_APPLE_QUICKTIME /* Define to 1 to support Advanced Vector Extensions */ #undef HAVE_AVX /* Define to 1 to support Advanced Vector Extensions 2 */ #undef HAVE_AVX2 /* Define to 1 to support AVX-512 Byte and Word Instructions */ #undef HAVE_AVX512_BW /* Define to 1 to support AVX-512 Conflict Detection Instructions */ #undef HAVE_AVX512_CD /* Define to 1 to support AVX-512 Doubleword and Quadword Instructions */ #undef HAVE_AVX512_DQ /* Define to 1 to support AVX-512 Exponential & Reciprocal Instructions */ #undef HAVE_AVX512_ER /* Define to 1 to support AVX-512 Foundation Extensions */ #undef HAVE_AVX512_F /* Define to 1 to support AVX-512 Integer Fused Multiply Add Instructions */ #undef HAVE_AVX512_IFMA /* Define to 1 to support AVX-512 Conflict Prefetch Instructions */ #undef HAVE_AVX512_PF /* Define to 1 to support AVX-512 Vector Byte Manipulation Instructions */ #undef HAVE_AVX512_VBMI /* Define to 1 to support AVX-512 Vector Length Extensions */ #undef HAVE_AVX512_VL /* Define to 1 if you have the 'bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 to support Bit Manipulation Instruction Set 1 */ #undef HAVE_BMI1 /* Define to 1 to support Bit Manipulation Instruction Set 2 */ #undef HAVE_BMI2 /* Define to 1 if you have the 'break' function. */ #undef HAVE_BREAK /* Define if you want to use libcairo */ #undef HAVE_CAIRO /* Define if you want to use gstreamer */ #undef HAVE_CANBERRA /* Define to 1 if you have the 'clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if you have the 'dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 to support Fused Multiply-Add Extensions 3 */ #undef HAVE_FMA3 /* Define to 1 to support Fused Multiply-Add Extensions 4 */ #undef HAVE_FMA4 /* Define if you have freetype2 */ #undef HAVE_FREETYPE /* Define to 1 if the system has the `const' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_CONST /* Define to 1 if the system has the `fallthrough' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_FALLTHROUGH /* Define to 1 if the system has the `format' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_FORMAT /* Define to 1 if the system has the `pure' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_PURE /* Define to 1 if the system has the `unused' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_UNUSED /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_GL_GLX_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have a functional curl library. */ #undef HAVE_LIBCURL /* Define if you have libgmp */ #undef HAVE_LIBGMP /* Define to 1 if you have the 'm' library (-lm). */ #undef HAVE_LIBM /* Define if you have libpng */ #undef HAVE_LIBPNG /* Define if you have libreadline */ #undef HAVE_LIB_READLINE /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MCHECK_H /* Define to 1 if you have the header file. */ #undef HAVE_MINIX_CONFIG_H /* Define to 1 to support Multimedia Extensions */ #undef HAVE_MMX /* Define to 1 to support Memory Protection Extensions */ #undef HAVE_MPX /* Define to 1 if you have the 'mtrace' function. */ #undef HAVE_MTRACE /* Support NEON instructions */ #undef HAVE_NEON /* Define if you want to use pangocairo */ #undef HAVE_PANGOCAIRO /* Define to 1 if you have the 'posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* Define to 1 to support Prefetch Vector Data Into Caches WT1 */ #undef HAVE_PREFETCHWT1 /* If available, contains the Python version number currently in use. */ #undef HAVE_PYTHON /* Define to 1 to support Digital Random Number Generator */ #undef HAVE_RDRND /* Define to 1 if you have the 'setpriority' function. */ #undef HAVE_SETPRIORITY /* Define to 1 to support Secure Hash Algorithm Extension */ #undef HAVE_SHA /* Define to 1 if you have the 'sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the 'sigvec' function. */ #undef HAVE_SIGVEC /* Define if the system supports sockets. */ #undef HAVE_SOCKETS /* Define to 1 to support Streaming SIMD Extensions */ #undef HAVE_SSE /* Define to 1 to support Streaming SIMD Extensions */ #undef HAVE_SSE2 /* Define to 1 to support Streaming SIMD Extensions 3 */ #undef HAVE_SSE3 /* Define to 1 to support Streaming SIMD Extensions 4.1 */ #undef HAVE_SSE4_1 /* Define to 1 to support Streaming SIMD Extensions 4.2 */ #undef HAVE_SSE4_2 /* Define to 1 to support AMD Streaming SIMD Extensions 4a */ #undef HAVE_SSE4a /* Define to 1 to support Supplemental Streaming SIMD Extensions 3 */ #undef HAVE_SSSE3 /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the 'strptime' function. */ #undef HAVE_STRPTIME /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Support VSX instructions */ #undef HAVE_VSX /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 to support eXtended Operations Extensions */ #undef HAVE_XOP /* Define to 1 if you have the '_aligned_malloc' function. */ #undef HAVE__ALIGNED_MALLOC /* define if your compiler has __attribute__ */ #undef HAVE___ATTRIBUTE__ /* Define to 1 if the system has the `__builtin_clz' built-in function */ #undef HAVE___BUILTIN_CLZ /* Define to 1 if the system has the `__builtin_expect' built-in function */ #undef HAVE___BUILTIN_EXPECT /* Defined if libcurl supports AsynchDNS */ #undef LIBCURL_FEATURE_ASYNCHDNS /* Defined if libcurl supports IDN */ #undef LIBCURL_FEATURE_IDN /* Defined if libcurl supports IPv6 */ #undef LIBCURL_FEATURE_IPV6 /* Defined if libcurl supports KRB4 */ #undef LIBCURL_FEATURE_KRB4 /* Defined if libcurl supports libz */ #undef LIBCURL_FEATURE_LIBZ /* Defined if libcurl supports NTLM */ #undef LIBCURL_FEATURE_NTLM /* Defined if libcurl supports SSL */ #undef LIBCURL_FEATURE_SSL /* Defined if libcurl supports SSPI */ #undef LIBCURL_FEATURE_SSPI /* Defined if libcurl supports DICT */ #undef LIBCURL_PROTOCOL_DICT /* Defined if libcurl supports FILE */ #undef LIBCURL_PROTOCOL_FILE /* Defined if libcurl supports FTP */ #undef LIBCURL_PROTOCOL_FTP /* Defined if libcurl supports FTPS */ #undef LIBCURL_PROTOCOL_FTPS /* Defined if libcurl supports HTTP */ #undef LIBCURL_PROTOCOL_HTTP /* Defined if libcurl supports HTTPS */ #undef LIBCURL_PROTOCOL_HTTPS /* Defined if libcurl supports IMAP */ #undef LIBCURL_PROTOCOL_IMAP /* Defined if libcurl supports LDAP */ #undef LIBCURL_PROTOCOL_LDAP /* Defined if libcurl supports POP3 */ #undef LIBCURL_PROTOCOL_POP3 /* Defined if libcurl supports RTSP */ #undef LIBCURL_PROTOCOL_RTSP /* Defined if libcurl supports SMTP */ #undef LIBCURL_PROTOCOL_SMTP /* Defined if libcurl supports TELNET */ #undef LIBCURL_PROTOCOL_TELNET /* Defined if libcurl supports TFTP */ #undef LIBCURL_PROTOCOL_TFTP /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* maximum number of evaluation threads */ #undef MAX_NUMTHREADS /* program to open URLs */ #undef OPEN_URL_PROG /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Using Msys */ #undef USABLE_UNDER_MSYS /* Define if using Apple OpenGL */ #undef USE_APPLE_OPENGL /* Define if you want to compile with AVX support */ #undef USE_AVX /* Define if you want to use the 3D boards */ #undef USE_BOARD3D /* Define if you want to compile with FMA3 support */ #undef USE_FMA3 /* Define if you want to use GResource to load images */ #undef USE_GRESOURCE /* Define if you want to use the gtk gui */ #undef USE_GTK /* Define if you want to have multithread support */ #undef USE_MULTITHREAD /* Define if you want to compile with NEON support */ #undef USE_NEON /* Define if you want to use Python inside GNUbg */ #undef USE_PYTHON /* Define if you want to compile with SIMD support */ #undef USE_SIMD_INSTRUCTIONS /* Define if you want to use sqlite */ #undef USE_SQLITE /* Define if you want to compile with SSE2 support */ #undef USE_SSE2 /* Enable extensions on AIX, Interix, z/OS. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by C23 Annex F. */ #ifndef __STDC_WANT_IEC_60559_EXT__ # undef __STDC_WANT_IEC_60559_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Version number of package */ #undef VERSION /* Define to 1 if 'lex' declares 'yytext' as a 'char *' by default, not a 'char[]'. */ #undef YYTEXT_POINTER /* Define curl_free() as free() if our version of curl lacks curl_free. */ #undef curl_free /* Define to '__inline__' or '__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define as 'unsigned int' if doesn't define. */ #undef size_t gnubg-1.08.003/AUTHORS000644 001751 000024 00000011714 14600064560 013675 0ustar00pmstaff000000 000000 GNU Backgammon was written by: Joseph Heled Jim Segrave Michael Petch Oystein Johansen Joern Thyssen Philippe Michel Jonathan Kinsey Gary Wong David Montgomery Christian Anthon Support by: Oystein Johansen (Web Pages) Nardy Pillards (Web Pages) Achim Mueller (Manual) Albert Silver (Tutorial) Contributors of code include: Olivier Baur Petr Kadlec Ingo Macherius Holger Bochnig Isaac Keslassy Jeremy Moore Guido Flohr Kaoru Takahashi Rod Roark Nis Joergensen Stein Kulseth Aaron Tikuisis Translations by: Petr Kadlec (Czech) Joern Thyssen (Danish) Matti Kamppinen (Finnish) Olivier Baur (French) Achim Mueller (German) Vangelis Skarmoutsos (Greek) Hlynur Sigurgislason (Icelandic) Renzo Campagna (Italian) Yoshito Takeuchi (Japanese) Mihai Varzaru (Romanian) Dmitri I Gouliaev (Russian) Fernando GarcĂ­a GarcĂ­a (Spanish) Akif Dinc (Turkish) Contributors (of bug reports and suggestions) include: Russ Allbery Neil Kazaross Jared Riley Misja Alma Mathias Kegelmann Klaus Rindholt Kazuaki Asai Matija Kejzar Oliver Riordan Eric Augustine Bert Van Kerckhove Alex Romosan Erik Barfoed James F. Kibler Hans-Juergen Schaefer Ron Barry Johnny Kirk Steve Schreiber Steve Baedke Gerhard Knop Hugh Sconyers Stefan van den Berg Robert Konigsberg Martin Schrode Frank Berger Martin Krainer Paul Selick Jim Borror Elias Kritikos Sho Sengoku Chuck Bower Corrin Lakeland Ian Shaw Adrian Bunk Tim Laursen Alberta di Silvio Nick Bratby Myshkin LeVine Peter Sochovsky Craig Campbell Eli Liang Mark Spencer Timothy Chow Ege Lundgren Scott Steiner John Chuang Kevin Maguire Maik Stiebler Tristan Colgate Massimiliano Maini W. Stroop (Rob) Olivier Croisille Giulio De Marco Daisuke Takahashi Ned Cross John Marttila Yoshito Takeuchi Ian Curtis Alix Martin Jacques Thiriat Bill Davidson Tom Martin Malene Thyssen Michael Depreli William Maslen Claes Tornberg Ian Dunstan Joachim Matussek Sander van Rijnswou Max Durbano Thomas Meyer Robert-Jan Veldhuizen Peter Eberhard Daniel Murphy Morten Wang Robert Eberlein Magnar Naustdalslid Jeff White Fotis Dave Neary JP White Dan Fandrich Rolf Nielsen Mike Whitton Kennedy Fraser Mirori Orange Chris Wilson Ric Gerace Peter Orum Simon Woodhead Michel Grimminck Roy Passfield Kit Woolsey Eric Groleau Thomas Patrick Frank Worrell Jeff Haferman Billie Patterson Christopher D. Yep Morten Juul Henriksen Zvezdan Petkovic Anders Zachrison Alain Henry Petri Pitkanen Douglas Zare Jens Hoefkens Sam Pottle Tilemachos Zoidis Casey Hopkins Henrik Ravn Louis Zulli Martin Janke James Rech Credit is also due to those who have published information about backgammon playing programs (references will appear here later). GNU Backgammon has borrowed ideas from: Hans Berliner Rick Janowski Gerry Tesauro Douglas Zare Chuck Bower Brian Sheppard Morten Wang Michael Zehr The manual for GNU Backgammon includes a chapter describing the rules of backgammon, written by Tom Keith for his Backgammon Galore web site . Library code from the following authors has been included in GNU Backgammon: Austin Appleby (the MurmurHash3 hashing function) Ulrich Drepper (an implementation of the public domain MD5 algorithm) Bob Jenkins (the ISAAC pseudo random number generator) Mutsuo Saito and Makoto Matsumoto (the Mersenne Twister PRNG) Brian Paul (the TR tile rendering library) Claes Tornberg (the mec match equity table generator) If you feel that you're not given credits for your contributions to GNU Backgammon please write to one of the developers. Please send bug reports for GNU Backgammon to: gnubg-1.08.003/compile000755 001751 000024 00000016350 14600637122 014204 0ustar00pmstaff000000 000000 #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gnubg-1.08.003/autogen.sh000755 001751 000024 00000003014 14600064703 014617 0ustar00pmstaff000000 000000 #! /bin/sh # Copyright (C) 2002 Gary Wong # Copyright (C) 2003-2018 the AUTHORS # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # $Id: autogen.sh,v 1.12 2019/09/15 17:54:57 plm Exp $ # If we use libtool-2, libtoolize below will recreate them, but if we use # libtool-1 we don't want them, which could happen if we use a shared # source directory or work from a "make dist" made on a libtool-2 system. # rm -f m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 rm -f aclocal.m4 aclocal -I m4 if [ `uname -s` = Darwin ] then LIBTOOLIZE=glibtoolize else LIBTOOLIZE=libtoolize fi $LIBTOOLIZE --force --copy # In case we got a "You should update your `aclocal.m4' by running aclocal." # from libtoolize. # aclocal -I m4 autoheader # automake will replace them by its local version. # rm -f compile config.guess config.sub install-sh missing ylwrap automake --add-missing --copy -Wno-portability autoconf gnubg-1.08.003/boarddim.h000644 001751 000024 00000012634 14574155047 014574 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Holger Bochnig * Copyright (C) 2003-2008 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: boarddim.h,v 1.15 2013/06/16 02:16:10 mdpetch Exp $ */ #ifndef BOARDDIM_H #define BOARDDIM_H /* fundamental constants */ #define CHEQUER_WIDTH 6 #define DIE_WIDTH 7 #define CUBE_WIDTH 6 #define ARROW_WIDTH 3 #define HINGE_HEIGHT 12 #define HINGE_WIDTH 2 /* additional space (beyond one chequer's worth) between two points * with 5 chequers */ #define EXTRA_HEIGHT 10 /* derived constants */ #define CHEQUER_HEIGHT CHEQUER_WIDTH #define DIE_HEIGHT DIE_WIDTH #define CUBE_HEIGHT CUBE_WIDTH #define ARROW_HEIGHT ARROW_WIDTH #define BORDER_HEIGHT (CHEQUER_HEIGHT / 2) #define BORDER_WIDTH (CHEQUER_WIDTH / 2) #define BAR_WIDTH (2 * CHEQUER_WIDTH) #define BEAROFF_INSIDE CHEQUER_WIDTH #define BEAROFF_WIDTH (BEAROFF_INSIDE + 2 * BORDER_WIDTH) #define BOARD_WIDTH (12 * CHEQUER_WIDTH + 2 * BEAROFF_WIDTH + BAR_WIDTH) #define BEAROFF_DIVIDER_HEIGHT CHEQUER_HEIGHT /* the following is technically wrong - it should be 10 chequers, die/cube * and two borders - there may be undisplayable positions otherwise */ #define BOARD_MIN_HEIGHT (11 * CHEQUER_HEIGHT + 2 * BORDER_HEIGHT) #define BOARD_HEIGHT (BOARD_MIN_HEIGHT + EXTRA_HEIGHT) /* more derived constants */ #define CUBE_LABEL_WIDTH (CUBE_WIDTH - 2) #define CUBE_LABEL_HEIGHT (CUBE_HEIGHT - 2) #define RESIGN_WIDTH CUBE_WIDTH #define RESIGN_HEIGHT CUBE_HEIGHT #define RESIGN_LABEL_WIDTH CUBE_LABEL_WIDTH #define RESIGN_LABEL_HEIGHT CUBE_LABEL_HEIGHT #define CHEQUER_LABEL_WIDTH (CHEQUER_WIDTH - 2) #define CHEQUER_LABEL_HEIGHT (CHEQUER_HEIGHT - 2) #define POINT_WIDTH CHEQUER_WIDTH /* for a tall enough board, let the points extend past a stack of 5 chequers */ #if (EXTRA_HEIGHT >= (CHEQUER_HEIGHT + 4)) #define DISPLAY_POINT_EXTRA 4 #elif (EXTRA_HEIGHT >= (CHEQUER_HEIGHT + 3)) #define DISPLAY_POINT_EXTRA 3 #elif (EXTRA_HEIGHT >= (CHEQUER_HEIGHT + 2)) #define DISPLAY_POINT_EXTRA 2 #elif (EXTRA_HEIGHT >= (CHEQUER_HEIGHT + 1)) #define DISPLAY_POINT_EXTRA 1 #else #define DISPLAY_POINT_EXTRA 0 #endif #define DISPLAY_POINT_HEIGHT (5 * CHEQUER_HEIGHT + DISPLAY_POINT_EXTRA) /* for HTML */ #define BEAROFF_HEIGHT (5 * CHEQUER_HEIGHT) #define POINT_HEIGHT (5 * CHEQUER_HEIGHT) #define BOARD_CENTER_WIDTH (6 * CHEQUER_WIDTH) #define BOARD_CENTER_HEIGHT (BOARD_HEIGHT - 2 * (BORDER_HEIGHT + POINT_HEIGHT)) #define DISPLAY_BEAROFF_HEIGHT ((BOARD_HEIGHT - BEAROFF_DIVIDER_HEIGHT) / 2 - \ BORDER_HEIGHT) /* where to place a chequer on the bar - x */ #define BAR_X ((BOARD_WIDTH - CHEQUER_WIDTH) / 2) /* where to place the first player 0 chequer on the bar - y */ #define BAR_Y_0 (BOARD_HEIGHT / 2 - 16) /* and where to place the first player 1 chequer on the bar - y */ #define BAR_Y_1 (BOARD_HEIGHT / 2 + 9) /* where to start point x, x = 1..13 */ #define POINT_X(n) ((n < 7) ? (BOARD_WIDTH - BEAROFF_WIDTH - \ n * CHEQUER_WIDTH) : \ (n < 13) ? ((BOARD_WIDTH - BAR_WIDTH) / 2 - \ (n - 6) * CHEQUER_WIDTH) : \ (n < 19) ? (BEAROFF_WIDTH + \ (n - 13) * CHEQUER_WIDTH) : \ (BOARD_WIDTH + BAR_WIDTH) / 2 + (n - 19) * CHEQUER_WIDTH) /* top and bottom y co-ordinates of chequers */ #define TOP_POINT_Y (BOARD_HEIGHT - BORDER_HEIGHT - CHEQUER_HEIGHT) #define BOT_POINT_Y (BORDER_HEIGHT) /* left and right bearoff tray coordinates */ #define BEAROFF_RIGHT_X (BOARD_WIDTH - BORDER_WIDTH - CHEQUER_WIDTH) #define BEAROFF_LEFT_X (BORDER_WIDTH) /* x and y coordinates of cube when not available/doubling/owned/centred */ #define NO_CUBE -32768 /* width of board between tray and bar */ #define PLAY_WIDTH (((BOARD_WIDTH - (2 * BEAROFF_WIDTH)) - BAR_WIDTH) / 2) #define CUBE_RIGHT_X (BEAROFF_WIDTH + (PLAY_WIDTH - CUBE_WIDTH) / 2) #define CUBE_LEFT_X (BOARD_WIDTH - (CUBE_RIGHT_X)) #define CUBE_TRAY_X (BEAROFF_LEFT_X + (BEAROFF_INSIDE - CUBE_WIDTH) / 2) #define PLAY_HEIGHT (BOARD_HEIGHT - 2 * BORDER_HEIGHT ) #define CUBE_CENTRE_Y (BORDER_HEIGHT + (PLAY_HEIGHT - CUBE_HEIGHT) / 2) #define CUBE_OWN_1_Y (BOARD_HEIGHT - (CUBE_HEIGHT + BORDER_HEIGHT)) #define CUBE_OWN_0_Y (BORDER_HEIGHT) #define CUBE_RESIGN_LEFT_X (CUBE_LEFT_X - CHEQUER_WIDTH) #define CUBE_RESIGN_RIGHT_X (CUBE_RIGHT_X + CHEQUER_WIDTH) /* where the hinges begin - y */ #define HINGE_BOT_Y ((BOARD_HEIGHT - CUBE_HEIGHT) / 2 - \ 2 * CHEQUER_HEIGHT - HINGE_HEIGHT - 1) #define HINGE_TOP_Y ((BOARD_HEIGHT + CUBE_HEIGHT) / 2 + \ 2 * CHEQUER_HEIGHT + 1) #endif /* BOARDDIM_H */ gnubg-1.08.003/bearoffdump.c000644 001751 000024 00000010004 14574155047 015265 0ustar00pmstaff000000 000000 /* * Copyright (C) 2004 Joern Thyssen * Copyright (C) 2004-2020 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: bearoffdump.c,v 1.29 2022/01/27 22:14:49 plm Exp $ */ #include "config.h" #include #include #include #include #include #include "positionid.h" #include "bearoff.h" #include "multithread.h" #include "backgammon.h" #include "drawboard.h" extern void MT_CloseThreads(void) { return; } extern int main(int argc, char **argv) { char *filename, *szPosID = NULL; unsigned int id = 0; bearoffcontext *pbc; char sz[4096]; TanBoard anBoard; GOptionEntry ao[] = { {"index", 'n', 0, G_OPTION_ARG_INT, &id, N_("index"), NULL}, {"posid", 'p', 0, G_OPTION_ARG_STRING, &szPosID, N_("Position ID"), NULL}, {NULL, 0, 0, (GOptionArg) 0, NULL, NULL, NULL} }; GError *error = NULL; GOptionContext *context; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); g_set_print_handler(print_utf8_to_locale); g_set_printerr_handler(print_utf8_to_locale); context = g_option_context_new("file"); g_option_context_add_main_entries(context, ao, PACKAGE); g_option_context_parse(context, &argc, &argv, &error); g_option_context_free(context); if (error) { g_printerr("%s\n", error->message); exit(EXIT_FAILURE); } if ((szPosID && id) || (!szPosID && !id)) { g_printerr(_("Either Position ID or index is required.\n" "For more help try `bearoffdump --help'\n")); exit(EXIT_FAILURE); } if (argc != 2) { g_printerr(_("A bearoff database file should be given as an argument\n" "For more help try `bearoffdump --help'\n")); exit(EXIT_FAILURE); } filename = argv[1]; g_print(_("Bearoff database: %s\n"), filename); if (!id) { g_print(_("Position ID : %s\n"), szPosID); } else { g_print(_("Position number : %u\n"), id); } /* This is needed since we call ReadBearoffFile() from bearoff.c */ MT_InitThreads(); if (!(pbc = BearoffInit(filename, BO_NONE, NULL))) { g_print(_("Failed to initialise bearoff database %s\n"), filename); exit(-1); } /* information about bearoff database */ g_print(_("\n" "Information about database:\n\n")); *sz = 0; BearoffStatus(pbc, sz); puts(sz); /* set up board */ memset(anBoard, 0, sizeof anBoard); if (!id) { g_print(_("\n" "Dump of position ID: %s\n\n"), szPosID); PositionFromID(anBoard, szPosID); } else { unsigned int n, nUs, nThem; g_print(_("\n" "Dump of position#: %u\n\n"), id); n = Combination(pbc->nPoints + pbc->nChequers, pbc->nPoints); nUs = id / n; nThem = id % n; PositionFromBearoff(anBoard[0], nThem, pbc->nPoints, pbc->nChequers); PositionFromBearoff(anBoard[1], nUs, pbc->nPoints, pbc->nChequers); } /* board */ { char szOut[2048]; char *apc[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; int nc = pbc->bt == BEAROFF_HYPERGAMMON ? pbc->nChequers : 15; puts(DrawBoard(szOut, (ConstTanBoard) anBoard, TRUE, apc, NULL, nc)); } /* dump req. position */ *sz = 0; BearoffDump(pbc, (ConstTanBoard) anBoard, sz); puts(sz); BearoffClose(pbc); return 0; } gnubg-1.08.003/gtkmet.h000644 001751 000024 00000001654 14574155047 014306 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002 Joern Thyssen * Copyright (C) 2009 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkmet.h,v 1.7 2013/06/16 02:16:15 mdpetch Exp $ */ #ifndef GTKMET_H #define GTKMET_H extern void GTKShowMatchEquityTable(const unsigned int nMatchTo, const int anScore[2]); #endif gnubg-1.08.003/gtk-multiview.c000644 001751 000024 00000025657 14574155047 015627 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000 Jonathan Blandford * Copyright (C) 2001-2019 the AUTHORS * * License changed from the GNU LGPL to the GNU GPL (as permitted under * Term 3 of the GNU LGPL) by Gary Wong for distribution with GNU Backgammon. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtk-multiview.c,v 1.20 2021/04/03 21:09:26 plm Exp $ */ #include "config.h" #include "common.h" #include "gtklocdefs.h" #include #include "gtk-multiview.h" G_DEFINE_TYPE(GtkMultiview, gtk_multiview, GTK_TYPE_CONTAINER) static void gtk_multiview_size_request(GtkWidget * widget, GtkRequisition * requisition); #if GTK_CHECK_VERSION(3,0,0) static void gtk_multiview_get_preferred_width(GtkWidget * widget, gint * minimal_width, gint * natural_width); static void gtk_multiview_get_preferred_height(GtkWidget * widget, gint * minimal_height, gint * natural_height); #endif static void gtk_multiview_size_allocate(GtkWidget * widget, GtkAllocation * allocation); static void gtk_multiview_map(GtkWidget * widget); static void gtk_multiview_unmap(GtkWidget * widget); static GType gtk_multiview_child_type(GtkContainer * container); static void gtk_multiview_forall(GtkContainer * container, gboolean include_internals, GtkCallback callback, gpointer callback_data); static void gtk_multiview_add(GtkContainer * widget, GtkWidget * child); static void gtk_multiview_remove(GtkContainer * widget, GtkWidget * child); static void gtk_multiview_init(GtkMultiview * multiview) { gtk_widget_set_has_window(GTK_WIDGET(multiview), FALSE); multiview->current = NULL; multiview->children = NULL; } static void gtk_multiview_class_init(GtkMultiviewClass * klass) { GtkWidgetClass *widget_class; GtkContainerClass *container_class; widget_class = (GtkWidgetClass *) klass; container_class = (GtkContainerClass *) klass; #if GTK_CHECK_VERSION(3,0,0) widget_class->get_preferred_width = gtk_multiview_get_preferred_width; widget_class->get_preferred_height = gtk_multiview_get_preferred_height; #else widget_class->size_request = gtk_multiview_size_request; #endif widget_class->size_allocate = gtk_multiview_size_allocate; widget_class->map = gtk_multiview_map; widget_class->unmap = gtk_multiview_unmap; container_class->forall = gtk_multiview_forall; container_class->add = gtk_multiview_add; container_class->remove = gtk_multiview_remove; container_class->child_type = gtk_multiview_child_type; } static void gtk_multiview_size_request(GtkWidget * widget, GtkRequisition * requisition) { GList *tmp_list; GtkMultiview *multiview; GtkRequisition child_requisition; GtkWidget *child; multiview = GTK_MULTIVIEW(widget); requisition->width = 0; requisition->height = 0; /* We find the maximum size of all children widgets */ tmp_list = multiview->children; while (tmp_list) { child = GTK_WIDGET(tmp_list->data); tmp_list = tmp_list->next; if (gtk_widget_get_visible(child)) { #if GTK_CHECK_VERSION(3,0,0) gtk_widget_get_preferred_size(child, &child_requisition, NULL); #else gtk_widget_size_request(child, &child_requisition); #endif requisition->width = MAX(requisition->width, child_requisition.width); requisition->height = MAX(requisition->height, child_requisition.height); if (gtk_widget_get_mapped(child) && child != multiview->current) { gtk_widget_unmap(GTK_WIDGET(child)); } } } } #if GTK_CHECK_VERSION(3,0,0) static void gtk_multiview_get_preferred_width(GtkWidget * widget, gint * minimal_width, gint * natural_width) { GtkRequisition requisition; gtk_multiview_size_request(widget, &requisition); *minimal_width = *natural_width = requisition.width; } static void gtk_multiview_get_preferred_height(GtkWidget * widget, gint * minimal_height, gint * natural_height) { GtkRequisition requisition; gtk_multiview_size_request(widget, &requisition); *minimal_height = *natural_height = requisition.height; } #endif static void gtk_multiview_size_allocate(GtkWidget * widget, GtkAllocation * allocation) { GtkMultiview *multiview; GList *tmp_list; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(widget)); multiview = GTK_MULTIVIEW(widget); gtk_widget_set_allocation(widget, allocation); tmp_list = multiview->children; while (tmp_list) { GtkWidget *child = GTK_WIDGET(tmp_list->data); tmp_list = tmp_list->next; if (gtk_widget_get_visible(child)) { gtk_widget_size_allocate(child, allocation); } } } static void gtk_multiview_map(GtkWidget * widget) { GtkMultiview *multiview; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(widget)); multiview = GTK_MULTIVIEW(widget); gtk_widget_set_mapped(widget, TRUE); if (multiview->current && gtk_widget_get_visible(multiview->current) && !gtk_widget_get_mapped(multiview->current)) { gtk_widget_map(GTK_WIDGET(multiview->current)); } } static void gtk_multiview_unmap(GtkWidget * widget) { GtkMultiview *multiview; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(widget)); multiview = GTK_MULTIVIEW(widget); gtk_widget_set_mapped(widget, FALSE); if (multiview->current && gtk_widget_get_visible(multiview->current) && gtk_widget_get_mapped(multiview->current)) { gtk_widget_unmap(GTK_WIDGET(multiview->current)); } } static GType gtk_multiview_child_type(GtkContainer * UNUSED(container)) { return gtk_widget_get_type(); } static void gtk_multiview_forall(GtkContainer * container, gboolean UNUSED(include_internals), GtkCallback callback, gpointer callback_data) { GtkMultiview *multiview; GList *tmp_list; g_return_if_fail(container != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(container)); g_return_if_fail(callback != NULL); multiview = GTK_MULTIVIEW(container); tmp_list = multiview->children; while (tmp_list) { GtkWidget *child = GTK_WIDGET(tmp_list->data); tmp_list = tmp_list->next; (*callback) (GTK_WIDGET(child), callback_data); } } static void gtk_multiview_add(GtkContainer * container, GtkWidget * child) { g_return_if_fail(container != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(container)); g_return_if_fail(child != NULL); g_return_if_fail(GTK_IS_WIDGET(child)); gtk_multiview_append_child(GTK_MULTIVIEW(container), child); } static void gtk_multiview_remove(GtkContainer * container, GtkWidget * child) { GtkMultiview *multiview; GList *list; g_return_if_fail(container != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(container)); g_return_if_fail(child != NULL); multiview = GTK_MULTIVIEW(container); list = g_list_find(multiview->children, child); g_return_if_fail(list != NULL); /* If we are mapped and visible, we want to deal with changing the page. */ if ((gtk_widget_get_mapped(GTK_WIDGET(container))) && (list->data == (gpointer) multiview->current) && (list->next != NULL)) { gtk_multiview_set_current(multiview, GTK_WIDGET(list->next->data)); } multiview->children = g_list_remove(multiview->children, child); gtk_widget_unparent(child); } /* Public Functions */ GtkWidget * gtk_multiview_new(void) { return g_object_new(GTK_TYPE_MULTIVIEW, NULL); } void gtk_multiview_prepend_child(GtkMultiview * multiview, GtkWidget * child) { g_return_if_fail(multiview != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(multiview)); g_return_if_fail(child != NULL); g_return_if_fail(GTK_IS_WIDGET(child)); gtk_multiview_insert_child(multiview, NULL, child); } void gtk_multiview_insert_child(GtkMultiview * multiview, GtkWidget * back_child, GtkWidget * child) { GList *list; g_return_if_fail(multiview != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(multiview)); g_return_if_fail(child != NULL); g_return_if_fail(GTK_IS_WIDGET(child)); list = g_list_find(multiview->children, back_child); if (list == NULL) { multiview->children = g_list_prepend(multiview->children, child); } else { GList *new_el = g_list_alloc(); new_el->next = list->next; new_el->prev = list; if (new_el->next) new_el->next->prev = new_el; new_el->prev->next = new_el; new_el->data = (gpointer) child; } gtk_widget_set_parent(GTK_WIDGET(child), GTK_WIDGET(multiview)); if (gtk_widget_get_realized(GTK_WIDGET(multiview))) gtk_widget_realize(GTK_WIDGET(child)); if (gtk_widget_get_visible(GTK_WIDGET(multiview)) && gtk_widget_get_visible(GTK_WIDGET(child))) { if (gtk_widget_get_mapped(GTK_WIDGET(child))) gtk_widget_unmap(GTK_WIDGET(child)); gtk_widget_queue_resize(GTK_WIDGET(multiview)); } /* if it's the first and only entry, we want to bring it to the foreground. */ if (multiview->children->next == NULL) gtk_multiview_set_current(multiview, child); } void gtk_multiview_append_child(GtkMultiview * multiview, GtkWidget * child) { GList *list; g_return_if_fail(multiview != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(multiview)); g_return_if_fail(child != NULL); g_return_if_fail(GTK_IS_WIDGET(child)); list = g_list_last(multiview->children); if (list) { gtk_multiview_insert_child(multiview, GTK_WIDGET(list->data), child); } else { gtk_multiview_insert_child(multiview, NULL, child); } } void gtk_multiview_set_current(GtkMultiview * multiview, GtkWidget * child) { GList *list; GtkWidget *old = NULL; g_return_if_fail(multiview != NULL); g_return_if_fail(GTK_IS_MULTIVIEW(multiview)); g_return_if_fail(child != NULL); g_return_if_fail(GTK_IS_WIDGET(child)); if (multiview->current == child) return; list = g_list_find(multiview->children, child); g_return_if_fail(list != NULL); if ((multiview->current) && (gtk_widget_get_visible(multiview->current)) && (gtk_widget_get_mapped(GTK_WIDGET(multiview)))) { old = GTK_WIDGET(multiview->current); } multiview->current = GTK_WIDGET(list->data); if (gtk_widget_get_visible(multiview->current) && (gtk_widget_get_mapped(GTK_WIDGET(multiview)))) { gtk_widget_map(multiview->current); } if (old && gtk_widget_get_mapped(old)) gtk_widget_unmap(old); } gnubg-1.08.003/gtkrolls.h000644 001751 000024 00000001660 14574155047 014651 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkrolls.h,v 1.4 2013/06/16 02:16:16 mdpetch Exp $ */ #ifndef GTKROLLS_H #define GTKROLLS_H extern void GTKShowRolls(const gint nDepth, evalcontext * pec, matchstate * pms); #endif /* GTKROLLS_H */ gnubg-1.08.003/import.c000644 001751 000024 00000323653 14610037046 014313 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2003 Oystein Johansen * Copyright (C) 2001-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: import.c,v 1.235 2023/09/05 20:34:21 plm Exp $ */ #include "config.h" #include #include #include #include #include #include #include #include #include "backgammon.h" #include "drawboard.h" #if USE_GTK #include "gtkgame.h" #endif #include "file.h" #include "positionid.h" #include "matchequity.h" #if !GLIB_CHECK_VERSION (2,26,0) #ifdef WIN32 #define GStatBuf struct _g_stat_struct #else typedef struct stat GStatBuf; #endif #endif static int ParseSnowieTxt(char *sz, int *pnMatchTo, int *pfJacoby, int *pfUnused1, int *pfUnused2, int *pfTurn, char aszPlayer[2][MAX_NAME_LEN], int *pfCrawfordGame, int anScore[2], int *pnCube, int *pfCubeOwner, TanBoard anBoard, int anDice[2]); static int IsValidMove(const TanBoard anBoard, const int anMove[8]) { TanBoard anBoardTemp; int anMoveTemp[8]; memcpy(anBoardTemp, anBoard, 2 * 25 * sizeof(int)); memcpy(anMoveTemp, anMove, 8 * sizeof(int)); if (!ApplyMove(anBoardTemp, anMoveTemp, TRUE)) return 1; else return 0; } static void ParseSetDate(char *szFilename) { /* GridGammon mat files contain date in filename. * for other files use last file access date */ GStatBuf filestat; struct tm *matchdate = NULL; #if HAVE_STRPTIME char *pch; struct tm mdate; for (pch = szFilename; *pch != '\0'; pch++); /* goto end of filename */ while (pch != szFilename) { if (*--pch == '-') { /* go backwards until '-' */ /* check if 8 digits before - are valid date */ if (strptime(pch - 8, "%Y%m%d", &mdate) == pch) { matchdate = &mdate; /* GamesGrid closed at the end of May 2008, GridGammon opened some time later */ if (mdate.tm_year <= 107 || (mdate.tm_year == 108 && mdate.tm_mon <= 5)) SetMatchInfo(&mi.pchPlace, "GamesGrid", NULL); else SetMatchInfo(&mi.pchPlace, "GridGammon", NULL); } } } #endif /* date could not be parsed, use date of last modification */ if (matchdate == NULL) { if (g_stat(szFilename, &filestat) == 0) { matchdate = localtime((time_t *) & filestat.st_mtime); } } if (matchdate != NULL) { mi.nYear = matchdate->tm_year + 1900; mi.nMonth = matchdate->tm_mon + 1; mi.nDay = matchdate->tm_mday; } } static int ReadInt16(FILE * pf, int *n) { /* Read a little-endian, signed (2's complement) 16-bit integer. * This is inefficient on hardware which is already little-endian * or 2's complement, but at least it's portable. */ /* FIXME what about error handling? */ unsigned char auch[2]; if (fread(auch, 2, 1, pf) != 1) return FALSE; *n = auch[0] | (auch[1] << 8); if (*n >= 0x8000) *n -= 0x10000; return TRUE; } static int ParseJF(FILE * fp, int *pnMatchTo, int *pfJacoby, int *pfTurn, char aszPlayer[2][MAX_NAME_LEN], int *pfCrawfordGame, int *pfPostCrawford, int anScore[2], int *pnCube, int *pfCubeOwner, TanBoard anBoard, int anDice[2], int *pfCubeUse, int *pfBeavers) { int nVersion, nCubeOwner, nOnRoll, nMovesLeft, nMovesRight; int nGameOrMatch, nOpponent, nLevel, nScore1, nScore2; int nDie1, nDie2; int fCaution, fSwapDice, fJFplayedLast; int i, idx, anNew[26], anOld[26]; char szLastMove[25]; unsigned char c; int no_val; int val_crawford; if (!ReadInt16(fp, &nVersion)) goto read_failed; if (nVersion < 124 || nVersion > 126) { outputl(_("File not recognised as Jellyfish file.")); return -1; } if (nVersion == 126) { /* 3.0 */ if (!ReadInt16(fp, &fCaution)) goto read_failed; if (!ReadInt16(fp, &no_val)) goto read_failed; /* Not in use */ } if (nVersion == 125 || nVersion == 126) { /* 1.6 or newer */ /* 3 variables not used by older version */ if (!ReadInt16(fp, pfCubeUse)) goto read_failed; if (!ReadInt16(fp, pfJacoby)) goto read_failed; if (!ReadInt16(fp, pfBeavers)) goto read_failed; if (nVersion == 125) { /* If reading, caution can be set here use caution = */ } } if (nVersion == 124) { /* 1.0, 1.1 or 1.2 If reading, the other variables can be set here */ /* use cube = jacoby = beaver = use caution = */ } if (!ReadInt16(fp, pnCube)) goto read_failed; if (!ReadInt16(fp, &nCubeOwner)) goto read_failed; /* Owner: 1 or 2 is player 1 or 2, respectively, 0 means cube in the middle */ *pfCubeOwner = nCubeOwner - 1; if (!ReadInt16(fp, &nOnRoll)) goto read_failed; /* 0 means starting position. If you add 2 to the player (to get 3 or 4) Sure? it means that the player is on * roll but the dice have not been rolled yet. */ if (!ReadInt16(fp, &nMovesLeft)) goto read_failed; if (!ReadInt16(fp, &nMovesRight)) goto read_failed; /* These two variables are used when you use movement #1, (two buttons) and tells how many moves you have left * to play with the left and the right die, respectively. Initialized to 1 (if you roll a double, left = 4 and * right = 0). If movement #2 (one button), only the first one (left) is used to store both dice. */ if (!ReadInt16(fp, &no_val)) /* Not in use */ goto read_failed; if (!ReadInt16(fp, &nGameOrMatch)) goto read_failed; /* 1 = match, 3 = game */ if (!ReadInt16(fp, &nOpponent)) goto read_failed; /* 1 = 2 players, 2 = JF plays one side */ if (!ReadInt16(fp, &nLevel)) goto read_failed; if (!ReadInt16(fp, pnMatchTo)) goto read_failed; /* 0 if single game */ if (nGameOrMatch == 3) *pnMatchTo = 0; if (!ReadInt16(fp, &nScore1)) goto read_failed; if (!ReadInt16(fp, &nScore2)) goto read_failed; /* Can be whatever if match length = 0 */ anScore[0] = nScore1; anScore[1] = nScore2; if (fread(&c, 1, 1, fp) != 1) goto read_failed; for (i = 0; i < c; i++) { if (fread(&aszPlayer[0][i], 1, 1, fp) != 1) goto read_failed; } aszPlayer[0][c] = '\0'; if (nOpponent == 2) strcpy(aszPlayer[0], "Jellyfish"); if (fread(&c, 1, 1, fp) != 1) goto read_failed; for (i = 0; i < c; i++) { if (fread(&aszPlayer[1][i], 1, 1, fp) != 1) goto read_failed; } aszPlayer[1][c] = '\0'; if (!ReadInt16(fp, &fSwapDice)) goto read_failed; /* TRUE if lower die is to be drawn to the left */ if (!ReadInt16(fp, &val_crawford)) goto read_failed; switch (val_crawford) { case 2: /* Crawford */ *pfPostCrawford = FALSE; *pfCrawfordGame = TRUE; break; case 3: /* post-Crawford */ *pfPostCrawford = TRUE; *pfCrawfordGame = FALSE; break; default: *pfCrawfordGame = *pfPostCrawford = FALSE; break; } if (nGameOrMatch == 3) *pfCrawfordGame = *pfPostCrawford = FALSE; if (!ReadInt16(fp, &fJFplayedLast)) goto read_failed; if (fread(&c, 1, 1, fp) != 1) goto read_failed; for (i = 0; i < c; i++) { if (fread(&szLastMove[i], 1, 1, fp) != 1) goto read_failed; } szLastMove[c] = '\0'; /* Stores whether the last move was played by JF If so, the move is stored in a string to be displayed in the * 'Show last' dialog box */ if (!ReadInt16(fp, &nDie1)) goto read_failed; if (!ReadInt16(fp, &nDie2)) goto read_failed; nDie1 = abs(nDie1); /* if ( nDie1 < 0 ) { nDie1=65536; } *//* What?? */ /* In the end the position itself is stored, as well as the old position to be able to undo. The two position * arrays can be read like this: */ for (i = 0; i < 26; i++) { if (!ReadInt16(fp, &(anNew[i]))) goto read_failed; if (!ReadInt16(fp, &(anOld[i]))) goto read_failed; anNew[i] -= 20; anOld[i] -= 20; /* 20 has been added to each number when storing */ } /* Player 1's checkers are represented with negative numbers, player 2's with positive. The arrays are * representing the 26 different points on the board, starting with anNew[0] which is the upper bar and ending * with anNew[25] which is the bottom bar. The remaining numbers are in the opposite direction of the numbers * you see if you choose 'Numbers' from the 'View' menu, so anNew[1] is marked number 24 on the screen. */ if (nOnRoll == 1 || nOnRoll == 3) idx = 0; else idx = 1; *pfTurn = idx; if (nOnRoll == 0) *pfTurn = -1; anDice[0] = nDie1; anDice[1] = nDie2; for (i = 0; i < 25; i++) { if (anNew[i + 1] < 0) anBoard[idx][i] = -anNew[i + 1]; else anBoard[idx][i] = 0; if (anNew[24 - i] > 0) anBoard[!idx][i] = anNew[24 - i]; else anBoard[!idx][i] = 0; } SwapSides(anBoard); return 0; read_failed: outputerr(_("Error reading Jellyfish file")); fclose(fp); return -2; } static int ImportJF(FILE * fp, char *UNUSED(szFileName)) { moverecord *pmr; int nMatchTo = 0; int fJacobyRule = FALSE; int fTurn = 0; int fCrawfordGame = FALSE; int fPostCrawfordGame = FALSE; int anScore[2] = { 0, 0 }; int nCube = 0; int fCubeOwner = 0; int anDice[2] = { 0, 0 }; TanBoard anBoard; int fCubeUsage = FALSE; int fBeavers = 0; char aszPlayer[2][MAX_NAME_LEN]; int i; if (!get_input_discard()) return -1; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif if (ParseJF(fp, &nMatchTo, &fJacobyRule, &fTurn, aszPlayer, &fCrawfordGame, &fPostCrawfordGame, anScore, &nCube, &fCubeOwner, anBoard, anDice, &fCubeUsage, &fBeavers) < 0) { outputl(_("This file is not a valid Jellyfish .pos file!\n")); return -1; } FreeMatch(); ClearMatch(); InitBoard(ms.anBoard, ms.bgv); ClearMoveRecord(); ListInsert(&lMatch, plGame); /* game info */ pmr = NewMoveRecord(); pmr->mt = MOVE_GAMEINFO; pmr->g.i = 0; pmr->g.nMatch = nMatchTo; pmr->g.anScore[0] = anScore[0]; pmr->g.anScore[1] = anScore[1]; pmr->g.fCrawford = TRUE; pmr->g.fCrawfordGame = fCrawfordGame; pmr->g.fJacoby = fJacobyRule; pmr->g.fWinner = -1; pmr->g.nPoints = 0; pmr->g.fResigned = FALSE; pmr->g.nAutoDoubles = 0; pmr->g.bgv = VARIATION_STANDARD; /* assume standard backgammon */ pmr->g.fCubeUse = fCubeUsage; /* assume use of cube */ IniStatcontext(&pmr->g.sc); AddMoveRecord(pmr); ms.fTurn = ms.fMove = fTurn; for (i = 0; i < 2; ++i) strcpy(ap[i].szName, aszPlayer[i]); /* dice */ if (anDice[0]) { pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = fTurn; pmr->anDice[0] = anDice[0]; pmr->anDice[1] = anDice[1]; pmr->lt = LUCK_NONE; pmr->rLuck = (float) ERR_VAL; AddMoveRecord(pmr); } /* board */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETBOARD; if (fTurn) SwapSides(anBoard); PositionKey((ConstTanBoard) anBoard, &pmr->sb.key); AddMoveRecord(pmr); /* cube value */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEVAL; pmr->scv.nCube = nCube; AddMoveRecord(pmr); /* cube position */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEPOS; pmr->scp.fCubeOwner = fCubeOwner; AddMoveRecord(pmr); /* update menus etc */ UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif return 0; } static int fWarned, fPostCrawford; static int ExpandMatMove(const TanBoard anBoard, int anMove[8], int *pc, const unsigned int anDice[2]) { int i; int c = *pc; if (anDice[0] != anDice[1]) { if ((unsigned int) (anMove[0] - anMove[1]) == (anDice[0] + anDice[1])) { int an[8]; /* consolidated move, e.g. 61: 11/4. Let's hope that the notation cannot * be as bad as 61: 11/4* meaning 11/5* 5/4 */ for (i = 0; i < 2; ++i) { an[0] = anMove[0]; an[1] = an[0] - anDice[i]; an[2] = an[1]; an[3] = an[2] - anDice[!i]; an[4] = -1; an[5] = -1; /* no hits on the first part of the move */ if (anBoard[0][23 - an[1]] != 0) continue; if (IsValidMove(anBoard, an)) { memcpy(anMove, an, sizeof(an)); ++*pc; break; } } } else if (anMove[1] == -1 && (unsigned int) anMove[0] >= anDice[0] && (unsigned int) anMove[0] >= anDice[1]) { int an[8]; /* consolidated bearoff move with overage, like 65: 9/Off */ for (i = 0; i < 2; ++i) { an[0] = anMove[0]; an[1] = an[0] - anDice[i]; an[2] = an[1]; an[3] = -1; an[4] = -1; an[5] = -1; /* no hits on the first part of the move */ if (anBoard[0][23 - an[1]] != 0) continue; if (IsValidMove(anBoard, an)) { memcpy(anMove, an, sizeof(an)); ++*pc; break; } } } } else { for (i = 0; i < c; ++i) { /* if this is a consolidated move then "expand" it */ int j, k; j = (anDice[0] - 1 + anMove[2 * i] - anMove[2 * i + 1]) / anDice[0]; for (k = 1; k < j; ++k) { /* new move */ anMove[2 * *pc] = anMove[2 * *pc + 1] = anMove[2 * i]; anMove[2 * *pc + 1] -= anDice[0]; /* fix old move */ anMove[2 * i] -= anDice[0]; ++*pc; if (*pc > 4) /* something is wrong */ return -1; /* terminator */ if (*pc < 4) { anMove[2 * *pc] = -1; anMove[2 * *pc + 1] = -1; } } } } if (c != *pc) /* reorder moves */ CanonicalMoveOrder(anMove); return 0; } static void ParseMatMove(char *sz, int iPlayer, int *warned) { char *pch; moverecord *pmr; int c; static int fBeaver = FALSE; sz += strspn(sz, " \t"); if (!*sz) return; for (pch = strchr(sz, 0) - 1; pch >= sz && (*pch == ' ' || *pch == '\t'); pch--) *pch = 0; if (sz[0] >= '1' && sz[0] <= '6' && sz[1] >= '1' && sz[1] <= '6' && sz[2] == ':') { int dice1 = sz[0] - '0'; int dice2 = sz[1] - '0'; if (fBeaver) { /* looks like the previous beaver was taken */ moverecord *prev; pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; if (!(prev = LinkToDouble(pmr))) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } pmr->fPlayer = !prev->fPlayer; AddMoveRecord(pmr); } fBeaver = FALSE; if (!StrNCaseCmp(sz + 4, "???", 3)) { /* * Apparently XG writes this when the player resigned after rolling * Put it back to ' ' and fall through to "standard" .mat handling */ sz[4] = sz[5] = sz[6] = ' '; /* * Sometimes it puts a 4th one... */ if (!StrNCaseCmp(sz + 7, "?", 1)) sz[7] = ' '; } if (!StrNCaseCmp(sz + 4, "Cannot Move", 11)) { /* * Sometimes it writes this instead of nothing for dancing rolls */ sz[4] = 0; } /* XG can have additional spaces between roll and "Illegal play" */ while (sz[4] == ' ') sz++; if (!StrNCaseCmp(sz + 4, "illegal play", 12)) { /* Snowie type illegal play */ int nMatchTo, fJacobyRule, fUnused1, fUnused2, fTurn = 0, fCrawfordGame; int anScore[2], nCube, fCubeOwner, anDice[2]; TanBoard anBoard; char aszPlayer[2][MAX_NAME_LEN]; if ((pch = strchr(sz + 4, '(')) == 0) { outputl(_("No '(' following text 'Illegal play'")); return; } /* step over '(' */ ++pch; if (ParseSnowieTxt(pch, &nMatchTo, &fJacobyRule, &fUnused1, &fUnused2, &fTurn, aszPlayer, &fCrawfordGame, anScore, &nCube, &fCubeOwner, anBoard, anDice)) { outputl(_("Illegal Snowie position format for illegal play.")); return; } /* FIXME: we only handle illegal moves; not illegal cubes, * changes to the match score etc. */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = iPlayer; pmr->anDice[0] = dice1; pmr->anDice[1] = dice2; AddMoveRecord(pmr); pmr = NewMoveRecord(); pmr->mt = MOVE_SETBOARD; if (fTurn) SwapSides(anBoard); PositionKey((ConstTanBoard) anBoard, &pmr->sb.key); AddMoveRecord(pmr); return; } pmr = NewMoveRecord(); pmr->mt = MOVE_NORMAL; pmr->anDice[0] = dice1; pmr->anDice[1] = dice2; pmr->fPlayer = iPlayer; c = ParseMove(sz + 3, pmr->n.anMove); FixMatchState(&ms, pmr); if (c > 0) { /* moves found */ int i; for (i = 0; i < (c << 1); i++) pmr->n.anMove[i]--; if (c < 4) pmr->n.anMove[c << 1] = pmr->n.anMove[(c << 1) | 1] = -1; /* remove consolidation */ if (ExpandMatMove(msBoard(), pmr->n.anMove, &c, pmr->anDice)) outputf(_("WARNING: Expand move failed. This file " "contains garbage!")); /* check if move is valid */ if (!IsValidMove(msBoard(), pmr->n.anMove)) { if (*warned == -1) outputf(_("WARNING: Invalid move: \"%s\" encountered\n"), sz + 3); else *warned = TRUE; return; } AddMoveRecord(pmr); return; } else if (!c) { /* roll but no move found; if there are legal moves assume * a resignation */ movelist ml; int anDice[2]; anDice[0] = pmr->anDice[0]; anDice[1] = pmr->anDice[1]; switch (GenerateMoves(&ml, msBoard(), pmr->anDice[0], pmr->anDice[1], FALSE)) { case 0: /* no legal moves; record the movenormal */ pmr->n.anMove[0] = pmr->n.anMove[1] = -1; AddMoveRecord(pmr); return; case 1: /* forced move; record the movenormal */ memcpy(pmr->n.anMove, ml.amMoves[0].anMove, sizeof(pmr->n.anMove)); AddMoveRecord(pmr); return; default: /* legal moves; just record roll */ g_free(pmr); /* free movenormal from above */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = iPlayer; pmr->anDice[0] = anDice[0]; pmr->anDice[1] = anDice[1]; AddMoveRecord(pmr); return; } } } if (!StrNCaseCmp(sz, "double", 6) || !StrNCaseCmp(sz, "beaver", 6) || !StrNCaseCmp(sz, "raccoon", 7)) { pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->fPlayer = iPlayer; LinkToDouble(pmr); AddMoveRecord(pmr); fBeaver = !StrNCaseCmp(sz, "beaver", 6); } else if (!StrNCaseCmp(sz, "take", 4)) { pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->fPlayer = iPlayer; if (!LinkToDouble(pmr)) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); fBeaver = FALSE; } else if (!StrNCaseCmp(sz, "drop", 4)) { pmr = NewMoveRecord(); pmr->mt = MOVE_DROP; pmr->fPlayer = iPlayer; if (!LinkToDouble(pmr)) { outputl(_("Drop record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); } else if (!StrNCaseCmp(sz, "win", 3)) { if (ms.gs == GAME_PLAYING) { /* Neither a drop nor a bearoff to win, so we presume the loser * resigned. */ int n = atoi(sz + 4); pmr = NewMoveRecord(); pmr->mt = MOVE_RESIGN; pmr->fPlayer = !iPlayer; if (n <= ms.nCube) pmr->r.nResigned = 1; else if (n <= 2 * ms.nCube) pmr->r.nResigned = 2; else pmr->r.nResigned = 3; AddMoveRecord(pmr); } } else if (!StrNCaseCmp(sz, "resign", 6)) { return; /* Ignore this .gam line */ } else if (!fWarned) { outputf(_("Unrecognised move \"%s\" in .mat file.\n"), sz); fWarned = TRUE; } } #define START_STRING "Game " #define START_STRING_LEN 5 static char * GetMatLine(FILE * fp) { static char szLine[1024]; do { if (feof(fp) || !fgets(szLine, sizeof(szLine), fp)) return NULL; } while (strspn(szLine, " \n\r\t") == strlen(szLine)); return szLine; } static int ImportGame(FILE * fp, int iGame, int nLength, bgvariation bgVariation, int fCubeUsage, int *warned) { char sz0[MAX_NAME_LEN], sz1[MAX_NAME_LEN], *pch, *pchLeft, *pchRight = NULL, *szLine; int n0, n1; char *colon, *psz, *pszEnd; moverecord *pmr; /* Process player score line, avoid fscanf(%nn) as buffer may overrun */ szLine = GetMatLine(fp); if (!szLine) return 1; psz = szLine; while (isspace(*psz)) psz++; /* 1st player name */ colon = strchr(psz, ':'); if (!colon) return 0; pszEnd = colon - 1; while (isspace(*pszEnd)) pszEnd--; psz[MIN(pszEnd - psz + 1, MAX_NAME_LEN - 1)] = '\0'; strcpy(sz0, psz); /* 1st score */ psz = colon + 1; while (isspace(*psz)) psz++; n0 = atoi(psz); /* 2nd player name */ while (!isspace(*psz)) psz++; while (isspace(*psz)) psz++; colon = strchr(psz, ':'); if (!colon) return 0; pszEnd = colon - 1; while (isspace(*pszEnd)) pszEnd--; psz[MIN(pszEnd - psz + 1, MAX_NAME_LEN - 1)] = '\0'; strcpy(sz1, psz); /* 2nd score */ psz = colon + 1; while (isspace(*psz)) psz++; n1 = atoi(psz); if (nLength && (n0 >= nLength || n1 >= nLength)) /* match is already over -- ignore extra games */ return 1; InitBoard(ms.anBoard, bgVariation); ClearMoveRecord(); ListInsert(&lMatch, plGame); for (pch = sz0; *pch; pch++); for (pch--; pch >= sz0 && isspace(*pch);) *pch-- = 0; for (; pch >= sz0; pch--) if (isspace(*pch)) *pch = ' '; else if (*pch == ',' && strtol(pch + 1, NULL, 10) > 0) { /* GridGammon mat files have ratings */ *pch = '\0'; /* after player name */ SetMatchInfo(&mi.pchRating[0], pch + 1, NULL); } strcpy(ap[0].szName, sz0); for (pch = sz1; *pch; pch++); for (pch--; pch >= sz1 && isspace(*pch);) *pch-- = 0; for (; pch >= sz1; pch--) if (isspace(*pch)) *pch = ' '; else if (*pch == ',' && strtol(pch + 1, NULL, 10) > 0) { /* GridGammon mat files have ratings */ *pch = '\0'; /* after player name */ SetMatchInfo(&mi.pchRating[1], pch + 1, NULL); } strcpy(ap[1].szName, sz1); pmr = NewMoveRecord(); pmr->mt = MOVE_GAMEINFO; pmr->g.i = iGame; pmr->g.nMatch = nLength; pmr->g.anScore[0] = n0; pmr->g.anScore[1] = n1; pmr->g.fCrawford = (nLength > 0); /* assume JF always uses Crawford rule */ if ((pmr->g.fCrawfordGame = !fPostCrawford && (n0 == nLength - 1) ^ (n1 == nLength - 1))) fPostCrawford = TRUE; pmr->g.fJacoby = fJacoby && (nLength == 0); pmr->g.fWinner = -1; pmr->g.nPoints = 0; pmr->g.fResigned = FALSE; pmr->g.nAutoDoubles = 0; pmr->g.bgv = bgVariation; pmr->g.fCubeUse = fCubeUsage; IniStatcontext(&pmr->g.sc); AddMoveRecord(pmr); while ((szLine = GetMatLine(fp)) && !g_strrstr(szLine, START_STRING)) { if ((pch = strpbrk(szLine, "\n\r")) != 0) *pch = 0; if (!strncmp(szLine, "; Set Pos=", 10) && szLine[36] == '/') { /* XG Set Pos extension */ char *pos, *posid; TanBoard anBoard; char szcv[5], szco[2]; pos = g_strndup(szLine + 10, 26); PositionFromXG(anBoard, pos); g_free(pos); ms.gs = GAME_PLAYING; ms.fMove = 0; if (szLine[37] == '0') { sprintf(szcv, "1"); CommandSetCubeCentre(NULL); } else if (szLine[37] == '-') { sprintf(szcv, "%d", 1 << (szLine[38] - '0')); /* FIXME: * CommandSetCubeOwner() needs its argument to be writable * CommandSetCubeOwner("1") coredumps */ sprintf(szco, "0"); CommandSetCubeOwner(szco); } else { sprintf(szcv, "%d", 1 << (szLine[37] - '0')); sprintf(szco, "1"); CommandSetCubeOwner(szco); } CommandSetCubeValue(szcv); ms.fMove = 0; posid = g_strdup(PositionID((ConstTanBoard) anBoard)); CommandSetBoard(posid); g_free(posid); continue; } if ((pchLeft = strchr(szLine, ':')) && (pchRight = strchr(pchLeft + 1, ':')) && pchRight > szLine + 3) *((pchRight -= 2) - 1) = 0; else if (strlen(szLine) > 15 && (pchRight = strstr(szLine + 15, " "))) *pchRight++ = 0; if ((pchLeft = strchr(szLine, ')')) != 0) pchLeft++; else pchLeft = szLine; ParseMatMove(pchLeft, 0, warned); if (pchRight && *warned < TRUE) ParseMatMove(pchRight, 1, warned); if (*warned == TRUE) return 1; } AddGame(pmr); return (ms.nMatchTo && (ms.anScore[0] >= ms.nMatchTo || ms.anScore[1] >= ms.nMatchTo)); } static int ImportMatVariation(FILE * fp, char *szFilename, bgvariation bgVariation, int warned) { int n = 0, nLength = -1, game; char ch; gchar *pchComment = NULL; char *szLine; int fCubeUsage = TRUE; fWarned = fPostCrawford = FALSE; do { szLine = GetMatLine(fp); if (!szLine) { outputerrf(_("%s: not a valid .mat file"), szFilename); g_free(pchComment); return -1; } if (*szLine == (char) 0xef && *(szLine + 1) == (char) 0xbb && *(szLine + 2) == (char) 0xbf) szLine += 3; /* skip UTF junk at the start of XG mat files */ if (*szLine == '#' || *szLine == ';') { /* comment */ char *pchOld = pchComment; char *pch; if ((pch = strpbrk(szLine, "\n\r")) != 0) *pch = 0; pch = szLine + 1; while (isspace(*pch)) ++pch; if (*pch) { gchar *p; if (g_str_has_prefix(pch, "[Event ")) { if ((p = g_strrstr(pch, "\"]"))) *p = 0; SetMatchInfo(&mi.pchEvent, pch + 8, NULL); } else if (g_str_has_prefix(pch, "[Round ")) { if ((p = g_strrstr(pch, "\"]"))) *p = 0; SetMatchInfo(&mi.pchRound, pch + 8, NULL); } else if (g_str_has_prefix(pch, "[Site ")) { if ((p = g_strrstr(pch, "\"]"))) *p = 0; SetMatchInfo(&mi.pchPlace, pch + 7, NULL); } else if (g_str_has_prefix(pch, "[Transcriber ")) { if ((p = g_strrstr(pch, "\"]"))) *p = 0; SetMatchInfo(&mi.pchAnnotator, pch + 14, NULL); } else if (g_str_has_prefix(pch, "[EventDate ")) { sscanf(pch + 12, "%4u.%2u.%2u", &mi.nYear, &mi.nMonth, &mi.nDay); } else if (g_str_has_prefix(pch, "[EventTime ")) { /* discard ; we don't have this in matchinfo */ } else if (g_str_has_prefix(pch, "[Unrated ")) { /* discard */ } else if (g_str_has_prefix(pch, "[Player ")) { /* discard. We don't have player names * in matchinfo and rely on games * headers. Elos (even if not left at * default 1600) are useless if their * source is unknown. Maybe keep them * for known Site values ? */ } else if (g_str_has_prefix(pch, "[Match ID ")) { /* discard */ } else if (g_str_has_prefix(pch, "[CubeLimit \"1\"")) { fCubeUsage = FALSE; } else if (g_str_has_prefix(pch, "[CubeLimit ")) { /* discard ; maybe keep as comment if != 1024 ? */ } else if (g_str_has_prefix(pch, "[Variation \"Backgammon")) { bgVariation = VARIATION_STANDARD; } else if (g_str_has_prefix(pch, "[Variation \"NackGammon")) { bgVariation = VARIATION_NACKGAMMON; } else if (g_str_has_prefix(pch, "[Variation \"HyperGammon (1)")) { bgVariation = VARIATION_HYPERGAMMON_1; } else if (g_str_has_prefix(pch, "[Variation \"HyperGammon (2)")) { bgVariation = VARIATION_HYPERGAMMON_2; } else if (g_str_has_prefix(pch, "[Variation \"HyperGammon (3)")) { bgVariation = VARIATION_HYPERGAMMON_3; } else if (g_str_has_prefix(pch, "[Crawford ")) { /* discard for now */ } else if (g_str_has_prefix(pch, "[Jacoby ")) { /* discard for now */ } else if (g_str_has_prefix(pch, "[Beaver ")) { /* discard for now */ } else if (g_str_has_prefix(pch, "[Game ")) { /* Discard useless BGNJ comment. Its format is : * ; [Game 1, Move 1: Dice set to Manual Rolls] * or * ; [Game 2, Move 1: Dice set to Mersenne Twister, seed=1290023973, rollNum=586] */ gchar **token; token = g_strsplit(pch, " ", 8); if (!strcmp(token[2], "Move") && !strcmp(token[4], "Dice") && !strcmp(token[5], "set") && !strcmp(token[6], "to")); /* discard */ else { pchComment = g_strconcat(pchComment ? pchComment : "", pch, "\n", NULL); g_free(pchOld); } g_strfreev(token); } else { pchComment = g_strconcat(pchComment ? pchComment : "", pch, "\n", NULL); g_free(pchOld); } } } else /* Look for start of mat file */ n = sscanf(szLine, "%10d %*1[Pp]oint %*1[Mm]atch%c", &nLength, &ch); } while (n != 2); if (nLength < 0 || nLength > MAXSCORE) { outputerrf(_("Invalid match length %d found in mat file"), nLength); outputerrf(_("Match length must be between 0 (unlimited session) and %d\n"), MAXSCORE); return -1; } #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif if (mi.nYear == 0) ParseSetDate(szFilename); if (pchComment) mi.pchComment = g_strdup(pchComment); /* no need to free mi.pchComment as it's * already done in ClearMatch */ g_free(pchComment); szLine = GetMatLine(fp); while (szLine) { if (g_strrstr(szLine, START_STRING)) { game = atoi(g_strchug(szLine) + START_STRING_LEN); if (!game) outputf(_("WARNING! Unrecognized line in mat file: '%s'\n"), szLine); { if (ImportGame(fp, game - 1, nLength, bgVariation, fCubeUsage, &warned)) break; /* import failed */ } } else szLine = GetMatLine(fp); } UpdateSettings(); #if USE_GTK if (fX) { GTKSet(ap); GTKThaw(); } #endif return (warned > 0); } static int ImportMat(FILE * fp, char *szFilename) { bgvariation bgv; if (!get_input_discard()) return -1; FreeMatch(); ClearMatch(); for (bgv = VARIATION_STANDARD; bgv < NUM_VARIATIONS; bgv++) { gchar *str; if (ImportMatVariation(fp, szFilename, bgv, FALSE) == 0) return 0; str = g_strdup_printf(N_("Import as a %s match had errors. Try a different variation?"), aszVariations[bgv]); if (!GetInputYN(str)) { g_free(str); return 0; } g_free(str); /* reset and try a different format */ if (fseek(fp, 0L, SEEK_SET) != 0) return -1; FreeMatch(); ClearMatch(); } return ImportMatVariation(fp, szFilename, VARIATION_STANDARD, -1); } static int isAscending(const int anMove[8]) { if (anMove[0] < 0) return FALSE; if (anMove[0] != 24) { /* not moving from the bar */ if (anMove[1] > -1) /* not moving off */ return anMove[0] < anMove[1]; else return anMove[0] > 17; } else return anMove[1] < 6; } static void ParseOldmove(char *sz, int fInvert) { int iPlayer, i, c; moverecord *pmr; char *pch; switch (*sz) { case 'X': iPlayer = fInvert; break; case 'O': iPlayer = !fInvert; break; default: goto error; } if (sz[3] == '(' && strlen(sz) >= 8) { pmr = NewMoveRecord(); pmr->mt = MOVE_NORMAL; pmr->anDice[0] = sz[4] - '0'; pmr->anDice[1] = sz[6] - '0'; pmr->fPlayer = iPlayer; if (!StrNCaseCmp(sz + 9, "can't move", 10)) c = 0; else { for (pch = sz + 9; *pch; pch++) if (*pch == '-') *pch = '/'; c = ParseMove(sz + 9, pmr->n.anMove); } if (c >= 0) { for (i = 0; i < (c << 1); i++) pmr->n.anMove[i]--; /* if the moves are ascending invert it. * In theory this is only necessary when iPlayer == fInvert, * but some programs may write incompatible files. * Joseph's fibs2html is one such program. */ if (c && isAscending(pmr->n.anMove)) { /* ascending moves: invert */ for (i = 0; i < (c << 1); ++i) if (pmr->n.anMove[i] > -1 && pmr->n.anMove[i] < 24) /* invert numbers (other than bar=24 and off=-1) */ pmr->n.anMove[i] = 23 - pmr->n.anMove[i]; } if (c < 4) pmr->n.anMove[c << 1] = pmr->n.anMove[(c << 1) | 1] = -1; /* We have to order the moves before calling AddMoveRecord * Think about the opening roll of 6 5, and the legal move * 18/13 24/18 is entered. AddMoveRecord will then silently * fail in the sub-call to PlayMove(). This problem should * maybe be fixed in PlayMove (drawboard.c). Opinions? */ CanonicalMoveOrder(pmr->n.anMove); if (!IsValidMove(msBoard(), pmr->n.anMove)) { outputf(_("WARNING! Illegal or invalid move: '%s'\n"), sz); g_free(pmr); } else { /* Now we're ready */ AddMoveRecord(pmr); } } else g_free(pmr); return; } else if (!StrNCaseCmp(sz + 3, "doubles", 7)) { pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->fPlayer = iPlayer; if (!LinkToDouble(pmr)) { pmr->CubeDecPtr = &pmr->CubeDec; pmr->CubeDecPtr->esDouble.et = EVAL_NONE; pmr->nAnimals = 0; } pmr->stCube = SKILL_NONE; AddMoveRecord(pmr); return; } else if (!StrNCaseCmp(sz + 3, "accepts", 7)) { pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->fPlayer = iPlayer; if (!LinkToDouble(pmr)) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } pmr->stCube = SKILL_NONE; AddMoveRecord(pmr); return; } else if (!StrNCaseCmp(sz + 3, "rejects", 7)) { pmr = NewMoveRecord(); pmr->mt = MOVE_DROP; pmr->fPlayer = iPlayer; if (!LinkToDouble(pmr)) { outputl(_("Drop record found but doesn't follow a double")); g_free(pmr); return; } pmr->stCube = SKILL_NONE; AddMoveRecord(pmr); return; } else if (!StrNCaseCmp(sz + 3, "wants to resign", 15)) { /* ignore */ return; } else if (!StrNCaseCmp(sz + 3, "wins", 4)) { if (ms.gs == GAME_PLAYING) { /* Neither a drop nor a bearoff to win, so we presume the loser * resigned. */ pmr = NewMoveRecord(); pmr->mt = MOVE_RESIGN; pmr->r.esResign.et = EVAL_NONE; pmr->fPlayer = !iPlayer; pmr->r.nResigned = 1; /* FIXME determine from score */ AddMoveRecord(pmr); } return; } error: if (!fWarned) { outputf(_("Unrecognised move \"%s\" in oldmoves file.\n"), sz); fWarned = TRUE; } } static int NewPlayers(const char *szOld0, const char *szOld1, const char *szNew0, const char *szNew1) { if (!strcmp(szOld0, szNew0)) /* player 0 have not changed */ return strcmp(szOld1, szNew1); else if (!strcmp(szOld0, szNew1)) /* swap of player1 and player 0 */ return strcmp(szOld1, szNew0); else /* definitely a new player */ return 1; } static int ImportOldmovesGame(FILE * pf, int iGame, int nLength, int n0, int n1) { char sz[80], sz0[MAX_NAME_LEN], sz1[MAX_NAME_LEN], *pch; char buf[256], *pNext; moverecord *pmr; int fInvert; static int anExpectedScore[2]; /* FIXME's: * * what about multiple matches? * pmr->r.nResigned is not correct in ParseOldMove * * Possible solution: read through file one time and collect match scores. * If the score is decreasing or the players's names changes stop. * * Since we now know the score after every game it's easy to * have pmr->r.nResigned correct. * */ /* Process player score line, avoid fscanf(%nn) as buffer may overrun */ if (fgets(buf, sizeof(buf), pf) == NULL) { outputerr(_("Error reading oldmoves file")); return 0; } pch = strstr(buf, "is X"); if (!pch) return 0; pNext = pch + strlen("is X -"); do pch--; while (isspace(*pch)); pch[1] = '\0'; pch = buf; while (isspace(*pch)) pch++; strcpy(sz0, pch); pch = strstr(pNext, "is O"); if (!pch) return 0; do pch--; while (isspace(*pch)); pch[1] = '\0'; pch = pNext; while (isspace(*pch)) pch++; strcpy(sz1, pch); /* consistency checks */ if (iGame) { if (NewPlayers(ap[0].szName, ap[1].szName, sz0, sz1)) return 1; if (ms.nMatchTo != nLength) /* match length have changed */ return 1; } /* initialise */ InitBoard(ms.anBoard, ms.bgv); ClearMoveRecord(); ListInsert(&lMatch, plGame); if (!iGame) { strcpy(ap[0].szName, sz0); strcpy(ap[1].szName, sz1); fInvert = FALSE; } else fInvert = strcmp(ap[0].szName, sz0) != 0; /* add game info */ pmr = NewMoveRecord(); pmr->mt = MOVE_GAMEINFO; pmr->g.i = iGame; pmr->g.nMatch = nLength; pmr->g.anScore[fInvert] = n0; pmr->g.anScore[!fInvert] = n1; pmr->g.fCubeUse = TRUE; /* always use cube */ /* check if score is swapped (due to fibs oldmoves bug) */ if (iGame && (pmr->g.anScore[0] == anExpectedScore[1] || pmr->g.anScore[1] == anExpectedScore[0])) { int n = pmr->g.anScore[0]; pmr->g.anScore[0] = pmr->g.anScore[1]; pmr->g.anScore[1] = n; } pmr->g.fCrawford = nLength != 0; /* assume matches use Crawford rule */ if ((pmr->g.fCrawfordGame = !fPostCrawford && (n0 == nLength - 1) ^ (n1 == nLength - 1))) fPostCrawford = TRUE; pmr->g.fJacoby = !nLength; /* assume matches never use Jacoby rule */ pmr->g.fWinner = -1; pmr->g.nPoints = 0; pmr->g.fResigned = FALSE; pmr->g.nAutoDoubles = 0; pmr->g.bgv = VARIATION_STANDARD; /* only standard bg on FIBS */ IniStatcontext(&pmr->g.sc); AddMoveRecord(pmr); do if (!fgets(sz, 80, pf)) { sz[0] = 0; break; } while (strspn(sz, " \n\r\t") == strlen(sz)); do { if ((pch = strpbrk(sz, "\n\r")) != 0) *pch = 0; ParseOldmove(sz, fInvert); if (ms.gs != GAME_PLAYING) break; if (!fgets(sz, 80, pf)) break; } while (strspn(sz, " \n\r\t") != strlen(sz)); anExpectedScore[0] = pmr->g.anScore[0]; anExpectedScore[1] = pmr->g.anScore[1]; anExpectedScore[pmr->g.fWinner] += pmr->g.nPoints; AddGame(pmr); return 0; } #define MAXLINE 1024 static char * FindScoreIs(FILE * pf, char *buffer) { while (fgets(buffer, MAXLINE, pf)) { char *p; if ((p = strstr(buffer, "Score is ")) != 0) return p; } return 0; } static int ImportOldmoves(FILE * pf, char *szFilename) { char buffer[1024]; char *p; int n, n0, n1, nLength, i; if (!get_input_discard()) return -1; fWarned = fPostCrawford = FALSE; p = FindScoreIs(pf, buffer); if (p == 0) { outputerrf(_("%s: not a valid oldmoves file"), szFilename); return -1; } if ((n = sscanf(p, "Score is %10d-%10d in a %10d", &n0, &n1, &nLength)) < 2) { outputerrf(_("%s: not a valid oldmoves file"), szFilename); return -1; } if (n == 2) { /* assume a money game */ nLength = 0; } #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); i = 0; while (ImportOldmovesGame(pf, i++, nLength, n0, n1) == 0) { p = FindScoreIs(pf, buffer); if (p == 0) break; n = sscanf(p, "Score is %10d-%10d in a %10d", &n0, &n1, &nLength); if (n < 2) break; } UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif return 0; } static void ImportSGGGame(FILE * pf, int i, int nLength, int n0, int n1, int fCrawford, int fCrawfordRule, int UNUSED(fAutoDoubles), int fJacobyRule, bgvariation bgv, int fCubeUsage) { char sz[1024]; char *pch = NULL; int c, fPlayer = 0, anRoll[2]; moverecord *pmgi, *pmr; char *szComment = NULL; int fBeaver = FALSE; int fPlayerOld, nMoveOld; int nMove = -1; int fResigned = -1; InitBoard(ms.anBoard, ms.bgv); ClearMoveRecord(); ListInsert(&lMatch, plGame); pmgi = NewMoveRecord(); pmgi->mt = MOVE_GAMEINFO; pmgi->g.i = i - 1; pmgi->g.nMatch = nLength; pmgi->g.anScore[0] = n0; pmgi->g.anScore[1] = n1; pmgi->g.fCrawford = fCrawfordRule && nLength; pmgi->g.fCrawfordGame = fCrawford; pmgi->g.fJacoby = fJacobyRule && !nLength; pmgi->g.fWinner = -1; pmgi->g.nPoints = 0; pmgi->g.fResigned = FALSE; pmgi->g.nAutoDoubles = 0; /* we check for automatic doubles later */ pmgi->g.bgv = bgv; pmgi->g.fCubeUse = fCubeUsage; IniStatcontext(&pmgi->g.sc); AddMoveRecord(pmgi); anRoll[0] = 0; anRoll[1] = 0; while (fgets(sz, 1024, pf)) { char *pchtmp; nMoveOld = nMove; fPlayerOld = fPlayer; /* check for game over */ for (pch = sz; *pch; pch++) if ((pchtmp = strstr(pch, " wins "))) { pch = pchtmp; goto finished; } else if (*pch == ':' || *pch == ' ') break; if (isdigit(*sz)) { nMove = atoi(sz); for (pch = sz; isdigit(*pch); pch++); if (*pch++ == '\t') { /* we have a move! */ if (anRoll[0]) { /* check for * 1 43: * 1 43: <---- check for this line * 1 43: 13/9, 13/10 */ if (*(pch + 4) == '\n' || !*(pch + 4)) continue; /* when beavered there is no explicit "take" */ if (fBeaver) { pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Beaver record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; fBeaver = FALSE; } if (!StrNCaseCmp(pch, "resign", 6) || (strlen(pch) > 4 && !StrNCaseCmp(pch + 4, "resign", 6))) { /* resignation after rolling dice */ fResigned = fPlayer; continue; } pmr = NewMoveRecord(); pmr->mt = MOVE_NORMAL; pmr->sz = szComment; pmr->anDice[0] = anRoll[0]; pmr->anDice[1] = anRoll[1]; pmr->fPlayer = fPlayer; if ((c = ParseMove(pch + 4, pmr->n.anMove)) >= 0) { for (i = 0; i < (c << 1); i++) pmr->n.anMove[i]--; if (c < 4) pmr->n.anMove[c << 1] = pmr->n.anMove[(c << 1) | 1] = -1; AddMoveRecord(pmr); } else g_free(pmr); anRoll[0] = 0; szComment = NULL; } else { if ((fPlayer = *pch == '\t') != 0) pch++; if (*pch == ' ' && pch[1] == '-') { /* * Closeout. The SGG file doesn't contain any dice * number but GNUbg needs a roll. Set it to 6-6 then * fall through to normal processing. */ pch[0] = pch[1] = '6'; } if (*pch >= '1' && *pch <= '6' && pch[1] >= '1' && pch[1] <= '6') { /* dice roll */ anRoll[0] = *pch - '0'; anRoll[1] = pch[1] - '0'; if (strstr(pch, "O-O")) { if (nMove == nMoveOld && fPlayerOld == fPlayer) { /* handle duplicate dances: * 24 62: O-O * 24 62: O-O */ anRoll[0] = 0; continue; } /* when beavered there is no explicit "take" */ if (fBeaver) { pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; } pmr = NewMoveRecord(); pmr->mt = MOVE_NORMAL; pmr->sz = szComment; pmr->anDice[0] = anRoll[0]; pmr->anDice[1] = anRoll[1]; pmr->fPlayer = fPlayer; AddMoveRecord(pmr); anRoll[0] = 0; szComment = NULL; fBeaver = FALSE; } else { for (pch += 3; *pch; pch++) if (!isspace(*pch)) break; if (*pch && StrNCaseCmp(pch, "resign", 6)) { /* Apparently SGG files can contain spurious * duplicate moves -- the only thing we can * do is ignore them. */ /* this catches: * 1 43: * 1 43: 13/9, 13/10 * 1 43: 13/9, 13/10 */ anRoll[0] = 0; continue; } /* when beavered there is no explicit "take" */ if (fBeaver) { pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; } pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; /* we do not want comments on MOVE_SETDICE */ pmr->fPlayer = fPlayer; pmr->anDice[0] = anRoll[0]; pmr->anDice[1] = anRoll[1]; AddMoveRecord(pmr); fBeaver = FALSE; if (!StrNCaseCmp(pch, "resign", 6)) { /* resignation after rolling dice */ fResigned = fPlayer; continue; } } } else { if (!StrNCaseCmp(pch, "double", 6)) { if (ms.fDoubled && ms.fTurn != fPlayer) /* Presumably a duplicated move in the * SGG file -- ignore */ continue; pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->sz = szComment; pmr->fPlayer = fPlayer; LinkToDouble(pmr); AddMoveRecord(pmr); fBeaver = FALSE; szComment = NULL; } else if (!StrNCaseCmp(pch, "beaver", 6)) { /* Beaver to 4 */ if (ms.fDoubled && ms.fTurn != fPlayer) /* Presumably a duplicated move in the * SGG file -- ignore */ continue; pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Beaver record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; fBeaver = TRUE; } else if (!StrNCaseCmp(pch, "raccoon", 7)) { /* Raccoon to 8 */ if (ms.fDoubled && ms.fTurn != fPlayer) /* Presumably a duplicated move in the * SGG file -- ignore */ continue; pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Raccoon record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; fBeaver = TRUE; } else if (!StrNCaseCmp(pch, "accept", 6)) { if (!ms.fDoubled) continue; pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; fBeaver = FALSE; } else if (!StrNCaseCmp(pch, "pass", 4)) { pmr = NewMoveRecord(); pmr->mt = MOVE_DROP; pmr->sz = szComment; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Drop record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); szComment = NULL; fBeaver = FALSE; } else if (!StrNCaseCmp(pch, "resign", 4)) { /* resignation */ fResigned = fPlayer; } } } } /* *pch++ == '\t' */ else { /* check for automatic doubles: * * 11: Automatic double * */ if (strstr(pch, "Automatic double")) { ++pmgi->g.nAutoDoubles; /* we've already called AddMoveRecord for pmgi, * so we manually update the cube value */ ms.nCube *= 2; } } } /* isdigit */ else { /* the text is most likely a comment */ if (*sz != '\n' && *sz != '\r') { /* non-empty line */ if (!szComment) szComment = g_strdup(sz); else { szComment = (char *) g_realloc(szComment, (gulong) strlen(sz) + strlen(szComment) + 1); strcat(szComment, sz); } } } } finished: if (fResigned > -1) { /* game was terminated by an resignation */ /* parse string, e.g., MosheTissona_MC wins 2 points. */ long nr; pch += 6; /* step over ' wins ' */ nr = strtol(pch, NULL, 10); if (nr == 0) outputerrf(_("Unparseable line: %s"), sz); /* This doesn't really bother us as we rely * on the initial score of the next game. * The MOVE_RESIGN record below may be inaccurate, though */ pmr = NewMoveRecord(); pmr->mt = MOVE_RESIGN; pmr->sz = szComment; pmr->fPlayer = fResigned; pmr->r.nResigned = (int) nr / ms.nCube; if (pmr->r.nResigned > 3) pmr->r.nResigned = 3; if (pmr->r.nResigned < 1) pmr->r.nResigned = 1; szComment = NULL; AddMoveRecord(pmr); } AddGame(pmgi); /* garbage collect */ if (szComment) g_free(szComment); } static int ParseSGGGame(char *pch, int *pi, int *pn0, int *pn1, int *pfCrawford, int *pnLength) { *pfCrawford = FALSE; if (strncmp(pch, "Game ", 5)) return -1; pch += 5; *pi = (int) strtol(pch, &pch, 10); if (*pch != '.') return -1; pch++; *pn0 = (int) strtol(pch, &pch, 10); if (*pch == '*') { pch++; *pfCrawford = TRUE; } if (*pch != '-') return -1; pch++; *pn1 = (int) strtol(pch, &pch, 10); if (*pch == '*') { pch++; *pfCrawford = TRUE; } if (*pch != '/') { /* assume money session */ *pnLength = 0; return 0; } pch++; *pnLength = (int) strtol(pch, &pch, 10); return 0; } static char * GetValue(const char *sz, char *szValue) { const char *pc; char *pc2; /* skip "Keyword:" */ pc = strchr(sz, ':'); if (!pc) return NULL; ++pc; /* string leading blanks */ while (isspace(*pc)) ++pc; if (!*pc) return NULL; strcpy(szValue, pc); /* strip trailing blanks */ pc2 = strchr(szValue, 0) - 1; while (pc2 >= szValue && isspace(*pc2)) *pc2-- = 0; return szValue; } static void ParseSGGDate(const char *sz, unsigned int *pnDay, unsigned int *pnMonth, unsigned int *pnYear) { static const char *aszMonths[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; int i; char szMonth[80]; unsigned int nDay, nYear; *pnDay = 1; *pnMonth = 1; *pnYear = 1900; if (sscanf(sz, "%*s %79s %2u, %4u", szMonth, &nDay, &nYear) != 3) return; *pnDay = nDay; *pnYear = nYear; for (i = 0; i < 12; ++i) { if (!strcmp(szMonth, aszMonths[i])) { *pnMonth = i + 1; break; } } } static void ParseSGGOptions(const char *sz, matchinfo * pmi, int *pfCrawfordRule, int *pfAutoDoubles, int *pfJacobyRule, bgvariation * pbgv, int *pfCubeUse) { char szTemp[80]; int i; static const char *aszOptions[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "GamesGrid", "ELO:", "Jacoby:", "Automatic Doubles:", "Crawford:", "Beavers:", "Raccoons:", "Doubling Cube:", "Rated:", "Match Length:", "Variant:", NULL }; double arRating[2]; int anExp[2]; const char *pc; for (i = 0, pc = aszOptions[i]; pc; ++i, pc = aszOptions[i]) if (!strncmp(sz, pc, strlen(pc))) break; switch (i) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: /* date */ ParseSGGDate(sz, &pmi->nDay, &pmi->nMonth, &pmi->nYear); break; case 7: /* place */ /* GamesGrid closed at the end of May 2008, GridGammon opened some time later */ if (pmi->nYear <= 2007 || (pmi->nYear == 2008 && pmi->nMonth <= 5)) pmi->pchPlace = g_strdup("GamesGrid"); else pmi->pchPlace = g_strdup("GridGammon"); break; case 8: /* ratings */ /* Players are swapped later (at the end of ImportSGG()) and ratings * must be swapped here as well to be correctly attributed at the end * Order in SGG file is player1 player0 */ if ((sscanf(sz, "%*s %20lf %10d %20lf %10d", &arRating[0], &anExp[0], &arRating[1], &anExp[1])) != 4) break; for (i = 0; i < 2; ++i) { g_free(pmi->pchRating[i]); sprintf(szTemp, "%.6g (Exp %d)", arRating[i], anExp[i]); pmi->pchRating[i] = g_strdup(szTemp); } break; case 9: /* Jacoby rule */ if (!GetValue(sz, szTemp)) break; *pfJacobyRule = !strcmp(szTemp, "Yes"); break; case 10: /* automatic doubles */ if (!GetValue(sz, szTemp)) break; *pfAutoDoubles = !strcmp(szTemp, "Yes"); break; case 11: /* Crawford rule */ if (!GetValue(sz, szTemp)) break; *pfCrawfordRule = !strcmp(szTemp, "Yes"); break; case 12: case 13: /* beavers & raccons */ /* ignored as they are not used internally in GNUbg */ break; case 14: /* doubling cube */ if (!GetValue(sz, szTemp)) break; *pfCubeUse = !strcmp(szTemp, "Yes"); break; case 15: /* rated */ break; case 16: /* match length */ break; case 17: /* variant */ if (!GetValue(sz, szTemp)) break; if (!StrCaseCmp(szTemp, "HyperGammon")) *pbgv = VARIATION_HYPERGAMMON_3; else if (!StrCaseCmp(szTemp, "Nackgammon")) *pbgv = VARIATION_NACKGAMMON; else if (!StrCaseCmp(szTemp, "Backgammon")) *pbgv = VARIATION_STANDARD; else { outputl(_("Unknown variant in SGG file")); outputl(_("Please send the SGG file to bug-gnubg@gnu.org")); outputx(); g_assert_not_reached(); } break; default: g_assert_not_reached(); } } static int ImportSGG(FILE * pf, char *szFilename) { char sz[80], sz0[MAX_NAME_LEN], sz1[MAX_NAME_LEN]; int n0 = 0, n1 = 0, nLength = 0, i = 0, fCrawford = FALSE; int fCrawfordRule = TRUE; int fJacobyRule = TRUE; int fAutoDoubles = 0; int fCubeUsage = TRUE; char buf[256], *pNext, *psz; bgvariation bgv = VARIATION_STANDARD; if (!get_input_discard()) return -1; fWarned = FALSE; *sz0 = '\0'; while (fgets(buf, sizeof(buf), pf)) { psz = strstr(buf, "vs."); if (psz) { /* Found player line, avoid fscanf(%nn) as buffer may overrun */ pNext = psz + strlen("vs."); do psz--; while (isspace(*psz)); psz[1] = '\0'; psz = buf; while (isspace(*psz)) psz++; strcpy(sz0, psz); psz = pNext + strlen(pNext); do psz--; while (isspace(*psz)); psz[1] = '\0'; psz = pNext; while (isspace(*psz)) psz++; strcpy(sz1, psz); break; } } if (!*sz0) { /* No player line found */ outputerrf(_("%s: not a valid SGG file"), szFilename); return -1; } #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); strcpy(ap[0].szName, sz0); strcpy(ap[1].szName, sz1); while (fgets(sz, 80, pf)) { if (!ParseSGGGame(sz, &i, &n0, &n1, &fCrawford, &nLength)) break; ParseSGGOptions(sz, &mi, &fCrawfordRule, &fAutoDoubles, &fJacobyRule, &bgv, &fCubeUsage); } while (!feof(pf)) { ImportSGGGame(pf, i, nLength, n0, n1, fCrawford, fCrawfordRule, fAutoDoubles, fJacobyRule, bgv, fCubeUsage); while (fgets(sz, 80, pf)) if (!ParseSGGGame(sz, &i, &n0, &n1, &fCrawford, &nLength)) break; } UpdateSettings(); /* swap players */ CommandSwapPlayers(NULL); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif return 0; } /* * Parse TMG files * */ static int ParseTMGOptions(const char *sz, matchinfo * pmi, int *pfCrawfordRule, int *UNUSED(pfAutoDoubles), int *pfJacobyRule, int *pnLength, bgvariation * pbgv, int *pfCubeUse) { char szTemp[80]; int i, j; static const char *aszOptions[] = { "MatchID:", "Player1:", "Player2:", "Stake:", "RakePct:", "MaxRakeAbs:", "Startdate:", "Jacoby:", "AutoDistrib:", "Beavers:", "Raccoons:", "Crawford:", "Cube:", "MaxCube:", "Length:", "MaxGames:", "Variant:", "PlayMoney:", NULL }; const char *pc; char *pc2; char szName[80]; for (i = 0, pc = aszOptions[i]; pc; ++i, pc = aszOptions[i]) if (!strncmp(sz, pc, strlen(pc))) break; switch (i) { case 0: /* MatchID */ pc = strchr(sz, ':') + 2; sprintf(szTemp, _("TMG MatchID: %s"), pc); if ((pc2 = strchr(szTemp, '\n')) != 0) *pc2 = 0; pmi->pchComment = g_strdup(szTemp); return 0; case 1: /* Player1: */ case 2: /* Player2: */ if (sscanf(sz, "Player%1d: %*d %79s %*f", &j, szName) == 2) if ((j == 1 || j == 2) && *szName) strcpy(ap[j - 1].szName, szName); return 0; case 3: /* Stake: */ /* ignore, however, we could read into pmi->szComment, but I guess * people do not want to see their stakes in, say, html export */ break; case 4: /* RakePct: */ case 5: /* MaxRakeAbs: */ case 8: /* AutoDistrib */ case 13: /* MaxCube */ case 15: /* MaxGames */ /* ignore */ return 0; case 6: /* Startdate */ if ((sscanf(sz, "Startdate: %4u-%2u-%2u", &pmi->nYear, &pmi->nMonth, &pmi->nDay)) != 3) pmi->nYear = pmi->nMonth = pmi->nDay = 0; return 0; case 7: /* Jacoby */ if ((pc = strchr(sz, ':')) == 0) return 0; *pfJacobyRule = atoi(pc + 2); return 0; case 9: /* Beavers */ break; case 10: /* Raccoons */ break; case 11: /* Crawford */ if ((pc = strchr(sz, ':')) == 0) return 0; *pfCrawfordRule = atoi(pc + 2); return 0; case 12: /* Cube */ if ((pc = strchr(sz, ':')) == 0) return 0; *pfCubeUse = atoi(pc + 2); return 0; case 14: /* Length */ if ((pc = strchr(sz, ':')) == 0) return 0; *pnLength = atoi(pc + 2); return 0; case 16: /* Variant */ if ((pc = strchr(sz, ':')) == 0) return 0; switch (atoi(pc + 2)) { case 1: *pbgv = VARIATION_STANDARD; break; case 2: *pbgv = VARIATION_NACKGAMMON; break; default: outputl(_("Unknown variation in TMG file")); outputl(_("Please send the TMG file to bug-gnubg@gnu.org")); outputx(); g_assert_not_reached(); return -1; } return 0; case 17: /* PlayMoney */ break; } /* code not reachable */ return -1; } static int ParseTMGGame(const char *sz, int *piGame, int *pn0, int *pn1, int *pfCrawford, int *post_crawford, const int nLength) { int i = sscanf(sz, "Game %10d: %10d-%10d", piGame, pn0, pn1) == 3; if (!i) return FALSE; if (nLength) { if (!*post_crawford) *post_crawford = *pfCrawford = (*pn0 == (nLength - 1)) || (*pn1 == (nLength - 1)); else *pfCrawford = FALSE; } return TRUE; } static void ImportTMGGame(FILE * pf, int i, int nLength, int n0, int n1, int fCrawford, int fCrawfordRule, int UNUSED(fAutoDoubles), int fJacobyRule, bgvariation bgv, int fCubeUsage) { char sz[1024]; char *pch; int c, anRoll[2]; moverecord *pmgi, *pmr; int j; typedef enum { TMG_ROLL = 1, TMG_AUTO_DOUBLE = 2, TMG_MOVE = 4, TMG_DOUBLE = 5, TMG_TAKE = 7, TMG_BEAVER = 8, TMG_PASS = 10, TMG_WIN_SINGLE = 14, TMG_WIN_GAMMON = 15, TMG_WIN_BACKGAMMON = 16, TMG_OUT_OF_TIME = 17, TMG_TABLE_STAKE = 19, TMG_OUT_OF_TIME_1 = 22 } tmgrecordtype; tmgrecordtype trt; InitBoard(ms.anBoard, ms.bgv); ClearMoveRecord(); ListInsert(&lMatch, plGame); pmgi = NewMoveRecord(); pmgi->mt = MOVE_GAMEINFO; pmgi->g.i = i - 1; pmgi->g.nMatch = nLength; pmgi->g.anScore[0] = n0; pmgi->g.anScore[1] = n1; pmgi->g.fCrawford = fCrawfordRule && nLength; pmgi->g.fCrawfordGame = fCrawford; pmgi->g.fJacoby = fJacobyRule && !nLength; pmgi->g.fWinner = -1; pmgi->g.nPoints = 0; pmgi->g.fResigned = FALSE; pmgi->g.nAutoDoubles = 0; /* we check for automatic doubles later */ pmgi->g.bgv = bgv; pmgi->g.fCubeUse = fCubeUsage; IniStatcontext(&pmgi->g.sc); AddMoveRecord(pmgi); anRoll[0] = 0; anRoll[1] = 0; while (fgets(sz, 1024, pf)) { /* skip white space */ for (pch = sz; isspace(*pch); ++pch); /* * is it: * -1 4 13/11 24/23 * or * Beavers: 0 */ if (isdigit(*pch) || *pch == '-') { int fPlayer = (*pch == '-'); /* player: +n for player 0, * -n for player 1 */ /* step over move number */ for (; !isspace(*pch); ++pch); for (; isspace(*pch); ++pch); /* determine record type */ trt = (tmgrecordtype) atoi(pch); /* step over record type */ for (; !isspace(*pch); ++pch); for (; isspace(*pch); ++pch); switch (trt) { case TMG_ROLL: /* roll: 1 1 21: */ if (*pch == '?') { /* no roll recorded, because the game is lost on time out */ continue; } anRoll[0] = *pch - '0'; anRoll[1] = *(pch + 1) - '0'; pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = fPlayer; pmr->anDice[0] = anRoll[0]; pmr->anDice[1] = anRoll[1]; AddMoveRecord(pmr); break; case TMG_AUTO_DOUBLE: /* automatic double: 0 2 Automatic to 2 */ ++pmgi->g.nAutoDoubles; /* we've already called AddMoveRecord for pmgi, * so we manually update the cube value */ ms.nCube *= 2; break; case TMG_MOVE: /* move: 1 4 24/18 13/10 */ pmr = NewMoveRecord(); pmr->mt = MOVE_NORMAL; pmr->anDice[0] = anRoll[0]; pmr->anDice[1] = anRoll[1]; pmr->fPlayer = fPlayer; if (!strncmp(pch, "0/0", 3)) { /* See if fan is legal (i.e. no moves available) - otherwise skip */ movelist ml; if (GenerateMoves(&ml, msBoard(), pmr->anDice[0], pmr->anDice[1], FALSE) == 0) { /* fans */ AddMoveRecord(pmr); } } else if ((c = ParseMove(pch, pmr->n.anMove)) >= 0) { for (i = 0; i < (c << 1); i++) pmr->n.anMove[i]--; if (c < 4) pmr->n.anMove[c << 1] = pmr->n.anMove[(c << 1) | 1] = -1; AddMoveRecord(pmr); } else g_free(pmr); break; case TMG_DOUBLE: /* double: -7 5 Double to 2 */ case TMG_BEAVER: /* beaver: 25 8 Beaver to 8 */ pmr = NewMoveRecord(); pmr->mt = MOVE_DOUBLE; pmr->fPlayer = fPlayer; LinkToDouble(pmr); AddMoveRecord(pmr); break; case TMG_TAKE: /* take: -6 7 Take */ pmr = NewMoveRecord(); pmr->mt = MOVE_TAKE; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Take record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); break; case TMG_PASS: /* pass: 5 10 Pass */ pmr = NewMoveRecord(); pmr->mt = MOVE_DROP; pmr->fPlayer = fPlayer; if (!LinkToDouble(pmr)) { outputl(_("Drop record found but doesn't follow a double")); g_free(pmr); return; } AddMoveRecord(pmr); break; case TMG_WIN_SINGLE: /* win single: 4 14 1 thj wins 1 point */ case TMG_WIN_GAMMON: /* resign: -30 15 2 Saltyzoo7 wins 2 points */ case TMG_WIN_BACKGAMMON: /* win backgammon: ??? */ if (ms.gs == GAME_PLAYING) { /* game is in progress: the opponent resigned */ pmr = NewMoveRecord(); pmr->mt = MOVE_RESIGN; pmr->fPlayer = !fPlayer; pmr->r.nResigned = (atoi(pch) + ms.nCube - 1) / ms.nCube; /* rounding up */ AddMoveRecord(pmr); } goto finished; case TMG_TABLE_STAKE: /* Table stake: 0 19 57.68 0.00 43.57 0.00 Settlement */ /* ignore: FIXME: this should be stored in order to analyse * tables stakes correctly */ break; case TMG_OUT_OF_TIME: case TMG_OUT_OF_TIME_1: break; default: outputl(_("Please send the TMG file to bug-gnubg@gnu.org")); outputx(); g_assert_not_reached(); } } else { /* it's most likely an option: the players may enable or * disable beavers and auto doubles during play */ ParseTMGOptions(sz, &mi, &pmgi->g.fCrawford, &j, &pmgi->g.fJacoby, &j, &bgv, &fCubeUsage); } } finished: AddGame(pmgi); } static int ImportTMG(FILE * pf, const char *UNUSED(szFilename)) { int fCrawfordRule = TRUE; int fJacobyRule = TRUE; int fAutoDoubles = 0; int nLength = 0; int fCrawford = FALSE; int fCubeUsage = TRUE; int n0 = 0, n1 = 0; int i = 0, j; int post_crawford = FALSE; char sz[80]; bgvariation bgv = VARIATION_STANDARD; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); /* clear matchinfo */ for (j = 0; j < 2; ++j) SetMatchInfo(&mi.pchRating[j], NULL, NULL); SetMatchInfo(&mi.pchPlace, "TrueMoneyGames", NULL); SetMatchInfo(&mi.pchEvent, NULL, NULL); SetMatchInfo(&mi.pchRound, NULL, NULL); SetMatchInfo(&mi.pchAnnotator, NULL, NULL); SetMatchInfo(&mi.pchComment, NULL, NULL); mi.nYear = mi.nMonth = mi.nDay = 0; /* search for options (until first game is found) */ while (fgets(sz, 80, pf)) { if (ParseTMGGame(sz, &i, &n0, &n1, &fCrawford, &post_crawford, nLength)) break; ParseTMGOptions(sz, &mi, &fCrawfordRule, &fAutoDoubles, &fJacobyRule, &nLength, &bgv, &fCubeUsage); } /* set remainder of match info */ while (!feof(pf)) { ImportTMGGame(pf, i, nLength, n0, n1, fCrawford, fCrawfordRule, fAutoDoubles, fJacobyRule, bgv, fCubeUsage); while (fgets(sz, 80, pf)) if (ParseTMGGame(sz, &i, &n0, &n1, &fCrawford, &post_crawford, nLength)) break; } UpdateSettings(); /* swap players */ if (ms.gs != GAME_NONE) CommandSwapPlayers(NULL); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif return 0; } static int ParseSnowieTxt(char *sz, int *pnMatchTo, int *pfJacoby, int *UNUSED(p1), int *UNUSED(p2), int *pfTurn, char aszPlayer[2][MAX_NAME_LEN], int *pfCrawfordGame, int anScore[2], int *pnCube, int *pfCubeOwner, TanBoard anBoard, int anDice[2]) { int c; char *pc; int i, j; memset(anBoard, 0, 2 * 25 * sizeof(int)); c = 0; i = 0; pc = NextTokenGeneral(&sz, ";"); while (pc) { switch (c) { case 0: /* match length */ *pnMatchTo = atoi(pc); break; case 1: /* Jacoby rule */ *pfJacoby = atoi(pc); break; case 2: case 3: /* unknown??? */ break; case 4: /* player on roll */ *pfTurn = atoi(pc); break; case 5: case 6: /* player names */ j = *pfTurn; if (c == 6) j = !j; memset(aszPlayer[j], 0, MAX_NAME_LEN); if (*pc) g_strlcpy(aszPlayer[j], pc, MAX_NAME_LEN); else sprintf(aszPlayer[j], "Player %d", j); break; case 7: /* Crawford Game */ *pfCrawfordGame = atoi(pc); break; case 8: /* Score */ anScore[*pfTurn] = atoi(pc); break; case 9: /* Score */ anScore[!*pfTurn] = atoi(pc); break; case 10: /* cube value */ *pnCube = atoi(pc); break; case 11: /* cube owner */ j = atoi(pc); if (j == 1) *pfCubeOwner = *pfTurn; else if (j == -1) *pfCubeOwner = !*pfTurn; else *pfCubeOwner = -1; break; case 12: /* chequers on bar for player on roll */ anBoard[1][24] = abs(atoi(pc)); break; case 37: /* chequers on bar for player opponent */ anBoard[0][24] = abs(atoi(pc)); break; case 38: case 39: /* dice rolled */ anDice[c - 38] = atoi(pc); break; default: /* points */ j = atoi(pc); anBoard[j < 0][(j < 0) ? 23 - i : i] = abs(j); ++i; break; } pc = NextTokenGeneral(&sz, ";"); ++c; if (c == 40) break; } if (c != 40) return -1; return 0; } /* * Snowie .txt files * * The files are a single line with fields separated by * semicolons. Fields are numeric, except for player names. * * Field no meaning * 0 length of match (0 in money games) * 1 1 if Jacoby enabled, 0 in match play or disabled * 2 Don't know, all samples had 0. Maybe it's Nack gammon or * some other variant? * 3 Don't know. It was one in all money game samples, 0 in * match samples * 4 Player on roll 0 = 1st player * 5,6 Player names * 7 1 = Crawford game * 8,9 Scores for player 0, 1 * 10 Cube value * 11 Cube owner 1 = player on roll, 0 = centred, -1 opponent * 12 Chequers on bar for player on roll * 13..36 Points 1..24 from player on roll's point of view * 0 = empty, positive nos. for player on roll, negative * for opponent * 37 Chequers on bar for opponent * 38.39 Current roll (0,0 if not rolled) * */ static int ImportSnowieTxt(FILE * pf) { char sz[2048]; char *pc; int c; moverecord *pmr; moverecord *pmgi; int nMatchTo, fJacobyRule, fUnused1, fUnused2, fTurn, fCrawfordGame; int fCubeOwner, nCube; int anScore[2], anDice[2]; TanBoard anBoard; char aszPlayer[2][MAX_NAME_LEN]; if (!get_input_discard()) return -1; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif /* * Import Snowie .txt file */ /* read file into string */ pc = sz; while ((c = fgetc(pf)) > -1) { *pc++ = (char) c; if ((pc - sz) == (sizeof(sz) - 2)) break; } *pc = 0; /* parse string */ if (ParseSnowieTxt(sz, &nMatchTo, &fJacobyRule, &fUnused1, &fUnused2, &fTurn, aszPlayer, &fCrawfordGame, anScore, &nCube, &fCubeOwner, anBoard, anDice) < 0) { outputl(_("This file is not a valid Snowie .txt file!")); return -1; } FreeMatch(); ClearMatch(); InitBoard(ms.anBoard, ms.bgv); ClearMoveRecord(); ListInsert(&lMatch, plGame); /* Game info */ pmgi = NewMoveRecord(); pmgi->mt = MOVE_GAMEINFO; pmgi->g.i = 0; pmgi->g.nMatch = nMatchTo; pmgi->g.anScore[0] = anScore[0]; pmgi->g.anScore[1] = anScore[1]; pmgi->g.fCrawford = TRUE; pmgi->g.fCrawfordGame = fCrawfordGame; pmgi->g.fJacoby = fJacobyRule; pmgi->g.fWinner = -1; pmgi->g.nPoints = 0; pmgi->g.fResigned = FALSE; pmgi->g.nAutoDoubles = 0; pmgi->g.bgv = VARIATION_STANDARD; /* assume standard backgammon */ pmgi->g.fCubeUse = TRUE; /* assume use of cube */ IniStatcontext(&pmgi->g.sc); AddMoveRecord(pmgi); ms.fTurn = ms.fMove = fTurn; for (c = 0; c < 2; ++c) strcpy(ap[c].szName, aszPlayer[c]); /* dice */ if (anDice[0]) { pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = fTurn; pmr->anDice[0] = anDice[0]; pmr->anDice[1] = anDice[1]; AddMoveRecord(pmr); } /* board */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETBOARD; if (!fTurn) SwapSides(anBoard); PositionKey((ConstTanBoard) anBoard, &pmr->sb.key); AddMoveRecord(pmr); /* cube value */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEVAL; pmr->scv.nCube = nCube; AddMoveRecord(pmr); /* cube position */ pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEPOS; pmr->scp.fCubeOwner = fCubeOwner; AddMoveRecord(pmr); /* update menus etc */ UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif return 0; } static int ImportGAM(FILE * fp, char *UNUSED(szFilename)) { char *pchLeft, *pchRight, *szLine; moverecord *pmgi; int warned = -1; #if USE_GTK if (fX) { /* Clear record to avoid ugly updates */ GTKClearMoveRecord(); GTKFreeze(); } #endif FreeMatch(); ClearMatch(); while ((szLine = GetMatLine(fp)) != 0) { szLine += strspn(szLine, " \t"); if (!StrNCaseCmp(szLine, "win", 3)) continue; /* Skip this line (in between games) */ /* Read player names */ pchRight = szLine; while (*pchRight != ' ' && *pchRight != '\t') pchRight++; *pchRight = '\0'; strcpy(ap[0].szName, szLine); pchLeft = pchRight + 1; while (*pchLeft == ' ' || *pchLeft == '\t') pchLeft++; pchRight = pchLeft; while (*pchRight != ' ' && *pchRight != '\t' && *pchRight != '\n') pchRight++; *pchRight = '\0'; strcpy(ap[1].szName, pchLeft); InitBoard(ms.anBoard, ms.bgv); ClearMoveRecord(); ListInsert(&lMatch, plGame); /* Game info */ pmgi = NewMoveRecord(); pmgi->mt = MOVE_GAMEINFO; pmgi->g.i = ms.cGames; pmgi->g.nMatch = 0; pmgi->g.anScore[0] = ms.anScore[0]; pmgi->g.anScore[1] = ms.anScore[1]; pmgi->g.fCrawford = FALSE; pmgi->g.fCrawfordGame = FALSE; pmgi->g.fJacoby = FALSE; pmgi->g.fWinner = -1; pmgi->g.nPoints = 0; pmgi->g.fResigned = FALSE; pmgi->g.nAutoDoubles = 0; pmgi->g.bgv = VARIATION_STANDARD; /* assume standard backgammon */ pmgi->g.fCubeUse = TRUE; /* assume use of cube */ IniStatcontext(&pmgi->g.sc); AddMoveRecord(pmgi); /* Read game */ while ((szLine = GetMatLine(fp)) != 0) { char *pch; pchRight = pchLeft = NULL; if ((pch = strpbrk(szLine, "\n\r")) != 0) *pch = 0; if ((pchLeft = strchr(szLine, ':')) && (pchRight = strchr(pchLeft + 1, ':')) && pchRight > szLine + 3) *((pchRight -= 2) - 1) = 0; else if (strlen(szLine) > 15 && (pchRight = strstr(szLine + 15, " "))) *pchRight++ = 0; if ((pchLeft = strchr(szLine, ')')) != 0) pchLeft++; else pchLeft = szLine; ParseMatMove(pchLeft, 0, &warned); if (pchRight) ParseMatMove(pchRight, 1, &warned); if (ms.gs != GAME_PLAYING) { AddGame(pmgi); break; } } } UpdateSettings(); #if USE_GTK if (fX) { GTKThaw(); GTKSet(ap); } #endif return TRUE; } static void WritePartyGame(FILE * fp, char *gameStr, int ns) { char *move; char *data = gameStr; int moveNum = 1; int side = -1; while ((move = NextTokenGeneral(&data, "#")) != NULL) { char buf[100]; char *moveStr = NULL; side = (move[0] == '2'); if ((side == 0) || (moveNum == 1 && side == 1)) { fprintf(fp, "%3d) ", moveNum); if (moveNum == 1 && side == 1) fprintf(fp, "%28s", " "); moveNum++; } move = strchr(move, ' '); g_assert(move); if (move) { move++; if (isdigit(*move)) { char *roll; move = strchr(move, ' ') + 1; move = strchr(move, ' ') + 1; roll = move; move = strchr(move, ' '); if (move) { char *dest, *src; *move = '\0'; moveStr = move + 1; /* Change bar -> 25, off -> 0 */ src = dest = moveStr; while (*src) { if (*src == 'b') { *dest++ = '2'; *dest++ = '5'; src += 3; } else if (*src == 'o') { *dest++ = '0'; src += 3; } else { *dest = *src; dest++; src++; } } *dest = '\0'; } sprintf(buf, "%s: %s", roll, moveStr ? moveStr : ""); } else /* !isdigit(*move) */ strcpy(buf, move); /* Double/Take */ } if (side == 0) fprintf(fp, "%-30s ", buf); else fprintf(fp, "%s\n", buf); } if (side == 0 && ns < 0) fprintf(fp, "\n "); else if (side == 1 && ns > 0) fprintf(fp, "%36s", " "); fprintf(fp, "Wins %d point%s\n\n", abs(ns), (abs(ns) == 1) ? "" : "s"); } typedef struct { int s1, s2; char *gameStr; } PartyGame; static int ConvertPartyGammonFileToMat(FILE * partyFP, FILE * matFP) { PartyGame pg = { -1, -1, NULL }; int matchLen = -1; char p1[MAX_NAME_LEN] = "", p2[MAX_NAME_LEN] = ""; GList *games = NULL; char buffer[1024 * 10]; while (fgets(buffer, sizeof(buffer), partyFP) != NULL) { char *value, *key; value = buffer; key = NextTokenGeneral(&value, "="); if (key) { if (!StrNCaseCmp(key, "GAME_", strlen("GAME_"))) { key += strlen("GAME_"); do key++; while (key[-1] != '_'); if (g_ascii_iscntrl(value[strlen(value) - 1])) value[strlen(value) - 1] = '\0'; if (!StrCaseCmp(key, "PLAYER_1")) strcpy(p1, value); else if (!StrCaseCmp(key, "PLAYER_2")) strcpy(p2, value); else if (!StrCaseCmp(key, "GAMEPLAY")) pg.gameStr = g_strdup(value); else if (!StrCaseCmp(key, "SCORE1")) pg.s1 = atoi(value); else if (!StrCaseCmp(key, "SCORE2")) { PartyGame *newGame; pg.s2 = atoi(value); /* Add this game */ newGame = g_malloc(sizeof(PartyGame)); memcpy(newGame, &pg, sizeof(PartyGame)); games = g_list_append(games, newGame); } } if (!StrCaseCmp(key, "MATCHLENGTH")) matchLen = atoi(value); } } if (g_list_length(games) > 0 || matchLen == -1) { /* Write out mat file */ unsigned int i; int s1 = 0, s2 = 0; GList *pl; fprintf(matFP, " %d point match\n", matchLen); for (i = 0, pl = g_list_first(games); i < g_list_length(games); i++, pl = g_list_next(pl)) { int pts; PartyGame *pGame = (PartyGame *) (pl->data); fprintf(matFP, "\n Game %u\n", i + 1); fprintf(matFP, " %s : %d %14s %s : %d\n", p1, s1, " ", p2, s2); pts = pGame->s2 - s2 - pGame->s1 + s1; WritePartyGame(matFP, pGame->gameStr, pts); s1 = pGame->s1; s2 = pGame->s2; g_free(pGame->gameStr); g_free(pGame); } g_free(pg.gameStr); g_list_free(pl); return TRUE; } if (ferror(partyFP)) outputerr(_("File error while processing PartyGammon match")); g_free(pg.gameStr); return FALSE; } extern void CommandImportJF(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a position file to import (see `help " "import pos').")); return; } if ((pf = g_fopen(sz, "rb"))) { int rc = ImportJF(pf, sz); if (rc) /* no file imported */ return; fclose(pf); setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); } else outputerr(sz); ShowBoard(); } extern void CommandImportMat(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a match file to import (see `help " "import mat').")); return; } if ((pf = g_fopen(sz, "r")) != 0) { int rc = ImportMat(pf, sz); fclose(pf); if (rc) /* no file imported */ return; setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); if (fGotoFirstGame) CommandFirstGame(NULL); } else outputerr(sz); } extern void CommandImportOldmoves(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify an oldmoves file to import (see `help " "import oldmoves').")); return; } if ((pf = g_fopen(sz, "r")) != 0) { int rc = ImportOldmoves(pf, sz); fclose(pf); if (rc) /* no file imported */ return; setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); if (fGotoFirstGame) CommandFirstGame(NULL); } else outputerr(sz); } extern void CommandImportSGG(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify an SGG file to import (see `help " "import sgg').")); return; } if ((pf = g_fopen(sz, "r")) != 0) { int rc = ImportSGG(pf, sz); fclose(pf); if (rc) /* no file imported */ return; setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); if (fGotoFirstGame) CommandFirstGame(NULL); } else outputerr(sz); } extern void CommandImportTMG(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify an TMG file to import (see `help " "import tmg').")); return; } if ((pf = g_fopen(sz, "r")) != 0) { int rc = ImportTMG(pf, sz); fclose(pf); if (rc) /* no file imported */ return; setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); if (fGotoFirstGame) CommandFirstGame(NULL); } else outputerr(sz); } extern void CommandImportSnowieTxt(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a Snowie Text file to import (see `help " "import snowietxt').")); return; } if ((pf = g_fopen(sz, "r")) != 0) { int rc = ImportSnowieTxt(pf); fclose(pf); if (rc) /* no file imported */ return; setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); } else outputerr(sz); } extern void CommandImportEmpire(char *sz) { FILE *pf; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a GammonEmpire file to import (see `help " "import empire').")); return; } if ((pf = g_fopen(sz, "r")) != 0) { int res = ImportGAM(pf, sz); fclose(pf); if (!res) /* no file imported */ return; setDefaultFileName(sz); if (fUseKeyNames) SmartSit(); } else outputerr(sz); } extern void CommandImportParty(char *sz) { FILE *gamf, *matf; char *tmpfile; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a PartyGammon file to import (see `help " "import party').")); return; } if ((gamf = g_fopen(sz, "r")) == NULL) { outputerr(sz); return; } tmpfile = g_strdup_printf("%s.mat", sz); if (g_file_test(tmpfile, G_FILE_TEST_EXISTS)) { outputerrf(_("%s already exists. Cannot import %s\n"), tmpfile, sz); g_free(tmpfile); fclose(gamf); return; } if ((matf = g_fopen(tmpfile, "w")) == NULL) { outputerr(tmpfile); g_free(tmpfile); fclose(gamf); return; } if (ConvertPartyGammonFileToMat(gamf, matf)) { FILE *pf; if ((pf = g_fopen(tmpfile, "r")) != NULL) { int rc = ImportMat(pf, tmpfile); fclose(pf); if (!rc) { setDefaultFileName(tmpfile); if (fUseKeyNames) SmartSit(); if (fGotoFirstGame) CommandFirstGame(NULL); } } else outputerr(tmpfile); } else outputerrf(_("Failed to convert BGRoom gam file to mat\n")); g_unlink(tmpfile); g_free(tmpfile); fclose(matf); fclose(gamf); } extern void CommandImportAuto(char *sz) { FilePreviewData *fdp; gchar *cmd; /* Careful! NextToken breaks the Windows file/directory names with spaces! */ //outputerrf("before=%s\n", sz); sz = NextToken(&sz); //outputerrf("after=%s\n", sz); if (!sz || !*sz) { outputerrf(_("You must specify a file to import (see `help " "import auto').")); return; } if (!g_file_test(sz, G_FILE_TEST_EXISTS)) { outputerrf(_("The file `%s' doesn't exist"), sz); return; } fdp = ReadFilePreview(sz); if (!fdp) { outputerrf(_("`%s' is not a backgammon file"), sz); g_free(fdp); return; } else if (fdp->type == N_IMPORT_TYPES) { outputf(_("The format of '%s' is not recognized"), sz); g_free(fdp); return; } else if (fdp->type == IMPORT_SGF) cmd = g_strdup_printf("load match \"%s\"", sz); else cmd = g_strdup_printf("import %s \"%s\"", import_format[fdp->type].clname, sz); HandleCommand(cmd, acTop); g_free(cmd); g_free(fdp); } #define BGR_STRING "BGF version" static int moveNumBGR; static void OutputMove(FILE * fpOut, int side, const char *outBuf) { if ((side == 0) || (moveNumBGR == 1)) { fprintf(fpOut, "%3d) ", moveNumBGR); if (side == 1) fprintf(fpOut, "%28s", " "); moveNumBGR++; } if (side == 0) fprintf(fpOut, "%-27s ", outBuf); else fprintf(fpOut, "%s\n", outBuf); } static int ConvertBGRoomFileToMat(FILE * bgrFP, FILE * matFP) { char *player1; char *player2; int p1Score = 0, p2Score = 0; int dice1, dice2; int doubled, stake, side = 0; int gameCount = 0, moveCount; char buffer[1024 * 4]; player1 = g_malloc(sizeof(char) * 128); player2 = g_malloc(sizeof(char) * 128); while (fgets(buffer, sizeof(buffer), bgrFP) != NULL) { if (strncmp(buffer, BGR_STRING, strlen(BGR_STRING)) == 0) break; } if (ferror(bgrFP)) { outputerr(_("Error opening BGRoom file")); g_free(player2); g_free(player1); return FALSE; } if (feof(bgrFP)) { g_free(player2); g_free(player1); return FALSE; } while (!feof(bgrFP)) { char *value, *ptr, *tempptr; gboolean fSwap; do { if (fgets(buffer, sizeof(buffer), bgrFP) == NULL) { if (ferror(bgrFP)) outputerr(_("Error reading BGRoom file")); g_free(player2); g_free(player1); return FALSE; } if (strstr(buffer, "Win the Match")) goto done; } while (strncmp(buffer, "Game ", strlen("Game "))); value = buffer + strlen("Game "); gameCount++; ptr = NextTokenGeneral(&value, " "); if (atoi(ptr) != gameCount) { outputerrf(_("Error parsing BGRoom file. Wrong game count: expected %d, got %s"), gameCount, ptr); g_assert_not_reached(); } ptr = NextTokenGeneral(&value, " "); /* Skip '-' */ if (strcmp(ptr, "-")) { outputerrf(_("Error parsing BGRoom file. Expected '-', got '%s'"), ptr); g_assert_not_reached(); } strcpy(player1, NextTokenGeneral(&value, " ")); ptr = NextTokenGeneral(&value, " "); /* Skip '(0|X)' */ fSwap = *(ptr + 1) == '0'; ptr = NextTokenGeneral(&value, " "); /* Skip 'vs.' */ if (strcmp(ptr, "vs.")) { outputerrf(_("Error parsing BGRoom file. Expected 'vs.', got '%s'"), ptr); g_assert_not_reached(); } strcpy(player2, NextTokenGeneral(&value, " ")); if (fSwap) { tempptr = player1; player1 = player2; player2 = tempptr; } if (fgets(buffer, sizeof(buffer), bgrFP) == NULL) { if (ferror(bgrFP)) outputerr(_("Error reading BGRoom file")); g_free(player2); g_free(player1); return FALSE; } value = buffer; ptr = NextTokenGeneral(&value, " "); if (strcmp(ptr, "Single")) { outputerrf(_("Error parsing BGRoom file. Expected 'Single', got '%s'"), ptr); g_assert_not_reached(); } fprintf(matFP, " 0 point match\n\n Game %d\n %s : %-22d %s : %d\n", gameCount, player1, p1Score, player2, p2Score); /* Game Moves */ moveCount = 0; moveNumBGR = 1; doubled = FALSE; stake = 1; while (!feof(bgrFP)) { char outBuf[100]; if (fgets(buffer, sizeof(buffer), bgrFP) == NULL) { if (ferror(bgrFP)) outputerr(_("Error reading BGRoom file")); g_free(player2); g_free(player1); return FALSE; } while (buffer[strlen(buffer) - 1] == '\n' || buffer[strlen(buffer) - 1] == '\r') buffer[strlen(buffer) - 1] = '\0'; if (!*buffer) { if (doubled) { /* Drop */ side = !side; OutputMove(matFP, side, " Drops"); } if (side) fprintf(matFP, "%36s", ""); fprintf(matFP, " Wins %d points\n", stake); break; /* end of game */ } moveCount++; if (doubled) { /* Taken, peek ahead to see if it is a beaver */ if (strcmp(value, "Beaver")) { stake *= 2; OutputMove(matFP, !side, " Takes"); } else { stake *= 4; sprintf(outBuf, " Beavers => %d", stake); OutputMove(matFP, !side, outBuf); } side = !side; doubled = FALSE; } value = buffer; ptr = NextTokenGeneral(&value, "."); if (atoi(ptr) != moveCount) { outputerrf(_("Error parsing BGroom file. Wrong move count: expected %d, got %s"), moveCount, ptr); g_assert_not_reached(); } ptr = NextTokenGeneral(&value, ":"); if (!strcmp(ptr, "X")) side = 0; else if (!strcmp(ptr, "0")) side = 1; else { outputf(_("Unrecognised data in file: %s"), ptr); continue; } if (!strcmp(value, "Double")) { doubled = TRUE; sprintf(outBuf, " Doubles => %d", stake * 2); } else if (!strcmp(value, "Beaver")) { /* already handled above */ continue; } else { g_assert(*value == '('); value++; ptr = NextTokenGeneral(&value, " "); dice1 = atoi(ptr); ptr = NextTokenGeneral(&value, ")"); dice2 = atoi(ptr); if (!strcmp(value, "can't move")) value[0] = '\0'; sprintf(outBuf, "%d%d: %s", dice1, dice2, value); } OutputMove(matFP, side, outBuf); } } done: g_free(player2); g_free(player1); return TRUE; } extern void CommandImportBGRoom(char *sz) { FILE *gamf, *matf; char *matfile; sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a BGRoom file to import (see `help " "import bgroom').")); return; } if ((gamf = g_fopen(sz, "r")) == NULL) { outputerr(sz); return; } matfile = g_strdup_printf("%s.mat", sz); if ((matf = g_fopen(matfile, "w")) == NULL) { outputerr(matfile); g_free(matfile); fclose(gamf); return; } if (ConvertBGRoomFileToMat(gamf, matf)) { FILE *pf; if ((pf = g_fopen(matfile, "r")) != NULL) { int rc = ImportMat(pf, matfile); fclose(pf); if (!rc) { setDefaultFileName(matfile); if (fUseKeyNames) SmartSit(); if (fGotoFirstGame) CommandFirstGame(NULL); } } else outputerr(matfile); } else outputerrf(_("Failed to convert BGRoom gam file to mat\n")); g_unlink(matfile); g_free(matfile); fclose(matf); fclose(gamf); } gnubg-1.08.003/gnubgmodule.h000644 001751 000024 00000002650 14574155047 015320 0ustar00pmstaff000000 000000 /* * Copyright (C) 2003 Joern Thyssen * Copyright (C) 2003-2014 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gnubgmodule.h,v 1.31 2014/08/07 21:51:48 mdpetch Exp $ */ #ifndef GNUBGMODULE_H #define GNUBGMODULE_H #if defined(USE_PYTHON) #if defined(WIN32) /* needed for mingw inclusion of Python.h */ #include #endif #include #include "pylocdefs.h" extern PyObject *PythonGnubgModule(void); #include "lib/simd.h" #include extern void PythonInitialise(char *argv0); extern void PythonShutdown(void); extern void PythonRun(const char *sz); extern int LoadPythonFile(const char *sz, int fQuiet); extern gint python_run_file(gpointer file); extern MOD_INIT(gnubg); #endif /* USE_PYTHON */ #endif /* GNUBGMODULE_H */ gnubg-1.08.003/gnubg.sql000644 001751 000024 00000031511 14574155047 014460 0ustar00pmstaff000000 000000 -- -- Copyright (C) 2004 Joern Thyssen -- Copyright (C) 2004-2008 the AUTHORS -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- $Id: gnubg.sql,v 1.14 2013/08/21 03:45:22 mdpetch Exp $ -- -- Table: control -- Holds the most current value of xxx_id for every table. CREATE TABLE control ( tablename CHAR(80) NOT NULL ,next_id INTEGER NOT NULL ,PRIMARY KEY (tablename) ); CREATE UNIQUE INDEX icontrol ON control ( tablename ); -- Table: player -- a player CREATE TABLE player ( player_id INTEGER NOT NULL -- Name of player ,name CHAR(80) NOT NULL -- Misc notes about this player ,notes VARCHAR(1000) NOT NULL ,PRIMARY KEY (player_id) ); CREATE UNIQUE INDEX iplayer ON player ( player_id ); -- Table: session CREATE TABLE session ( session_id INTEGER NOT NULL ,checksum CHAR(33) NOT NULL -- Player 0 ,player_id0 INTEGER NOT NULL -- Player 1 ,player_id1 INTEGER NOT NULL -- The result of the match/session: -- - the total number of points won or lost -- - +1/0/-1 for player 0 won the match, match not complete, and -- player 1 won match, respectively ,result INTEGER NOT NULL -- Length of match -- 0=session, >0=match ,length INTEGER NOT NULL -- Timestamp for insert into database ,added TIMESTAMP NOT NULL -- Match info ,rating0 CHAR(80) NOT NULL ,rating1 CHAR(80) NOT NULL ,event CHAR(80) NOT NULL ,round CHAR(80) NOT NULL ,place CHAR(80) NOT NULL ,annotator CHAR(80) NOT NULL ,comment CHAR(80) NOT NULL ,date DATE ,PRIMARY KEY (session_id) ,FOREIGN KEY (player_id0) REFERENCES player (player_id) ON DELETE RESTRICT ,FOREIGN KEY (player_id1) REFERENCES player (player_id) ON DELETE RESTRICT ); CREATE UNIQUE INDEX isession ON session ( session_id ); -- Table: statistics -- Used from session and game tables to store match and game statistics, -- respectively. CREATE TABLE matchstat ( matchstat_id INTEGER NOT NULL -- session identification ,session_id INTEGER NOT NULL -- player identification ,player_id INTEGER NOT NULL -- chequerplay statistics ,total_moves INTEGER NOT NULL ,unforced_moves INTEGER NOT NULL ,unmarked_moves INTEGER NOT NULL ,good_moves INTEGER NOT NULL ,doubtful_moves INTEGER NOT NULL ,bad_moves INTEGER NOT NULL ,very_bad_moves INTEGER NOT NULL ,chequer_error_total_normalised FLOAT NOT NULL ,chequer_error_total FLOAT NOT NULL ,chequer_error_per_move_normalised FLOAT NOT NULL ,chequer_error_per_move FLOAT NOT NULL ,chequer_rating INTEGER NOT NULL -- luck statistics ,very_lucky_rolls INTEGER NOT NULL ,lucky_rolls INTEGER NOT NULL ,unmarked_rolls INTEGER NOT NULL ,unlucky_rolls INTEGER NOT NULL ,very_unlucky_rolls INTEGER NOT NULL ,luck_total_normalised FLOAT NOT NULL ,luck_total FLOAT NOT NULL ,luck_per_move_normalised FLOAT NOT NULL ,luck_per_move FLOAT NOT NULL ,luck_rating INTEGER NOT NULL -- cube statistics ,total_cube_decisions INTEGER NOT NULL ,close_cube_decisions INTEGER NOT NULL ,doubles INTEGER NOT NULL ,takes INTEGER NOT NULL ,passes INTEGER NOT NULL ,missed_doubles_below_cp INTEGER NOT NULL ,missed_doubles_above_cp INTEGER NOT NULL ,wrong_doubles_below_dp INTEGER NOT NULL ,wrong_doubles_above_tg INTEGER NOT NULL ,wrong_takes INTEGER NOT NULL ,wrong_passes INTEGER NOT NULL ,error_missed_doubles_below_cp_normalised FLOAT NOT NULL ,error_missed_doubles_above_cp_normalised FLOAT NOT NULL ,error_wrong_doubles_below_dp_normalised FLOAT NOT NULL ,error_wrong_doubles_above_tg_normalised FLOAT NOT NULL ,error_wrong_takes_normalised FLOAT NOT NULL ,error_wrong_passes_normalised FLOAT NOT NULL ,error_missed_doubles_below_cp FLOAT NOT NULL ,error_missed_doubles_above_cp FLOAT NOT NULL ,error_wrong_doubles_below_dp FLOAT NOT NULL ,error_wrong_doubles_above_tg FLOAT NOT NULL ,error_wrong_takes FLOAT NOT NULL ,error_wrong_passes FLOAT NOT NULL ,cube_error_total_normalised FLOAT NOT NULL ,cube_error_total FLOAT NOT NULL ,cube_error_per_move_normalised FLOAT NOT NULL ,cube_error_per_move FLOAT NOT NULL ,cube_rating INTEGER NOT NULL -- overall statistics ,overall_error_total_normalised FLOAT NOT NULL ,overall_error_total FLOAT NOT NULL ,overall_error_per_move_normalised FLOAT NOT NULL ,overall_error_per_move FLOAT NOT NULL ,overall_rating INTEGER NOT NULL ,actual_result FLOAT NOT NULL ,luck_adjusted_result FLOAT NOT NULL ,snowie_moves INTEGER NOT NULL ,snowie_error_rate_per_move FLOAT NOT NULL -- for matches only ,luck_based_fibs_rating_diff FLOAT ,error_based_fibs_rating FLOAT ,chequer_rating_loss FLOAT ,cube_rating_loss FLOAT -- for money sesisons only ,actual_advantage FLOAT ,actual_advantage_ci FLOAT ,luck_adjusted_advantage FLOAT ,luck_adjusted_advantage_ci FLOAT -- time penalties ,time_penalties INTEGER NOT NULL ,time_penalty_loss_normalised FLOAT NOT NULL ,time_penalty_loss FLOAT NOT NULL -- ,PRIMARY KEY (matchstat_id) ,FOREIGN KEY (player_id) REFERENCES player (player_id) ON DELETE RESTRICT ,FOREIGN KEY (session_id) REFERENCES session (session_id) ON DELETE CASCADE ); CREATE UNIQUE INDEX ismatchstat ON matchstat ( matchstat_id ); -- Table: game CREATE TABLE game ( game_id INTEGER NOT NULL ,session_id INTEGER NOT NULL -- Player 0 ,player_id0 INTEGER NOT NULL -- Player 1 ,player_id1 INTEGER NOT NULL -- score at start of game (since end of game is not meaningful if incomplete) ,score_0 INTEGER NOT NULL ,score_1 INTEGER NOT NULL -- The result of the game -- the total number of points won or lost -- positive means player 0 won game, negative player 1 won game, -- zero - game not complete ,result INTEGER NOT NULL -- Timestamp for insert into database ,added TIMESTAMP NOT NULL -- which game in the match/session this is ,game_number INTEGER NOT NULL -- if Crawford game ,crawford INTEGER NOT NULL ,PRIMARY KEY (game_id) ,FOREIGN KEY (session_id) REFERENCES session (session_id) ON DELETE CASCADE ,FOREIGN KEY (player_id0) REFERENCES player (player_id) ON DELETE RESTRICT ,FOREIGN KEY (player_id1) REFERENCES player (player_id) ON DELETE RESTRICT ); CREATE UNIQUE INDEX igame ON game ( game_id ); -- Table: statistics -- Used from match and game tables to store match and game statistics, -- respectively. CREATE TABLE gamestat ( gamestat_id INTEGER NOT NULL -- game identification ,game_id INTEGER NOT NULL -- player identification ,player_id INTEGER NOT NULL -- chequerplay statistics ,total_moves INTEGER NOT NULL ,unforced_moves INTEGER NOT NULL ,unmarked_moves INTEGER NOT NULL ,good_moves INTEGER NOT NULL ,doubtful_moves INTEGER NOT NULL ,bad_moves INTEGER NOT NULL ,very_bad_moves INTEGER NOT NULL ,chequer_error_total_normalised FLOAT NOT NULL ,chequer_error_total FLOAT NOT NULL ,chequer_error_per_move_normalised FLOAT NOT NULL ,chequer_error_per_move FLOAT NOT NULL ,chequer_rating INTEGER NOT NULL -- luck statistics ,very_lucky_rolls INTEGER NOT NULL ,lucky_rolls INTEGER NOT NULL ,unmarked_rolls INTEGER NOT NULL ,unlucky_rolls INTEGER NOT NULL ,very_unlucky_rolls INTEGER NOT NULL ,luck_total_normalised FLOAT NOT NULL ,luck_total FLOAT NOT NULL ,luck_per_move_normalised FLOAT NOT NULL ,luck_per_move FLOAT NOT NULL ,luck_rating INTEGER NOT NULL -- cube statistics ,total_cube_decisions INTEGER NOT NULL ,close_cube_decisions INTEGER NOT NULL ,doubles INTEGER NOT NULL ,takes INTEGER NOT NULL ,passes INTEGER NOT NULL ,missed_doubles_below_cp INTEGER NOT NULL ,missed_doubles_above_cp INTEGER NOT NULL ,wrong_doubles_below_dp INTEGER NOT NULL ,wrong_doubles_above_tg INTEGER NOT NULL ,wrong_takes INTEGER NOT NULL ,wrong_passes INTEGER NOT NULL ,error_missed_doubles_below_cp_normalised FLOAT NOT NULL ,error_missed_doubles_above_cp_normalised FLOAT NOT NULL ,error_wrong_doubles_below_dp_normalised FLOAT NOT NULL ,error_wrong_doubles_above_tg_normalised FLOAT NOT NULL ,error_wrong_takes_normalised FLOAT NOT NULL ,error_wrong_passes_normalised FLOAT NOT NULL ,error_missed_doubles_below_cp FLOAT NOT NULL ,error_missed_doubles_above_cp FLOAT NOT NULL ,error_wrong_doubles_below_dp FLOAT NOT NULL ,error_wrong_doubles_above_tg FLOAT NOT NULL ,error_wrong_takes FLOAT NOT NULL ,error_wrong_passes FLOAT NOT NULL ,cube_error_total_normalised FLOAT NOT NULL ,cube_error_total FLOAT NOT NULL ,cube_error_per_move_normalised FLOAT NOT NULL ,cube_error_per_move FLOAT NOT NULL ,cube_rating INTEGER NOT NULL -- overall statistics ,overall_error_total_normalised FLOAT NOT NULL ,overall_error_total FLOAT NOT NULL ,overall_error_per_move_normalised FLOAT NOT NULL ,overall_error_per_move FLOAT NOT NULL ,overall_rating INTEGER NOT NULL ,actual_result FLOAT NOT NULL ,luck_adjusted_result FLOAT NOT NULL ,snowie_moves INTEGER NOT NULL ,snowie_error_rate_per_move FLOAT NOT NULL -- for matches only ,luck_based_fibs_rating_diff FLOAT ,error_based_fibs_rating FLOAT ,chequer_rating_loss FLOAT ,cube_rating_loss FLOAT -- for money sesisons only ,actual_advantage FLOAT ,actual_advantage_ci FLOAT ,luck_adjusted_advantage FLOAT ,luck_adjusted_advantage_ci FLOAT -- time penalties ,time_penalties INTEGER NOT NULL ,time_penalty_loss_normalised FLOAT NOT NULL ,time_penalty_loss FLOAT NOT NULL -- ,PRIMARY KEY (gamestat_id) ,FOREIGN KEY (player_id) REFERENCES player (player_id) ON DELETE RESTRICT ,FOREIGN KEY (game_id) REFERENCES game (game_id) ON DELETE CASCADE ); CREATE UNIQUE INDEX isgamestat ON gamestat ( gamestat_id ); gnubg-1.08.003/bearoff.c000644 001751 000024 00000102742 14574155047 014412 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2004 Joern Thyssen * Copyright (C) 2003-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: bearoff.c,v 1.109 2022/07/26 21:16:44 plm Exp $ */ #include "config.h" /*must be first here because of strange warning from mingw */ #include "multithread.h" #include "backgammon.h" #if HAVE_UNISTD_H #include #endif #include "bearoffgammon.h" #include "positionid.h" #include #include #include #include #define HEURISTIC_C 15 #define HEURISTIC_P 6 static int setGammonProb(const TanBoard anBoard, unsigned int bp0, unsigned int bp1, float *g0, float *g1) { int i; unsigned short int prob[32]; unsigned int tot0 = 0; unsigned int tot1 = 0; for (i = 5; i >= 0; --i) { tot0 += anBoard[0][i]; tot1 += anBoard[1][i]; } { g_assert(tot0 == 15 || tot1 == 15); } *g0 = 0.0; *g1 = 0.0; if (tot0 == 15) { struct GammonProbs *gp = getBearoffGammonProbs(anBoard[0]); double make[3]; if (BearoffDist(pbc1, bp1, NULL, NULL, NULL, prob, NULL)) return -1; make[0] = gp->p0 / 36.0; make[1] = (make[0] + gp->p1 / (36.0 * 36.0)); make[2] = (make[1] + gp->p2 / (36.0 * 36.0 * 36.0)); *g1 = (float) ((prob[1] / 65535.0) + (1 - make[0]) * (prob[2] / 65535.0) + (1 - make[1]) * (prob[3] / 65535.0) + (1 - make[2]) * (prob[4] / 65535.0)); } if (tot1 == 15) { struct GammonProbs *gp = getBearoffGammonProbs(anBoard[1]); double make[3]; if (BearoffDist(pbc1, bp0, NULL, NULL, NULL, prob, NULL)) return -1; make[0] = gp->p0 / 36.0; make[1] = (make[0] + gp->p1 / (36.0 * 36.0)); make[2] = (make[1] + gp->p2 / (36.0 * 36.0 * 36.0)); *g0 = (float) ((prob[1] / 65535.0) * (1 - make[0]) + (prob[2] / 65535.0) * (1 - make[1]) + (prob[3] / 65535.0) * (1 - make[2])); } return 0; } static void AverageRolls(const float arProb[32], float *ar) { float sx; float sx2; int i; sx = sx2 = 0.0f; for (i = 1; i < 32; i++) { float p = (float) i * arProb[i]; sx += p; sx2 += (float) i * p; } ar[0] = sx; ar[1] = sqrtf(sx2 - sx * sx); } /* Make a plausible bearoff move (used to create approximate bearoff database). */ static unsigned int HeuristicBearoff(unsigned int anBoard[6], const unsigned int anRoll[2]) { unsigned int i, /* current die being played */ c, /* number of dice to play */ nMax, /* highest occupied point */ anDice[4], j, iSearch, nTotal; int n; /* point to play from */ if (anRoll[0] == anRoll[1]) { /* doubles */ anDice[0] = anDice[1] = anDice[2] = anDice[3] = anRoll[0]; c = 4; } else { /* non-doubles */ g_assert(anRoll[0] > anRoll[1]); anDice[0] = anRoll[0]; anDice[1] = anRoll[1]; c = 2; } for (i = 0; i < c; i++) { for (nMax = 5; nMax > 0; nMax--) { if (anBoard[nMax]) break; } if (!anBoard[nMax]) /* finished bearoff */ break; do { if (anBoard[anDice[i] - 1]) { /* bear off exactly */ n = (int) anDice[i] - 1; break; } if (anDice[i] - 1 > nMax) { /* bear off highest chequer */ n = (int) nMax; break; } nTotal = anDice[i] - 1; for (n = -1, j = i + 1; j < c; j++) { nTotal += anDice[j]; if (nTotal < 6 && anBoard[nTotal]) { /* there's a chequer we can bear off with subsequent dice; * do it */ n = (int) nTotal; break; } } if (n >= 0) break; for (n = -1, iSearch = anDice[i]; iSearch <= nMax; iSearch++) { if (anBoard[iSearch] >= 2 && /* at least 2 on source point */ !anBoard[iSearch - anDice[i]] && /* dest empty */ (n == -1 || anBoard[iSearch] > anBoard[n])) n = (int) iSearch; } if (n >= 0) break; /* find the point with the most on it (or least on dest) */ for (iSearch = anDice[i]; iSearch <= nMax; iSearch++) if (n == -1 || anBoard[iSearch] > anBoard[n] || (anBoard[iSearch] == anBoard[n] && anBoard[iSearch - anDice[i]] < anBoard[(unsigned int) n - anDice[i]])) n = (int) iSearch; g_assert(n >= 0); } while (n < 0); /* Dummy loop to remove goto's */ g_assert(anBoard[n]); anBoard[n]--; if (n >= (int) anDice[i]) anBoard[n - (int) anDice[i]]++; } return PositionBearoff(anBoard, HEURISTIC_P, HEURISTIC_C); } static void GenerateBearoff(unsigned char *p, unsigned int nId) { unsigned int anRoll[2], anBoard[6], aProb[32] = { 0 }; unsigned int i, iBest; for (anRoll[0] = 1; anRoll[0] <= 6; anRoll[0]++) for (anRoll[1] = 1; anRoll[1] <= anRoll[0]; anRoll[1]++) { PositionFromBearoff(anBoard, nId, HEURISTIC_P, HEURISTIC_C); iBest = HeuristicBearoff(anBoard, anRoll); g_assert(iBest < nId); if (anRoll[0] == anRoll[1]) for (i = 0; i < 31; i++) aProb[i + 1] += p[(iBest << 6) | (i << 1)] + (p[(iBest << 6) | (i << 1) | 1] << 8); else for (i = 0; i < 31; i++) aProb[i + 1] += (p[(iBest << 6) | (i << 1)] + ((unsigned int) p[(iBest << 6) | (i << 1) | 1] << 8)) << 1; } for (i = 0; i < 32; i++) { unsigned short us = (unsigned short) ((aProb[i] + 18) / 36); p[(nId << 6) | (i << 1)] = us & 0xFF; p[(nId << 6) | (i << 1) | 1] = us >> 8; } } static unsigned char * HeuristicDatabase(void (*pfProgress) (unsigned int)) { unsigned char *pm = malloc(40 + 54264 * 64); unsigned char *p; unsigned int i; if (!pm) return NULL; p = pm + 40; p[0] = p[1] = 0xFF; for (i = 2; i < 64; i++) p[i] = 0; for (i = 1; i < 54264; i++) { GenerateBearoff(p, i); if (pfProgress && !(i % 1000)) pfProgress(i); } return pm; } static void ReadBearoffFile(const bearoffcontext * pbc, unsigned int offset, unsigned char *buf, unsigned int nBytes) { MT_Exclusive(); if ((fseek(pbc->pf, (long) offset, SEEK_SET) < 0) || (fread(buf, 1, nBytes, pbc->pf) < nBytes)) { if (errno) perror(_("bearoff database")); else fprintf(stderr, _("Error reading bearoff database")); memset(buf, 0, nBytes); return; } MT_Release(); } /* BEAROFF_GNUBG: read two sided bearoff database */ static void ReadTwoSidedBearoff(const bearoffcontext * pbc, const unsigned int iPos, float ar[4], unsigned short int aus[4]) { unsigned int i, k = (pbc->fCubeful) ? 4 : 1; unsigned char ac[8]; unsigned char *pc = NULL; if (pbc->p) pc = pbc->p + 40 + 2 * iPos * k; else { ReadBearoffFile(pbc, 40 + 2 * iPos * k, ac, k * 2); pc = ac; } /* add to cache */ for (i = 0; i < k; ++i) { unsigned short int us = pc[2 * i] | (unsigned short) (pc[2 * i + 1] << 8); if (aus) aus[i] = us; if (ar) ar[i] = us / 32767.5f - 1.0f; } } extern int BearoffCubeful(const bearoffcontext * pbc, const unsigned int iPos, float ar[4], unsigned short int aus[4]) { g_return_val_if_fail(pbc, -1); g_return_val_if_fail(pbc->fCubeful, -1); ReadTwoSidedBearoff(pbc, iPos, ar, aus); return 0; } static int BearoffEvalTwoSided(const bearoffcontext * pbc, const TanBoard anBoard, float arOutput[]) { unsigned int nUs = PositionBearoff(anBoard[1], pbc->nPoints, pbc->nChequers); unsigned int nThem = PositionBearoff(anBoard[0], pbc->nPoints, pbc->nChequers); unsigned int n = Combination(pbc->nPoints + pbc->nChequers, pbc->nPoints); unsigned int iPos = nUs * n + nThem; float ar[4]; ReadTwoSidedBearoff(pbc, iPos, ar, NULL); memset(arOutput, 0, 5 * sizeof(float)); arOutput[OUTPUT_WIN] = ar[0] / 2.0f + 0.5f; return 0; } static int ReadHypergammon(const bearoffcontext * pbc, const unsigned int iPos, float arOutput[NUM_OUTPUTS], float arEquity[4]) { unsigned char ac[28]; unsigned char *pc = NULL; unsigned int us; int i; const int x = 28; if (pbc->p) pc = pbc->p + 40 + x * iPos; else { ReadBearoffFile(pbc, 40 + x * iPos, ac, x); pc = ac; } if (arOutput) for (i = 0; i < NUM_OUTPUTS; ++i) { us = pc[3 * i] | (pc[3 * i + 1]) << 8 | (pc[3 * i + 2]) << 16; arOutput[i] = (float) us / 16777215.0f; } if (arEquity) for (i = 0; i < 4; ++i) { us = pc[15 + 3 * i] | (pc[15 + 3 * i + 1]) << 8 | (pc[15 + 3 * i + 2]) << 16; arEquity[i] = ((float) us / 16777215.0f - 0.5f) * 6.0f; } return 0; } static int BearoffEvalOneSided(const bearoffcontext * pbc, const TanBoard anBoard, float arOutput[]) { int i, j; float aarProb[2][32]; float aarGammonProb[2][32]; float r; unsigned int anOn[2] = { 0 }; unsigned int an[2]; float ar[2][4]; /* get bearoff probabilities */ for (i = 0; i < 2; ++i) { an[i] = PositionBearoff(anBoard[i], pbc->nPoints, pbc->nChequers); if (BearoffDist(pbc, an[i], aarProb[i], aarGammonProb[i], ar[i], NULL, NULL)) return -1; } /* calculate winning chance */ r = 0.0; for (i = 0; i < 32; ++i) for (j = i; j < 32; ++j) r += aarProb[1][i] * aarProb[0][j]; arOutput[OUTPUT_WIN] = r; /* calculate gammon chances */ for (i = 0; i < 2; ++i) for (j = 0; j < 25; ++j) anOn[i] += anBoard[i][j]; if (anOn[0] == 15 || anOn[1] == 15) { if (pbc->fGammon) { /* my gammon chance: I'm out in i rolls and my opponent isn't inside * home quadrant in less than i rolls */ r = 0; for (i = 0; i < 32; i++) for (j = i; j < 32; j++) r += aarProb[1][i] * aarGammonProb[0][j]; arOutput[OUTPUT_WINGAMMON] = r; /* opp gammon chance */ r = 0; for (i = 0; i < 32; i++) for (j = i + 1; j < 32; j++) r += aarProb[0][i] * aarGammonProb[1][j]; arOutput[OUTPUT_LOSEGAMMON] = r; } else { if (setGammonProb(anBoard, an[0], an[1], &arOutput[OUTPUT_LOSEGAMMON], &arOutput[OUTPUT_WINGAMMON])) return -1; } } else { /* no gammons possible */ arOutput[OUTPUT_WINGAMMON] = 0.0f; arOutput[OUTPUT_LOSEGAMMON] = 0.0f; } /* no backgammons possible */ arOutput[OUTPUT_LOSEBACKGAMMON] = 0.0f; arOutput[OUTPUT_WINBACKGAMMON] = 0.0f; return 0; } extern int BearoffHyper(const bearoffcontext * pbc, const unsigned int iPos, float arOutput[], float arEquity[]) { return ReadHypergammon(pbc, iPos, arOutput, arEquity); } static int BearoffEvalHypergammon(const bearoffcontext * pbc, const TanBoard anBoard, float arOutput[]) { unsigned int nUs = PositionBearoff(anBoard[1], pbc->nPoints, pbc->nChequers); unsigned int nThem = PositionBearoff(anBoard[0], pbc->nPoints, pbc->nChequers); unsigned int n = Combination(pbc->nPoints + pbc->nChequers, pbc->nPoints); unsigned int iPos = nUs * n + nThem; return ReadHypergammon(pbc, iPos, arOutput, NULL); } extern int BearoffEval(const bearoffcontext * pbc, const TanBoard anBoard, float arOutput[]) { g_return_val_if_fail(pbc, 0); switch (pbc->bt) { case BEAROFF_TWOSIDED: return BearoffEvalTwoSided(pbc, anBoard, arOutput); case BEAROFF_ONESIDED: return BearoffEvalOneSided(pbc, anBoard, arOutput); case BEAROFF_HYPERGAMMON: return BearoffEvalHypergammon(pbc, anBoard, arOutput); case BEAROFF_INVALID: default: g_warning(_("Invalid bearoff database type")); g_assert_not_reached(); return 0; } } extern void BearoffStatus(const bearoffcontext * pbc, char *sz) { char buf[256]; if (!pbc || (pbc->bt != BEAROFF_TWOSIDED && pbc->bt != BEAROFF_ONESIDED && pbc->bt != BEAROFF_HYPERGAMMON)) return; /* Title */ if (pbc->bt == BEAROFF_HYPERGAMMON) { if (pbc->p) sprintf(buf, _("In memory 2-sided exact %u-chequer Hypergammon database evaluator"), pbc->nChequers); else sprintf(buf, _("On disk 2-sided exact %u-chequer Hypergammon database evaluator"), pbc->nChequers); } else { if (pbc->p) sprintf(buf, _("In memory %u-sided bearoff database evaluator"), pbc->bt); else sprintf(buf, _("On disk %u-sided bearoff database evaluator"), pbc->bt); } sz += sprintf(sz, " * %s\n", buf); sz += sprintf(sz, " - %s\n", _("generated by GNU Backgammon")); sprintf(buf, _("up to %u chequers on %u points (%u positions) per player"), pbc->nChequers, pbc->nPoints, Combination(pbc->nChequers + pbc->nPoints, pbc->nPoints)); sz += sprintf(sz, " - %s\n", buf); switch (pbc->bt) { case BEAROFF_TWOSIDED: sz += sprintf(sz, " - %s\n", pbc->fCubeful ? _("database includes both cubeful and cubeless equities") : _("cubeless database")); break; case BEAROFF_ONESIDED: if (pbc->fND) sz += sprintf(sz, " - %s\n", _("distributions are approximated with a normal distribution")); if (pbc->fHeuristic) sz += sprintf(sz, " - %s\n", _("with heuristic moves")); sz += sprintf(sz, " - %s\n", pbc->fGammon ? _("database includes gammon distributions") : _("database does not include gammon distributions")); break; case BEAROFF_HYPERGAMMON: case BEAROFF_INVALID: default: break; } sprintf(sz, "\n"); } static int BearoffDumpTwoSided(const bearoffcontext * pbc, const TanBoard anBoard, char *sz) { unsigned int nUs = PositionBearoff(anBoard[1], pbc->nPoints, pbc->nChequers); unsigned int nThem = PositionBearoff(anBoard[0], pbc->nPoints, pbc->nChequers); unsigned int n = Combination(pbc->nPoints + pbc->nChequers, pbc->nPoints); unsigned int iPos = nUs * n + nThem; float ar[4]; const char *aszEquity[] = { N_("Cubeless equity"), N_("Owned cube"), N_("Centered cube"), N_("Opponent owns cube") }; sprintf(sz + strlen(sz), "%19s %14s\n%s %12u %12u\n\n", _("Player"), _("Opponent"), _("Position"), nUs, nThem); ReadTwoSidedBearoff(pbc, iPos, ar, NULL); if (pbc->fCubeful) for (int i = 0; i < 4; ++i) sprintf(sz + strlen(sz), "%-30.30s: %+7.4f\n", gettext(aszEquity[i]), ar[i]); else sprintf(sz + strlen(sz), "%-30.30s: %+7.4f\n", gettext(aszEquity[0]), 2.0f * ar[0] - 1.0f); strcat(sz, "\n"); return 0; } static int BearoffDumpOneSided(const bearoffcontext * pbc, const TanBoard anBoard, char *sz) { unsigned int nUs = PositionBearoff(anBoard[1], pbc->nPoints, pbc->nChequers); unsigned int nThem = PositionBearoff(anBoard[0], pbc->nPoints, pbc->nChequers); float ar[2][4]; unsigned int i; float aarProb[2][32], aarGammonProb[2][32]; int f0, f1, f2, f3; unsigned int anPips[2]; const float x = (2 * 3 + 3 * 4 + 4 * 5 + 4 * 6 + 6 * 7 + 5 * 8 + 4 * 9 + 2 * 10 + 2 * 11 + 1 * 12 + 1 * 16 + 1 * 20 + 1 * 24) / 36.0f; if (BearoffDist(pbc, nUs, aarProb[0], aarGammonProb[0], ar[0], NULL, NULL)) return -1; if (BearoffDist(pbc, nThem, aarProb[1], aarGammonProb[1], ar[1], NULL, NULL)) return -1; sz += sprintf(sz, "%19s %14s\n%s %12u %12u\n\n", _("Player"), _("Opponent"), _("Position"), nUs, nThem); sz += sprintf(sz, "%s \t\t\t\t%s\n", _("Bearing off"), _("Bearing at least one chequer off")); sz += sprintf(sz, "%s\t%s\t%s\t%s\t%s\n", _("Rolls"), _("Player"), _("Opponent"), _("Player"), _("Opponent")); f0 = f1 = f2 = f3 = FALSE; for (i = 0; i < 32; i++) { if (aarProb[0][i] > 0.0f) f0 = TRUE; if (aarProb[1][i] > 0.0f) f1 = TRUE; if (aarGammonProb[0][i] > 0.0f) f2 = TRUE; if (aarGammonProb[1][i] > 0.0f) f3 = TRUE; if (f0 || f1 || f2 || f3) { if (f0 && f1 && ((f2 && f3) || !pbc->fGammon) && aarProb[0][i] == 0.0f && aarProb[1][i] == 0.0f && ((aarGammonProb[0][i] == 0.0f && aarGammonProb[1][i] == 0.0f) || !pbc->fGammon)) break; sprintf(sz = sz + strlen(sz), "%5u\t%7.3f\t%7.3f" "\t\t", i, aarProb[0][i] * 100.0f, aarProb[1][i] * 100.0f); if (pbc->fGammon) sprintf(sz = sz + strlen(sz), "%7.3f\t%7.3f\n", aarGammonProb[0][i] * 100.0f, aarGammonProb[1][i] * 100.0f); else sprintf(sz = sz + strlen(sz), "%-7.7s\t%-7.7s\n", _("n/a"), _("n/a")); } } sz += sprintf(sz, "\n%s\n", _("Average rolls")); sz += sprintf(sz, "%s\t\t\t\t%s\n", _("Bearing off"), _("Saving gammon")); sz += sprintf(sz, "\t%s\t%s\t%s\t%s\n", _("Player"), _("Opponent"), _("Player"), _("Opponent")); /* mean rolls */ sz += sprintf(sz, "%s\t%7.3f\t%7.3f\t\t", _("Mean"), ar[0][0], ar[1][0]); if (pbc->fGammon) sz += sprintf(sz, "%7.3f\t%7.3f\n", ar[0][2], ar[1][2]); else sz += sprintf(sz, "%-7.7s\t%-7.7s\n", _("n/a"), _("n/a")); /* std. dev */ sz += sprintf(sz, "%s\t%7.3f\t%7.3f\t\t", _("Std dev"), ar[0][1], ar[1][1]); if (pbc->fGammon) sz += sprintf(sz, "%7.3f\t%7.3f\n", ar[0][3], ar[1][3]); else sz += sprintf(sz, "%-7.7s\t%-7.7s\n", _("n/a"), _("n/a")); /* effective pip count */ PipCount(anBoard, anPips); sz += sprintf(sz, "\n%s:\n", _("Effective pip count")); sz += sprintf(sz, "\t%s\t%s\n", _("Player"), _("Opponent")); sz += sprintf(sz, "%s\t%7.3f\t%7.3f\n%s\t%7.3f\t%7.3f\n\n", _("EPC"), ar[0][0] * x, ar[1][0] * x, _("Wastage"), ar[0][0] * x - (float) anPips[1], ar[1][0] * x - (float) anPips[0]); sprintf(sz, "%s = %5.3f * %s\n%s = %s - %s\n\n", _("EPC"), x, _("Average rolls"), _("Wastage"), _("EPC"), _("pips")); return 0; } static int BearoffDumpHyper(const bearoffcontext * pbc, const TanBoard anBoard, char *sz) { unsigned int nUs = PositionBearoff(anBoard[1], pbc->nPoints, pbc->nChequers); unsigned int nThem = PositionBearoff(anBoard[0], pbc->nPoints, pbc->nChequers); unsigned int n = Combination(pbc->nPoints + pbc->nChequers, pbc->nPoints); unsigned int iPos = nUs * n + nThem; float ar[4]; unsigned int i; const char *aszEquity[] = { N_("Owned cube"), N_("Centered cube"), N_("Centered cube (Jacoby rule)"), N_("Opponent owns cube") }; if (BearoffHyper(pbc, iPos, NULL, ar)) return -1; sprintf(sz + strlen(sz), "%19s %14s\n%s %12u %12u\n\n", _("Player"), _("Opponent"), _("Position"), nUs, nThem); for (i = 0; i < 4; ++i) sprintf(sz + strlen(sz), "%-30.30s: %+7.4f\n", gettext(aszEquity[i]), ar[i]); return 0; } extern int BearoffDump(const bearoffcontext * pbc, const TanBoard anBoard, char *sz) { g_return_val_if_fail(pbc, -1); switch (pbc->bt) { case BEAROFF_TWOSIDED: return BearoffDumpTwoSided(pbc, anBoard, sz); case BEAROFF_ONESIDED: return BearoffDumpOneSided(pbc, anBoard, sz); case BEAROFF_HYPERGAMMON: return BearoffDumpHyper(pbc, anBoard, sz); case BEAROFF_INVALID: default: g_warning(_("Invalid bearoff database type")); return -1; } } extern void BearoffClose(bearoffcontext * pbc) { if (!pbc) return; if (pbc->pf) fclose(pbc->pf); if (pbc->map) { g_mapped_file_unref(pbc->map); pbc->p = NULL; } if (pbc->p) free(pbc->p); if (pbc->szFilename) g_free(pbc->szFilename); g_free(pbc); } static unsigned char * ReadIntoMemory(bearoffcontext * pbc) { GError *error = NULL; pbc->map = g_mapped_file_new(pbc->szFilename, FALSE, &error); if (!pbc->map) { g_printerr(_("%s: Failed to map bearoff database %s\n"), pbc->szFilename, error->message); g_error_free(error); return NULL; } pbc->p = (unsigned char *) g_mapped_file_get_contents(pbc->map); return pbc->p; } /* * Check whether this is a exact bearoff file * * The first long must be 73457356 * The second long must be 100 * */ static inline unsigned int MakeInt(unsigned char a, unsigned char b, unsigned char c, unsigned char d) { return (a | b << 8 | c << 16 | d << 24); } static void InvalidDb(bearoffcontext * pbc) { if (errno) { const char *fn = pbc->szFilename ? pbc->szFilename : ""; g_printerr("%s(%s): %s\n", _("Bearoff Database"), fn, g_strerror(errno)); } BearoffClose(pbc); } /* * Initialise bearoff database * * Input: * szFilename: the filename of the database to open * * Returns: * pointer to bearoff context on succes; NULL on error * * Garbage collect: * caller must free returned pointer if not NULL. * */ extern bearoffcontext * BearoffInit(const char *szFilename, const unsigned int bo, void (*p) (unsigned int)) { bearoffcontext *pbc; char sz[41]; pbc = g_new0(bearoffcontext, 1); if (bo & BO_HEURISTIC) { pbc->bt = BEAROFF_ONESIDED; pbc->nPoints = HEURISTIC_P; pbc->nChequers = HEURISTIC_C; pbc->fHeuristic = TRUE; pbc->p = HeuristicDatabase(p); return pbc; } errno = 0; if (!szFilename || !*szFilename) { g_printerr("%s\n", _("No database filename provided")); InvalidDb(pbc); return NULL; } pbc->szFilename = g_strdup(szFilename); if (!g_file_test(szFilename, G_FILE_TEST_IS_REGULAR)) { /* fail silently */ errno = 0; InvalidDb(pbc); return NULL; } if ((pbc->pf = g_fopen(szFilename, "rb")) == 0) { g_printerr("%s\n", _("Invalid or nonexistent database")); InvalidDb(pbc); return NULL; } /* * Read header bearoff file */ /* read header */ if (fread(sz, 1, 40, pbc->pf) < 40) { g_printerr("%s\n", _("Database read failed")); InvalidDb(pbc); return NULL; } /* detect bearoff program */ if (strncmp(sz, "gnubg", 5) != 0) { g_printerr("%s\n", _("Unknown bearoff database")); InvalidDb(pbc); return NULL; } /* one sided or two sided? */ if (!strncmp(sz + 6, "TS", 2)) pbc->bt = BEAROFF_TWOSIDED; else if (!strncmp(sz + 6, "OS", 2)) pbc->bt = BEAROFF_ONESIDED; else if (*(sz + 6) == 'H') pbc->bt = BEAROFF_HYPERGAMMON; else { g_printerr("%s: %s\n (%s: '%2s')\n", szFilename, _("incomplete bearoff database"), _("illegal bearoff type"), sz + 6); InvalidDb(pbc); return NULL; } if (((bo & BO_MUST_BE_ONE_SIDED) && (pbc->bt != BEAROFF_ONESIDED)) || ((bo & BO_MUST_BE_TWO_SIDED) && (pbc->bt != BEAROFF_TWOSIDED))) { g_printerr("%s: %s\n (%s: '%2s')\n", szFilename, _("incorrect bearoff database"), _("wrong bearoff type"), sz + 6); InvalidDb(pbc); return NULL; } if (pbc->bt == BEAROFF_TWOSIDED || pbc->bt == BEAROFF_ONESIDED) { /* normal onesided or twosided bearoff database */ /* number of points */ pbc->nPoints = (unsigned) atoi(sz + 9); if (pbc->nPoints < 1 || pbc->nPoints >= 24) { g_printerr("%s: %s\n (%s: %u)\n", szFilename, _("incomplete bearoff database"), _("illegal number of points"), pbc->nPoints); InvalidDb(pbc); return NULL; } /* number of chequers */ pbc->nChequers = (unsigned) atoi(sz + 12); if (pbc->nChequers < 1 || pbc->nChequers > 15) { g_printerr("%s: %s\n (%s: %u)", szFilename, _("incomplete bearoff database"), _("illegal number of chequers"), pbc->nChequers); InvalidDb(pbc); return NULL; } } else { /* hypergammon database */ pbc->nPoints = 25; pbc->nChequers = (unsigned) atoi(sz + 7); } switch (pbc->bt) { case BEAROFF_TWOSIDED: /* options for two-sided dbs */ pbc->fCubeful = atoi(sz + 15); break; case BEAROFF_ONESIDED: /* options for one-sided dbs */ pbc->fGammon = atoi(sz + 15); pbc->fCompressed = atoi(sz + 17); pbc->fND = atoi(sz + 19); break; case BEAROFF_HYPERGAMMON: case BEAROFF_INVALID: default: break; } /* * read database into memory if requested */ if (bo & BO_IN_MEMORY) { fclose(pbc->pf); pbc->pf = NULL; if ((ReadIntoMemory(pbc) == NULL)) if ((pbc->pf = g_fopen(szFilename, "rb")) == 0) { g_printerr("%s\n", _("Invalid or nonexistent database")); InvalidDb(pbc); return NULL; } } return pbc; } extern float fnd(const float x, const float mu, const float sigma) { const float epsilon = 1.0e-7f; if (sigma <= epsilon) /* dirac delta function */ return (fabsf(mu - x) < epsilon) ? 1.0f : 0.0f; else { float xm = (x - mu) / sigma; return 1.0f / (sigma * sqrtf(2.0f * F_PI)) * expf(-xm * xm / 2.0f); } } static int ReadBearoffOneSidedND(const bearoffcontext * pbc, const unsigned int nPosID, float arProb[32], float arGammonProb[32], float *ar, unsigned short int ausProb[32], unsigned short int ausGammonProb[32]) { unsigned char ac[16]; float arx[4]; int i; float r; ReadBearoffFile(pbc, 40 + nPosID * 16, ac, 16); memcpy(arx, ac, 16); if (arProb || ausProb) for (i = 0; i < 32; ++i) { r = fnd((float) i, arx[0], arx[1]); if (arProb) arProb[i] = r; if (ausProb) ausProb[i] = (unsigned short) (r * 65535.0f); } if (arGammonProb || ausGammonProb) for (i = 0; i < 32; ++i) { r = fnd((float) i, arx[2], arx[3]); if (arGammonProb) arGammonProb[i] = r; if (ausGammonProb) ausGammonProb[i] = (unsigned short) (r * 65535.0f); } if (ar) memcpy(ar, arx, 16); return 0; } static void AssignOneSided(float arProb[32], float arGammonProb[32], float ar[4], unsigned short int ausProb[32], unsigned short int ausGammonProb[32], const unsigned short int ausProbx[32], const unsigned short int ausGammonProbx[32]) { if (ausProb) memcpy(ausProb, ausProbx, 32 * sizeof(ausProb[0])); if (ausGammonProb) memcpy(ausGammonProb, ausGammonProbx, 32 * sizeof(ausGammonProbx[0])); if (ar || arProb || arGammonProb) { float arx[64]; int i; for (i = 0; i < 32; ++i) arx[i] = ausProbx[i] / 65535.0f; for (i = 0; i < 32; ++i) arx[32 + i] = ausGammonProbx[i] / 65535.0f; if (arProb) memcpy(arProb, arx, 32 * sizeof(float)); if (arGammonProb) memcpy(arGammonProb, arx + 32, 32 * sizeof(float)); if (ar) { AverageRolls(arx, ar); AverageRolls(arx + 32, ar + 2); } } } static void CopyBytes(unsigned short int aus[64], const unsigned char ac[128], const unsigned int nz, const unsigned int ioff, const unsigned int nzg, const unsigned int ioffg) { unsigned int i, j; i = 0; memset(aus, 0, 64 * sizeof(unsigned short int)); for (j = 0; j < nz; ++j, i += 2) aus[ioff + j] = ac[i] | (unsigned short int) (ac[i + 1] << 8); for (j = 0; j < nzg; ++j, i += 2) aus[32 + ioffg + j] = (unsigned short int) (ac[i] | ac[i + 1] << 8); } static unsigned short int * GetDistCompressed(unsigned short int aus[64], const bearoffcontext * pbc, const unsigned int nPosID) { unsigned char *puch; unsigned char ac[128]; unsigned int iOffset; unsigned int nBytes; unsigned int ioff, nz, ioffg = 0, nzg = 0; unsigned int nPos = Combination(pbc->nPoints + pbc->nChequers, pbc->nPoints); unsigned int index_entry_size = pbc->fGammon ? 8 : 6; /* find offsets and no. of non-zero elements */ if (pbc->p) /* database is in memory */ puch = pbc->p + 40 + nPosID * index_entry_size; else { ReadBearoffFile(pbc, 40 + nPosID * index_entry_size, ac, index_entry_size); puch = ac; } /* find offset */ iOffset = MakeInt(puch[0], puch[1], puch[2], puch[3]); nz = puch[4]; ioff = puch[5]; if (pbc->fGammon) { nzg = puch[6]; ioffg = puch[7]; } /* Sanity checks */ if ((iOffset > 64 * nPos && 64 * nPos > 0) || nz > 32 || ioff > 32 || nzg > 32 || ioffg > 32) { fprintf(stderr, _("The bearoff file '%s' is likely to be corrupted.\n"), pbc->szFilename); #if !defined(G_DISABLE_ASSERT) fprintf(stderr, "Offset %lu, dist size %u (offset %u), " "gammon dist size %u (offset %u)\n", (unsigned long) iOffset, nz, ioff, nzg, ioffg); #endif g_assert_not_reached(); } /* read prob + gammon probs */ iOffset = 40 /* the header */ + nPos * index_entry_size /* the offset data */ + 2 * iOffset; /* offset to current position */ /* read values */ nBytes = 2 * (nz + nzg); /* get distribution */ if (pbc->p) /* from memory */ puch = pbc->p + iOffset; else { /* from disk */ ReadBearoffFile(pbc, iOffset, ac, nBytes); puch = ac; } CopyBytes(aus, puch, nz, ioff, nzg, ioffg); return aus; } static unsigned short int * GetDistUncompressed(unsigned short int aus[64], const bearoffcontext * pbc, const unsigned int nPosID) { unsigned char ac[128]; unsigned char *puch; unsigned int iOffset; /* read from file */ iOffset = 40 + 64 * nPosID * (pbc->fGammon ? 2 : 1); if (pbc->p) /* from memory */ puch = pbc->p + iOffset; else { /* from disk */ ReadBearoffFile(pbc, iOffset, ac, pbc->fGammon ? 128 : 64); puch = ac; } CopyBytes(aus, puch, 32, 0, 32, 0); return aus; } static int ReadBearoffOneSidedExact(const bearoffcontext * pbc, const unsigned int nPosID, float arProb[32], float arGammonProb[32], float ar[4], unsigned short int ausProb[32], unsigned short int ausGammonProb[32]) { unsigned short int aus[64]; unsigned short int *pus = NULL; /* get distribution */ if (pbc->fCompressed) pus = GetDistCompressed(aus, pbc, nPosID); else pus = GetDistUncompressed(aus, pbc, nPosID); if (!pus) { printf(_("Error decoding one-sided bearoff database entry; position %u\n"), nPosID); return -1; } AssignOneSided(arProb, arGammonProb, ar, ausProb, ausGammonProb, pus, pus + 32); return 0; } extern int BearoffDist(const bearoffcontext * pbc, const unsigned int nPosID, float arProb[32], float arGammonProb[32], float ar[4], unsigned short int ausProb[32], unsigned short int ausGammonProb[32]) { g_return_val_if_fail(pbc, -1); g_return_val_if_fail(pbc->bt == BEAROFF_ONESIDED, -1); if (pbc->fND) return ReadBearoffOneSidedND(pbc, nPosID, arProb, arGammonProb, ar, ausProb, ausGammonProb); else return ReadBearoffOneSidedExact(pbc, nPosID, arProb, arGammonProb, ar, ausProb, ausGammonProb); } extern int isBearoff(const bearoffcontext * pbc, const TanBoard anBoard) { unsigned int i, nOppBack, nBack; unsigned int n = 0, nOpp = 0; if (!pbc) return FALSE; for (nOppBack = 24; nOppBack > 0; nOppBack--) { if (anBoard[0][nOppBack]) break; } for (nBack = 24; nBack > 0; nBack--) { if (anBoard[1][nBack]) break; } if (!anBoard[0][nOppBack] || !anBoard[1][nBack]) /* the game is over */ return FALSE; if ((nBack + nOppBack > 22) && !(pbc->bt == BEAROFF_HYPERGAMMON)) /* contact position */ return FALSE; for (i = 0; i <= nOppBack; ++i) nOpp += anBoard[0][i]; for (i = 0; i <= nBack; ++i) n += anBoard[1][i]; if (n <= pbc->nChequers && nOpp <= pbc->nChequers && nBack < pbc->nPoints && nOppBack < pbc->nPoints) return TRUE; else return FALSE; } gnubg-1.08.003/relational.h000644 001751 000024 00000002552 14574155047 015143 0ustar00pmstaff000000 000000 /* * Copyright (C) 2004 Joern Thyssen * Copyright (C) 2004-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: relational.h,v 1.17 2019/12/24 09:02:43 plm Exp $ */ #ifndef RELATIONAL_H #define RELATIONAL_H #include #include #include "analysis.h" #include "dbprovider.h" #define DB_VERSION 1 extern int RelationalUpdatePlayerDetails(const char *oldName, const char *newName, const char *newNotes); extern statcontext *relational_player_stats_get(const char *player0, const char *player1); static inline float Ratiof(float a, int b) { return b ? a / (float) b : 0.0f; } static inline double Ratio(double a, int b) { return b ? a / (double) b : 0.0f; } #endif /* RELATIONAL_H */ gnubg-1.08.003/gtkuidefs.h000644 001751 000024 00000030445 14574155047 015000 0ustar00pmstaff000000 000000 /* * Copyright (C) 2011 Michael Petch * Copyright (C) 2013-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkuidefs.h,v 1.9 2023/09/05 20:34:21 plm Exp $ */ #define GNUBG_MAIN_UI \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ \ "" \ \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ \ "" \ \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" \ \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ "" \ \ "" #define UIADDITIONS3D \ "" \ "" \ " " \ " " \ " " \ "" \ "" gnubg-1.08.003/randomorg.h000644 001751 000024 00000002740 14574155047 015000 0ustar00pmstaff000000 000000 /* * Copyright (C) 2015 Michael Petch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: randomorg.h,v 1.4 2020/02/23 21:07:07 plm Exp $ */ #ifndef RANDOMORG_H #define RANDOMORG_H #include /*#define RANDOMORG_DEBUG 1 */ #define STRINGIZEAUX(num) #num #define STRINGIZE(num) STRINGIZEAUX(num) #define RANDOMORGSITE "www.random.org" #define BUFLENGTH 500 #define BUFLENGTH_STR STRINGIZE(BUFLENGTH) #define RANDOMORG_URL "https://" RANDOMORGSITE "/integers/?num=" \ BUFLENGTH_STR "&min=0&max=5&col=1&base=10&format=plain&rnd=new" #define RANDOMORG_USERAGENT "GNUbg/" VERSION " (" PACKAGE_BUGREPORT ")" #define RANDOMORG_CERTPATH ".\\etc\\ssl\\" #define RANDOMORG_CABUNDLE "ca-bundle.crt" typedef struct { size_t nNumRolls; int nCurrent; unsigned int anBuf[BUFLENGTH]; } RandomData; extern unsigned int getDiceRandomDotOrg(void); #endif gnubg-1.08.003/dbprovider.c000644 001751 000024 00000053613 14605051561 015137 0ustar00pmstaff000000 000000 /* * Copyright (C) 2008-2009 Jon Kinsey * Copyright (C) 2008-2019 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: dbprovider.c,v 1.63 2023/12/18 21:14:48 plm Exp $ */ #include "config.h" #include "gnubgmodule.h" #include "backgammon.h" #include "dbprovider.h" #include #include #include DBProviderType dbProviderType = (DBProviderType)INVALID_PROVIDER ; int storeGameStats = TRUE; #if defined(USE_PYTHON) #include "pylocdefs.h" static PyObject *pdict; static RowSet *ConvertPythonToRowset(PyObject * v); #if !defined(USE_SQLITE) static int PySQLiteConnect(const char *dbfilename, const char *user, const char *password, const char *hostname); #endif static int PyMySQLConnect(const char *dbfilename, const char *user, const char *password, const char *hostname); static void PyDisconnect(void); static RowSet *PySelect(const char *str); static int PyUpdateCommand(const char *str); static void PyCommit(void); static int PyPostgreConnect(const char *dbfilename, const char *user, const char *password, const char *hostname); static GList *PyPostgreGetDatabaseList(const char *user, const char *password, const char *hostname); static int PyPostgreDeleteDatabase(const char *dbfilename, const char *user, const char *password, const char *hostname); static GList *PyMySQLGetDatabaseList(const char *user, const char *password, const char *hostname); static int PyMySQLDeleteDatabase(const char *dbfilename, const char *user, const char *password, const char *hostname); #endif #if defined(USE_SQLITE) static int SQLiteConnect(const char *dbfilename, const char *user, const char *password, const char *hostname); static void SQLiteDisconnect(void); static RowSet *SQLiteSelect(const char *str); static int SQLiteUpdateCommand(const char *str); static void SQLiteCommit(void); #endif #if NUM_PROVIDERS static int SQLiteDeleteDatabase(const char *dbfilename, const char *user, const char *password, const char *hostname); static GList *SQLiteGetDatabaseList(const char *user, const char *password, const char *hostname); static DBProvider providers[NUM_PROVIDERS] = { #if defined(USE_SQLITE) { .Connect = SQLiteConnect, .Disconnect = SQLiteDisconnect, .Select = SQLiteSelect, .UpdateCommand = SQLiteUpdateCommand, .Commit = SQLiteCommit, .GetDatabaseList = SQLiteGetDatabaseList, .DeleteDatabase = SQLiteDeleteDatabase, .name = "SQLite", .shortname = "SQLite", .desc = N_("Direct SQLite3 connection"), .HasUserDetails = FALSE, .storeGameStats = TRUE, .database = NULL, .username = NULL, .password = NULL, .hostname = NULL }, #endif #if defined(USE_PYTHON) #if !defined(USE_SQLITE) { .Connect = PySQLiteConnect, .Disconnect = PyDisconnect, .Select = PySelect, .UpdateCommand = PyUpdateCommand, .Commit = PyCommit, .GetDatabaseList = SQLiteGetDatabaseList, .DeleteDatabase = SQLiteDeleteDatabase, .name = "SQLite (Python)", .shortname = "PythonSQLite", .desc = N_("SQLite3 connection via Python"), .HasUserDetails = FALSE, .storeGameStats = TRUE, .database = NULL, .username = NULL, .password = NULL, .hostname = NULL }, #endif { .Connect = PyMySQLConnect, .Disconnect = PyDisconnect, .Select = PySelect, .UpdateCommand = PyUpdateCommand, .Commit = PyCommit, .GetDatabaseList = PyMySQLGetDatabaseList, .DeleteDatabase = PyMySQLDeleteDatabase, .name = "MySQL (Python)", .shortname = "PythonMySQL", .desc = N_("MySQL/MariaDB connection via MySQLdb Python module"), .HasUserDetails = TRUE, .storeGameStats = TRUE, .database = NULL, .username = NULL, .password = NULL, .hostname = NULL }, { .Connect = PyPostgreConnect, .Disconnect = PyDisconnect, .Select = PySelect, .UpdateCommand = PyUpdateCommand, .Commit = PyCommit, .GetDatabaseList = PyPostgreGetDatabaseList, .DeleteDatabase = PyPostgreDeleteDatabase, .name = "PostgreSQL (Python)", .shortname = "PythonPostgre", .desc = N_("PostgreSQL connection via PyGreSQL Python module"), .HasUserDetails = TRUE, .storeGameStats = TRUE, .database = NULL, .username = NULL, .password = NULL, .hostname = NULL } #endif }; #else DBProvider providers[1] = { { .Connect = NULL, .Disconnect = NULL, .Select = NULL, .UpdateCommand = NULL, .Commit = NULL, .GetDatabaseList = NULL, .DeleteDatabase = NULL, .name = "No Providers", .shortname = "No Providers", .desc = N_("No database providers"), .HasUserDetails = FALSE, .storeGameStats = FALSE, .database = NULL, .username = NULL, .password = NULL, .hostname = NULL } }; #endif #if defined(USE_PYTHON) || defined(USE_SQLITE) static RowSet * MallocRowset(size_t rows, size_t cols) { size_t i; RowSet *pRow = g_malloc(sizeof(RowSet)); pRow->widths = (size_t *) g_malloc(cols * sizeof(size_t)); memset(pRow->widths, 0, cols * sizeof(size_t)); pRow->data = g_malloc(rows * sizeof(char **)); for (i = 0; i < rows; i++) { pRow->data[i] = g_malloc(cols * sizeof(char *)); memset(pRow->data[i], 0, cols * sizeof(char *)); } pRow->cols = cols; pRow->rows = rows; return pRow; } static void SetRowsetData( /*lint -e{818} */ RowSet * rs, size_t row, size_t col, const char *data) { size_t size; if (!data) data = ""; rs->data[row][col] = g_strdup(data); size = strlen(data); if (row == 0 || size > rs->widths[col]) rs->widths[col] = size; } #endif extern void FreeRowset(RowSet * pRow) { if (pRow != NULL) { g_free(pRow->widths); if (pRow->data != NULL) { unsigned int i, j; for (i = 0; i < pRow->rows; i++) { for (j = 0; j < pRow->cols; j++) { g_free(pRow->data[i][j]); } g_free(pRow->data[i]); } } g_free(pRow->data); } g_free(pRow); } int RunQueryValue(const DBProvider * pdb, const char *query) { RowSet *rs; rs = pdb->Select(query); if (rs && rs->rows > 1) { int id = (int)strtol(rs->data[1][0], NULL, 0); FreeRowset(rs); return id; } else { FreeRowset(rs); return -1; } } extern RowSet * RunQuery(const char *sz) { DBProvider *pdb; if ((pdb = ConnectToDB(dbProviderType)) != NULL) { RowSet *rs = pdb->Select(sz); pdb->Disconnect(); return rs; } return NULL; } const char * GetProviderName(int i) { return providers[i].name; } static DBProviderType GetTypeFromName(const char *name) { int i; for (i = 0; i < NUM_PROVIDERS; i++) { if (!StrCaseCmp(providers[i].shortname, name)) break; } if (i == NUM_PROVIDERS) return INVALID_PROVIDER; return (DBProviderType) i; } void DefaultDBSettings(void) { #if NUM_PROVIDERS int i = 0; #if defined(USE_SQLITE) /* native sqlite3 */ providers[i++].database = g_strdup("gnubg"); #endif #if defined(USE_PYTHON) #if !defined(USE_SQLITE) /* sqlite3 via Python */ providers[i++].database = g_strdup("gnubg"); #endif /* MySQL / MariaDB */ providers[i].hostname = g_strdup("localhost:3306"); providers[i++].database = g_strdup("gnubg"); /* PostgreSQL */ providers[i].hostname = g_strdup("localhost:5432"); providers[i++].database = g_strdup("gnubg"); #endif #endif } void SetDBParam(const char *db, const char *key, const char *value) { DBProviderType type = GetTypeFromName(db); if (type == INVALID_PROVIDER) return; if (!StrCaseCmp(key, "database")) { g_free(providers[type].database); providers[type].database= g_strdup(value); } else if (!StrCaseCmp(key, "username")) { g_free(providers[type].username); providers[type].username = g_strdup(value); } else if (!StrCaseCmp(key, "password")) { g_free(providers[type].password); providers[type].password = g_strdup(value); } else if (!StrCaseCmp(key, "hostname")) { g_free(providers[type].hostname); providers[type].hostname = g_strdup(value); } } void SetDBType(const char *type) { dbProviderType = GetTypeFromName(type); } void SetDBSettings(DBProviderType dbType, const char *database, const char *user, const char *password, const char *hostname) { dbProviderType = dbType; g_free(providers[dbProviderType].database); providers[dbProviderType].database = g_strdup(database); g_free(providers[dbProviderType].username); providers[dbProviderType].username = g_strdup(user); g_free(providers[dbProviderType].password); providers[dbProviderType].password = g_strdup(password); g_free(providers[dbProviderType].hostname); providers[dbProviderType].hostname = g_strdup(hostname); } void RelationalSaveSettings(FILE * pf) { int i; fprintf(pf, "relational setup storegamestats=%s\n", storeGameStats ? "yes" : "no"); if (dbProviderType != INVALID_PROVIDER) fprintf(pf, "relational setup dbtype=%s\n", providers[dbProviderType].shortname); for (i = 0; i < NUM_PROVIDERS; i++) { DBProvider *pdb = GetDBProvider((DBProviderType) i); g_assert(pdb != NULL); if (pdb == NULL) return; fprintf(pf, "relational setup %s-database=%s\n", providers[i].shortname, pdb->database); fprintf(pf, "relational setup %s-username=%s\n", providers[i].shortname, pdb->username); fprintf(pf, "relational setup %s-password=%s\n", providers[i].shortname, pdb->password); fprintf(pf, "relational setup %s-hostname=%s\n", providers[i].shortname, pdb->hostname); } } extern DBProvider * GetDBProvider(DBProviderType dbType) { #if defined(USE_PYTHON) static int setup = FALSE; if (!setup) { if (LoadPythonFile("database.py", FALSE) == 0) { PyObject *m; /* Get main python dictionary */ if ((m = PyImport_AddModule("__main__")) == NULL) { outputl(_("Error importing 'main' module")); } else { pdict = PyModule_GetDict(m); setup = TRUE; } } if (!setup) return NULL; } #endif #if !NUM_PROVIDERS (void) dbType; /* suppress unused parameter compiler warning */ return NULL; #else if (dbType == INVALID_PROVIDER) return NULL; return &providers[dbType]; #endif } #if defined(USE_PYTHON) int PyMySQLConnect(const char *dbfilename, const char *user, const char *password, const char *hostname) { long iret; PyObject *ret; const char *host = hostname ? hostname : ""; char *buf = g_strdup_printf("PyMySQLConnect(r'%s', '%s', '%s', '%s')", dbfilename, user, password, host); /* Connect to database */ ret = PyRun_String(buf, Py_eval_input, pdict, pdict); g_free(buf); if (ret == NULL || !PyInt_Check(ret) || (iret = PyInt_AsLong(ret)) < 0) { PyErr_Print(); return -1; } else if (iret == 0L) { /* New database - populate */ return 0; } return 1; } int PyPostgreConnect(const char *dbfilename, const char *user, const char *password, const char *hostname) { long iret; PyObject *ret; const char *host = hostname ? hostname : ""; char *buf = g_strdup_printf("PyPostgreConnect(r'%s', '%s', '%s', '%s')", dbfilename, user, password, host); /* Connect to database */ ret = PyRun_String(buf, Py_eval_input, pdict, pdict); g_free(buf); if (ret == NULL || !PyInt_Check(ret) || (iret = PyInt_AsLong(ret)) < 0) { PyErr_Print(); return -1; } else if (iret == 0L) { /* New database - populate */ return 0; } return 1; } #if !defined(USE_SQLITE) static int PySQLiteConnect(const char *dbfilename, const char *UNUSED(user), const char *UNUSED(password), const char *UNUSED(hostname)) { PyObject *con; char *name, *filename, *buf; int exists; name = g_strdup_printf("%s.db", dbfilename); filename = g_build_filename(szHomeDirectory, name, NULL); exists = g_file_test(filename, G_FILE_TEST_EXISTS); buf = g_strdup_printf("PySQLiteConnect(r'%s')", filename); /* Connect to database */ con = PyRun_String(buf, Py_eval_input, pdict, pdict); g_free(name); g_free(filename); g_free(buf); if (con == NULL) { PyErr_Print(); return -1; } else if (con == Py_None) { outputl(_("Error connecting to database")); return -1; } if (!exists) { /* Empty database file created - create tables */ return 0; } else return 1; } #endif static void PyDisconnect(void) { if (!PyRun_String("PyDisconnect()", Py_eval_input, pdict, pdict)) PyErr_Print(); } RowSet * PySelect(const char *str) { PyObject *rs; char *buf = g_strdup_printf("PySelect(\"%s\")", str); /* Remove any new lines from query string */ char *ppch = buf; while (*ppch) { if (strchr("\t\n\r\v\f", *ppch)) *ppch = ' '; ppch++; } /* Run select */ rs = PyRun_String(buf, Py_eval_input, pdict, pdict); g_free(buf); if (rs) { return ConvertPythonToRowset(rs); } else { PyErr_Print(); return NULL; } } int PyUpdateCommand(const char *str) { char *buf = g_strdup_printf("PyUpdateCommand(\"%s\")", str); /* Run update */ PyObject *ret = PyRun_String(buf, Py_eval_input, pdict, pdict); g_free(buf); if (!ret) { PyErr_Print(); return FALSE; } else return TRUE; } static void PyCommit(void) { if (!PyRun_String("PyCommit()", Py_eval_input, pdict, pdict)) PyErr_Print(); } static RowSet * ConvertPythonToRowset(PyObject * v) { RowSet *pRow; Py_ssize_t row, col; int i, j; if (PyInt_Check(v)) { if (PyInt_AsLong(v) != 0) outputerrf(_("unexpected rowset error")); return NULL; } if (!PySequence_Check(v)) { outputerrf(_("invalid Python return")); return NULL; } row = PySequence_Size(v); col = 0; if (row > 0) { PyObject *cols = PySequence_GetItem(v, 0); if (!PySequence_Check(cols)) { outputerrf(_("invalid Python return")); return NULL; } else col = PySequence_Size(cols); } pRow = MallocRowset((size_t) row, (size_t) col); for (i = 0; i < (int) pRow->rows; i++) { PyObject *e = PySequence_GetItem(v, i); if (!e) { outputf(_("Error getting item %d\n"), i); continue; } if (PySequence_Check(e)) { for (j = 0; j < (int) pRow->cols; j++) { char buf[1024]; PyObject *e2 = PySequence_GetItem(e, j); if (!e2) { outputf(_("Error getting sub item (%d, %d)\n"), i, j); continue; } if (PyUnicode_Check(e2)) g_strlcpy(buf, PyBytes_AsString(PyUnicode_AsUTF8String(e2)), sizeof(buf)); else if (PyBytes_Check(e2)) g_strlcpy(buf, PyBytes_AsString(e2), sizeof(buf)); else if (PyInt_Check(e2) || PyLong_Check(e2) || !StrCaseCmp(e2->ob_type->tp_name, "Decimal")) /* Not sure how to check for decimal type directly */ sprintf(buf, "%ld", PyInt_AsLong(e2)); else if (PyFloat_Check(e2)) sprintf(buf, "%.4f", PyFloat_AsDouble(e2)); else if (e2 == Py_None) sprintf(buf, "[%s]", _("none")); else sprintf(buf, "[%s]", _("unknown type")); SetRowsetData(pRow, (size_t) i, (size_t) j, buf); Py_DECREF(e2); } } else { outputf(_("Item %d is not a list\n"), i); } Py_DECREF(e); } return pRow; } GList * PyMySQLGetDatabaseList(const char *user, const char *password, const char *hostname) { PyObject *rs; if (PyMySQLConnect("", user, password, hostname) < 0) return NULL; rs = PyRun_String("PyUpdateCommandReturn(\"Show databases\")", Py_eval_input, pdict, pdict); if (rs) { unsigned int i; GList *glist = NULL; RowSet *list = ConvertPythonToRowset(rs); if (!list) return NULL; for (i = 0; i < list->rows; i++) glist = g_list_append(glist, g_strdup(list->data[i][0])); FreeRowset(list); return glist; } else { PyErr_Print(); return NULL; } } GList * PyPostgreGetDatabaseList(const char *user, const char *password, const char *hostname) { RowSet *rs; if (PyPostgreConnect("", user, password, hostname) < 0) return NULL; rs = PySelect("datname from pg_database"); if (rs) { unsigned int i; GList *glist = NULL; for (i = 1; i < rs->rows; i++) glist = g_list_append(glist, g_strdup(rs->data[i][0])); FreeRowset(rs); return glist; } else { PyErr_Print(); return NULL; } } int PyMySQLDeleteDatabase(const char *dbfilename, const char *user, const char *password, const char *hostname) { char *buf; int ret; if (PyMySQLConnect(dbfilename, user, password, hostname) < 0) return FALSE; buf = g_strdup_printf("DROP DATABASE %s", dbfilename); ret = PyUpdateCommand(buf); g_free(buf); return ret; } int PyPostgreDeleteDatabase(const char *dbfilename, const char *user, const char *password, const char *hostname) { char *buf; int ret; if (PyPostgreConnect("postgres", user, password, hostname) < 0) return FALSE; PyUpdateCommand("END"); buf = g_strdup_printf("DROP DATABASE %s", dbfilename); ret = PyUpdateCommand(buf); g_free(buf); return ret; } #endif #if defined(USE_SQLITE) #include static sqlite3 *connection; int SQLiteConnect(const char *dbfilename, const char *UNUSED(user), const char *UNUSED(password), const char *UNUSED(hostname)) { char *name, *filename; int exists, ret; name = g_strdup_printf("%s.db", dbfilename); filename = g_build_filename(szHomeDirectory, name, NULL); exists = g_file_test(filename, G_FILE_TEST_EXISTS); ret = sqlite3_open(filename, &connection); g_free(name); g_free(filename); if (ret == SQLITE_OK) return exists ? 1 : 0; else return -1; } static void SQLiteDisconnect(void) { if (sqlite3_close(connection) != SQLITE_OK) outputerrf("SQL error: %s in sqlite3_close()", sqlite3_errmsg(connection)); } RowSet * SQLiteSelect(const char *str) { int ret; char *buf = g_strdup_printf("SELECT %s;", str); RowSet *rs = NULL; sqlite3_stmt *pStmt; #if SQLITE_VERSION_NUMBER >= 3003011 ret = sqlite3_prepare_v2(connection, buf, -1, &pStmt, NULL); #else ret = sqlite3_prepare(connection, buf, -1, &pStmt, NULL); #endif g_free(buf); if (ret == SQLITE_OK) { size_t i, row; size_t numCols = (size_t) sqlite3_column_count(pStmt); size_t numRows = 0; while ((ret = sqlite3_step(pStmt)) == SQLITE_ROW) numRows++; if (ret != SQLITE_DONE) outputerrf("SQL error: %s in sqlite3_step()", sqlite3_errmsg(connection)); if (sqlite3_reset(pStmt) != SQLITE_OK) outputerrf("SQL error: %s in sqlite3_reset()", sqlite3_errmsg(connection)); rs = MallocRowset(numRows + 1, numCols); /* first row is headings */ for (i = 0; i < numCols; i++) SetRowsetData(rs, 0, i, sqlite3_column_name(pStmt, (int) i)); row = 0; while ((ret = sqlite3_step(pStmt)) == SQLITE_ROW) { row++; for (i = 0; i < numCols; i++) SetRowsetData(rs, row, i, (const char *) sqlite3_column_text(pStmt, (int) i)); } if (ret == SQLITE_DONE) ret = SQLITE_OK; } if (ret != SQLITE_OK) outputerrf("SQL error: %s\nfrom '%s'", sqlite3_errmsg(connection), str); if (sqlite3_finalize(pStmt) != SQLITE_OK) outputerrf("SQL error: %s in sqlite3_finalize()", sqlite3_errmsg(connection)); return rs; } int SQLiteUpdateCommand(const char *str) { char *zErrMsg; int ret = sqlite3_exec(connection, str, NULL, NULL, &zErrMsg); if (ret != SQLITE_OK) { outputerrf("SQL error: %s\nfrom '%s'", zErrMsg, str); sqlite3_free(zErrMsg); } return (ret == SQLITE_OK); } static void SQLiteCommit(void) { /* No transaction in sqlite by default */ } #endif #if NUM_PROVIDERS GList * SQLiteGetDatabaseList(const char *UNUSED(user), const char *UNUSED(password), const char *UNUSED(hostname)) { GList *glist = NULL; GDir *dir = g_dir_open(szHomeDirectory, 0, NULL); if (dir) { const char *filename; while ((filename = g_dir_read_name(dir)) != NULL) { size_t len = strlen(filename); if (len > 3 && !StrCaseCmp(filename + len - 3, ".db")) { char *db = g_strdup(filename); db[len - 3] = '\0'; glist = g_list_append(glist, db); } } g_dir_close(dir); } return glist; } int SQLiteDeleteDatabase(const char *dbfilename, const char *UNUSED(user), const char *UNUSED(password), const char *UNUSED(hostname)) { char *name, *filename; int ret; name = g_strdup_printf("%s.db", dbfilename); filename = g_build_filename(szHomeDirectory, name, NULL); /* Delete database file */ ret = g_unlink(filename); g_free(filename); g_free(name); return (ret == 0); } #endif gnubg-1.08.003/gtkboard.h000644 001751 000024 00000015436 14574155047 014613 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2003 Gary Wong * Copyright (C) 2002-2016 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkboard.h,v 1.110 2020/01/19 19:26:05 Superfly_Jon Exp $ */ #ifndef GTKBOARD_H #define GTKBOARD_H #include "backgammon.h" #include #include "eval.h" #include "gtkpanels.h" #include "common.h" #include "render.h" #include "gtklocdefs.h" #define TYPE_BOARD (board_get_type ()) #define BOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BOARD, Board)) #define BOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BOARD, BoardClass)) #define IS_BOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BOARD)) #define IS_BOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_BOARD)) #define BOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_BOARD, BoardClass)) typedef struct { GtkVBoxClass parent_class; } BoardClass; typedef enum { DICE_NOT_SHOWN = 0, DICE_BELOW_BOARD, DICE_ON_BOARD, DICE_ROLLING } DiceShown; /* private data */ typedef struct { GtkWidget *drawing_area, *dice_area, *table, *wmove, *reset, *edit, *name0, *name1, *score0, *score1, *crawford, *jacoby, *widget, *key0, *key1, *stop, *stopparent, *doub, *lname0, *lname1, *lscore0, *lscore1, *mname0, *mname1, *mscore0, *mscore1, *play; GtkWidget *mmatch, *lmatch, *match; GtkAdjustment *amatch, *ascore0, *ascore1; GtkWidget *roll; GtkWidget *take, *drop, *redouble; GtkWidget *pipcount0, *pipcount1; GtkWidget *pipcountlabel0, *pipcountlabel1; GtkWidget *pwvboxcnt; gtk_locdef_surface *appmKey[2]; gboolean playing, computer_turn; gint drag_point, drag_colour, x_drag, y_drag, x_dice[2], y_dice[2], drag_button, click_time, cube_use; /* roll showing on the off-board dice */ DiceShown diceShown; TanBoard old_board; gint cube_owner; /* -1 = bottom, 0 = centred, 1 = top */ gint qedit_point; /* used to remember last point in quick edit mode */ gint resigned; gint nchequers; move *all_moves, *valid_move; movelist move_list; renderimages ri; /* remainder is from FIBS board: data */ char name[MAX_NAME_LEN], name_opponent[MAX_NAME_LEN]; gint match_to, score, score_opponent; gint points[28]; /* 0 and 25 are the bars */ gint turn; /* -1 is X, 1 is O, 0 if game over */ unsigned int diceRoll[2]; /* 0, 0 if not rolled */ guint cube; gint can_double, opponent_can_double; /* allowed to double */ gint doubled; /* -1 if X is doubling, 1 if O is doubling */ gint colour; /* -1 for player X, 1 for player O */ gint direction; /* -1 playing from 24 to 1, 1 playing from 1 to 24 */ gint home, bar; /* 0 or 25 depending on fDirection */ gint off, off_opponent; /* number of men borne off */ gint on_bar, on_bar_opponent; /* number of men on bar */ gint to_move; /* 0 to 4 -- number of pieces to move */ gint forced, crawford_game; /* unused, Crawford game flag */ gint jacoby_flag; /* jacoby enabled flag */ gint redoubles; /* number of instant redoubles allowed */ int DragTargetHelp; /* Currently showing draw targets? */ int iTargetHelpPoints[4]; /* Drag target position */ int grayBoard; /* Show board grayed when editing */ #if defined(USE_BOARD3D) BoardData3d *bd3d; /* extra members for 3d board */ #endif renderdata *rd; /* The board colour settings */ } BoardData; typedef struct { GtkVBox vboxxx; /* private data */ BoardData *board_data; } Board; typedef enum { ANIMATE_NONE, ANIMATE_BLINK, ANIMATE_SLIDE } animation; typedef enum { GUI_SHOW_PIPS_NONE, GUI_SHOW_PIPS_PIPS, GUI_SHOW_PIPS_EPC, GUI_SHOW_PIPS_WASTAGE, N_GUI_SHOW_PIPS } GuiShowPips; extern animation animGUI; extern int fGUIBeep; extern int fGUIHighDieFirst; extern int fGUIIllegal; extern int fShowIDs; extern GuiShowPips gui_show_pips; extern int fGUISetWindowPos; extern int fGUIDragTargetHelp; extern int fGUIUseStatsPanel; extern int fGUIGrayEdit; extern unsigned int nGUIAnimSpeed; extern GType board_get_type(void); extern GtkWidget *board_new(renderdata * prd, int inPreview); extern GtkWidget *board_cube_widget(Board * board); extern void DestroySetCube(GObject * po, GtkWidget * pw); extern void Copy3dDiceColour(renderdata * prd); typedef enum { MT_STANDARD, MT_FIRSTMOVE, MT_EDIT } manualDiceType; extern GtkWidget *board_dice_widget(Board * board, manualDiceType mdt); extern gint game_set(Board * board, TanBoard points, int roll, const gchar * name, const gchar * opp_name, gint match, gint score, gint opp_score, gint die0, gint die1, gint computer_turn, gint nchequers); extern void board_set_playing(Board * board, gboolean f); extern void board_animate(Board * board, int move[8], int player); extern unsigned int convert_point(int i, int player); extern void board_create_pixmaps(GtkWidget * board, BoardData * bd); extern void board_free_pixmaps(BoardData * bd); extern void board_edit(BoardData * bd); extern void InitBoardPreview(BoardData * bd); extern int animate_player, *animate_move_list, animation_finished; enum TheoryTypes { TT_PIPCOUNT = 1, TT_EPC = 2, TT_RETURNHITS = 4, TT_KLEINCOUNT = 8 }; void UpdateTheoryData(BoardData * bd, int UpdateTypes, const TanBoard points); extern void read_board(BoardData * bd, TanBoard points); extern void update_pipcount(BoardData * bd, const TanBoard points); extern void InitBoardData(BoardData * bd); extern gboolean board_button_press(GtkWidget * board, GdkEventButton * event, BoardData * bd); extern gboolean board_motion_notify(GtkWidget * widget, GdkEventMotion * event, BoardData * bd); extern gboolean board_button_release(GtkWidget * board, GdkEventButton * event, BoardData * bd); extern void RollDice2d(BoardData * bd); extern void DestroyPanel(gnubgwindow window); extern void DrawDie(cairo_t * pd, unsigned char *achDice[], unsigned char *achPip[], const int s, int x, int y, int fColour, int n, int alpha); extern int UpdateMove(BoardData * bd, TanBoard anBoard); extern void stop_board_expose(BoardData * bd); #endif gnubg-1.08.003/set.c000644 001751 000024 00000331157 14606176642 013605 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2003 Gary Wong * Copyright (C) 1999-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: set.c,v 1.437 2023/12/20 23:09:54 plm Exp $ */ #include "config.h" #if defined(WIN32) /* Needed for thread priority defines */ #include #include #endif #include #include #include #include #if defined(HAVE_SYS_RESOURCE_H) #include #endif /* HAVE_SYS_RESOURCE_H */ #if defined(HAVE_SOCKETS) #if !defined(WIN32) #if defined(HAVE_SYS_SOCKET_H) #include #include #endif /* HAVE_SYS_SOCKET_H */ #include #include #else /* WIN32 */ #include #endif /* WIN32 */ #endif /* HAVE_SOCKETS */ #if defined(HAVE_UNISTD_H) #include #endif /* HAVE_UNISTD_H */ #include "backgammon.h" #include "dice.h" #include "eval.h" #include "external.h" #include "export.h" #if defined(USE_GTK) #include "gtklocdefs.h" #include "gtkgame.h" #include "gtkprefs.h" #include "gtkchequer.h" #include "gtkwindows.h" #include "gtkscoremap.h" #endif /* USE_GTK */ #include "matchequity.h" #include "positionid.h" #include "matchid.h" #include "renderprefs.h" #include "drawboard.h" #include "format.h" #include "boarddim.h" #include "sound.h" #include "openurl.h" #if defined(USE_BOARD3D) #include "inc3d.h" #endif #include "multithread.h" static int iPlayerSet, iPlayerLateSet; static evalcontext *pecSet; static char *szSet; static const char *szSetCommand; static rolloutcontext *prcSet; static evalsetup *pesSet; static rng *rngSet; static rngcontext *rngctxSet; #if !defined(HAVE_LIBGMP) /* get the next token from the input and convert as an * integer. Returns 0 on empty input or non-numerics found, and * 1 on success. On failure, one token (if any were available) * will have been consumed, it is not pushed back into the input. * Unsigned long is returned in pretVal */ static gboolean ParseULong(char **ppch, unsigned long *pretVal) { char *pch, *pchOrig; if (!ppch || !(pchOrig = NextToken(ppch))) return FALSE; for (pch = pchOrig; *pch; pch++) if (!isdigit(*pch)) return FALSE; errno = 0; /* To distinguish success/failure after call */ *pretVal = strtol(pchOrig, NULL, 10); /* Check for various possible errors */ if ((errno == ERANGE && (*pretVal == LONG_MAX || *pretVal == (unsigned long) LONG_MIN)) || (errno != 0 && *pretVal == 0)) return FALSE; return TRUE; } #endif static void SetSeed(const rng rngx, void *rngctx, char *sz) { if (rngx == RNG_MANUAL || rngx == RNG_RANDOM_DOT_ORG || rngx == RNG_FILE) { outputf(_("You can't set a seed if you're using %s as RNG\n"), aszRNG[rngx]); return; } if (sz && *sz) { #if defined(HAVE_LIBGMP) if (InitRNGSeedLong(sz, rngx, rngctx)) outputl(_("You must specify a valid seed (see `help set " "seed').")); else outputf(_("Seed set to %s.\n"), sz); #else gboolean bSuccess; unsigned long n = 0; bSuccess = ParseULong(&sz, &n); if (!bSuccess || n > UINT_MAX) { outputl(_("You must specify a valid seed (see `help set seed').")); return; } InitRNGSeed((unsigned int) n, rngx, rngctx); outputf(_("Seed set to %ld.\n"), n); #endif /* HAVE_LIBGMP */ } else outputl(RNGSystemSeed(rngx, rngctx, NULL) ? _("Seed initialised from system random data.") : _("Seed initialised by system clock.")); } extern void SetRNG(rng * prng, rngcontext * rngctx, rng rngNew, char *szSeed) { if (*prng == rngNew && !*szSeed) { outputf(_("You are already using the %s generator.\n"), gettext(aszRNG[rngNew])); return; } if (prng == &prcSet->rngRollout && (rngNew == RNG_MANUAL || rngNew == RNG_RANDOM_DOT_ORG || rngNew == RNG_FILE)) { outputf(_("The %s RNG is not suitable for rollouts\n"), aszRNG[rngNew]); return; } /* Dispose internal paremeters for RNG */ CloseRNG(*prng, rngctx); switch (rngNew) { case RNG_BBS: #if defined(HAVE_LIBGMP) { int fInit; fInit = FALSE; if (*szSeed) { if (!StrNCaseCmp(szSeed, "modulus", strcspn(szSeed, " \t\n\r\v\f"))) { NextToken(&szSeed); /* skip "modulus" keyword */ if (InitRNGBBSModulus(NextToken(&szSeed), rngctx)) { outputf(_("You must specify a valid modulus (see `help " "set rng bbs').")); return; } fInit = TRUE; } else if (!StrNCaseCmp(szSeed, "factors", strcspn(szSeed, " \t\n\r\v\f"))) { char *sz, *sz1; NextToken(&szSeed); /* skip "factors" keyword */ sz = NextToken(&szSeed); sz1 = NextToken(&szSeed); if (InitRNGBBSFactors(sz, sz1, rngctx)) { outputf(_("You must specify two valid factors (see `help " "set rng bbs').")); return; } fInit = TRUE; } } if (!fInit) /* use default modulus, with factors * 148028650191182616877187862194899201391 and * 315270837425234199477225845240496832591. * (this is copied from old libgmp code, * the numbers must be primes, congruent to 3 mod 4) */ InitRNGBBSModulus("46669116508701198206463178178218347698370" "262771368237383789001446050921334081", rngctx); break; } #else abort(); #endif /* HAVE_LIBGMP */ case RNG_FILE: { char *sz = NextToken(&szSeed); if (!sz || !*sz) { outputl(_("Please enter filename!")); return; } if (!OpenDiceFile(rngctx, sz)) { outputf(_("File %s does not exist or is not readable\n"), sz); return; } } break; default: ; } outputf(_("GNU Backgammon will now use the %s generator.\n"), gettext(aszRNG[rngNew])); switch ((*prng = rngNew)) { case RNG_MANUAL: case RNG_RANDOM_DOT_ORG: case RNG_FILE: /* no-op */ break; default: SetSeed(*prng, rngctx, szSeed); break; } } static void SetMoveFilter(char *sz, movefilter aamf[MAX_FILTER_PLIES][MAX_FILTER_PLIES]) { int ply = ParseNumber(&sz); int level; int accept; movefilter *pmfFilter; int extras; float tolerance; /* Temporary removing the temporary debug ... * outputf( _("Temporary debug: '%s' '%s'\n"), szSetCommand, sz ); */ if (ply < 0) { outputl(N_("You must specify for which ply you want to set a filter")); return; } if (!(0 < ply && ply <= MAX_FILTER_PLIES)) { outputf(_("You must specify a valid ply for setting move filters " "(see `help set %s movefilter')"), szSetCommand); return; } if (((level = ParseNumber(&sz)) < 0) || (level >= ply)) { outputf(_("You must specify a valid level 0..%d for the filter " "(see `help set %s movefilter')"), ply - 1, szSetCommand); return; } pmfFilter = &aamf[ply - 1][level]; if ((accept = ParseNumber(&sz)) == INT_MIN) { outputf(N_("You must specify a number of moves to accept (or a negative number to skip " "this level) (see `help set %s movefilter')"), szSetCommand); return; } if (accept < 0) { pmfFilter->Accept = -1; pmfFilter->Extra = 0; pmfFilter->Threshold = 0.0; return; } if (((extras = ParseNumber(&sz)) < 0) || ((tolerance = ParseReal(&sz)) < 0.0f)) { outputf(_("You must set a count of extra moves and a search tolerance " "(see `help set %s movefilter')."), szSetCommand); return; } pmfFilter->Accept = accept; pmfFilter->Extra = extras; pmfFilter->Threshold = tolerance; } extern void CommandSetAnalysisBackground(char *sz) { SetToggle("analysis background", &fBackgroundAnalysis, sz, _("Will run analysis in the background."), _("Will not run analysis in the background.")); } extern void CommandSetAnalysisCube(char *sz) { if (SetToggle("analysis cube", &fAnalyseCube, sz, _("Cube action will be analysed."), _("Cube action will not be analysed.")) >= 0) UpdateSetting(&fAnalyseCube); } extern void CommandSetAnalysisLuck(char *sz) { if (SetToggle("analysis luck", &fAnalyseDice, sz, _("Dice rolls will be analysed."), _("Dice rolls will not be analysed.")) >= 0) UpdateSetting(&fAnalyseDice); } extern void CommandSetAnalysisLuckAnalysis(char *sz) { szSet = _("luck analysis"); szSetCommand = "set analysis luckanalysis"; pecSet = &ecLuck; HandleCommand(sz, acSetEvaluation); } extern void CommandSetAnalysisMoves(char *sz) { if (SetToggle("analysis moves", &fAnalyseMove, sz, _("Chequer play will be analysed."), _("Chequer play will not be analysed.")) >= 0) UpdateSetting(&fAnalyseMove); } static void SetLuckThreshold(lucktype lt, char *sz) { float r = ParseReal(&sz); const char *szCommand = aszLuckTypeCommand[lt]; if (r <= 0.0f) { outputf(_("You must specify a positive number for the threshold (see " "`help set analysis\nthreshold %s').\n"), szCommand); return; } arLuckLevel[lt] = r; outputf(_("`%s' threshold set to %.3f.\n"), szCommand, r); } static void SetSkillThreshold(skilltype lt, char *sz) { float r = ParseReal(&sz); const char *szCommand = aszSkillTypeCommand[lt]; if (r < 0.0f) { outputf(_("You must specify a semi-positive number for the threshold (see " "`help set analysis\nthreshold %s').\n"), szCommand); return; } arSkillLevel[lt] = r; outputf(_("`%s' threshold set to %.3f.\n"), szCommand, r); } extern void CommandSetAnalysisThresholdBad(char *sz) { SetSkillThreshold(SKILL_BAD, sz); } extern void CommandSetAnalysisThresholdDoubtful(char *sz) { SetSkillThreshold(SKILL_DOUBTFUL, sz); } extern void CommandSetAnalysisThresholdLucky(char *sz) { SetLuckThreshold(LUCK_GOOD, sz); } extern void CommandSetAnalysisThresholdUnlucky(char *sz) { SetLuckThreshold(LUCK_BAD, sz); } extern void CommandSetAnalysisThresholdVeryBad(char *sz) { SetSkillThreshold(SKILL_VERYBAD, sz); } extern void CommandSetAnalysisThresholdVeryLucky(char *sz) { SetLuckThreshold(LUCK_VERYGOOD, sz); } extern void CommandSetAnalysisThresholdVeryUnlucky(char *sz) { SetLuckThreshold(LUCK_VERYBAD, sz); } extern void CommandSetStyledGameList(char *sz) { SetToggle("styledgamelist", &fStyledGamelist, sz, _("Show colours in game window"), _("Do not show colours in game window.")); #if defined(USE_GTK) if (fX) ChangeGame(NULL); #endif } extern void CommandSetFullScreen(char *sz) { int newValue = fFullScreen; SetToggle("fullscreen", &newValue, sz, _("Show board in full screen mode"), _("Show board in normal screen mode.")); if (newValue != fFullScreen) { /* Value has changed */ fFullScreen = newValue; #if defined(USE_GTK) if (fX) FullScreenMode(fFullScreen); #endif } } extern void CommandSetAutoBearoff(char *sz) { SetToggle("automatic bearoff", &fAutoBearoff, sz, _("Will automatically " "bear off as many chequers as possible."), _("Will not " "automatically bear off chequers.")); } extern void CommandSetAutoCrawford(char *sz) { SetToggle("automatic crawford", &fAutoCrawford, sz, _("Will enable the " "Crawford game according to match score."), _("Will not " "enable the Crawford game according to match score.")); } extern void CommandSetAutoDoubles(char *sz) { int n; if ((n = ParseNumber(&sz)) < 0) { outputl(_("You must specify how many automatic doubles to use " "(see `help set automatic double').")); return; } if (n > 12) { outputl(_("Please specify a smaller limit (up to 12 automatic " "doubles).")); return; } if ((cAutoDoubles = (unsigned int) n) > 1) outputf(_("Automatic doubles will be used " "(up to a limit of %d).\n"), n); else if (cAutoDoubles) outputl(_("A single automatic double will be permitted.")); else outputl(_("Automatic doubles will not be used.")); UpdateSetting(&cAutoDoubles); if (cAutoDoubles) { if (ms.nMatchTo > 0) outputl(_("(Note that automatic doubles will have " "no effect until you " "start session play.)")); else if (!ms.fCubeUse) outputl(_("Note that automatic doubles will have no effect " "until you " "enable cube use\n(see `help set cube use').")); } } extern void CommandSetAutoDB(char *sz) { SetToggle("automatic db", &fAutoDB, sz, _("Will automatically add analysis to database."), _("Will not automatically add analysis to database.")); } extern void CommandSetAutoGame(char *sz) { SetToggle("automatic game", &fAutoGame, sz, _("Will automatically start games after wins."), _("Will not automatically start games.")); } extern void CommandSetAutoMove(char *sz) { SetToggle("automatic move", &fAutoMove, sz, _("Forced moves will be made automatically."), _("Forced moves will not be made automatically.")); } extern void CommandSetAutoRoll(char *sz) { SetToggle("automatic roll", &fAutoRoll, sz, _("Will automatically roll the " "dice when no cube action is possible."), _("Will not automatically roll the dice.")); } static int CorrectNumberOfChequers(TanBoard anBoard, int numCheq) { /* Check players don't have too many chequers (esp. for hypergammon) */ int ac[2], i; ac[0] = ac[1] = 0; for (i = 0; i < 25; i++) { ac[0] += anBoard[0][i]; ac[1] += anBoard[1][i]; } /* Nb. representation doesn't specify how many chequers * may be off the board - so has to be <= not == */ if (ac[0] <= numCheq && ac[1] <= numCheq) return 1; else return 0; } extern int SetBoard(char *sz) { TanBoard an; moverecord *pmr; if (ms.gs != GAME_PLAYING) { outputl(_("There must be a game in progress to set the board.")); return 1; } if (!*sz) { outputl(_("You must specify a position (see `help set board').")); return 1; } /* FIXME how should =n notation be handled? */ if (ParsePosition(an, &sz, NULL) < 0 || !CorrectNumberOfChequers(an, anChequers[ms.bgv])) return 1; pmr = NewMoveRecord(); pmr->mt = MOVE_SETBOARD; pmr->fPlayer = ms.fMove; if (ms.fMove) SwapSides(an); PositionKey((ConstTanBoard) an, &pmr->sb.key); AddMoveRecord(pmr); /* this way the player turn is stored */ get_current_moverecord(NULL); return 0; } extern void CommandSetBoard(char *sz) { if (SetBoard(sz) == 0) ShowBoard(); } static int CheckCubeAllowed(void) { if (ms.gs != GAME_PLAYING) { outputl(_("There must be a game in progress to set the cube.")); return -1; } if (ms.fCrawford) { outputl(_("The cube is disabled during the Crawford game.")); return -1; } if (!ms.fCubeUse) { outputl(_("The cube is disabled (see `help set cube use').")); return -1; } return 0; } extern void CommandSetCache(char *sz) { int n; if ((n = ParseNumber(&sz)) < 0) { outputl(_("You must specify the number of cache entries to use.")); return; } n = EvalCacheResize(n); if (n != -1) outputf(ngettext ("The position cache has been sized to %d entry.\n", "The position cache has been sized to %d entries.\n", n), n); else outputerr(_("Evaluation cache allocation failed")); } #if defined(USE_MULTITHREAD) extern void CommandSetThreads(char *sz) { int n; if ((n = ParseNumber(&sz)) <= 0) { outputl(_("You must specify the number of threads to use.")); return; } if (n > MAX_NUMTHREADS) { outputf(_("%d is the maximum number of threads supported"), MAX_NUMTHREADS); output(".\n"); n = MAX_NUMTHREADS; } MT_SetNumThreads(n); outputf(_("The number of threads has been set to %d.\n"), n); } #endif extern void CommandSetVsync3d(char *sz) { #if defined(WIN32) && defined(USE_BOARD3D) SetToggle("vsync", &fSync, sz, _("Set vsync on."), _("Set vsync off.")); if (setVSync(fSync) == FALSE) { if (gtk_widget_get_realized(pwMain)) { fSync = -1; outputl(_("Unable to set vsync.")); return; } else fResetSync = TRUE; /* Try again once main window is created */ } fSync = (fSync != 0) ? 1 : 0; /* Set to 1 or 0, (-1 == not set) */ #else (void) sz; /* suppress unused parameter compiler warning */ outputl(_("This function is for MS Windows 3D boards only")); #endif } extern void CommandSetBrowser(char *sz) { if (!sz || !*sz) set_web_browser(""); set_web_browser(NextToken(&sz)); } extern void CommandSetCalibration(char *sz) { float r; if (!sz || !*sz) { rEvalsPerSec = -1.0f; outputl(_("The evaluation speed has been cleared.")); return; } if ((r = ParseReal(&sz)) <= 2.0f) { outputl(_("If you give a parameter to `set calibration', it must " "be a legal number of evaluations per second.")); return; } rEvalsPerSec = r; outputf(_("The speed estimate has been set to %.0f static " "evaluations per second.\n"), rEvalsPerSec); } extern void CommandSetClockwise(char *sz) { SetToggle("clockwise", &fClockwise, sz, _("Player 1 moves clockwise (and " "player 0 moves anticlockwise)."), _("Player 1 moves anticlockwise (and " "player 0 moves clockwise).")); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetAppearance(char *sz) { #if defined(USE_GTK) SetBoardPreferences(pwBoard, sz); #else char *apch[2]; while (ParseKeyValue(&sz, apch)) RenderPreferencesParam(GetMainAppearance(), apch[0], apch[1]); #endif } extern void CommandSetConfirmDefault(char *sz) { if (!sz || !*sz) { outputf(_("Needs an argument!\n")); return; } if (strcmp(sz, "yes") == 0) nConfirmDefault = 1; else if (strcmp(sz, "no") == 0) nConfirmDefault = 0; else if (strcmp(sz, "ask") == 0) nConfirmDefault = -1; else outputf(_("Invalid argument\n")); } extern void CommandSetConfirmNew(char *sz) { SetToggle("confirm new", &fConfirmNew, sz, _("Will ask for confirmation before " "aborting games in progress."), _("Will not ask for confirmation " "before aborting games in progress.")); } extern void CommandSetConfirmSave(char *sz) { SetToggle("confirm save", &fConfirmSave, sz, _("Will ask for confirmation before " "overwriting existing files."), _("Will not ask for confirmation " "overwriting existing files.")); } extern void CommandSetCubeCentre(char *UNUSED(sz)) { moverecord *pmr; if (CheckCubeAllowed()) return; pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEPOS; pmr->scp.fCubeOwner = -1; pmr->fPlayer = ms.fMove; AddMoveRecord(pmr); outputl(_("The cube has been centred.")); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetCubeOwner(char *sz) { moverecord *pmr; int i; if (CheckCubeAllowed()) return; switch (i = ParsePlayer(NextToken(&sz))) { case 0: case 1: break; case 2: /* "set cube owner both" is the same as "set cube centre" */ CommandSetCubeCentre(NULL); return; default: outputl(_("You must specify which player owns the cube " "(see `help set cube owner').")); return; } pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEPOS; pmr->scp.fCubeOwner = i; pmr->fPlayer = ms.fMove; AddMoveRecord(pmr); outputf(_("%s now owns the cube.\n"), ap[ms.fCubeOwner].szName); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetCubeUse(char *sz) { if (SetToggle("cube use", &fCubeUse, sz, _("Use of the doubling cube is permitted."), _("Use of the doubling cube is disabled.")) < 0) return; if (!ms.nMatchTo && ms.fJacoby && !fCubeUse) outputl(_("Note that you'll have to disable the Jacoby rule " "if you want gammons and\nbackgammons to be scored " "(see `help set jacoby').")); if (ms.fCrawford && fCubeUse) outputl(_("(But the Crawford rule is in effect, " "so you won't be able to use it during\nthis game.)")); else if (ms.gs == GAME_PLAYING && !fCubeUse) { /* The cube was being used and now it isn't; reset it to 1, * centred. */ ms.nCube = 1; ms.fCubeOwner = -1; UpdateSetting(&ms.nCube); UpdateSetting(&ms.fCubeOwner); CancelCubeAction(); } ms.fCubeUse = fCubeUse; #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ } extern int SetCubeValue(int n) { int i; moverecord *pmr; if (CheckCubeAllowed()) return 2; for (i = MAX_CUBE; i; i >>= 1) if (n == i) { pmr = NewMoveRecord(); pmr->mt = MOVE_SETCUBEVAL; pmr->fPlayer = ms.fMove; pmr->scv.nCube = n; AddMoveRecord(pmr); return 0; } return 1; } extern void CommandSetCubeValue(char *sz) { int n, rc; n = ParseNumber(&sz); rc = SetCubeValue(n); if (rc == 0) { outputf(_("The cube has been set to %d.\n"), n); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ return; } if (rc == 1) outputl(_("You must specify a legal cube value (see `help set cube " "value').")); } extern void CommandSetDelay(char *sz) { #if defined(USE_GTK) if (fX) { int n; if (*sz && !StrNCaseCmp(sz, "none", strlen(sz))) n = 0; else if ((n = ParseNumber(&sz)) < 0 || n > 10000) { outputl(_("You must specify a legal move delay (see `help set " "delay').")); return; } if (n) { outputf(ngettext("All moves will be shown for at least %d millisecond.\n", "All moves will be shown for at least %d milliseconds.\n", n), n); if (!fDisplay) outputl(_("You will also need to use `set display' to turn " "board updates on (see `help set display').")); } else outputl(_("Moves will not be delayed.")); nDelay = n; UpdateSetting(&nDelay); } else #endif /* USE_GTK */ (void) sz; /* suppress unused parameter compiler warning */ outputl(_("The `set delay' command applies only when using a window " "system.")); } extern void SetDice(int n0, int n1) { moverecord *pmr; g_assert(ms.gs == GAME_PLAYING); pmr = NewMoveRecord(); pmr->mt = MOVE_SETDICE; pmr->fPlayer = ms.fMove; pmr->anDice[0] = n0; pmr->anDice[1] = n1; AddMoveRecord(pmr); return; } extern void CommandSetDice(char *sz) { int n0, n1; if (ms.gs != GAME_PLAYING) { outputl(_("There must be a game in progress to set the dice.")); return; } n0 = ParseNumber(&sz); if (n0 > 10) { /* assume a 2-digit number; n0 first digit, n1 second */ n1 = n0 % 10; n0 /= 10; } else n1 = ParseNumber(&sz); if (n0 < 1 || n0 > 6 || n1 < 1 || n1 > 6) { outputl(_("You must specify two numbers from 1 to 6 for the dice.")); return; } SetDice(n0, n1); outputf(_("The dice have been set to %d and %d.\n"), n0, n1); #if defined(USE_GTK) if (fX) ShowBoard(); #endif } extern void CommandSetDisplay(char *sz) { SetToggle("display", &fDisplay, sz, _("Will display boards for computer " "moves."), _("Will not display boards for computer moves.")); } extern void CommandSetEvalCubeful(char *sz) { gchar *asz0, *asz1, *szCommand; int f = pecSet->fCubeful; asz0 = g_strdup_printf(_("%s will use cubeful evaluation.\n"), szSet); asz1 = g_strdup_printf(_("%s will use cubeless evaluation.\n"), szSet); szCommand = g_strdup_printf("%s cubeful", szSetCommand); SetToggle(szCommand, &f, sz, asz0, asz1); pecSet->fCubeful = f; g_free(szCommand); g_free(asz1); g_free(asz0); } extern void CommandSetEvalPrune(char *sz) { gchar *asz0, *asz1, *szCommand; int f = pecSet->fUsePrune; asz0 = g_strdup_printf(_("%s will use pruning.\n"), szSet); asz1 = g_strdup_printf(_("%s will not use pruning.\n"), szSet); szCommand = g_strdup_printf("%s prune", szSetCommand); SetToggle(szCommand, &f, sz, asz0, asz1); pecSet->fUsePrune = f; g_free(szCommand); g_free(asz1); g_free(asz0); } extern void CommandSetEvalDeterministic(char *sz) { gchar *asz0, *asz1, *szCommand; int f = pecSet->fDeterministic; asz0 = g_strdup_printf(_("%s will use deterministic noise.\n"), szSet); asz1 = g_strdup_printf(_("%s will use pseudo-random noise.\n"), szSet); szCommand = g_strdup_printf("%s deterministic", szSetCommand); SetToggle(szCommand, &f, sz, asz0, asz1); pecSet->fDeterministic = f; g_free(szCommand); g_free(asz1); g_free(asz0); if (pecSet->rNoise == 0.0f) outputl(_("(Note that this setting will have no effect unless you " "set noise to some non-zero value.)")); } extern void CommandSetEvalNoise(char *sz) { float r = ParseReal(&sz); if (r < 0.0f) { outputf(_("You must specify a valid amount of noise to use " "(see `help set\n%s noise').\n"), szSetCommand); return; } pecSet->rNoise = r; if (pecSet->rNoise > 0.0f) outputf(_("%s will use noise with standard deviation %5.3f.\n"), szSet, pecSet->rNoise); else outputf(_("%s will use noiseless evaluations.\n"), szSet); } extern void CommandSetEvalPlies(char *sz) { int n = ParseNumber(&sz); if (n < 0 || n > 7) outputf(_("Valid numbers of plies to look ahead are 0 to 7.\n")); else pecSet->nPlies = n; outputf(_("%s will use %d ply evaluation.\n"), szSet, pecSet->nPlies); } #if defined(USE_GTK) extern void CommandSetGUIAnimationBlink(char *UNUSED(sz)) { animGUI = ANIMATE_BLINK; } extern void CommandSetGUIAnimationNone(char *UNUSED(sz)) { animGUI = ANIMATE_NONE; } extern void CommandSetGUIAnimationSlide(char *UNUSED(sz)) { animGUI = ANIMATE_SLIDE; } extern void CommandSetGUIAnimationSpeed(char *sz) { unsigned int n = ParseNumber(&sz); if (n > 7) { outputl(_("You must specify a speed between 0 and 7 " "(see `help set speed').")); return; } nGUIAnimSpeed = n; outputf(_("Animation speed set to %u.\n"), n); } extern void CommandSetGUIBeep(char *sz) { SetToggle("gui beep", &fGUIBeep, sz, _("GNU Backgammon will beep on illegal input."), _("GNU Backgammon will not beep on illegal input.")); } extern void CommandSetGUIGrayEdit(char *sz) { SetToggle("gui grayedit", &fGUIGrayEdit, sz, _("Board will be grayed in edit mode."), _("Board will not change colour in edit mode.")); } extern void CommandSetGUIDiceArea(char *sz) { if (SetToggle("gui dicearea", &GetMainAppearance()->fDiceArea, sz, _("A dice icon will be shown below the board when a human " "player is on roll."), _("No dice icon will be shown.")) >= 0) UpdateSetting(&GetMainAppearance()->fDiceArea); } extern void CommandSetGUIHighDieFirst(char *sz) { SetToggle("gui highdiefirst", &fGUIHighDieFirst, sz, _("The higher die will be shown on the left."), _("The dice will be shown in the order rolled.")); } extern void CommandSetGUIIllegal(char *sz) { SetToggle("gui illegal", &fGUIIllegal, sz, _("Chequers may be dragged to illegal points."), _("Chequers may not be dragged to illegal points.")); } extern void CommandSetGUIShowIDs(char *sz) { if (!inCallback) { SetToggle("gui showids", &fShowIDs, sz, _("The position and match IDs will be shown above the board."), _("The position and match IDs will not be shown.")); } } extern void CommandSetGUIDragTargetHelp(char *sz) { if (SetToggle("gui dragtargethelp", &fGUIDragTargetHelp, sz, _("The target help while dragging a chequer will " "be shown."), _("The target help while dragging a chequer will " "not be shown."))) UpdateSetting(&fGUIDragTargetHelp); } extern void CommandSetGUIUseStatsPanel(char *sz) { SetToggle("gui usestatspanel", &fGUIUseStatsPanel, sz, _("The match statistics will be shown in a panel"), _("The match statistics will be shown in a list")); } extern void CommandSetGUIMoveListDetail(char *sz) { SetToggle("gui movelistdetail", &showMoveListDetail, sz, _("The win loss statistics will be shown in the move analysis"), _("Basic details will be shown in the move analysis")); } extern void CommandSetGUIShowPipsNone(char *UNUSED(sz)) { gui_show_pips = GUI_SHOW_PIPS_NONE; outputf(_("The pip counts will not be shown.")); UpdateSetting(&gui_show_pips); } extern void CommandSetGUIShowPipsPips(char *UNUSED(sz)) { gui_show_pips = GUI_SHOW_PIPS_PIPS; outputf(_("Pip counts will be shown.")); UpdateSetting(&gui_show_pips); } extern void CommandSetGUIShowPipsEPC(char *UNUSED(sz)) { gui_show_pips = GUI_SHOW_PIPS_EPC; outputf(_("Effective pip counts will be shown.")); UpdateSetting(&gui_show_pips); } extern void CommandSetGUIShowPipsWastage(char *UNUSED(sz)) { gui_show_pips = GUI_SHOW_PIPS_WASTAGE; outputf(_("Pip wastage will be shown.")); UpdateSetting(&gui_show_pips); } extern void CommandSetGUIWindowPositions(char *sz) { SetToggle("gui windowpositions", &fGUISetWindowPos, sz, _("Saved window positions will be applied to new windows."), _("Saved window positions will not be applied to new " "windows.")); } #else static void NoGUI(void) { outputl(_("This installation of GNU Backgammon was compiled without GUI " "support.")); } extern void CommandSetGUIAnimationBlink(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIAnimationNone(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIAnimationSlide(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIAnimationSpeed(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIBeep(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIDiceArea(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIHighDieFirst(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIIllegal(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIShowIDs(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIShowPipsNone(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIShowPipsPips(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIShowPipsEPC(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIShowPipsWastage(char *UNUSED(sz)) { NoGUI(); } extern void CommandSetGUIWindowPositions(char *UNUSED(sz)) { NoGUI(); } #endif extern void CommandSetPlayerMoveFilter(char *sz) { SetMoveFilter(sz, ap[iPlayerSet].aamf); } extern void CommandSetPlayerChequerplay(char *sz) { szSet = ap[iPlayerSet].szName; szSetCommand = "player chequerplay evaluation"; pesSet = &ap[iPlayerSet].esChequer; outputpostpone(); HandleCommand(sz, acSetEvalParam); if (ap[iPlayerSet].pt != PLAYER_GNU) outputf(_("(Note that this setting will have no effect until you " "`set player %s gnu'.)\n"), ap[iPlayerSet].szName); outputresume(); } extern void CommandSetPlayerCubedecision(char *sz) { szSet = ap[iPlayerSet].szName; szSetCommand = "player cubedecision evaluation"; pesSet = &ap[iPlayerSet].esCube; outputpostpone(); HandleCommand(sz, acSetEvalParam); if (ap[iPlayerSet].pt != PLAYER_GNU) outputf(_("(Note that this setting will have no effect until you " "`set player %s gnu'.)\n"), ap[iPlayerSet].szName); outputresume(); } extern void CommandSetPlayerExternal(char *sz) { #if !defined(HAVE_SOCKETS) (void) sz; /* suppress unused parameter compiler warning */ outputl(_("This installation of GNU Backgammon was compiled without\n" "socket support, and does not implement external players.")); #else int h; socklen_t cb; struct sockaddr *psa; char *pch; if (ap[iPlayerSet].pt == PLAYER_EXTERNAL) closesocket(ap[iPlayerSet].h); sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify the name of the socket to the external\n" "player (see `help set player external').")); return; } pch = g_strdup(sz); if ((h = ExternalSocket(&psa, &cb, sz)) < 0) { SockErr(pch); g_free(pch); return; } while (connect(h, psa, cb) < 0) { if (errno == EINTR) { if (fInterrupt) { closesocket(h); g_free(psa); g_free(pch); return; } continue; } SockErr(pch); closesocket(h); g_free(psa); g_free(pch); return; } ap[iPlayerSet].pt = PLAYER_EXTERNAL; ap[iPlayerSet].h = h; g_free(ap[iPlayerSet].szSocket); ap[iPlayerSet].szSocket = pch; g_free(psa); #endif /* !HAVE_SOCKETS */ } extern void CommandSetPlayerGNU(char *UNUSED(sz)) { #if defined(HAVE_SOCKETS) if (ap[iPlayerSet].pt == PLAYER_EXTERNAL) closesocket(ap[iPlayerSet].h); #endif ap[iPlayerSet].pt = PLAYER_GNU; outputf(_("Moves for %s will now be played by GNU Backgammon.\n"), ap[iPlayerSet].szName); #if defined(USE_GTK) if (fX) /* The "play" button might now be required; update the board. */ ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetPlayerHuman(char *UNUSED(sz)) { #if defined(HAVE_SOCKETS) if (ap[iPlayerSet].pt == PLAYER_EXTERNAL) closesocket(ap[iPlayerSet].h); #endif ap[iPlayerSet].pt = PLAYER_HUMAN; outputf(_("Moves for %s must now be entered manually.\n"), ap[iPlayerSet].szName); } extern void CommandSetPlayerName(char *sz) { if (!sz || !*sz) { outputl(_("You must specify a name to use.")); return; } if (strlen(sz) > 31) sz[31] = 0; if ((*sz == '0' || *sz == '1') && !sz[1]) { outputf(_("`%c' is not a valid name.\n"), *sz); return; } if (!StrCaseCmp(sz, "both")) { outputl(_("`both' is a reserved word; you can't call a player " "that.\n")); return; } if (!CompareNames(sz, ap[!iPlayerSet].szName)) { outputl(_("That name is already in use by the other player.")); return; } strcpy(ap[iPlayerSet].szName, sz); outputf(_("Player %d is now known as `%s'.\n"), iPlayerSet, sz); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetPlayer(char *sz) { char *pch = NextToken(&sz); int i; if (!pch) { outputl(_("You must specify a player (see `help set player').")); return; } if ((i = ParsePlayer(pch)) == 0 || i == 1) { gchar *szTemp; iPlayerSet = i; szTemp = g_strdup_printf("player %d", i); szSetCommand = szTemp; HandleCommand(sz, acSetPlayer); UpdateSetting(ap); szSetCommand = NULL; g_free(szTemp); return; } if (i == 2) { gchar *pchCopy = g_strdup(sz); outputpostpone(); iPlayerSet = 0; szSetCommand = "player 0"; HandleCommand(sz, acSetPlayer); iPlayerSet = 1; szSetCommand = "player 1"; HandleCommand(pchCopy, acSetPlayer); outputresume(); UpdateSetting(ap); g_free(pchCopy); szSetCommand = NULL; return; } outputf(_("Unknown player `%s' (see `help set player').\n"), pch); szSetCommand = NULL; return; } extern void CommandSetKeyNames(char *sz) { char *token; keyNamesFirstEmpty=0; /* get the first token */ token = strtok(sz, "\t"); /* walk through other tokens */ while( token != NULL ) { // g_message("token = %s, length=%zu\n", token, strlen(token) ); /* note: could also use AddKeyName() below if we are not guaranteed that they are unique*/ strcpy(keyNames[keyNamesFirstEmpty],token); keyNamesFirstEmpty++; // DisplayKeyNames(); token = strtok(NULL, "\t"); } // DisplayKeyNames(); } extern void CommandSetDefaultNames(char *sz) { char *names[2] = { NextToken(&sz), NextToken(&sz) }; int i; for (i = 0; i < 2; i++) { char *pch = names[i]; if (!pch || !*pch) { outputl(_("You must specify two player names.")); return; } if (strlen(pch) > 31) pch[31] = 0; if ((*pch == '0' || *pch == '1') && !pch[1]) { outputf(_("`%c' is not a valid name.\n"), *pch); return; } if (!StrCaseCmp(pch, "both")) { outputl(_("`both' is a reserved word; you can't call a player " "that.\n")); return; } } if (!CompareNames(names[0], names[1])) { outputl(_("Player names identical")); return; } if (StrCaseCmp(names[0], default_names[0]) == 0 && StrCaseCmp(names[1], default_names[1]) == 0) return; strcpy(default_names[0], names[0]); strcpy(default_names[1], names[1]); outputf(_("Players will be known as `%s' and `%s'.\n This setting will take effect when a new match is started.\n"), default_names[0], default_names[1]); } extern void CommandSetPrompt(char *szParam) { static char sz[128]; /* FIXME check overflow */ szPrompt = (szParam && *szParam) ? strcpy(sz, szParam) : szDefaultPrompt; outputf(_("The prompt has been set to `%s'.\n"), szPrompt); } extern void CommandSetRecord(char *sz) { SetToggle("record", &fRecord, sz, _("All games in a session will be recorded."), _("Only the active game in a session will be recorded.")); } extern void CommandSetRNG(char *sz) { rngSet = &rngCurrent; rngctxSet = rngctxCurrent; HandleCommand(sz, acSetRNG); } extern void CommandSetRNGFile(char *sz) { SetRNG(rngSet, rngctxSet, RNG_FILE, sz); } #if defined(HAVE_LIBGMP) extern void CommandSetRNGBBS(char *sz) { SetRNG(rngSet, rngctxSet, RNG_BBS, sz); #else extern void CommandSetRNGBBS(char *UNUSED(sz)) { outputl(_("This installation of GNU Backgammon was compiled without the " "Blum, Blum and Shub generator.")); #endif /* HAVE_LIBGMP */ } extern void CommandSetRNGIsaac(char *sz) { SetRNG(rngSet, rngctxSet, RNG_ISAAC, sz); } extern void CommandSetRNGManual(char *sz) { SetRNG(rngSet, rngctxSet, RNG_MANUAL, sz); } extern void CommandSetRNGMD5(char *sz) { SetRNG(rngSet, rngctxSet, RNG_MD5, sz); } extern void CommandSetRNGMersenne(char *sz) { SetRNG(rngSet, rngctxSet, RNG_MERSENNE, sz); } extern void CommandSetRNGRandomDotOrg(char *sz) { #if defined(LIBCURL_PROTOCOL_HTTPS) SetRNG(rngSet, rngctxSet, RNG_RANDOM_DOT_ORG, sz); #else (void) sz; /* suppress unused parameter compiler warning */ outputl(_("This installation of GNU Backgammon was compiled without\n" "support for HTTPS(libcurl) which is needed for fetching\n" "random numbers from ")); #endif } extern void CommandSetRolloutLate(char *sz) { HandleCommand(sz, acSetRolloutLate); } extern void CommandSetRolloutLogEnable(char *sz) { int f = log_rollouts; SetToggle("rollout .sgf files", &f, sz, _("Create an .sgf file for each game rolled out"), _("Do not create an .sgf file for each game rolled out")); log_rollouts = f; } extern void CommandSetRolloutLogFile(char *sz) { g_free(log_file_name); log_file_name = g_strdup(sz); } extern void CommandSetRolloutLateEnable(char *sz) { int l = prcSet->fLateEvals; if (SetToggle("separate evaluation for later plies", &l, sz, _("Use different evaluation for later moves of rollout."), _("Do not change evaluations during rollout.")) != -1) { prcSet->fLateEvals = l; } } extern void CommandSetRolloutLatePlies(char *sz) { int n = ParseNumber(&sz); if (n < 1) { outputl(_("You must specify a valid ply at which to change evaluations " "(see `help set rollout later plies').")); return; } prcSet->nLate = (unsigned short) n; outputf(_("Evaluations will change after %d plies in rollouts.\n"), n); if (prcSet->fLateEvals == FALSE) outputl(_("But separate evaluation for later plies is not currently enabled " "(see `help set rollout later enable').")); } extern void CommandSetRolloutTruncation(char *sz) { HandleCommand(sz, acSetTruncation); } extern void CommandSetRolloutLimit(char *sz) { HandleCommand(sz, acSetRolloutLimit); } extern void CommandSetRolloutLimitEnable(char *sz) { int s = prcSet->fStopOnSTD; if (SetToggle("stop when the STD's are small enough", &s, sz, _("Stop rollout when STD's are small enough"), _("Do not stop rollout based on STDs")) != -1) { prcSet->fStopOnSTD = s; } } extern void CommandSetRolloutLimitMinGames(char *sz) { int n = ParseNumber(&sz); if (n < 1) { outputl(_("You must specify a valid minimum number of games to rollout " "(see `help set rollout limit minimumgames').")); return; } prcSet->nMinimumGames = n; outputf(_("After %d games, rollouts will stop if the STDs are small enough" ".\n"), n); } extern void CommandSetRolloutMaxError(char *sz) { float r = ParseReal(&sz); if (r < 0.0001f) { outputl(_("You must set a valid STD where rollouts can stop " "(see `help set rollout limit maxerror').")); return; } prcSet->rStdLimit = r; outputf(_("Rollouts can stop when the estimated equities' STD are less than " "%5.4f)\n"), r); } extern void CommandSetRolloutJsd(char *sz) { HandleCommand(sz, acSetRolloutJsd); } extern void CommandSetRolloutJsdEnable(char *sz) { int s = prcSet->fStopOnJsd; if (SetToggle("stop rollout of choices which appear to " "to be worse with statistical certainty", &s, sz, _("Stop rollout of choices based on JSDs"), _("Do not stop rollout of moves choices on JSDs")) != -1) { prcSet->fStopOnJsd = s; } } extern void CommandSetRolloutJsdMinGames(char *sz) { int n = ParseNumber(&sz); if (n < 1) { outputl(_("You must specify a valid minimum number of games to rollout " "(see `help set rollout jsd minimumgames').")); return; } prcSet->nMinimumJsdGames = n; outputf(_("After %d games, rollouts will stop if the JSDs are large enough" ".\n"), n); } extern void CommandSetRolloutJsdLimit(char *sz) { float r = ParseReal(&sz); if (r < 0.0001f) { outputl(_("You must set a number of joint standard deviations for the equity" " difference with the best move being rolled out " "(see `help set rollout jsd limit').")); return; } prcSet->rJsdLimit = r; outputf(_("Rollouts (or rollouts of moves) may stop when the equity is more " "than %5.3f joint standard deviations from the best move being rolled out\n"), r); } extern void CommandSetRollout(char *sz) { prcSet = &rcRollout; HandleCommand(sz, acSetRollout); } extern void CommandSetRolloutRNG(char *sz) { rngSet = &prcSet->rngRollout; rngctxSet = rngctxRollout; HandleCommand(sz, acSetRNG); } /* set an eval context, then copy to other player's settings */ static void SetRolloutEvaluationContextBoth(char *sz, evalcontext * pec[]) { g_assert(pec[0] != 0); g_assert(pec[1] != 0); pecSet = pec[0]; HandleCommand(sz, acSetEvaluation); /* copy to both players */ /* FIXME don't copy if there was an error setting player 0 */ memcpy(pec[1], pec[0], sizeof(evalcontext)); } extern void CommandSetRolloutChequerplay(char *sz) { evalcontext *pec[2]; szSet = _("Chequer play in rollouts"); szSetCommand = "rollout chequerplay"; pec[0] = prcSet->aecChequer; pec[1] = prcSet->aecChequer + 1; SetRolloutEvaluationContextBoth(sz, pec); } extern void CommandSetRolloutMoveFilter(char *sz) { szSetCommand = "rollout"; SetMoveFilter(sz, prcSet->aaamfChequer[0]); SetMoveFilter(sz, prcSet->aaamfChequer[1]); } extern void CommandSetRolloutLateMoveFilter(char *sz) { szSetCommand = "rollout late"; SetMoveFilter(sz, prcSet->aaamfLate[0]); SetMoveFilter(sz, prcSet->aaamfLate[1]); } extern void CommandSetRolloutPlayerMoveFilter(char *sz) { szSetCommand = "rollout player"; SetMoveFilter(sz, prcSet->aaamfChequer[iPlayerSet]); } extern void CommandSetRolloutPlayerLateMoveFilter(char *sz) { szSetCommand = "rollout player late"; SetMoveFilter(sz, prcSet->aaamfLate[iPlayerLateSet]); } extern void CommandSetRolloutLateChequerplay(char *sz) { evalcontext *pec[2]; szSet = _("Chequer play for later moves in rollouts"); szSetCommand = "rollout late chequerplay"; pec[0] = prcSet->aecChequerLate; pec[1] = prcSet->aecChequerLate + 1; SetRolloutEvaluationContextBoth(sz, pec); } static void SetRolloutEvaluationContext(char *sz, evalcontext * pec[], int iPlayer) { g_assert((iPlayer == 0) || (iPlayer == 1)); g_assert(pec[iPlayer] != 0); pecSet = pec[iPlayer]; HandleCommand(sz, acSetEvaluation); } extern void CommandSetRolloutPlayerChequerplay(char *sz) { evalcontext *pec[2]; szSet = iPlayerSet ? _("Chequer play in rollouts (for player 1)") : _("Chequer play in rollouts (for player 0)"); szSetCommand = iPlayerSet ? "rollout player 1 chequerplay" : "rollout player 0 chequerplay"; pec[0] = prcSet->aecChequer; pec[1] = prcSet->aecChequer + 1; SetRolloutEvaluationContext(sz, pec, iPlayerSet); } extern void CommandSetRolloutPlayerLateChequerplay(char *sz) { evalcontext *pec[2]; szSet = iPlayerLateSet ? _("Chequer play for later moves in rollouts (for player 1)") : _("Chequer play for later moves in rollouts (for player 0)"); szSetCommand = iPlayerLateSet ? "rollout late player 1 chequerplay" : "rollout late player 0 chequerplay"; pec[0] = prcSet->aecChequerLate; pec[1] = prcSet->aecChequerLate + 1; SetRolloutEvaluationContext(sz, pec, iPlayerLateSet); } extern void CommandSetRolloutCubedecision(char *sz) { evalcontext *pec[2]; szSet = _("Cube decisions in rollouts"); szSetCommand = "rollout cubedecision"; pec[0] = prcSet->aecCube; pec[1] = prcSet->aecCube + 1; SetRolloutEvaluationContextBoth(sz, pec); } extern void CommandSetRolloutLateCubedecision(char *sz) { evalcontext *pec[2]; szSet = _("Cube decisions for later plies in rollouts"); szSetCommand = "rollout late cubedecision"; pec[0] = prcSet->aecCubeLate; pec[1] = prcSet->aecCubeLate + 1; SetRolloutEvaluationContextBoth(sz, pec); } extern void CommandSetRolloutPlayerCubedecision(char *sz) { evalcontext *pec[2]; szSet = iPlayerSet ? _("Cube decisions in rollouts (for player 1)") : _("Cube decisions in rollouts (for player 0)"); szSetCommand = iPlayerSet ? "rollout player 1 cubedecision" : "rollout player 0 cubedecision"; pec[0] = prcSet->aecCube; pec[1] = prcSet->aecCube + 1; SetRolloutEvaluationContext(sz, pec, iPlayerSet); } extern void CommandSetRolloutPlayerLateCubedecision(char *sz) { evalcontext *pec[2]; szSet = iPlayerLateSet ? _("Cube decisions for later plies of rollouts (for player 1)") : _("Cube decisions in later plies of rollouts (for player 0)"); szSetCommand = iPlayerLateSet ? "rollout late player 1 cubedecision" : "rollout late player 0 cubedecision"; pec[0] = prcSet->aecCubeLate; pec[1] = prcSet->aecCubeLate + 1; SetRolloutEvaluationContext(sz, pec, iPlayerLateSet); } extern void CommandSetRolloutBearoffTruncationExact(char *sz) { int f = prcSet->fTruncBearoff2; SetToggle("rollout bearofftruncation exact", &f, sz, _("Will truncate *cubeless* rollouts when reaching" " exact bearoff database"), _("Will not truncate *cubeless* rollouts when reaching" " exact bearoff database")); prcSet->fTruncBearoff2 = f; } extern void CommandSetRolloutBearoffTruncationOS(char *sz) { int f = prcSet->fTruncBearoffOS; SetToggle("rollout bearofftruncation onesided", &f, sz, _("Will truncate *cubeless* rollouts when reaching" " one-sided bearoff database"), _("Will not truncate *cubeless* rollouts when reaching" " one-sided bearoff database")); prcSet->fTruncBearoffOS = f; } extern void CommandSetRolloutInitial(char *sz) { int f = prcSet->fCubeful; SetToggle("rollout initial", &f, sz, _("Rollouts will be made as the initial position of a game."), _("Rollouts will be made for normal (non-opening) positions.")); prcSet->fInitial = f; } extern void CommandSetRolloutSeed(char *sz) { if (prcSet->rngRollout == RNG_MANUAL) { outputl(_("You can't set a seed if you're using manual dice " "generation.")); return; } if (*sz) { const int n = ParseNumber(&sz); if (n < 0) { outputl(_("You must specify a valid seed (see `help set seed').")); return; } prcSet->nSeed = n; outputf(_("Rollout seed set to %d.\n"), n); } else outputl(RNGSystemSeed(prcSet->rngRollout, rngctxRollout, NULL) ? _("Seed initialised from system random data.") : _("Seed initialised by system clock.")); } extern void CommandSetRolloutTrials(char *sz) { int n = ParseNumber(&sz); if (n < 1) { outputl(_("You must specify a valid number of trials to make (see `help set rollout trials').")); return; } prcSet->nTrials = n; outputf(ngettext("%d game will be played per rollout.\n", "%d games will be played per rollout.\n", n), n); } extern void CommandSetRolloutTruncationEnable(char *sz) { int t = prcSet->fDoTruncate; if (SetToggle("rollout truncation enable", &t, sz, _("Games in rollouts will be stopped after" " a fixed number of moves."), _("Games in rollouts will be played out" " until the end.")) != -1) { prcSet->fDoTruncate = t; } } extern void CommandSetRolloutCubeEqualChequer(char *sz) { SetToggle("rollout cube-equal-chequer", &fCubeEqualChequer, sz, _("Rollouts use same settings for cube and chequer play."), _("Rollouts use separate settings for cube and chequer play.")); } extern void CommandSetRolloutPlayersAreSame(char *sz) { SetToggle("rollout players-are-same", &fPlayersAreSame, sz, _("Rollouts use same settings for both players."), _("Rollouts use separate settings for both players.")); } extern void CommandSetRolloutTruncationEqualPlayer0(char *sz) { SetToggle("rollout truncate-equal-player0", &fTruncEqualPlayer0, sz, _("Evaluation of rollouts at truncation point will be same as player 0."), _("Evaluation of rollouts at truncation point are separately specified.")); } extern void CommandSetRolloutTruncationPlies(char *sz) { int n = ParseNumber(&sz); if (n < 1) { outputl(_("You must specify a valid ply at which to truncate rollouts " "(see `help set rollout truncation plies').")); return; } prcSet->nTruncate = (unsigned short) n; outputf(ngettext ("Rollouts will be truncated after %d ply.\n", "Rollouts will be truncated after %d plies.\n", n), n); if (prcSet->fDoTruncate == FALSE) outputl(_("But rollout truncation is not currently enabled " "(see `help set rollout truncation enable').")); } extern void CommandSetRolloutTruncationChequer(char *sz) { szSet = _("Chequer play evaluations at rollout truncation point"); szSetCommand = "rollout truncation chequerplay"; pecSet = &prcSet->aecChequerTrunc; HandleCommand(sz, acSetEvaluation); } extern void CommandSetRolloutTruncationCube(char *sz) { szSet = _("Cube decisions at rollout truncation point"); szSetCommand = "rollout truncation cubedecision"; pecSet = &prcSet->aecCubeTrunc; HandleCommand(sz, acSetEvaluation); } extern void CommandSetRolloutVarRedn(char *sz) { int f = prcSet->fVarRedn; SetToggle("rollout varredn", &f, sz, _("Will use lookahead during rollouts to reduce variance."), _("Will not use lookahead variance " "reduction during rollouts.")); prcSet->fVarRedn = f; } extern void CommandSetRolloutRotate(char *sz) { int f = prcSet->fRotate; SetToggle("rollout quasirandom", &f, sz, _("Use quasi-random dice in rollouts"), _("Do not use quasi-random dice in rollouts")); prcSet->fRotate = f; } extern void CommandSetRolloutCubeful(char *sz) { int f = prcSet->fCubeful; SetToggle("rollout cubeful", &f, sz, _("Cubeful rollouts will be performed."), _("Cubeless rollouts will be performed.")); prcSet->fCubeful = f; } extern void CommandSetRolloutPlayer(char *sz) { char *pch = NextToken(&sz); int i; if (!pch) { outputf(_("You must specify a player (see `help set %s player').\n"), szSetCommand); return; } if ((i = ParsePlayer(pch)) == 0 || i == 1) { iPlayerSet = i; HandleCommand(sz, acSetRolloutPlayer); return; } if (i == 2) { gchar *pchCopy = g_strdup(sz); outputpostpone(); iPlayerSet = 0; HandleCommand(sz, acSetRolloutPlayer); iPlayerSet = 1; HandleCommand(pchCopy, acSetRolloutPlayer); outputresume(); g_free(pchCopy); return; } outputf(_("Unknown player `%s'\n" "(see `help set %s player').\n"), pch, szSetCommand); } extern void CommandSetRolloutLatePlayer(char *sz) { char *pch = NextToken(&sz); int i; if (!pch) { outputf(_("You must specify a player (see `help set %s player').\n"), szSetCommand); return; } if ((i = ParsePlayer(pch)) == 0 || i == 1) { iPlayerLateSet = i; HandleCommand(sz, acSetRolloutLatePlayer); return; } if (i == 2) { gchar *pchCopy = g_strdup(sz); outputpostpone(); iPlayerLateSet = 0; HandleCommand(sz, acSetRolloutLatePlayer); iPlayerLateSet = 1; HandleCommand(pchCopy, acSetRolloutLatePlayer); outputresume(); g_free(pchCopy); return; } outputf(_("Unknown player `%s'\n" "(see `help set %s player').\n"), pch, szSetCommand); } extern void CommandSetScore(char *sz) { moverecord *pmr; xmovegameinfo *pmgi; const char *pch0, *pch1, *pch2; char *pchEnd0, *pchEnd1, *pchEnd2; int n0, n1, fCrawford0, fCrawford1, fPostCrawford0, fPostCrawford1; if ((pch0 = NextToken(&sz)) == 0) pch0 = ""; if ((pch1 = NextToken(&sz)) == 0) pch1 = ""; if ((pch2 = NextToken(&sz)) != 0) { int n = (int) strtol(pch2, &pchEnd2, 10); if (pch2 == pchEnd2 || n < 0 || n > MAXSCORE) { outputf(_("Match length must be between 0 (unlimited session) and %d\n"), MAXSCORE); return; } else ms.nMatchTo = n; } n0 = (int) strtol(pch0, &pchEnd0, 10); if (pch0 == pchEnd0) n0 = INT_MIN; n1 = (int) strtol(pch1, &pchEnd1, 10); if (pch1 == pchEnd1) n1 = INT_MIN; if (((fCrawford0 = *pchEnd0 == '*' || (*pchEnd0 && !StrNCaseCmp(pchEnd0, "crawford", strlen(pchEnd0)))) && n0 != INT_MIN && n0 != -1 && n0 != ms.nMatchTo - 1) || ((fCrawford1 = *pchEnd1 == '*' || (*pchEnd1 && !StrNCaseCmp(pchEnd1, "crawford", strlen(pchEnd1)))) && n1 != INT_MIN && n1 != -1 && n1 != ms.nMatchTo - 1)) { outputl(_("The Crawford rule applies only in match play when a " "player's score is 1-away.")); return; } if (((fPostCrawford0 = (*pchEnd0 && !StrNCaseCmp(pchEnd0, "postcrawford", strlen(pchEnd0)))) && n0 != INT_MIN && n0 != -1 && n0 != ms.nMatchTo - 1) || ((fPostCrawford1 = (*pchEnd1 && !StrNCaseCmp(pchEnd1, "postcrawford", strlen(pchEnd1)))) && n1 != INT_MIN && n1 != -1 && n1 != ms.nMatchTo - 1)) { outputl(_("The Crawford rule applies only in match play when a " "player's score is 1-away.")); return; } if (!ms.nMatchTo && (fCrawford0 || fCrawford1 || fPostCrawford0 || fPostCrawford1)) { outputl(_("The Crawford rule applies only in match play when a " "player's score is 1-away.")); return; } if (fCrawford0 && fCrawford1) { outputl(_("You cannot set the Crawford rule when both players' scores " "are 1-away.")); return; } if ((fCrawford0 && fPostCrawford1) || (fCrawford1 && fPostCrawford0)) { outputl(_("You cannot set both Crawford and post-Crawford " "simultaneously.")); return; } /* silently ignore the case where both players are set post-Crawford; * assume that is unambiguous and means double match point */ if (fCrawford0 || fPostCrawford0) n0 = -1; if (fCrawford1 || fPostCrawford1) n1 = -1; if (n0 < 0) /* -n means n-away */ n0 += ms.nMatchTo; if (n1 < 0) n1 += ms.nMatchTo; if ((fPostCrawford0 && !n1) || (fPostCrawford1 && !n0)) { outputl(_("You cannot set post-Crawford play if the trailer has yet " "to score.")); return; } if (n0 < 0 || n1 < 0) { outputl(_("You must specify two valid scores.")); return; } if (ms.nMatchTo && (n0 >= ms.nMatchTo || n1 >= ms.nMatchTo)) { outputl(_("You cannot set a score where the match is " "already over.")); return; } CancelCubeAction(); ms.anScore[0] = n0; ms.anScore[1] = n1; if (ms.nMatchTo) { if (n0 != ms.nMatchTo - 1 && n1 != ms.nMatchTo - 1) /* must be pre-Crawford */ ms.fCrawford = ms.fPostCrawford = FALSE; else if ((n0 == ms.nMatchTo - 1 && n1 == ms.nMatchTo - 1) || fPostCrawford0 || fPostCrawford1) { /* must be post-Crawford */ ms.fCrawford = FALSE; ms.fPostCrawford = ms.nMatchTo > 1; } else { /* possibly the Crawford game */ if (n0 >= ms.nMatchTo || n1 >= ms.nMatchTo) ms.fCrawford = FALSE; else if (fCrawford0 || fCrawford1 || !n0 || !n1) ms.fCrawford = TRUE; ms.fPostCrawford = !ms.fCrawford; } } if (ms.gs < GAME_OVER && plGame && (pmr = (moverecord *) plGame->plNext->p) && (pmgi = &pmr->g)) { g_assert(pmr->mt == MOVE_GAMEINFO); pmgi->anScore[0] = ms.anScore[0]; pmgi->anScore[1] = ms.anScore[1]; pmgi->fCrawfordGame = ms.fCrawford; #if defined(USE_GTK) /* The score this game was started at is displayed in the option * menu, and is now out of date. */ if (fX) GTKRegenerateGames(); #endif /* USE_GTK */ } CommandShowScore(NULL); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetSeed(char *sz) { SetSeed(rngCurrent, rngctxCurrent, sz); } extern void CommandSetToolbar(char *sz) { if (!StrCaseCmp("on", sz) || !StrCaseCmp("off", sz)) { #if defined(USE_GTK) if (!StrCaseCmp("on", sz)) { if (!fToolbarShowing) ShowToolbar(); } else { if (fToolbarShowing) HideToolbar(); } #endif } else { int n = ParseNumber(&sz); if (n != 0 && n != 1 && n != 2) { outputl(_("You must specify either 0, 1 or 2")); return; } #if defined(USE_GTK) if (fX) SetToolbarStyle(n); #endif } } extern void SetTurn(int i) { if (ms.fTurn != i) SwapSides(ms.anBoard); ms.fTurn = ms.fMove = i; CancelCubeAction(); pmr_hint_destroy(); fNextTurn = FALSE; #if defined(USE_GTK) if (fX) { BoardData *bd = BOARD(pwBoard)->board_data; bd->diceRoll[0] = bd->diceRoll[1] = 0; fJustSwappedPlayers = TRUE; } #endif ms.anDice[0] = ms.anDice[1] = 0; UpdateSetting(&ms.fTurn); #if defined(USE_GTK) if (fX) ShowBoard(); #endif /* USE_GTK */ return; } extern void CommandSetTurn(char *sz) { char *pch = NextToken(&sz); int i; if (ms.gs != GAME_PLAYING) { outputl(_("There must be a game in progress to set a player on roll.")); return; } if (ms.fResigned) { outputl(_("Please resolve the resignation first.")); return; } if (!pch) { outputl(_("Which player do you want to set on roll?")); return; } if ((i = ParsePlayer(pch)) < 0) { outputf(_("Unknown player `%s' (see `help set turn').\n"), pch); return; } if (i == 2) { outputl(_("You can't set both players on roll.")); return; } SetTurn(i); outputf(_("`%s' is now on roll.\n"), ap[i].szName); } extern void CommandSetUseKeyNames(char *sz) { SetToggle("usekeynames", &fUseKeyNames, sz, _("Use key player names to set key player at bottom of board."), _("Dont use key player names to set key player at bottom of board.")); // g_message("fUseKeyNames=%d",fUseKeyNames); } extern void CommandSetJacoby(char *sz) { if (SetToggle("jacoby", &fJacoby, sz, _("Will use the Jacoby rule for money sessions."), _("Will not use the Jacoby rule for money sessions."))) return; if (fJacoby && !ms.fCubeUse) outputl(_("Note that you'll have to enable the cube if you want " "gammons and backgammons\nto be scored (see `help set " "cube use').")); ms.fJacoby = fJacoby; } extern void CommandSetCrawford(char *sz) { if (ms.nMatchTo > 0) { if ((ms.nMatchTo - ms.anScore[0] == 1) || (ms.nMatchTo - ms.anScore[1] == 1)) { moverecord *pmr; xmovegameinfo *pmgi; if (SetToggle("crawford", &ms.fCrawford, sz, _("This game is the Crawford game (no doubling allowed)."), _("This game is not the Crawford game.")) < 0) return; /* sanity check */ ms.fPostCrawford = !ms.fCrawford; if (ms.fCrawford) CancelCubeAction(); if (plGame && (pmr = plGame->plNext->p) && (pmgi = &pmr->g)) { g_assert(pmr->mt == MOVE_GAMEINFO); pmgi->fCrawfordGame = ms.fCrawford; } } else { if (ms.fCrawford) { /* Allow crawford to be turned off if set at incorrect score */ SetToggle("crawford", &ms.fCrawford, sz, _("This game is the Crawford game (no doubling allowed)."), _("This game is not the Crawford game.")); return; } outputl(_("Cannot set whether this is the Crawford game\n" "as none of the players are 1-away from winning.")); } /* Clear previous data in the hint cache after toggling Crawford */ pmr_hint_destroy(); } else if (!ms.nMatchTo) outputl(_("Cannot set Crawford play for money sessions.")); else outputl(_("No match in progress (type `new match n' to start one).")); } extern void CommandSetPostCrawford(char *sz) { if (ms.nMatchTo > 0) { if ((ms.nMatchTo - ms.anScore[0] == 1) || (ms.nMatchTo - ms.anScore[1] == 1)) { moverecord *pmr; xmovegameinfo *pmgi; SetToggle("postcrawford", &ms.fPostCrawford, sz, _("This is post-Crawford play (doubling allowed)."), _("This is not post-Crawford play.")); /* sanity check */ ms.fCrawford = !ms.fPostCrawford; if (ms.fCrawford) CancelCubeAction(); if (plGame && (pmr = plGame->plNext->p) && (pmgi = &pmr->g)) { g_assert(pmr->mt == MOVE_GAMEINFO); pmgi->fCrawfordGame = ms.fCrawford; } } else { outputl(_("Cannot set whether this is post-Crawford play\n" "as none of the players are 1-away from winning.")); } } else if (!ms.nMatchTo) outputl(_("Cannot set post-Crawford play for money sessions.")); else outputl(_("No match in progress (type `new match n' to start one).")); } #if defined(USE_GTK) extern void CommandSetWarning(char *sz) { gchar *buf; warningType warning; char *pValue = strchr(sz, ' '); if (!pValue) { outputl(_("Incorrect syntax for set warning command.")); return; } *pValue++ = '\0'; warning = ParseWarning(sz); if ((int) warning < 0) { buf = g_strdup_printf(_("Unknown warning %s."), sz); outputl(buf); g_free(buf); return; } while (*pValue == ' ') pValue++; if (!StrCaseCmp(pValue, "on")) { SetWarningEnabled(warning, TRUE); } else if (!StrCaseCmp(pValue, "off")) { SetWarningEnabled(warning, FALSE); } else { buf = g_strdup_printf(_("Unknown value %s."), pValue); outputl(buf); g_free(buf); return; } buf = g_strdup_printf(_("Warning %s set to %s."), sz, pValue); outputl(buf); g_free(buf); } extern void CommandShowWarning(char *sz) { warningType warning; while (*sz == ' ') sz++; if (!*sz) { /* Show all warnings */ for (warning = (warningType) 0; warning < WARN_NUM_WARNINGS; warning++) PrintWarning(warning); } else { /* Show specific warning */ warning = ParseWarning(sz); if ((int) warning < 0) { gchar *buf; buf = g_strdup_printf(_("Unknown warning %s."), sz); outputl(buf); g_free(buf); return; } PrintWarning(warning); } } #endif extern void CommandSetBeavers(char *sz) { int n; if ((n = ParseNumber(&sz)) < 0) { outputl(_("You must specify the number of beavers to allow.")); return; } nBeavers = (unsigned int) n; if (nBeavers > 1) outputf(_("%u beavers/raccoons allowed in money sessions.\n"), nBeavers); else if (nBeavers == 1) outputl(_("1 beaver allowed in money sessions.")); else outputl(_("No beavers allowed in money sessions.")); } #if defined(USE_GTK) extern void CommandSetScoreMapPly(char* sz) { int n = ParseNumber(&sz); if (n < 0 || n>=NUM_PLY) { outputl(_("Wrong ply number.")); return; } scoreMapPlyDefault = (scoreMapPly) n; } extern void CommandSetScoreMapMatchLength(char* sz) { int n = ParseNumber(&sz); // g_print("\n n is: %d",n); // if (n < -1 || n>=MATCH_LENGTH_OPTIONS[NUM_MATCH_LENGTH-1]) { // outputl(_("Wrong match length.")); // return; // } for (int i=0; itext=%s",i,aszAnalyzeFileSettingCommands[i]); return; } } outputl(_("Wrong option.")); } extern void CommandSetOutputDigits(char *sz) { int n = ParseNumber(&sz); if (n < 0 || n > MAX_OUTPUT_DIGITS) { outputf(_("You must specify a number between 1 and %d.\n"), MAX_OUTPUT_DIGITS); return; } fOutputDigits = n; outputf(_("Probabilities and equities will be shown with %d digits " "after the decimal separator\n"), fOutputDigits); #if defined(USE_GTK) MoveListRefreshSize(); #endif } extern void CommandSetOutputMatchPC(char *sz) { SetToggle("output matchpc", &fOutputMatchPC, sz, _("Match winning chances will be shown as percentages."), _("Match winning chances will be shown as probabilities.")); } extern void CommandSetOutputMWC(char *sz) { SetToggle("output mwc", &fOutputMWC, sz, _("Match evaluations will be shown as match winning chances."), _("Match evaluations will be shown as equivalent money equity.")); } extern void CommandSetOutputRawboard(char *sz) { SetToggle("output rawboard", &fOutputRawboard, sz, _("TTY boards will be given in raw format."), _("TTY boards will be given in ASCII.")); } extern void CommandSetOutputWinPC(char *sz) { SetToggle("output winpc", &fOutputWinPC, sz, _("Game winning chances will be shown as percentages."), _("Game winning chances will be shown as probabilities.")); } static void SetInvertMET(void) { invertMET(); /* Clear any stored results to stop previous table causing problems */ EvalCacheFlush(); pmr_hint_destroy(); } extern void CommandSetMET(char *sz) { sz = NextToken(&sz); if (!sz || !*sz) { outputl(_("You must specify a filename. " "See \"help set met\". ")); return; } InitMatchEquity(sz); /* Cubeful evaluation get confused with entries from another table */ EvalCacheFlush(); /* clear hint */ CommandClearHint(NULL); outputf(_("GNU Backgammon will now use the %s match equity table.\n"), miCurrent.szName); if (miCurrent.nLength < MAXSCORE && miCurrent.nLength != -1) { outputf(_("\n" "Note that this match equity table only supports " "matches of length %i and below.\n" "For scores above %i-away an extrapolation " "scheme is used.\n"), miCurrent.nLength, miCurrent.nLength); } if (fInvertMET) SetInvertMET(); } extern void CommandSetEvalParamType(char *sz) { switch (sz[0]) { case 'r': pesSet->et = EVAL_ROLLOUT; break; case 'e': pesSet->et = EVAL_EVAL; break; default: outputf(_("Unknown evaluation type: %s (see\n" "`help set %s type').\n"), sz, szSetCommand); return; } outputf(_("%s will now use %s.\n"), szSet, gettext(aszEvalType[pesSet->et])); } extern void CommandSetEvalParamEvaluation(char *sz) { pecSet = &pesSet->ec; HandleCommand(sz, acSetEvaluation); if (pesSet->et != EVAL_EVAL) outputf(_("(Note that this setting will have no effect until you\n" "`set %s type evaluation'.)\n"), szSetCommand); } extern void CommandSetEvalParamRollout(char *sz) { prcSet = &pesSet->rc; HandleCommand(sz, acSetRollout); if (pesSet->et != EVAL_ROLLOUT) outputf(_("(Note that this setting will have no effect until you\n" "`set %s type rollout.)'\n"), szSetCommand); } extern void CommandSetEvalSameAsAnalysis(char *sz) { SetToggle("eval sameasanalysis", &fEvalSameAsAnalysis, sz, _("Evaluation settings will be same as analysis settings."), _("Evaluation settings separate from analysis settings.")); } extern void CommandSetAnalysisPlayer(char *sz) { char *pch = NextToken(&sz); int i; if (!pch) { outputl(_("You must specify a player " "(see `help set analysis player').")); return; } if ((i = ParsePlayer(pch)) == 0 || i == 1) { iPlayerSet = i; HandleCommand(sz, acSetAnalysisPlayer); return; } if (i == 2) { gchar *pchCopy = g_strdup(sz); outputpostpone(); iPlayerSet = 0; HandleCommand(sz, acSetAnalysisPlayer); iPlayerSet = 1; HandleCommand(pchCopy, acSetAnalysisPlayer); outputresume(); g_free(pchCopy); return; } outputf(_("Unknown player `%s'\n" "(see `help set analysis player').\n"), pch); } extern void CommandSetAnalysisPlayerAnalyse(char *sz) { gchar *sz1, *sz2; sz1 = g_strdup_printf(_("Analyse %s's chequerplay and cube decisions."), ap[iPlayerSet].szName); sz2 = g_strdup_printf(_("Do not analyse %s's chequerplay and cube decisions."), ap[iPlayerSet].szName); SetToggle("analysis player", &afAnalysePlayers[iPlayerSet], sz, sz1, sz2); g_free(sz2); g_free(sz1); } extern void CommandSetAnalysisChequerplay(char *sz) { pesSet = &esAnalysisChequer; szSet = _("Analysis chequerplay"); szSetCommand = "analysis chequerplay"; HandleCommand(sz, acSetEvalParam); } extern void CommandSetAnalysisCubedecision(char *sz) { pesSet = &esAnalysisCube; szSet = _("Analysis cubedecision"); szSetCommand = "analysis cubedecision"; HandleCommand(sz, acSetEvalParam); } extern void CommandSetEvalChequerplay(char *sz) { pesSet = &esEvalChequer; szSet = _("`eval' and `hint' chequerplay"); szSetCommand = "evaluation chequerplay "; HandleCommand(sz, acSetEvalParam); } extern void CommandSetEvalCubedecision(char *sz) { pesSet = &esEvalCube; szSet = _("`eval' and `hint' cube decisions"); szSetCommand = "evaluation cubedecision "; HandleCommand(sz, acSetEvalParam); } extern void CommandSetEvalMoveFilter(char *sz) { szSetCommand = "evaluation"; SetMoveFilter(sz, aamfEval); } extern void CommandSetAnalysisMoveFilter(char *sz) { szSetCommand = "analysis"; SetMoveFilter(sz, aamfAnalysis); } extern void SetMatchInfo(char **ppch, const char *sz, char *szMessage) { if (*ppch) g_free(*ppch); if (sz && *sz) { *ppch = g_strdup(sz); if (szMessage) outputf(_("%s set to: %s\n"), szMessage, sz); } else { *ppch = NULL; if (szMessage) outputf(_("%s cleared.\n"), szMessage); } } extern void CommandSetMatchAnnotator(char *sz) { SetMatchInfo(&mi.pchAnnotator, sz, _("Match annotator")); } extern void CommandSetMatchComment(char *sz) { SetMatchInfo(&mi.pchComment, sz, _("Match comment")); } static int DaysInMonth(int nYear, int nMonth) { static const int an[12] = { 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (nMonth < 1 || nMonth > 12) return -1; else if (nMonth != 2) return an[nMonth - 1]; else if (nYear % 4 || (!(nYear % 100) && nYear % 400)) return 28; else return 29; } extern void CommandSetMatchDate(char *sz) { int nYear, nMonth, nDay; if (!sz || !*sz) { mi.nYear = 0; outputl(_("Match date cleared.")); return; } /* 1753 is the year Britain and its colonies adopted the Gregorian calendar */ if (sscanf(sz, "%4d-%2d-%2d", &nYear, &nMonth, &nDay) < 3 || nYear < 1753 || nMonth < 1 || nMonth > 12 || nDay < 1 || nDay > DaysInMonth(nYear, nMonth)) { outputf(_("%s is not a valid date (see `help set matchinfo " "date').\n"), sz); return; } mi.nYear = nYear; mi.nMonth = nMonth; mi.nDay = nDay; outputf(_("Match date set to %04d-%02d-%02d.\n"), nYear, nMonth, nDay); } extern void CommandSetMatchEvent(char *sz) { SetMatchInfo(&mi.pchEvent, sz, _("Match event")); } extern void CommandSetMatchLength(char *sz) { int n; if ((n = ParseNumber(&sz)) < 0 || n > MAXSCORE) { outputf(_("Match length must be between 0 (unlimited session) and %d\n"), MAXSCORE); return; } nDefaultLength = (unsigned) n; outputf(ngettext("New matches default to %u point.\n", "New matches default to %u points.\n", nDefaultLength), nDefaultLength); } extern void CommandSetMatchPlace(char *sz) { SetMatchInfo(&mi.pchPlace, sz, _("Match place")); } extern void CommandSetMatchRating(char *sz) { gchar *szMessage; int n; if ((n = ParsePlayer(NextToken(&sz))) < 0) { outputl(_("You must specify which player's rating to set (see `help " "set matchinfo rating').")); return; } szMessage = g_strdup_printf(_("Rating for %s"), ap[n].szName); SetMatchInfo(&mi.pchRating[n], sz, szMessage); g_free(szMessage); } extern void CommandSetMatchRound(char *sz) { SetMatchInfo(&mi.pchRound, sz, _("Match round")); } extern void CommandSetMatchID(char *sz) { SetMatchID(sz); ShowBoard(); } extern void CommandSetExportIncludeAnnotations(char *sz) { SetToggle("annotations", &exsExport.fIncludeAnnotation, sz, _("Include annotations in exports"), _("Do not include annotations in exports")); } extern void CommandSetExportIncludeAnalysis(char *sz) { SetToggle("analysis", &exsExport.fIncludeAnalysis, sz, _("Include analysis in exports"), _("Do not include analysis in exports")); } extern void CommandSetExportIncludeStatistics(char *sz) { SetToggle("statistics", &exsExport.fIncludeStatistics, sz, _("Include statistics in exports"), _("Do not include statistics in exports")); } extern void CommandSetExportIncludeMatchInfo(char *sz) { SetToggle("matchinfo", &exsExport.fIncludeMatchInfo, sz, _("Include match information in exports"), _("Do not include match information in exports")); } extern void CommandSetExportShowBoard(char *sz) { int n; if ((n = ParseNumber(&sz)) < 0) { outputl(_("You must specify a semi-positive number.")); return; } exsExport.fDisplayBoard = n; if (!n) output(_("The board will never been shown in exports.")); else outputf(_("The board will be shown every %d. move in exports."), n); } extern void CommandSetExportShowPlayer(char *sz) { int i; if ((i = ParsePlayer(sz)) < 0) { outputf(_("Unknown player `%s' " "(see `help set export show player').\n"), sz); return; } exsExport.fSide = i + 1; if (i == 2) outputl(_("Analysis, boards etc will be " "shown for both players in exports.")); else outputf(_("Analysis, boards etc will only be shown for " "player %s in exports.\n"), ap[i].szName); } extern void CommandSetExportMovesNumber(char *sz) { int n; if ((n = ParseNumber(&sz)) < 0) { outputl(_("You must specify a semi-positive number.")); return; } exsExport.nMoves = n; outputf(_("Show at most %d moves in exports.\n"), n); } extern void CommandSetExportMovesProb(char *sz) { SetToggle("probabilities", &exsExport.fMovesDetailProb, sz, _("Show detailed probabilities for moves"), _("Do not show detailed probabilities for moves")); } static int *pParameter; extern void CommandSetExportMovesParameters(char *sz) { pParameter = exsExport.afMovesParameters; HandleCommand(sz, acSetExportParameters); } extern void CommandSetExportCubeProb(char *sz) { SetToggle("probabilities", &exsExport.fCubeDetailProb, sz, _("Show detailed probabilities for cube decisions"), _("Do not show detailed probabilities for cube decisions")); } extern void CommandSetExportCubeParameters(char *sz) { pParameter = exsExport.afCubeParameters; HandleCommand(sz, acSetExportParameters); } extern void CommandSetExportParametersEvaluation(char *sz) { SetToggle("evaluation", &pParameter[0], sz, _("Show detailed parameters for evaluations"), _("Do not show detailed parameters for evaluations")); } extern void CommandSetExportParametersRollout(char *sz) { SetToggle("rollout", &pParameter[1], sz, _("Show detailed parameters for rollouts"), _("Do not show detailed parameters for rollouts")); } extern void CommandSetExportMovesDisplayVeryBad(char *sz) { SetToggle("export moves display very bad", &exsExport.afMovesDisplay[SKILL_VERYBAD], sz, _("Export moves marked 'very bad'."), _("Do not export moves marked 'very bad'.")); } extern void CommandSetExportMovesDisplayBad(char *sz) { SetToggle("export moves display bad", &exsExport.afMovesDisplay[SKILL_BAD], sz, _("Export moves marked 'bad'."), _("Do not export moves marked 'bad'.")); } extern void CommandSetExportMovesDisplayDoubtful(char *sz) { SetToggle("export moves display doubtful", &exsExport.afMovesDisplay[SKILL_DOUBTFUL], sz, _("Export moves marked 'doubtful'."), _("Do not export moves marked 'doubtful'.")); } extern void CommandSetExportMovesDisplayUnmarked(char *sz) { SetToggle("export moves display unmarked", &exsExport.afMovesDisplay[SKILL_NONE], sz, _("Export unmarked moves."), _("Do not export unmarked moves.")); } extern void CommandSetExportCubeDisplayVeryBad(char *sz) { SetToggle("export cube display very bad", &exsExport.afCubeDisplay[SKILL_VERYBAD], sz, _("Export cube decisions marked 'very bad'."), _("Do not export cube decisions marked 'very bad'.")); } extern void CommandSetExportCubeDisplayBad(char *sz) { SetToggle("export cube display bad", &exsExport.afCubeDisplay[SKILL_BAD], sz, _("Export cube decisions marked 'bad'."), _("Do not export cube decisions marked 'bad'.")); } extern void CommandSetExportCubeDisplayDoubtful(char *sz) { SetToggle("export cube display doubtful", &exsExport.afCubeDisplay[SKILL_DOUBTFUL], sz, _("Export cube decisions marked 'doubtful'."), _("Do not export cube decisions marked 'doubtful'.")); } extern void CommandSetExportCubeDisplayUnmarked(char *sz) { SetToggle("export cube display unmarked", &exsExport.afCubeDisplay[SKILL_NONE], sz, _("Export unmarked cube decisions."), _("Do not export unmarked cube decisions.")); } extern void CommandSetExportCubeDisplayActual(char *sz) { SetToggle("export cube display actual", &exsExport.afCubeDisplay[EXPORT_CUBE_ACTUAL], sz, _("Export actual cube decisions."), _("Do not export actual cube decisions.")); } extern void CommandSetExportCubeDisplayClose(char *sz) { SetToggle("export cube display close", &exsExport.afCubeDisplay[EXPORT_CUBE_CLOSE], sz, _("Export close cube decisions."), _("Do not export close cube decisions.")); } extern void CommandSetExportCubeDisplayMissed(char *sz) { SetToggle("export cube display missed", &exsExport.afCubeDisplay[EXPORT_CUBE_MISSED], sz, _("Export missed cube decisions."), _("Do not export missed cube decisions.")); } static void SetExportHTMLType(const htmlexporttype het, const char *szExtension) { g_free(exsExport.szHTMLExtension); exsExport.het = het; exsExport.szHTMLExtension = g_strdup(szExtension); outputf(_("HTML export type is now: \n" "%s\n"), aszHTMLExportType[exsExport.het]); } extern void CommandSetExportHTMLTypeBBS(char *UNUSED(sz)) { SetExportHTMLType(HTML_EXPORT_TYPE_BBS, "gif"); } extern void CommandSetExportHTMLTypeFibs2html(char *UNUSED(sz)) { SetExportHTMLType(HTML_EXPORT_TYPE_FIBS2HTML, "gif"); } extern void CommandSetExportHTMLTypeGNU(char *UNUSED(sz)) { SetExportHTMLType(HTML_EXPORT_TYPE_GNU, "png"); } static void SetExportHTMLCSS(const htmlexportcss hecss) { if (exsExport.hecss == hecss) return; if (exsExport.hecss == HTML_EXPORT_CSS_EXTERNAL) CommandNotImplemented(NULL); exsExport.hecss = hecss; outputf(_("CSS stylesheet for HTML export: %s\n"), gettext(aszHTMLExportCSS[hecss])); } extern void CommandSetExportHTMLCSSHead(char *UNUSED(sz)) { SetExportHTMLCSS(HTML_EXPORT_CSS_HEAD); } extern void CommandSetExportHTMLCSSInline(char *UNUSED(sz)) { SetExportHTMLCSS(HTML_EXPORT_CSS_INLINE); } extern void CommandSetExportHTMLCSSExternal(char *UNUSED(sz)) { SetExportHTMLCSS(HTML_EXPORT_CSS_EXTERNAL); } extern void CommandSetExportHTMLPictureURL(char *sz) { if (!sz || !*sz) { outputl(_("You must specify a URL. " "See `help set export html pictureurl'.")); return; } g_free(exsExport.szHTMLPictureURL); sz = NextToken(&sz); exsExport.szHTMLPictureURL = g_strdup(sz); outputf(_("URL for picture in HTML export is now: \n" "%s\n"), exsExport.szHTMLPictureURL); } extern void CommandSetInvertMatchEquityTable(char *sz) { int fOldInvertMET = fInvertMET; if (SetToggle("invert matchequitytable", &fInvertMET, sz, _("Match equity table will be used inverted."), _("Match equity table will not be use inverted.")) >= 0) UpdateSetting(&fInvertMET); if (fOldInvertMET != fInvertMET) SetInvertMET(); } extern void CommandSetTutorMode(char *sz) { SetToggle("tutor-mode", &fTutor, sz, _("Warn about possibly bad play."), _("No warnings for possibly bad play.")); } extern void CommandSetTutorCube(char *sz) { SetToggle("tutor-cube", &fTutorCube, sz, _("Include advice on cube decisions in tutor mode."), _("Exclude advice on cube decisions from tutor mode.")); } extern void CommandSetTutorChequer(char *sz) { SetToggle("tutor-chequer", &fTutorChequer, sz, _("Include advice on chequer play in tutor mode."), _("Exclude advice on chequer play from tutor mode.")); } static void set_tutor_skill(skilltype Skill, int skillno, char *skill) { nTutorSkillCurrent = skillno; TutorSkill = Skill; outputf(_("Tutor warnings will be given for play marked `%s'.\n"), skill); } extern void CommandSetTutorSkillDoubtful(char *UNUSED(sz)) { set_tutor_skill(SKILL_DOUBTFUL, 0, _("doubtful")); } extern void CommandSetTutorSkillBad(char *UNUSED(sz)) { set_tutor_skill(SKILL_BAD, 1, _("bad")); } extern void CommandSetTutorSkillVeryBad(char *UNUSED(sz)) { set_tutor_skill(SKILL_VERYBAD, 2, _("very bad")); } /* * Sounds */ /* enable/disable sounds */ extern void CommandSetSoundEnable(char *sz) { SetToggle("sound enable", &fSound, sz, _("Enable sounds."), _("Disable sounds.")); } /* sound system */ extern void CommandSetSoundSystemCommand(char *sz) { sound_set_command(sz); } extern void CommandSetSoundSoundAgree(char *sz) { SetSoundFile(SOUND_AGREE, NextToken(&sz)); } extern void CommandSetSoundSoundAnalysisFinished(char *sz) { SetSoundFile(SOUND_ANALYSIS_FINISHED, NextToken(&sz)); } extern void CommandSetSoundSoundBotDance(char *sz) { SetSoundFile(SOUND_BOT_DANCE, NextToken(&sz)); } extern void CommandSetSoundSoundBotWinGame(char *sz) { SetSoundFile(SOUND_BOT_WIN_GAME, NextToken(&sz)); } extern void CommandSetSoundSoundBotWinMatch(char *sz) { SetSoundFile(SOUND_BOT_WIN_MATCH, NextToken(&sz)); } extern void CommandSetSoundSoundChequer(char *sz) { SetSoundFile(SOUND_CHEQUER, NextToken(&sz)); } extern void CommandSetSoundSoundDouble(char *sz) { SetSoundFile(SOUND_DOUBLE, NextToken(&sz)); } extern void CommandSetSoundSoundDrop(char *sz) { SetSoundFile(SOUND_DROP, NextToken(&sz)); } extern void CommandSetSoundSoundExit(char *sz) { SetSoundFile(SOUND_EXIT, NextToken(&sz)); } extern void CommandSetSoundSoundHumanDance(char *sz) { SetSoundFile(SOUND_HUMAN_DANCE, NextToken(&sz)); } extern void CommandSetSoundSoundHumanWinGame(char *sz) { SetSoundFile(SOUND_HUMAN_WIN_GAME, NextToken(&sz)); } extern void CommandSetSoundSoundHumanWinMatch(char *sz) { SetSoundFile(SOUND_HUMAN_WIN_MATCH, NextToken(&sz)); } extern void CommandSetSoundSoundMove(char *sz) { SetSoundFile(SOUND_MOVE, NextToken(&sz)); } extern void CommandSetSoundSoundRedouble(char *sz) { SetSoundFile(SOUND_REDOUBLE, NextToken(&sz)); } extern void CommandSetSoundSoundResign(char *sz) { SetSoundFile(SOUND_RESIGN, NextToken(&sz)); } extern void CommandSetSoundSoundRoll(char *sz) { SetSoundFile(SOUND_ROLL, NextToken(&sz)); } extern void CommandSetSoundSoundStart(char *sz) { SetSoundFile(SOUND_START, NextToken(&sz)); } extern void CommandSetSoundSoundTake(char *sz) { SetSoundFile(SOUND_TAKE, NextToken(&sz)); } static void SetPriority(int n) { #if defined(HAVE_SETPRIORITY) if (setpriority(PRIO_PROCESS, getpid(), n)) outputerr("setpriority"); else { outputf(_("Scheduling priority set to %d.\n"), n); nThreadPriority = n; } #elif WIN32 /* tp - thread priority, pp - process priority */ int tp = THREAD_PRIORITY_NORMAL; int pp = NORMAL_PRIORITY_CLASS; char *pch; if (n < -19) { tp = THREAD_PRIORITY_TIME_CRITICAL; pch = N_("time critical"); } else if (n < -10) { tp = THREAD_PRIORITY_HIGHEST; pch = N_("highest"); } else if (n < 0) { tp = THREAD_PRIORITY_ABOVE_NORMAL; pch = N_("above normal"); } else if (!n) { pch = N_("normal"); } else if (n < 19) { tp = THREAD_PRIORITY_BELOW_NORMAL; pch = N_("below normal"); } else { /* Lowest - set to idle prioirty but raise the thread priority * to make sure it runs instead of screen savers */ tp = THREAD_PRIORITY_HIGHEST; pp = IDLE_PRIORITY_CLASS; pch = N_("idle"); } if (SetThreadPriority(GetCurrentThread(), tp) && SetPriorityClass(GetCurrentProcess(), pp)) { outputf(_("Priority of program set to: %s\n"), pch); nThreadPriority = n; } else outputerrf(_("Changing priority failed (trying to set priority " "%s)\n"), pch); #else (void) n; /* suppress unused parameter compiler warning */ outputerrf(_("Priority changes are not supported on this platform.\n")); #endif /* HAVE_SETPRIORITY */ } extern void CommandSetPriorityAboveNormal(char *UNUSED(sz)) { SetPriority(-10); } extern void CommandSetPriorityBelowNormal(char *UNUSED(sz)) { SetPriority(10); } extern void CommandSetPriorityHighest(char *UNUSED(sz)) { SetPriority(-19); } extern void CommandSetPriorityIdle(char *UNUSED(sz)) { SetPriority(19); } extern void CommandSetPriorityNice(char *sz) { int n; if ((n = ParseNumber(&sz)) < -20 || n > 20) { outputl(_("You must specify a priority between -20 and 20.")); return; } SetPriority(n); } extern void CommandSetPriorityNormal(char *UNUSED(sz)) { SetPriority(0); } extern void CommandSetPriorityTimeCritical(char *UNUSED(sz)) { SetPriority(-20); } extern void CommandSetCheatEnable(char *sz) { SetToggle("cheat enable", &fCheat, sz, _("Allow GNU Backgammon to manipulate the dice."), _("Disallow GNU Backgammon to manipulate the dice.")); } extern void CommandSetCheatPlayer(char *sz) { char *pch = NextToken(&sz); int i; if (!pch) { outputl(_("You must specify a player " "(see `help set cheat player').")); return; } if ((i = ParsePlayer(pch)) == 0 || i == 1) { iPlayerSet = i; HandleCommand(sz, acSetCheatPlayer); return; } if (i == 2) { gchar *pchCopy = g_strdup(sz); outputpostpone(); iPlayerSet = 0; HandleCommand(sz, acSetCheatPlayer); iPlayerSet = 1; HandleCommand(pchCopy, acSetCheatPlayer); outputresume(); g_free(pchCopy); return; } outputf(_("Unknown player `%s'\n" "(see `help set %s player').\n"), pch, szSetCommand); } extern void PrintCheatRoll(const int fPlayer, const int n) { static const char *aszNumber[21] = { N_("best"), N_("second best"), N_("third best"), N_("4th best"), N_("5th best"), N_("6th best"), N_("7th best"), N_("8th best"), N_("9th best"), N_("10th best"), N_("median"), N_("10th worst"), N_("9th worst"), N_("8th worst"), N_("7th worst"), N_("6th worst"), N_("5th worst"), N_("4th worst"), N_("third worst"), N_("second worst"), N_("worst") }; outputf(_("%s will get the %s roll on each turn.\n"), ap[fPlayer].szName, gettext(aszNumber[n])); } extern void CommandSetCheatPlayerRoll(char *sz) { int n; if ((n = ParseNumber(&sz)) < 1 || n > 21) { outputl(_("You must specify a size between 1 and 21.")); return; } afCheatRoll[iPlayerSet] = n - 1; PrintCheatRoll(iPlayerSet, afCheatRoll[iPlayerSet]); } extern void CommandSetExportHtmlSize(char *sz) { int n; if ((n = ParseNumber(&sz)) < 1 || n > 20) { outputl(_("You must specify a size between 1 and 20.")); return; } exsExport.nHtmlSize = n; outputf(_("Size of generated HTML images is %dx%d pixels\n"), n * BOARD_WIDTH, n * BOARD_HEIGHT); } extern void CommandSetExportPNGSize(char *sz) { int n; if ((n = ParseNumber(&sz)) < 1 || n > 20) { outputl(_("You must specify a size between 1 and 20.")); return; } exsExport.nPNGSize = n; outputf(_("Size of generated PNG images are %dx%d pixels\n"), n * BOARD_WIDTH, n * BOARD_HEIGHT); } static void SetVariation(const bgvariation bgvx) { bgvDefault = bgvx; CommandShowVariation(NULL); if (ms.gs != GAME_NONE) outputf(_("The current match or session is being played as `%s'.\n"), gettext(aszVariations[ms.bgv])); outputf(_("Please start a new match or session to play `%s'\n"), gettext(aszVariations[bgvDefault])); #if defined(USE_GTK) if (fX && ms.gs == GAME_NONE) ShowBoard(); #endif /* USE_GTK */ } extern void CommandSetVariation1ChequerHypergammon(char *UNUSED(sz)) { SetVariation(VARIATION_HYPERGAMMON_1); } extern void CommandSetVariation2ChequerHypergammon(char *UNUSED(sz)) { SetVariation(VARIATION_HYPERGAMMON_2); } extern void CommandSetVariation3ChequerHypergammon(char *UNUSED(sz)) { SetVariation(VARIATION_HYPERGAMMON_3); } extern void CommandSetVariationNackgammon(char *UNUSED(sz)) { SetVariation(VARIATION_NACKGAMMON); } extern void CommandSetVariationStandard(char *UNUSED(sz)) { SetVariation(VARIATION_STANDARD); } extern void CommandSetGotoFirstGame(char *sz) { SetToggle("gotofirstgame", &fGotoFirstGame, sz, _("Goto first game when loading matches or sessions."), _("Goto last game when loading matches or sessions.")); } static void SetEfficiency(const char *szText, char *sz, float *prX) { float r = ParseReal(&sz); if (r >= 0.0f && r <= 1.0f) { *prX = r; outputf("%s: %7.5f\n", szText, *prX); } else outputl(_("Cube efficiency must be between 0 and 1")); } extern void CommandSetCubeEfficiencyOS(char *sz) { SetEfficiency(_("Cube efficiency for one sided bearoff positions"), sz, &rOSCubeX); } extern void CommandSetCubeEfficiencyCrashed(char *sz) { SetEfficiency(_("Cube efficiency for crashed positions"), sz, &rCrashedX[0]); rCrashedX[1] = rCrashedX[0]; } extern void CommandSetCubeEfficiencyContact(char *sz) { SetEfficiency(_("Cube efficiency for contact positions"), sz, &rContactX[0]); rContactX[1] = rContactX[0]; } extern void CommandSetCubeEfficiencyRaceFactor(char *sz) { float r = ParseReal(&sz); if (r >= 0) { rRaceFactorX[0] = r; outputf(_("Cube efficiency race factor set to %7.5f\n"), r); rRaceFactorX[1] = rRaceFactorX[0]; } else outputl(_("Cube efficiency race factor must be larger than 0.")); } extern void CommandSetCubeEfficiencyRaceMax(char *sz) { SetEfficiency(_("Cube efficiency race max"), sz, &rRaceMax[0]); rRaceMax[1] = rRaceMax[0]; } extern void CommandSetCubeEfficiencyRaceMin(char *sz) { SetEfficiency(_("Cube efficiency race min"), sz, &rRaceMin[0]); rRaceMin[1] = rRaceMin[0]; } extern void CommandSetCubeEfficiencyRaceCoefficient(char *sz) { float r = ParseReal(&sz); if (r >= 0) { rRaceCoefficientX[0] = r; outputf(_("Cube efficiency race coefficient set to %7.5f\n"), r); rRaceCoefficientX[1] = rRaceCoefficientX[0]; } else outputl(_("Cube efficiency race coefficient must be larger than 0.")); } extern void CommandSetRatingOffset(char *sz) { float r = ParseReal(&sz); if (r < 0) { outputl(_("Please provide a positive rating offset\n")); return; } rRatingOffset = r; outputf(_("The rating offset for estimating absolute ratings is: %.1f\n"), rRatingOffset); } extern void CommandSetLang(char *sz) { char *result; g_free(szLang); szLang = (sz && *sz) ? g_strdup(sz) : g_strdup("system"); result = SetupLanguage(szLang); if (result) { #if defined(USE_GTK) if (fX) GtkChangeLanguage(); else #endif outputf(_("Locale is now '%s'\n"), result); } else outputerrf(_("Locale '%s' not supported by C library.\n"), sz); } extern void CommandSetPanelWidth(char *sz) { int n = ParseNumber(&sz); if (n < 50) { outputl(_("You must specify a number greater than 50")); return; } #if defined(USE_GTK) if (fX) SetPanelWidth(n); #endif } extern void CommandSetOutputErrorRateFactor(char *sz) { float r = ParseReal(&sz); if (r < 0) { outputl(_("Please provide a positive number\n")); return; } rErrorRateFactor = r; outputf(_("The factor used for multiplying error rates is: %.1f\n"), rErrorRateFactor); } static void SetFolder(char **folder, char *sz) { g_free(*folder); if (sz && *sz) *folder = g_strdup(sz); else *folder = NULL; } extern void CommandSetExportFolder(char *sz) { SetFolder(&default_export_folder, NextToken(&sz)); } extern void CommandSetImportFolder(char *sz) { SetFolder(&default_import_folder, NextToken(&sz)); } extern void CommandSetSGFFolder(char *sz) { SetFolder(&default_sgf_folder, NextToken(&sz)); } static int SetXGID(char *sz) { int nMatchTo; int nRules; int fCrawford = 0; int anScore[2]; int fMove; int fTurn; unsigned int anDice[2] = { 0, 0 }; int fCubeOwner = -1; int nCube; int fDoubled = 0; int fJacobyRule = 0; matchstate msxg; TanBoard anBoard; char *posid, *matchid; char *pos; char *s = g_strdup(sz); char *c; int i; char v[9][5]; int fSidesSwapped = FALSE; if (s == NULL) return 1; /* If "XGID=" found, then parse "XGID=" line. * For get along with XGID+board style clipboard. * (also Board position: Above ) */ c = strstr(s, "XGID="); if (c != NULL) { c = strchr(c, '\n'); if (c != NULL) { *c = '\0'; } } for (i = 0; i < 9 && (c = strrchr(s, ':')); i++) { g_strlcpy(v[i], c + 1, 5); *c = '\0'; } c = strrchr(s, '='); pos = c ? c + 1 : s; if (strlen(pos) != 26) { g_free(s); return 1; } if (PositionFromXG(anBoard, pos)) { g_free(s); return 1; } else g_free(s); /* atoi(v[0]) is a maximum (money) cube value, unused in GNUbg. * Special case : if it is set to 0, the position is cubeless * with gammons and backgammons counting. See msxg initialization below. * It may not be that useful though, since setting a position is typically * followed by a "hint" or "analyse" command and analysis parameters * will override that. */ nMatchTo = atoi(v[1]); if (nMatchTo > MAXSCORE) return 1; nRules = atoi(v[2]); if (nMatchTo > 0) { switch (nRules) { case 0: fCrawford = 0; break; case 1: fCrawford = 1; break; default: return 1; } } else { switch (nRules) { case 0: fJacobyRule = 0; nBeavers = 0; break; case 1: fJacobyRule = 1; nBeavers = 0; break; case 2: fJacobyRule = 0; nBeavers = 3; break; case 3: fJacobyRule = 1; nBeavers = 3; break; default: return 1; } } anScore[0] = atoi(v[3]); anScore[1] = atoi(v[4]); if (nMatchTo > 0 && (anScore[0] >= nMatchTo || anScore[1] >= nMatchTo)) return 1; fMove = atoi(v[6]) == 1 ? 1 : 0; switch (v[5][0]) { case 'D': fTurn = !fMove; fDoubled = 1; anDice[0] = anDice[1] = 0; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': if (strlen(v[5]) != 2) { return 1; } fTurn = fMove; anDice[1] = atoi(v[5] + 1); v[5][1] = '\0'; anDice[0] = atoi(v[5]); break; default: return 1; } nCube = 1 << atoi(v[8]); if (nCube > MAX_CUBE) return 1; switch (atoi(v[7])) { case 1: fCubeOwner = 1; break; case 0: fCubeOwner = -1; break; case -1: fCubeOwner = 0; } msxg.anDice[0] = anDice[0]; msxg.anDice[1] = anDice[1]; msxg.fResigned = 0; msxg.fResignationDeclined = 0; msxg.fDoubled = fDoubled; msxg.cGames = 0; msxg.fMove = fMove; msxg.fTurn = fTurn; msxg.fCubeOwner = fCubeOwner; msxg.fCrawford = fCrawford; msxg.fPostCrawford = !fCrawford && (anScore[0] == nMatchTo - 1 || anScore[1] == nMatchTo - 1); msxg.nMatchTo = nMatchTo; msxg.anScore[0] = anScore[0]; msxg.anScore[1] = anScore[1]; msxg.nCube = nCube; msxg.bgv = bgvDefault; msxg.fCubeUse = fCubeUse; if (atoi(v[0]) == 0) msxg.fCubeUse = FALSE; msxg.fJacoby = fJacobyRule; msxg.gs = GAME_PLAYING; matchid = g_strdup(MatchIDFromMatchState(&msxg)); SetMatchID(matchid); g_free(matchid); if (!fMove) { SwapSides(anBoard); fSidesSwapped = TRUE; } posid = g_strdup(PositionID((ConstTanBoard) anBoard)); SetBoard(posid); g_free(posid); if ((anDice[0] == 0 && fSidesSwapped) || (anDice[0] && !fMove)) return 2; /* position has player on roll appearing on top */ return 0; } static char * get_base64(char *inp, char **next) { char *first, *last; int l = 0; *next = NULL; g_return_val_if_fail(inp, NULL); g_return_val_if_fail(*inp, NULL); for (first = inp; *first; first++) { if (Base64(*first) != 255) break; } if (!*first) { *next = first; return NULL; } for (last = first; *last; last++, l++) { if (Base64(*last) == 255) break; } *next = last; return g_strndup(first, l); } extern void CommandSetXGID(char *sz) { int rc = SetXGID(sz); if (rc == 1) outputerrf(_("Not a valid XGID '%s'"), sz); else { if (rc == 2) if (GetInputYN (_ ("This position has player on roll appearing on top. \nSwap players so the player on roll appears on the bottom? "))) CommandSwapPlayers(NULL); ShowBoard(); } } extern int SetGNUbgID(char *sz) { char *posid = NULL; char *matchid = NULL; switch (SetXGID(sz)) { case 0: return 0; case 2: return 2; default: ; /* continue below */ } while (sz && *sz) { char *out = get_base64(sz, &sz); if (out) { if (strlen(out) == L_MATCHID) { if (matchid) continue; matchid = g_strdup(out); } else if (strlen(out) == L_POSITIONID) { if (posid) continue; posid = g_strdup(out); } g_free(out); } if (posid && matchid) break; } if (!posid && !matchid) { outputerrf(_("No valid IDs found")); return 1; } if (matchid) SetMatchID(matchid); if (posid) SetBoard(posid); outputf(_("Setting GNUbg ID %s:%s\n"), posid ? posid : "", matchid ? matchid : ""); g_free(posid); g_free(matchid); return 0; } extern void CommandSetGNUbgID(char *sz) { int rc; rc = SetGNUbgID(sz); if (rc == 0) ShowBoard(); if (rc == 2) if (GetInputYN (_ ("This position has player on roll appearing on top. \nSwap players so the player on roll appears on the bottom? "))) CommandSwapPlayers(NULL); } extern void CommandSetAutoSaveRollout(char *sz) { SetToggle("autosave rollout", &fAutoSaveRollout, sz, _("Auto save during rollouts"), _("Don't auto save during rollouts")); } extern void CommandSetAutoSaveAnalysis(char *sz) { SetToggle("autosave analysis", &fAutoSaveAnalysis, sz, _("Auto save after each analysed game"), _("Don't auto save after each analysed game")); } extern void CommandSetAutoSaveConfirmDelete(char *sz) { SetToggle("autosave confirm", &fAutoSaveConfirmDelete, sz, _("Prompt before deleting autosaves"), _("Delete autosaves automatically")); } extern void CommandSetAutoSaveTime(char *sz) { int n = ParseNumber(&sz); if (n < 1) { outputl(_("You must specify a positive autosave time in minutes")); return; } nAutoSaveTime = n; } gnubg-1.08.003/Makefile.am000644 001751 000024 00000016266 14610037046 014670 0ustar00pmstaff000000 000000 # Copyright (C) 1998-2003 Gary Wong # Copyright (C) 2003-2021 the AUTHORS # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ## $Id: Makefile.am,v 1.275 2022/10/16 19:05:38 plm Exp $ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = win32 lib doc met po m4 sounds board3d textures scripts flags fonts non-src pixmaps . bin_PROGRAMS = gnubg makebearoff makehyper bearoffdump makeweights # ##include path # if WIN32 localeloc=-DLOCALEDIR=\"locale\" else localeloc=-DLOCALEDIR=\"$(localedir)\" endif AM_CPPFLAGS = -I$(srcdir)/lib -I$(builddir)/pixmaps -I$(srcdir)/pixmaps \ $(localeloc) @FREETYPE2_CFLAGS@ @GLIB_CFLAGS@ \ @LIBPNG_CFLAGS@ @GTK_CFLAGS@ @CAIRO_CFLAGS@ @PANGOCAIRO_CFLAGS@ \ @GTHREAD_CFLAGS@ @CANBERRA_CFLAGS@ @GOBJECT_CFLAGS@ \ @LIBCURL_CPPFLAGS@ if USE_SQLITE AM_CPPFLAGS += @SQLITE_CFLAGS@ endif if USE_PYTHON AM_CPPFLAGS += @PYTHON_CPPFLAGS@ endif if USE_BOARD3D AM_CPPFLAGS += @GTKGLEXT_CFLAGS@ endif AM_CPPFLAGS += -DAC_DOCDIR='"$(docdir)"' -DAC_DATADIR='"$(datadir)"' -DAC_PKGDATADIR='"$(datadir)/gnubg"' AM_CPPFLAGS += -DBUILD_DATE=@BUILD_DATE@ OTHER_LIBS = if WIN32 OTHER_LIBS += win32/win32res.o endif BUILT_SOURCES = sgf_y.c sgf_l.c copying.c credits.c external_l.c external_y.c # ## sources for building the main executable # gnubg_SOURCES = \ analysis.c \ analysis.h \ backgammon.h \ bearoff.c \ bearoffgammon.c \ bearoffgammon.h \ bearoff.h \ boarddim.h \ boardpos.c \ boardpos.h \ common.h \ copying.c \ credits.c \ credits.h \ dbprovider.c \ dbprovider.h \ dice.c \ dice.h \ drawboard.c \ drawboard.h \ eval.c \ evallock.c \ eval.h \ export.c \ export.h \ external.c \ external.h \ external_l.l \ external_y.y \ file.c \ file.h \ format.c \ formatgs.c \ formatgs.h \ format.h \ glib-ext.c \ glib-ext.h \ gnubg.c \ gnubgmodule.c \ gnubgmodule.h \ html.c \ htmlimages.c \ import.c \ inc3d.h \ latex.c \ matchequity.c \ matchequity.h \ matchid.c \ matchid.h \ mec.c \ mec.h \ mtsupport.c \ multithread.c \ multithread.h \ openurl.c \ openurl.h \ osr.c \ osr.h \ output.c \ output.h \ play.c \ positionid.c \ positionid.h \ progress.c \ progress.h \ pylocdefs.h \ randomorg.h \ randomorg.c \ relational.c \ relational.h \ render.c \ render.h \ renderprefs.c \ renderprefs.h \ rollout.c \ rollout.h \ set.c \ sgf.c \ sgf.h \ sgf_l.l \ sgf_y.y \ show.c \ simpleboard.c \ simpleboard.h \ sound.c \ sound.h \ speed.c \ text.c \ timer.c \ util.h \ util.c if USE_GTK gnubg_SOURCES += gtkboard.c gtkboard.h gtkgame.c gtkgame.h gtkfile.c gtkfile.h \ gtkprefs.c gtkprefs.h gtk-multiview.c gtk-multiview.h gtktheory.c \ gtktheory.h gtkexport.c gtkexport.h gtkcube.c gtkcube.h \ gtkchequer.c gtkchequer.h gtkrace.c gtkrace.h gtkmovefilter.c \ gtkmovefilter.h gtkmet.c gtkmet.h gtksplash.c \ gtksplash.h gtkrolls.c gtkrolls.h gtktempmap.c gtktempmap.h \ gtkoptions.h gtkoptions.c gtktoolbar.h gtktoolbar.c \ gtkgamelist.c gtkpanels.c gtkpanels.h gtkmovelist.c gtkmovelistctrl.c gtkmovelistctrl.h \ gtkwindows.c gtkwindows.h gtkrelational.c gtkrelational.h gnubgstock.c gnubgstock.h \ gtkuidefs.h gtklocdefs.c gtklocdefs.h \ gtkscoremap.h gtkscoremap.c endif # ##linkpath for gnubg # gnubg_LDADD = -L$(srcdir)/lib lib/libevent.la if USE_GTK if FOUND_GLIB_COMPILE_RESOURCES gnubg_LDADD += pixmaps/libresources.la endif endif gnubg_LDADD += @GTK_LIBS@ @LIBPNG_LIBS@ @CAIRO_LIBS@ @PANGOCAIRO_LIBS@ \ @GTHREAD_LIBS@ @GOBJECT_LIBS@ \ @READLINE_LIBS@ @GMP_LIB@ @LTLIBOBJS@ \ @FREETYPE2_LIBS@ @GLIB_LIBS@ @CANBERRA_LIBS@ \ @LIBCURL@ $(OTHER_LIBS) if USE_SQLITE gnubg_LDADD += @SQLITE_LIBS@ endif if USE_PYTHON gnubg_LDADD += @PYTHON_LIBS@ endif if USE_BOARD3D gnubg_LDADD += -L$(srcdir)/board3d board3d/libboard3d.la $(GTKGLEXT_LIBS) $(GL_LIBS) $(GLU_LIBS) $(EPOXY_LIBS) endif if WIN32 if USE_GTK gnubg_LDFLAGS = -mwindows endif endif # ##common sources for building the utility programs # UTILSOURCES = eval.h eval.c positionid.h positionid.c \ matchequity.c matchequity.h matchid.h matchid.c \ osr.c osr.h multithread.h mtsupport.c \ bearoffgammon.c bearoffgammon.h bearoff.c bearoff.h \ mec.h mec.c util.c util.h glib-ext.c glib-ext.h makebearoff_SOURCES = makebearoff.c $(UTILSOURCES) makebearoff_LDADD = -Llib lib/libevent.la @GLIB_LIBS@ @GTHREAD_LIBS@ @GOBJECT_LIBS@ makehyper_SOURCES = makehyper.c $(UTILSOURCES) makehyper_LDADD = -Llib lib/libevent.la @GLIB_LIBS@ @GTHREAD_LIBS@ @GOBJECT_LIBS@ bearoffdump_SOURCES = bearoffdump.c drawboard.c $(UTILSOURCES) bearoffdump_LDADD = -Llib lib/libevent.la @GLIB_LIBS@ @GTHREAD_LIBS@ @GOBJECT_LIBS@ makeweights_SOURCES = makeweights.c glib-ext.c makeweights_LDADD = -Llib lib/libevent.la @GLIB_LIBS@ @GTHREAD_LIBS@ @GOBJECT_LIBS@ # ##files to be installed in the datadir # pkgdata_DATA = gnubg_ts0.bd gnubg.wd boards.xml \ gnubg_os0.bd textures.txt gnubg.sql gnubg.gtkrc gnubg.css # ##files to add to the tarball when 'make dist' # EXTRA_DIST = config.rpath copying.awk gnubg.gtkrc gnubg.css credits.sh \ $(BUILT_SOURCES) ABOUT-NLS boards.xml gnubg.sql autogen.sh \ gnubg.weights textures.txt AUTHORS \ external_y.h sgf_y.h commands.inc movefilters.inc # # targets created by credits.sh # credits.c: credits.sh cd $(srcdir) && $(SHELL) ./credits.sh credits.h: credits.sh cd $(srcdir) && $(SHELL) ./credits.sh AUTHORS: credits.sh cd $(srcdir) && $(SHELL) ./credits.sh # ##copying.c target # if WIN32 copying.c: copying.awk $(AWK) -f $(srcdir)/copying.awk < $(srcdir)/COPYING > $@ copying.$(OBJEXT): copying.c $(COMPILE) -c $< -o $@ else copying.c: COPYING copying.awk $(AWK) -f $(srcdir)/copying.awk < $(srcdir)/COPYING > $@ endif # ##databases # if CROSS_COMPILING gnubg.wd: @echo ' ** NOTE: Since you are cross-compiling GNU Backgammon,' @echo ' ** it is not possible to generate weight and database files' @echo ' ** on the build system. To create these files manually,' @echo ' ** use commands like:' @echo ' ** makeweights < gnubg.weights > gnubg.wd' @echo ' ** makebearoff -o 6 -s 7999999 -f gnubg_os0.bd' @echo ' ** makebearoff -t 6x6 -f gnubg_ts0.bd' @echo ' ** on the host system.' else gnubg.wd: gnubg.weights makeweights$(EXEEXT) [ $@ -nt $< ] || \ ./makeweights -f $@ $< gnubg_os0.bd: makebearoff$(EXEEXT) [ -s $@ ] || \ ./makebearoff -o 6 -s 7999999 -f $@ gnubg_ts0.bd: makebearoff$(EXEEXT) [ -s $@ ] || \ ./makebearoff -t 6x6 -f $@ endif MOSTLYCLEANFILES=sgf_y.c sgf_y.h sgf_l.c external_l.c external_l.h external_y.c external_y.h copying.c credits.c credits.h AUTHORS DISTCLEANFILES=gnubg_os0.bd gnubg_ts0.bd gnubg.wd distclean-local: $(RM) -r cglm gnubg-1.08.003/common.h000644 001751 000024 00000005166 14574155047 014305 0ustar00pmstaff000000 000000 /* * Copyright (C) 2006-2009 Jon Kinsey * Copyright (C) 2006-2017 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: common.h,v 1.35 2019/12/02 10:56:00 plm Exp $ */ /*! \file common.h * \brief Odd definitions */ #ifndef COMMON_H #define COMMON_H #include #include "config.h" #ifndef HAVE___ATTRIBUTE__ #define __attribute__(Spec) /* Empty */ #endif /* HAVE___ATTRIBUTE__ */ #define F_PI (float)G_PI #define F_PI_2 (float)G_PI_2 /*! \brief Safe error value */ #if defined(HUGE_VALF) #define ERR_VAL (-HUGE_VALF) #else #define ERR_VAL (-FLT_MAX) #endif /*! \brief Macro to extract sign */ #ifndef SGN #define SGN(x) ((x) > 0 ? 1 : -1) #endif /*! \brief typedef of signal handler function */ #if HAVE_SIGACTION typedef struct sigaction psighandler; #elif HAVE_SIGVEC typedef struct sigvec psighandler; #else typedef void (*psighandler) (int); #endif /* abs returns unsigned int by definition */ #define Abs(a) ((unsigned int)abs(a)) /* Do we need to use g_utf8_casefold() for utf8 anywhere? */ #define StrCaseCmp(s1, s2) g_ascii_strcasecmp(s1, s2) #define StrNCaseCmp(s1, s2, n) g_ascii_strncasecmp(s1, s2, (gsize)n) /* if the following are defined as macros undefine them */ #ifdef strcasecmp #undef strcasecmp #endif #ifdef strncasecmp #undef strncasecmp #endif /* Avoid new code using strcase functions */ #define strcasecmp strcasecmp_error_use_StrCaseCmp #define strncasecmp strncasecmp_error_use_StrNCaseCmp /* Macro to mark parameters that aren't used in the function */ #ifdef UNUSED #elif defined(HAVE_FUNC_ATTRIBUTE_UNUSED) #define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #elif defined(_lint) #define UNUSED(x) /*lint -e{715, 818}*/ _unused_##x #else #define UNUSED(x) _unused_##x #endif /* Helper macros for __builtin_expect */ #ifdef HAVE___BUILTIN_EXPECT #define likely(expression) __builtin_expect(!!(expression), 1) #define unlikely(expression) __builtin_expect(!!(expression), 0) #else #define likely(expression) (expression) #define unlikely(expression) (expression) #endif #endif gnubg-1.08.003/credits.h000644 001751 000024 00000002157 14600064560 014434 0ustar00pmstaff000000 000000 /* Do not modify this file! It is created automatically by credits.sh. */ /* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include typedef struct { char* Name; char* Type; } credEntry; typedef struct { const char* Title; credEntry *Entry; } credits; extern credEntry ceAuthors[]; extern credEntry ceContrib[]; extern credEntry ceTranslations[]; extern credEntry ceSupport[]; extern credEntry ceCredits[]; extern credits creditList[]; extern const char aszAUTHORS[]; extern const char aszCOPYRIGHT[]; gnubg-1.08.003/evallock.c000644 001751 000024 00000001660 14574155047 014603 0ustar00pmstaff000000 000000 /* * Copyright (C) 2009 Michael Petch * Copyright (C) 2009 Christian Anthon * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: evallock.c,v 1.3 2013/06/16 02:16:11 mdpetch Exp $ */ #include "config.h" #if USE_MULTITHREAD #define LOCKING_VERSION 1 #include "eval.c" #include "rollout.c" #endif gnubg-1.08.003/bearoffgammon.h000644 001751 000024 00000002377 14574155047 015621 0ustar00pmstaff000000 000000 /* * Copyright (C) 2000-2002 Joseph Heled * Copyright (C) 2006-2008 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: bearoffgammon.h,v 1.12 2018/06/16 14:54:30 plm Exp $ */ #if !defined( BEAROFFGAMMON_H ) #define BEAROFFGAMMON_H /* pack for space */ struct GammonProbs { unsigned int p1:16; /* 0 - 36^2 */ unsigned int p2:16; /* 0 - 36^3 */ unsigned int p3:24; /* 0 - 36^4 */ unsigned int p0:8; /* 0 - 36 */ }; extern struct GammonProbs *getBearoffGammonProbs(const unsigned int board[6]); extern long *getRaceBGprobs(const unsigned int board[6]); #define RBG_NPROBS 5 #endif gnubg-1.08.003/gnubgstock.c000644 001751 000024 00000022274 14574155047 015155 0ustar00pmstaff000000 000000 /* * Copyright (C) 2008-2011 Christian Anthon * Copyright (C) 2016 Jeremy Moore * * Initial revision derived from The GIMP Library / gimpstock.c * Copyright (C) 2001 Michael Natterer * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gnubgstock.c,v 1.12 2019/11/05 22:01:25 plm Exp $ */ #include "config.h" #include #include #include "gnubgstock.h" #ifdef USE_GRESOURCE #include "gnubg-stock-resources.h" #else #include "gtklocdefs.h" #endif static GtkIconFactory *gnubg_stock_factory = NULL; static void icon_set_from_resource_path(GtkIconSet * set, const char *resource_path, GtkIconSize size, GtkTextDirection direction, gboolean fallback) { GtkIconSource *source; GdkPixbuf *pixbuf; GError *pixbuf_error = NULL; source = gtk_icon_source_new(); if (direction != GTK_TEXT_DIR_NONE) { gtk_icon_source_set_direction(source, direction); gtk_icon_source_set_direction_wildcarded(source, FALSE); } gtk_icon_source_set_size(source, size); gtk_icon_source_set_size_wildcarded(source, FALSE); pixbuf = gdk_pixbuf_new_from_resource(resource_path, &pixbuf_error); if (pixbuf == NULL) { g_print(_("Failed to create pixbuf from %s, %s\n"), resource_path, pixbuf_error->message); g_assert_not_reached(); return; } gtk_icon_source_set_pixbuf(source, pixbuf); g_object_unref(pixbuf); gtk_icon_set_add_source(set, source); if (fallback) { gtk_icon_source_set_size_wildcarded(source, TRUE); gtk_icon_set_add_source(set, source); } gtk_icon_source_free(source); } static void add_sized_with_same_fallback(GtkIconFactory * factory, const char *resource_path, const char *resource_path_rtl, GtkIconSize size, const gchar *stock_id) { GtkIconSet *set; gboolean fallback = FALSE; set = gtk_icon_factory_lookup(factory, stock_id); if (!set) { set = gtk_icon_set_new(); gtk_icon_factory_add(factory, stock_id, set); gtk_icon_set_unref(set); fallback = TRUE; } icon_set_from_resource_path(set, resource_path, size, GTK_TEXT_DIR_NONE, fallback); if (resource_path_rtl) icon_set_from_resource_path(set, resource_path_rtl, size, GTK_TEXT_DIR_RTL, fallback); } static const GtkStockItem gnubg_stock_items[] = { {GNUBG_STOCK_ACCEPT, N_("_Accept"), 0, 0, NULL}, {GNUBG_STOCK_ANTI_CLOCKWISE, N_("Play in Anti-clockwise Direction"), 0, 0, NULL}, {GNUBG_STOCK_CLOCKWISE, N_("Play in _Clockwise Direction"), 0, 0, NULL}, {GNUBG_STOCK_DOUBLE, N_("_Double"), 0, 0, NULL}, {GNUBG_STOCK_END_GAME, N_("_End Game"), 0, 0, NULL}, {GNUBG_STOCK_GO_NEXT_CMARKED, N_("Next CMarked"), 0, 0, NULL}, {GNUBG_STOCK_GO_NEXT_GAME, N_("Next _Game"), 0, 0, NULL}, {GNUBG_STOCK_GO_NEXT_MARKED, N_("Next _Marked"), 0, 0, NULL}, {GNUBG_STOCK_GO_NEXT, N_("_Next"), 0, 0, NULL}, {GNUBG_STOCK_GO_PREV_CMARKED, N_("Previous CMarked"), 0, 0, NULL}, {GNUBG_STOCK_GO_PREV_GAME, N_("Previous _Game"), 0, 0, NULL}, {GNUBG_STOCK_GO_PREV_MARKED, N_("Previous _Marked"), 0, 0, NULL}, {GNUBG_STOCK_GO_PREV, N_("_Previous"), 0, 0, NULL}, {GNUBG_STOCK_HINT, N_("_Hint"), 0, 0, NULL}, {GNUBG_STOCK_REJECT, N_("_Reject"), 0, 0, NULL}, {GNUBG_STOCK_RESIGN, N_("_Resign"), 0, 0, NULL}, }; static const struct { const gchar *stock_id; const char *ltr; const char *rtl; GtkIconSize size; } gnubg_stock_pixbufs[] = { {GNUBG_STOCK_ACCEPT, "/org/gnubg/16x16/actions/ok_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_ACCEPT, "/org/gnubg/24x24/actions/ok_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_ANTI_CLOCKWISE, "/org/gnubg/24x24/actions/anti_clockwise_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_CLOCKWISE, "/org/gnubg/24x24/actions/clockwise_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_DOUBLE, "/org/gnubg/16x16/actions/double_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_DOUBLE, "/org/gnubg/24x24/actions/double_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_END_GAME, "/org/gnubg/16x16/actions/runit_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_END_GAME, "/org/gnubg/24x24/actions/runit_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_NEXT_CMARKED, "/org/gnubg/16x16/actions/go_next_cmarked_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_NEXT_CMARKED, "/org/gnubg/24x24/actions/go_next_cmarked_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_NEXT_GAME, "/org/gnubg/16x16/actions/go_next_game_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_NEXT_GAME, "/org/gnubg/24x24/actions/go_next_game_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_NEXT, "/org/gnubg/16x16/actions/go_next_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_NEXT, "/org/gnubg/24x24/actions/go_next_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_NEXT_MARKED, "/org/gnubg/16x16/actions/go_next_marked_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_NEXT_MARKED, "/org/gnubg/24x24/actions/go_next_marked_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_PREV_CMARKED, "/org/gnubg/16x16/actions/go_prev_cmarked_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_PREV_CMARKED, "/org/gnubg/24x24/actions/go_prev_cmarked_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_PREV_GAME, "/org/gnubg/16x16/actions/go_prev_game_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_PREV_GAME, "/org/gnubg/24x24/actions/go_prev_game_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_PREV, "/org/gnubg/16x16/actions/go_prev_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_PREV, "/org/gnubg/24x24/actions/go_prev_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_GO_PREV_MARKED, "/org/gnubg/16x16/actions/go_prev_marked_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_GO_PREV_MARKED, "/org/gnubg/24x24/actions/go_prev_marked_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_HINT, "/org/gnubg/16x16/actions/hint_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_HINT, "/org/gnubg/24x24/actions/hint_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW0, "/org/gnubg/24x24/actions/new0_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW11, "/org/gnubg/24x24/actions/new11_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW13, "/org/gnubg/24x24/actions/new13_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW15, "/org/gnubg/24x24/actions/new15_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW17, "/org/gnubg/24x24/actions/new17_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW1, "/org/gnubg/24x24/actions/new1_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW3, "/org/gnubg/24x24/actions/new3_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW5, "/org/gnubg/24x24/actions/new5_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW7, "/org/gnubg/24x24/actions/new7_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_NEW9, "/org/gnubg/24x24/actions/new9_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_REJECT, "/org/gnubg/16x16/actions/cancel_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_REJECT, "/org/gnubg/24x24/actions/cancel_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_RESIGN, "/org/gnubg/16x16/actions/resign_16.png", NULL, GTK_ICON_SIZE_MENU}, {GNUBG_STOCK_RESIGN, "/org/gnubg/24x24/actions/resign_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_RESIGNSB, "/org/gnubg/24x24/actions/resignsb_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_RESIGNSG, "/org/gnubg/24x24/actions/resignsg_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR}, {GNUBG_STOCK_RESIGNSN, "/org/gnubg/24x24/actions/resignsn_24.png", NULL, GTK_ICON_SIZE_LARGE_TOOLBAR} }; /** * gnubg_stock_init: * * Initializes the GNUbg stock icon factory. */ void gnubg_stock_init(void) { guint i; gnubg_stock_factory = gtk_icon_factory_new(); gnubg_stock_register_resource(); for (i = 0; i < G_N_ELEMENTS(gnubg_stock_pixbufs); i++) { add_sized_with_same_fallback(gnubg_stock_factory, gnubg_stock_pixbufs[i].ltr, gnubg_stock_pixbufs[i].rtl, gnubg_stock_pixbufs[i].size, gnubg_stock_pixbufs[i].stock_id); } gtk_icon_factory_add_default(gnubg_stock_factory); gtk_stock_add_static(gnubg_stock_items, G_N_ELEMENTS(gnubg_stock_items)); } gnubg-1.08.003/mtsupport.c000644 001751 000024 00000024145 14574155047 015063 0ustar00pmstaff000000 000000 /* * Copyright (C) 2007-2009 Jon Kinsey * Copyright (C) 2007-2018 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: mtsupport.c,v 1.23 2022/03/12 21:05:54 plm Exp $ */ /* * Multithreaded support functions, moved out of multithread.c */ #include "config.h" #include "multithread.h" #include #if defined (DEBUG_MULTITHREADED) #include #endif #include #include "lib/simd.h" SSE_ALIGN(ThreadData td); extern ThreadLocalData * MT_CreateThreadLocalData(int id) { ThreadLocalData *tld = (ThreadLocalData *) g_malloc(sizeof(ThreadLocalData)); tld->id = id; tld->pnnState = (NNState *) g_malloc(sizeof(NNState) * 3); memset(tld->pnnState, 0, sizeof(NNState) * 3); // cppcheck-suppress duplicateExpression tld->pnnState[CLASS_RACE - CLASS_RACE].savedBase = g_malloc(nnRace.cHidden * sizeof(float)); // cppcheck-suppress duplicateExpression memset(tld->pnnState[CLASS_RACE - CLASS_RACE].savedBase, 0, nnRace.cHidden * sizeof(float)); // cppcheck-suppress duplicateExpression tld->pnnState[CLASS_RACE - CLASS_RACE].savedIBase = g_malloc(nnRace.cInput * sizeof(float)); // cppcheck-suppress duplicateExpression memset(tld->pnnState[CLASS_RACE - CLASS_RACE].savedIBase, 0, nnRace.cInput * sizeof(float)); tld->pnnState[CLASS_CRASHED - CLASS_RACE].savedBase = g_malloc(nnCrashed.cHidden * sizeof(float)); memset(tld->pnnState[CLASS_CRASHED - CLASS_RACE].savedBase, 0, nnCrashed.cHidden * sizeof(float)); tld->pnnState[CLASS_CRASHED - CLASS_RACE].savedIBase = g_malloc(nnCrashed.cInput * sizeof(float)); memset(tld->pnnState[CLASS_CRASHED - CLASS_RACE].savedIBase, 0, nnCrashed.cInput * sizeof(float)); tld->pnnState[CLASS_CONTACT - CLASS_RACE].savedBase = g_malloc(nnContact.cHidden * sizeof(float)); memset(tld->pnnState[CLASS_CONTACT - CLASS_RACE].savedBase, 0, nnContact.cHidden * sizeof(float)); tld->pnnState[CLASS_CONTACT - CLASS_RACE].savedIBase = g_malloc(nnContact.cInput * sizeof(float)); memset(tld->pnnState[CLASS_CONTACT - CLASS_RACE].savedIBase, 0, nnContact.cInput * sizeof(float)); tld->aMoves = (move *) g_malloc(sizeof(move) * MAX_INCOMPLETE_MOVES); memset(tld->aMoves, 0, sizeof(move) * MAX_INCOMPLETE_MOVES); return tld; } #if defined(USE_MULTITHREAD) #if defined(DEBUG_MULTITHREADED) && defined(WIN32) unsigned int mainThreadID; #endif #if GLIB_CHECK_VERSION (2,32,0) static GMutex condMutex; /* Extra mutex needed for waiting */ #else static GMutex *condMutex = NULL; /* Extra mutex needed for waiting */ #endif #if GLIB_CHECK_VERSION (2,32,0) /* Dynamic allocation of GPrivate is deprecated */ static GPrivate private_item = G_PRIVATE_INIT(free); extern void TLSCreate(TLSItem * pItem) { *pItem = &private_item; } #else extern void TLSCreate(TLSItem * pItem) { *pItem = g_private_new(g_free); } #endif extern void TLSSetValue(TLSItem pItem, size_t value) { size_t *pNew = (size_t *) g_malloc(sizeof(size_t)); *pNew = value; g_private_set(pItem, (gpointer) pNew); } #define TLSGet(item) *((size_t*)g_private_get(item)) extern void InitManualEvent(ManualEvent * pME) { ManualEvent pNewME = g_malloc(sizeof(*pNewME)); #if GLIB_CHECK_VERSION (2,32,0) g_cond_init(&pNewME->cond); #else pNewME->cond = g_cond_new(); #endif pNewME->signalled = FALSE; *pME = pNewME; } extern void FreeManualEvent(ManualEvent ME) { #if GLIB_CHECK_VERSION (2,32,0) g_cond_clear(&ME->cond); #else g_cond_free(ME->cond); #endif g_free(ME); } extern void WaitForManualEvent(ManualEvent ME) { #if GLIB_CHECK_VERSION (2,32,0) gint64 end_time; #else GTimeVal tv; #endif multi_debug("wait for manual event asks lock (condMutex)"); #if GLIB_CHECK_VERSION (2,32,0) g_mutex_lock(&condMutex); end_time = g_get_monotonic_time() + 10 * G_TIME_SPAN_SECOND; #else g_mutex_lock(condMutex); #endif multi_debug("wait for manual event gets lock (condMutex)"); while (!ME->signalled) { multi_debug("waiting for manual event"); #if GLIB_CHECK_VERSION (2,32,0) if (!g_cond_wait_until(&ME->cond, &condMutex, end_time)) #else g_get_current_time(&tv); g_time_val_add(&tv, 10 * 1000 * 1000); if (g_cond_timed_wait(ME->cond, condMutex, &tv)) #endif break; else { multi_debug("still waiting for manual event"); } } #if GLIB_CHECK_VERSION (2,32,0) g_mutex_unlock(&condMutex); #else g_mutex_unlock(condMutex); #endif multi_debug("wait for manual event unlocks (condMutex)"); } extern void ResetManualEvent(ManualEvent ME) { multi_debug("reset manual event asks lock (condMutex)"); #if GLIB_CHECK_VERSION (2,32,0) g_mutex_lock(&condMutex); multi_debug("reset manual event gets lock (condMutex)"); ME->signalled = FALSE; g_mutex_unlock(&condMutex); #else g_mutex_lock(condMutex); multi_debug("reset manual event gets lock (condMutex)"); ME->signalled = FALSE; g_mutex_unlock(condMutex); #endif multi_debug("reset manual event unlocks (condMutex)"); } extern void SetManualEvent(ManualEvent ME) { multi_debug("reset manual event asks lock (condMutex)"); #if GLIB_CHECK_VERSION (2,32,0) g_mutex_lock(&condMutex); multi_debug("reset manual event gets lock (condMutex)"); ME->signalled = TRUE; g_cond_broadcast(&ME->cond); g_mutex_unlock(&condMutex); #else g_mutex_lock(condMutex); multi_debug("reset manual event gets lock (condMutex)"); ME->signalled = TRUE; g_cond_broadcast(ME->cond); g_mutex_unlock(condMutex); #endif multi_debug("reset manual event unlocks (condMutex)"); } #if GLIB_CHECK_VERSION (2,32,0) extern void InitMutex(Mutex * pMutex) { g_mutex_init(pMutex); } extern void FreeMutex(Mutex * mutex) { g_assert(MT_GetThreadID() == -1); g_mutex_clear(mutex); } #else extern void InitMutex(Mutex * pMutex) { *pMutex = g_mutex_new(); } extern void FreeMutex(Mutex * mutex) { g_assert(MT_GetThreadID() == -1); g_mutex_free(*mutex); } #endif extern void Mutex_Lock(Mutex * mutex) { #if GLIB_CHECK_VERSION (2,32,0) g_mutex_lock(mutex); #else g_mutex_lock(*mutex); #endif } extern void Mutex_Release(Mutex * mutex) { #if GLIB_CHECK_VERSION (2,32,0) g_mutex_unlock(mutex); #else g_mutex_unlock(*mutex); #endif } extern void MT_InitThreads(void) { #if !GLIB_CHECK_VERSION (2,32,0) if (!g_thread_supported()) g_thread_init(NULL); g_assert(g_thread_supported()); #endif td.tasks = NULL; MT_SafeSet(&td.doneTasks, 0); td.addedTasks = 0; td.totalTasks = -1; InitManualEvent(&td.activity); TLSCreate(&td.tlsItem); TLSSetValue(td.tlsItem, (size_t) MT_CreateThreadLocalData(-1)); #if defined(DEBUG_MULTITHREADED) && defined(WIN32) mainThreadID = GetCurrentThreadId(); #endif InitMutex(&td.multiLock); InitMutex(&td.queueLock); InitManualEvent(&td.syncStart); InitManualEvent(&td.syncEnd); #if !GLIB_CHECK_VERSION (2,32,0) if (condMutex == NULL) condMutex = g_mutex_new(); #endif td.numThreads = 0; } extern void CloseThread(void *UNUSED(unused)) { ThreadLocalData *pTLD; NNState *pnnState; g_assert(MT_SafeCompare(&td.closingThreads, TRUE)); pTLD = (ThreadLocalData *) TLSGet(td.tlsItem); pnnState = pTLD->pnnState; g_free(pTLD->aMoves); for (int i = 0; i < 3; i++) { g_free(pnnState[i].savedBase); g_free(pnnState[i].savedIBase); } g_free(pnnState); g_free(pTLD); MT_SafeInc(&td.result); } extern void MT_Close(void) { MT_CloseThreads(); FreeManualEvent(td.activity); FreeMutex(&td.multiLock); FreeMutex(&td.queueLock); FreeManualEvent(td.syncStart); FreeManualEvent(td.syncEnd); } extern void MT_Exclusive(void) { multi_debug("exclusive asks lock (multiLock)"); Mutex_Lock(&td.multiLock); multi_debug("exclusive gets lock (multiLock)"); } extern void MT_Release(void) { Mutex_Release(&td.multiLock); multi_debug("release unlocks (multiLock)"); } #if defined(DEBUG_MULTITHREADED) extern void multi_debug(const char *str, ...) { int id; va_list vl; char tn[5]; char buf[1024]; /* Sync output so order makes some sense */ #if defined(WIN32) WaitForSingleObject(td.multiLock, INFINITE); #endif /* With glib threads, locking here doesn't seem to work : * GLib (gthread-posix.c): Unexpected error from C library during 'pthread_mutex_lock': Resource deadlock avoided. Aborting. * Timestamp the output instead. * Maybe the g_get_*_time() calls will sync output as well anyway... */ va_start(vl, str); vsprintf(buf, str, vl); id = MT_GetThreadID(); #if defined(WIN32) if (id == -1 && GetCurrentThreadId() == mainThreadID) #else if (id == -1) #endif strcpy(tn, "MT"); else sprintf(tn, "T%d", id); #if GLIB_CHECK_VERSION (2,28,0) printf("%" G_GINT64_FORMAT " %s: %s\n", g_get_monotonic_time(), tn, buf); #else { GTimeVal tv; g_get_current_time(&tv); printf("%lu %s: %s\n", 1000000UL * tv.tv_sec + tv.tv_usec, tn, buf); } #endif va_end(vl); #if defined(WIN32) ReleaseMutex(td.multiLock); #endif } #endif #else /* !defined(USE_MULTITHREAD) */ extern void MT_InitThreads(void) { td.tld = MT_CreateThreadLocalData(-1); } extern void MT_Close(void) { int i; NNState *pnnState; if (!td.tld) return; g_free(td.tld->aMoves); pnnState = td.tld->pnnState; for (i = 0; i < 3; i++) { g_free(pnnState[i].savedBase); g_free(pnnState[i].savedIBase); } g_free(pnnState); g_free(td.tld); } #endif gnubg-1.08.003/gtksplash.c000644 001751 000024 00000006671 14574155047 015012 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2003-2017 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtksplash.c,v 1.35 2017/05/27 19:49:24 plm Exp $ */ #include "config.h" #include "gtklocdefs.h" #include "gtkgame.h" #include "util.h" #include "gtksplash.h" typedef struct { GtkWidget *pwWindow; GtkWidget *apwStatus[2]; } gtksplash; extern GtkWidget * CreateSplash(void) { gtksplash *pgs; GtkWidget *pwvbox, *pwFrame, *pwb; GtkWidget *pwImage; gchar *fn; int i; pgs = (gtksplash *) g_malloc(sizeof(gtksplash)); pgs->pwWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_role(GTK_WINDOW(pgs->pwWindow), "splash screen"); gtk_window_set_type_hint(GTK_WINDOW(pgs->pwWindow), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); gtk_window_set_title(GTK_WINDOW(pgs->pwWindow), _("Starting " VERSION_STRING)); gtk_window_set_position(GTK_WINDOW(pgs->pwWindow), GTK_WIN_POS_CENTER); gtk_widget_realize(GTK_WIDGET(pgs->pwWindow)); /* gdk_window_set_decorations ( GTK_WIDGET ( pgs->pwWindow )->window, 0 ); */ /* content of page */ #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pgs->pwWindow), pwvbox); /* image */ fn = g_build_filename(getPkgDataDir(), "pixmaps", "gnubg-big.png", NULL); pwImage = gtk_image_new_from_file(fn); g_free(fn); gtk_box_pack_start(GTK_BOX(pwvbox), pwImage, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwvbox), pwFrame = gtk_frame_new(NULL), FALSE, FALSE, 0); gtk_frame_set_shadow_type(GTK_FRAME(pwFrame), GTK_SHADOW_ETCHED_OUT); #if GTK_CHECK_VERSION(3,0,0) pwb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwb = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwb); /* status bar */ for (i = 0; i < 2; ++i) { pgs->apwStatus[i] = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(pwb), pgs->apwStatus[i], FALSE, FALSE, 4); } /* signals */ g_object_set_data_full(G_OBJECT(pgs->pwWindow), "gtksplash", pgs, g_free); gtk_widget_show_all(GTK_WIDGET(pgs->pwWindow)); ProcessEvents(); return pgs->pwWindow; } extern void DestroySplash(GtkWidget * pwSplash) { if (!pwSplash) return; #ifndef WIN32 /* Don't bother with these pauses on windows? */ g_usleep(250 * 1000); #endif gtk_widget_destroy(pwSplash); } extern void PushSplash(GtkWidget * pwSplash, const gchar * szText0, const gchar * szText1) { gtksplash *pgs; if (!pwSplash) return; pgs = (gtksplash *) g_object_get_data(G_OBJECT(pwSplash), "gtksplash"); gtk_label_set_text(GTK_LABEL(pgs->apwStatus[0]), szText0); gtk_label_set_text(GTK_LABEL(pgs->apwStatus[1]), szText1); ProcessEvents(); } gnubg-1.08.003/sgf_y.h000644 001751 000024 00000005626 14613445366 014125 0ustar00pmstaff000000 000000 /* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ #ifndef YY_SGF_SGF_Y_H_INCLUDED # define YY_SGF_SGF_Y_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int sgfdebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ PROPERTY = 258, /* PROPERTY */ VALUETEXT = 259 /* VALUETEXT */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Token kinds. */ #define YYEMPTY -2 #define YYEOF 0 #define YYerror 256 #define YYUNDEF 257 #define PROPERTY 258 #define VALUETEXT 259 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 95 "../gnubg/sgf_y.y" char ach[ 2 ]; /* property identifier */ char *pch; /* property value */ property *pp; /* complete property */ listOLD *pl; /* nodes, sequences, gametrees */ #line 82 "sgf_y.h" }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE sgflval; int sgfparse (void); #endif /* !YY_SGF_SGF_Y_H_INCLUDED */ gnubg-1.08.003/config.rpath000755 001751 000024 00000037444 14570454011 015145 0ustar00pmstaff000000 000000 #! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2006 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix3*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | kfreebsd*-gnu | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; kfreebsd*-gnu) ;; freebsd* | dragonfly*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; interix3*) ;; irix5* | irix6* | nonstopux*) case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux*) ;; knetbsd*-gnu) ;; netbsd*) ;; newsos6) ;; nto-qnx*) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.3*) ;; sysv4*MP*) ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ;; uts4*) ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ #ifndef YY_YY_EXTERNAL_Y_H_INCLUDED # define YY_YY_EXTERNAL_Y_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ EOL = 258, /* EOL */ EXIT = 259, /* EXIT */ DISABLED = 260, /* DISABLED */ INTERFACEVERSION = 261, /* INTERFACEVERSION */ DEBUG = 262, /* DEBUG */ SET = 263, /* SET */ NEW = 264, /* NEW */ OLD = 265, /* OLD */ OUTPUT = 266, /* OUTPUT */ E_INTERFACE = 267, /* E_INTERFACE */ HELP = 268, /* HELP */ PROMPT = 269, /* PROMPT */ E_STRING = 270, /* E_STRING */ E_CHARACTER = 271, /* E_CHARACTER */ E_INTEGER = 272, /* E_INTEGER */ E_FLOAT = 273, /* E_FLOAT */ E_BOOLEAN = 274, /* E_BOOLEAN */ FIBSBOARD = 275, /* FIBSBOARD */ FIBSBOARDEND = 276, /* FIBSBOARDEND */ EVALUATION = 277, /* EVALUATION */ CRAWFORDRULE = 278, /* CRAWFORDRULE */ JACOBYRULE = 279, /* JACOBYRULE */ RESIGNATION = 280, /* RESIGNATION */ BEAVERS = 281, /* BEAVERS */ CUBE = 282, /* CUBE */ CUBEFUL = 283, /* CUBEFUL */ CUBELESS = 284, /* CUBELESS */ DETERMINISTIC = 285, /* DETERMINISTIC */ NOISE = 286, /* NOISE */ PLIES = 287, /* PLIES */ PRUNE = 288 /* PRUNE */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Token kinds. */ #define YYEMPTY -2 #define YYEOF 0 #define YYerror 256 #define YYUNDEF 257 #define EOL 258 #define EXIT 259 #define DISABLED 260 #define INTERFACEVERSION 261 #define DEBUG 262 #define SET 263 #define NEW 264 #define OLD 265 #define OUTPUT 266 #define E_INTERFACE 267 #define HELP 268 #define PROMPT 269 #define E_STRING 270 #define E_CHARACTER 271 #define E_INTEGER 272 #define E_FLOAT 273 #define E_BOOLEAN 274 #define FIBSBOARD 275 #define FIBSBOARDEND 276 #define EVALUATION 277 #define CRAWFORDRULE 278 #define JACOBYRULE 279 #define RESIGNATION 280 #define BEAVERS 281 #define CUBE 282 #define CUBEFUL 283 #define CUBELESS 284 #define DETERMINISTIC 285 #define NOISE 286 #define PLIES 287 #define PRUNE 288 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 114 "../gnubg/external_y.y" gboolean boolean; gchar character; gfloat floatnum; gint intnum; GString *str; GValue *gv; GList *list; commandinfo *cmd; #line 144 "external_y.h" }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif int yyparse (scancontext *scanner); #endif /* !YY_YY_EXTERNAL_Y_H_INCLUDED */ gnubg-1.08.003/commands.inc000644 001751 000024 00000216370 14610037046 015126 0ustar00pmstaff000000 000000 /* * Copyright (C) 2008-20O9 Jon Kinsey * Copyright (C) 2008-2023 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: commands.inc,v 1.69 2023/10/01 17:00:34 plm Exp $ */ /* All the commands are in this file */ static command cER = { /* dummy command used for evaluation/rollout parameters */ NULL, NULL, NULL, NULL, &cER }, cFilename = { /* dummy command used for filename parameters */ NULL, NULL, NULL, NULL, &cFilename }, cOnOff = { /* dummy command used for on/off parameters */ NULL, NULL, NULL, NULL, &cOnOff }, cPlayer = { /* dummy command used for player parameters */ NULL, NULL, NULL, NULL, &cPlayer }, cPlayerBoth = { /* dummy command used for player parameters; "both" also permitted */ NULL, NULL, NULL, NULL, &cPlayerBoth }, cExportParameters = { /* dummy command used for export parameters */ NULL, NULL, NULL, NULL, &cExportParameters }, cExportMovesDisplay = { /* dummy command used for export moves to display */ NULL, NULL, NULL, NULL, &cExportMovesDisplay }, cExportCubeDisplay = { /* dummy command used for player cube to display */ NULL, NULL, NULL, NULL, &cExportCubeDisplay }, acAnalyseClear[] = { { "game", CommandAnalyseClearGame, N_("Clear analysis for this game"), NULL, NULL }, { "match", CommandAnalyseClearMatch, N_("Clear analysis for entire match"), NULL, NULL }, { "session", CommandAnalyseClearMatch, N_("Clear analysis for entire session"), NULL, NULL }, { "move", CommandAnalyseClearMove, N_("Clear analysis for this move"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acAnalyseRollout[] = { { "cube", CommandAnalyseRolloutCube, N_("Rollout an analysed cube"), NULL, NULL }, { "move", CommandAnalyseRolloutMove, N_("Rollout choices in the analysis movelist.\n" "\"analyse rollout move 1 2 3\" will rollout the first three choices.\n" "\"analyse rollout move\" will rollout previously marked candidates."), NULL, NULL }, { "game", CommandAnalyseRolloutGame, N_("Rollout marked candidates in the game"), NULL, NULL }, { "match", CommandAnalyseRolloutMatch, N_("Rollout marked candidates in the match"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmarkCubeSet[] = { { "rollout", CommandCMarkCubeSetRollout, N_("CMark cube for rollout"), NULL, NULL }, { "none", CommandCMarkCubeSetNone, N_("CMark cube clear"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmarkMoveSet[] = { { "rollout", CommandCMarkMoveSetRollout, N_("CMark moves for rollout"), NULL, NULL }, { "none", CommandCMarkMoveSetNone, N_("CMark move clear"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmarkCube[] = { { "clear", CommandCMarkCubeSetNone, N_("CMark cube clear"), NULL, NULL }, { "set", NULL, N_("CMark cube"), NULL, acCmarkCubeSet }, { "show", CommandCMarkCubeShow, N_("Show cmarks for cube"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmarkMatch[] = { { "clear", CommandCMarkMatchClear, N_("CMark move clear all"), NULL, NULL }, { "show", CommandCMarkMatchShow, N_("Show cmarks for move"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmarkGame[] = { { "clear", CommandCMarkGameClear, N_("CMark move clear all"), NULL, NULL }, { "show", CommandCMarkGameShow, N_("Show cmarks for move"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmarkMove[] = { { "clear", CommandCMarkMoveClear, N_("CMark move clear all"), NULL, NULL }, { "set", NULL, N_("CMark moves"), NULL, acCmarkMoveSet }, { "show", CommandCMarkMoveShow, N_("Show cmarks for move"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acCmark[] = { { "match", NULL, N_("CMark moves and cubes in match"), NULL, acCmarkMatch }, { "game", NULL, N_("CMark moves and cubes in game"), NULL, acCmarkGame }, { "move", NULL, N_("CMark moves in movelist"), NULL, acCmarkMove }, { "cube", NULL, N_("CMark cube"), NULL, acCmarkCube }, { NULL, NULL, NULL, NULL, NULL } }, acSetAutoSave[] = { { "rollout", CommandSetAutoSaveRollout, N_("Autosave during rollout"), szONOFF, &cOnOff }, { "analysis", CommandSetAutoSaveAnalysis, N_("Autosave after each analysed game"), szONOFF, &cOnOff }, { "confirm", CommandSetAutoSaveConfirmDelete, N_("Confirm deletion of autosaves"), szONOFF, &cOnOff }, { "time", CommandSetAutoSaveTime, N_("Set how often to autosave in minutes"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acAnalyse[] = { { "clear", NULL, N_("Clear previous analysis"), NULL, acAnalyseClear }, { "game", CommandAnalyseGame, N_("Compute analysis and annotate current game"), NULL, NULL }, { "match", CommandAnalyseMatch, N_("Compute analysis and annotate every game " "in the match"), NULL, NULL }, { "move", CommandAnalyseMove, N_("Compute analysis and annotate the current " "move"), NULL, NULL }, { "rollout", NULL, N_("Rollout analysis"), NULL, acAnalyseRollout }, { "session", CommandAnalyseSession, N_("Compute analysis and annotate every " "game in the session"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acEnd[] = { { "game", CommandEndGame, N_("Let the computer play to the end of the game"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acAnnotateClear[] = { { "comment", CommandAnnotateClearComment, N_("Erase commentary about a move"), NULL, NULL }, { "luck", CommandAnnotateClearLuck, N_("Erase annotations for a dice roll"), NULL, NULL }, { "skill", CommandAnnotateClearSkill, N_("Erase skill annotations for a move"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }; command acAnnotateMove[] = { { "comment", CommandAnnotateAddComment, N_("Add commentary about a move"), szCOMMENT, NULL }, { "bad", CommandAnnotateBad, N_("Mark as bad"), NULL, NULL }, { "clear", CommandAnnotateClearSkill, N_("Remove annotations"), NULL, NULL }, { "doubtful", CommandAnnotateDoubtful, N_("Mark as doubtful"), NULL, NULL }, { "verybad", CommandAnnotateVeryBad, N_("Mark as very bad"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static command acAnnotateRoll[] = { { "clear", CommandAnnotateClearLuck, N_("Remove annotations"), NULL, NULL }, { "lucky", CommandAnnotateLucky, N_("Mark a lucky dice roll"), NULL, NULL }, { "unlucky", CommandAnnotateUnlucky, N_("Mark an unlucky dice roll"), NULL, NULL }, { "verylucky", CommandAnnotateVeryLucky, N_("Mark a very lucky dice roll"), NULL, NULL }, { "veryunlucky", CommandAnnotateVeryUnlucky, N_("Mark a very unlucky dice roll"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acAnnotate[] = { { "clear", NULL, N_("Clear annotation"), NULL, acAnnotateClear }, { "move", CommandAnnotateMove, N_("Mark a move"), NULL, acAnnotateMove }, { "roll", NULL, N_("Mark a roll"), NULL, acAnnotateRoll }, { "cube", CommandAnnotateCube, N_("Mark a cube decision"), NULL, acAnnotateMove }, { "double", CommandAnnotateDouble, N_("Mark a double"), NULL, acAnnotateMove }, { "accept", CommandAnnotateAccept, N_("Mark an accept decision"), NULL, acAnnotateMove }, { "drop", CommandAnnotateDrop, N_("Mark a drop decision"), NULL, acAnnotateMove }, { "pass", CommandAnnotateDrop, N_("Mark a pass decision"), NULL, acAnnotateMove }, { "reject", CommandAnnotateReject, N_("Mark a reject decision"), NULL, acAnnotateMove }, { "resign", CommandAnnotateResign, N_("Mark a resign decision"), NULL, acAnnotateMove }, { "take", CommandAnnotateAccept, N_("Mark a take decision"), NULL, acAnnotateMove }, { NULL, NULL, NULL, NULL, NULL } }, acClear[] = { { "cache", CommandClearCache, N_("Clear evaluation cache"), NULL, NULL }, { "hint", CommandClearHint, N_("Clear analysis used for `hint'"), NULL, NULL }, { "turn", CommandClearTurn, N_("Clear initialized cube action and dice roll"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acExportGame[] = { { "gam", CommandExportGameGam, N_("Records a log of the game in .gam " "format"), szFILENAME, &cFilename }, { "snowietxt", CommandExportGameSnowieTxt, N_("Records a log of the game in Snowie .txt format"), szFILENAME, &cFilename }, { "html", CommandExportGameHtml, N_("Records a log of the game in HTML format"), szFILENAME, &cFilename }, { "latex", CommandExportGameLaTeX, N_("Records a log of the game in LaTeX " "format"), szFILENAME, &cFilename }, { "pdf", CommandExportGamePDF, N_("Records a log of the game in PDF " "format"), szFILENAME, &cFilename }, { "ps", CommandExportGamePS, N_("Records a log of the game in PS " "format"), szFILENAME, &cFilename }, { "text", CommandExportGameText, N_("Export a log of the game in text format"), szFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acExportMatch[] = { { "mat", CommandExportMatchMat, N_("Records a log of the match in .mat " "format"), szFILENAME, &cFilename }, { "snowietxt", CommandExportMatchSnowieTxt, N_("Records a log of the match in Snowie .txt format"), szFILENAME, &cFilename }, { "html", CommandExportMatchHtml, N_("Records a log of the match in HTML format"), szFILENAME, &cFilename }, { "latex", CommandExportMatchLaTeX, N_("Records a log of the match in LaTeX " "format"), szFILENAME, &cFilename }, { "text", CommandExportMatchText, N_("Records a log of the match in text format"), szFILENAME, &cFilename }, { "pdf", CommandExportMatchPDF, N_("Save the current match in " "PDF format"), szFILENAME, &cFilename }, { "ps", CommandExportMatchPS, N_("Save the current match in " "PS format"), szFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acExportPosition[] = { { "bgo2clipboard", CommandExportPositionGOL2Clipboard, N_("Copy the current position in HTML format to clipboard " "(special for BGonline)"), szFILENAME, &cFilename }, { "bgonline", CommandExportPositionGammOnLine, N_("Save the current position in HTML format " "(special for BGonline)"), szFILENAME, &cFilename }, #if defined(HAVE_PANGOCAIRO) { "ps", CommandExportPositionPS, N_("Save the current position in " "PostScript format"), szFILENAME, &cFilename }, { "pdf", CommandExportPositionPDF, N_("Save the current position in " "PDF format"), szFILENAME, &cFilename }, { "svg", CommandExportPositionSVG, N_("Save the current position in " "SVG format"), szFILENAME, &cFilename }, #endif /* HAVE_PANGOCAIRO */ { "html", CommandExportPositionHtml, N_("Save the current position in HTML format"), szFILENAME, &cFilename }, #if defined(HAVE_LIBPNG) { "png", CommandExportPositionPNG, N_("Save the current position in " "Portable Network Graphics (PNG) format"), szFILENAME, &cFilename }, #endif /* HAVE_LIBPNG */ { "pos", CommandExportPositionJF, N_("Save the current position in .pos " "format"), szFILENAME, &cFilename }, { "snowietxt", CommandExportPositionSnowieTxt, N_("Save the current position in Snowie .txt format"), szFILENAME, &cFilename }, { "text", CommandExportPositionText, N_("Save the current position in text format"), szFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acExportSession[] = { { "html", CommandExportMatchHtml, N_("Records a log of the session in HTML format"), szFILENAME, &cFilename }, { "latex", CommandExportMatchLaTeX, N_("Records a log of the session in " "LaTeX format"), szFILENAME, &cFilename }, { "text", CommandExportMatchText, N_("Records a log of the session in text format"), szFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acExport[] = { { "game", NULL, N_("Record a log of the game so far to a file"), NULL, acExportGame }, { "htmlimages", CommandExportHTMLImages, N_("Generate images to be used " "by the HTML export commands"), szFILENAME, &cFilename }, { "match", NULL, N_("Record a log of the match so far to a file"), NULL, acExportMatch }, { "position", NULL, N_("Write the current position to a file"), NULL, acExportPosition }, { "session", NULL, N_("Record a log of the session so far to a file"), NULL, acExportSession }, { NULL, NULL, NULL, NULL, NULL } }, acFirst[] = { { "game", CommandFirstGame, N_("Goto first game of the match or session"), NULL, NULL }, { "move", CommandFirstMove, N_("Goto first move of the current game"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acImport[] = { { "auto", CommandImportAuto, N_("Import from any known format"), szFILENAME, &cFilename }, { "mat", CommandImportMat, N_("Import a Jellyfish match"), szFILENAME, &cFilename }, { "gam", CommandImportMat, N_("Import a Jellyfish game"), szFILENAME, &cFilename }, { "oldmoves", CommandImportOldmoves, N_("Import a FIBS oldmoves file"), szFILENAME, &cFilename }, { "empire", CommandImportEmpire, N_("Import a GammonEmpire game file"), szFILENAME, &cFilename }, { "party", CommandImportParty, N_("Import a PartyGammon game file"), szFILENAME, &cFilename }, { "bgroom", CommandImportBGRoom, N_("Import a BGRoom game file"), szFILENAME, &cFilename }, { "pos", CommandImportJF, N_("Import a Jellyfish position file"), szFILENAME, &cFilename }, { "sgg", CommandImportSGG, N_("Import an SGG match"), szFILENAME, &cFilename }, { "snowietxt", CommandImportSnowieTxt, N_("Import a Snowie .txt match"), szFILENAME, &cFilename }, { "tmg", CommandImportTMG, N_("Import an TMG match"), szFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acList[] = { { "game", CommandListGame, N_("Show the moves made in this game"), NULL, NULL }, { "match", CommandListMatch, N_("Show the games played in this match"), NULL, NULL }, { "session", CommandListMatch, N_("Show the games played in this session"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acLoad[] = { { "commands", CommandLoadCommands, N_("Read commands from a script file"), szFILENAME, &cFilename }, { "game", CommandLoadGame, N_("Read a saved game from a file"), szFILENAME, &cFilename }, { "match", CommandLoadMatch, N_("Read a saved match from a file"), szFILENAME, &cFilename }, { "position", CommandLoadPosition, N_("Read a saved position from a file"), szFILENAME, &cFilename }, { "python", CommandLoadPython, N_("Load a python script from a file"), szFILENAME, &cFilename }, { "weights", CommandNotImplemented, N_("Read neural net weights from a file"), szOPTFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acNew[] = { { "game", CommandNewGame, N_("Start a new game within the current match or session"), NULL, NULL }, { "match", CommandNewMatch, N_("Play a new match to some number of points"), szOPTLENGTH, NULL }, { "session", CommandNewSession, N_("Start a new (money) session"), szOPTLENGTH, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acRelationalAdd[] = { { "match", CommandRelationalAddMatch, N_("Log the match to the external relational database"), szQUIET, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acRelationalErase[] = { { "player", CommandRelationalErase, N_("Remove all statistics from one player " "in the relational database"), szNAME, NULL }, { "allplayers", CommandRelationalEraseAll, N_("Remove all player statistics in the relational database"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acRelationalShow[] = { { "details", CommandRelationalShowDetails, N_("Show details of the matches for a given player in the database"), szNAME, NULL }, { "players", CommandRelationalShowPlayers, N_("Show a list of all the players in the database"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acRelational[] = { { "add", NULL, N_("Add to the external relational database"), NULL, acRelationalAdd }, { "erase", NULL, N_("Remove from the external relational database"), NULL, acRelationalErase }, { "select", CommandRelationalSelect, N_("Query the relational database"), szCOMMAND, NULL }, { "setup", CommandRelationalSetup, N_("Setup database parameters"), szKEYVALUE, NULL }, { "show", NULL, N_("Show information from the relational database"), NULL, acRelationalShow }, { "test", CommandRelationalTest, N_("Test connexion to the external relational database"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSave[] = { { "game", CommandSaveGame, N_("Record a log of the game so far to a " "file"), szFILENAME, &cFilename }, { "match", CommandSaveMatch, N_("Record a log of the match so far to a file"), szFILENAME, &cFilename }, { "position", CommandSavePosition, N_("Record the current board position " "to a file"), szFILENAME, &cFilename }, { "settings", CommandSaveSettings, N_("Use the current settings in future " "sessions"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }; command acSetAnalysisPlayer[] = { { "analyse", CommandSetAnalysisPlayerAnalyse, N_("Specify if this player is to be analysed"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }; static command acSetAnalysisThreshold[] = { { "bad", CommandSetAnalysisThresholdBad, N_("Specify the equity loss for a bad move"), szVALUE, NULL }, { "doubtful", CommandSetAnalysisThresholdDoubtful, N_("Specify the equity loss for a doubtful move"), szVALUE, NULL }, { "lucky", CommandSetAnalysisThresholdLucky, N_("Specify the equity gain for " "a lucky roll"), szVALUE, NULL }, { "unlucky", CommandSetAnalysisThresholdUnlucky, N_("Specify the equity loss " "for an unlucky roll"), szVALUE, NULL }, { "verybad", CommandSetAnalysisThresholdVeryBad, N_("Specify the equity loss " "for a very bad move"), szVALUE, NULL }, { "verylucky", CommandSetAnalysisThresholdVeryLucky, N_("Specify the equity " "gain for a very lucky roll"), szVALUE, NULL }, { "veryunlucky", CommandSetAnalysisThresholdVeryUnlucky, N_("Specify the " "equity loss for a very unlucky roll"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }; command acSetEvaluation[] = { { "cubeful", CommandSetEvalCubeful, N_("Cubeful evaluations"), szONOFF, &cOnOff }, { "deterministic", CommandSetEvalDeterministic, N_("Specify whether added " "noise is determined by position"), szONOFF, &cOnOff }, { "noise", CommandSetEvalNoise, N_("Distort evaluations with noise"), szSTDDEV, NULL }, { "plies", CommandSetEvalPlies, N_("Choose how many plies to look ahead"), szPLIES, NULL }, { "prune", CommandSetEvalPrune, N_("use fast pruning networks"), szONOFF, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetPlayer[] = { { "chequerplay", CommandSetPlayerChequerplay, N_("Control chequerplay " "parameters when GNUbg plays"), NULL, acSetEvalParam }, { "cubedecision", CommandSetPlayerCubedecision, N_("Control cube decision " "parameters when GNUbg plays"), NULL, acSetEvalParam }, { "external", CommandSetPlayerExternal, N_("Have another process make all " "moves for a player"), szFILENAME, &cFilename }, { "gnubg", CommandSetPlayerGNU, N_("Have GNUbg make all moves for a player"), NULL, NULL }, { "human", CommandSetPlayerHuman, N_("Have a human make all moves for a " "player"), NULL, NULL }, { "movefilter", CommandSetPlayerMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { "name", CommandSetPlayerName, N_("Change a player's name"), szNAME, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetEvalParam[] = { { "type", CommandSetEvalParamType, N_("Specify type (evaluation or rollout)"), szER, &cER }, { "evaluation", CommandSetEvalParamEvaluation, N_("Specify parameters for neural net evaluation"), NULL, acSetEvaluation }, { "rollout", CommandSetEvalParamRollout, N_("Specify parameters for rollout"), NULL, acSetRollout }, { NULL, NULL, NULL, NULL, NULL } }; static command acSetAnalysis[] = { { "background", CommandSetAnalysisBackground, N_("Select whether to run analysis in the background"), szONOFF, &cOnOff }, { "chequerplay", CommandSetAnalysisChequerplay, N_("Specify parameters " "for the analysis of chequerplay"), NULL, acSetEvalParam }, { "cube", CommandSetAnalysisCube, N_("Select whether cube action will be " "analysed"), szONOFF, &cOnOff }, { "cubedecision", CommandSetAnalysisCubedecision, N_("Specify parameters " "for the analysis of cube decisions"), NULL, acSetEvalParam }, { "filesetting", CommandSetAnalysisFileSetting, N_("Set the default analyze-file setting"), szVALUE, NULL }, { "luck", CommandSetAnalysisLuck, N_("Select whether dice rolls will be " "analysed"), szONOFF, &cOnOff }, { "luckanalysis", CommandSetAnalysisLuckAnalysis, N_("Specify parameters for the luck analysis"), NULL, acSetEvaluation }, { "movefilter", CommandSetAnalysisMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { "moves", CommandSetAnalysisMoves, N_("Select whether chequer play will be " "analysed"), szONOFF, &cOnOff }, { "player", CommandSetAnalysisPlayer, N_("Player specific options"), szPLAYER, acSetAnalysisPlayer }, { "threshold", NULL, N_("Specify levels for marking moves"), NULL, acSetAnalysisThreshold }, #if defined(USE_GTK) { "window", CommandSetAnalysisWindows, N_("Display window with analysis"), szONOFF, &cOnOff }, #endif { NULL, NULL, NULL, NULL, NULL } }; static command acSetAutomatic[] = { { "bearoff", CommandSetAutoBearoff, N_("Automatically bear off as many " "chequers as possible"), szONOFF, &cOnOff }, { "crawford", CommandSetAutoCrawford, N_("Enable the Crawford game " "based on match score"), szONOFF, &cOnOff }, { "db", CommandSetAutoDB, N_("Select whether to add to database after analysis"), szONOFF, &cOnOff }, { "doubles", CommandSetAutoDoubles, N_("Control automatic doubles " "during (money) session play"), szLIMIT, NULL }, { "game", CommandSetAutoGame, N_("Select whether to start new games " "after wins"), szONOFF, &cOnOff }, { "move", CommandSetAutoMove, N_("Select whether forced moves will be " "made automatically"), szONOFF, &cOnOff }, { "roll", CommandSetAutoRoll, N_("Control whether dice will be rolled " "automatically"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetConfirm[] = { { "default", CommandSetConfirmDefault, N_("Set default answer to yes/no questions"), NULL, NULL }, { "new", CommandSetConfirmNew, N_("Ask for confirmation before aborting " "a game in progress"), szONOFF, &cOnOff }, { "save", CommandSetConfirmSave, N_("Ask for confirmation before " "overwriting existing files"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetCube[] = { { "center", CommandSetCubeCentre, N_("The U.S.A. spelling of `centre'"), NULL, NULL }, { "centre", CommandSetCubeCentre, N_("Allow both players access to the " "cube"), NULL, NULL }, { "owner", CommandSetCubeOwner, N_("Allow only one player to double"), szPLAYER, &cPlayerBoth }, { "use", CommandSetCubeUse, N_("Control use of the doubling cube"), szONOFF, &cOnOff }, { "value", CommandSetCubeValue, N_("Fix what the cube stake has been set to"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetCubeEfficiencyRace[] = { { "factor", CommandSetCubeEfficiencyRaceFactor, N_("Set cube efficiency race factor"), szVALUE, NULL }, { "coefficient", CommandSetCubeEfficiencyRaceCoefficient, N_("Set cube efficiency race coefficient"), szVALUE, NULL }, { "min", CommandSetCubeEfficiencyRaceMin, N_("Set cube efficiency race minimum value"), szVALUE, NULL }, { "max", CommandSetCubeEfficiencyRaceMax, N_("Set cube efficiency race maximum value"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetCubeEfficiency[] = { { "os", CommandSetCubeEfficiencyOS, N_("Set cube efficiency for one sided bearoff positions"), szVALUE, NULL }, { "crashed", CommandSetCubeEfficiencyCrashed, N_("Set cube efficiency for crashed positions"), szVALUE, NULL }, { "contact", CommandSetCubeEfficiencyContact, N_("Set cube efficiency for contact positions"), szVALUE, NULL }, { "race", NULL, N_("Set cube efficiency parameters for race positions"), szVALUE, acSetCubeEfficiencyRace }, { NULL, NULL, NULL, NULL, NULL } #if defined(USE_GTK) }; command acSetGeometryValues[] = { { "width", CommandSetGeometryWidth, N_("set width of window"), szVALUE, NULL }, { "height", CommandSetGeometryHeight, N_("set height of window"), szVALUE, NULL }, { "xpos", CommandSetGeometryPosX, N_("set x-position of window"), szVALUE, NULL }, { "ypos", CommandSetGeometryPosY, N_("set y-position of window"), szVALUE, NULL }, { "max", CommandSetGeometryMax, N_("set maximised state of window"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static command acSetGeometry[] = { { "analysis", CommandSetGeometryAnalysis, N_("set geometry of analysis window"), NULL, acSetGeometryValues }, { "command", CommandSetGeometryCommand, N_("set geometry of command window"), NULL, acSetGeometryValues }, { "game", CommandSetGeometryGame, N_("set geometry of game-list window"), NULL, acSetGeometryValues }, { "hint", CommandSetGeometryHint, N_("set geometry of game-list window"), NULL, acSetGeometryValues }, { "main", CommandSetGeometryMain, N_("set geometry of main window"), NULL, acSetGeometryValues }, { "message", CommandSetGeometryMessage, N_("set geometry of message window"), NULL, acSetGeometryValues }, { "theory", CommandSetGeometryTheory, N_("set geometry of theory window"), NULL, acSetGeometryValues }, { NULL, NULL, NULL, NULL, NULL } }, acSetGUIAnimation[] = { { "blink", CommandSetGUIAnimationBlink, N_("Blink chequers being moves"), NULL, NULL }, { "none", CommandSetGUIAnimationNone, N_("Do not animate moving chequers"), NULL, NULL }, { "slide", CommandSetGUIAnimationSlide, N_("Slide chequers across board when moved"), NULL, NULL }, { "speed", CommandSetGUIAnimationSpeed, N_("Specify animation rate for moving chequers"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetGUIShowPips[] = { { "none", CommandSetGUIShowPipsNone, N_("Don't show pip counts under the board"), NULL, NULL }, { "pips", CommandSetGUIShowPipsPips, N_("Show pip counts under the board"), NULL, NULL }, { "epc", CommandSetGUIShowPipsEPC, N_("Show EPC under the board, or pip count if unavailable"), NULL, NULL }, { "wastage", CommandSetGUIShowPipsWastage, N_("Show EPC and wastage under the board, or pip count if unavailable"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetGUI[] = { { "animation", NULL, N_("Control how moving chequers are displayed"), NULL, acSetGUIAnimation }, { "beep", CommandSetGUIBeep, N_("Enable beeping on illegal input"), szONOFF, NULL }, { "dicearea", CommandSetGUIDiceArea, N_("Show dice icon when human player on roll"), szONOFF, NULL }, { "dragtargethelp", CommandSetGUIDragTargetHelp, N_("Show target help while dragging a chequer"), szONOFF, NULL }, { "usestatspanel", CommandSetGUIUseStatsPanel, N_("Show statistics in a panel"), szONOFF, NULL }, { "movelistdetail", CommandSetGUIMoveListDetail, N_("Show win/loss stats in move list"), szONOFF, NULL }, { "grayedit", CommandSetGUIGrayEdit, N_("Gray board in edit mode"), szONOFF, NULL }, { "highdiefirst", CommandSetGUIHighDieFirst, N_("Show the higher die on the left"), szONOFF, NULL }, { "illegal", CommandSetGUIIllegal, N_("Permit dragging chequers to illegal points"), szONOFF, NULL }, { "showids", CommandSetGUIShowIDs, N_("Show the position and match IDs above the board"), szONOFF, NULL }, { "showpips", NULL, N_("Show the pip counts below the board"), NULL, acSetGUIShowPips }, { "windowpositions", CommandSetGUIWindowPositions, N_("Save and restore window positions and sizes"), szONOFF, NULL }, { NULL, NULL, NULL, NULL, NULL } #endif }, acSetMatchInfo[] = { { "annotator", CommandSetMatchAnnotator, N_("Record the name of the match commentator"), szOPTNAME, NULL }, { "comment", CommandSetMatchComment, N_("Record miscellaneous notes about the match"), szOPTVALUE, NULL }, { "date", CommandSetMatchDate, N_("Record the date when the match was played"), szOPTDATE, NULL }, { "event", CommandSetMatchEvent, N_("Record the name of the event the match is from"), szOPTVALUE, NULL }, { "place", CommandSetMatchPlace, N_("Record the location where the match was played"), szOPTVALUE, NULL }, { "rating", CommandSetMatchRating, N_("Record the ratings of the players"), szPLAYEROPTRATING, &cPlayer }, { "round", CommandSetMatchRound, N_("Record the round of the match within the event"), szOPTVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetOutput[] = { { "output", CommandSetOutputOutput, N_("Print to messages to stdout"), szONOFF, &cOnOff }, { "matchpc", CommandSetOutputMatchPC, N_("Show match equities as percentages (on) or probabilities (off)"), szONOFF, &cOnOff }, { "mwc", CommandSetOutputMWC, N_("Show output in MWC (on) or " "equity (off) (match play only)"), szONOFF, &cOnOff }, { "rawboard", CommandSetOutputRawboard, N_("Give FIBS \"boardstyle 3\" " "output (on), or an ASCII board (off)"), szONOFF, &cOnOff }, { "winpc", CommandSetOutputWinPC, N_("Show winning chances as percentages (on) or probabilities (off)"), szONOFF, &cOnOff }, { "digits", CommandSetOutputDigits, N_("Set number of digits after the decimal point in outputs"), szVALUE, NULL}, { "errorratefactor", CommandSetOutputErrorRateFactor, N_("The factor used for multiplying error rates"), szVALUE, NULL}, { NULL, NULL, NULL, NULL, NULL } }; command acSetRNG[] = { { "bbs", CommandSetRNGBBS, N_("Use the Blum, Blum and Shub generator"), szOPTMODULUSOPTSEED, NULL }, { "file", CommandSetRNGFile, N_("Read dice from file"), szFILENAME, NULL }, { "isaac", CommandSetRNGIsaac, N_("Use the I.S.A.A.C. generator"), szOPTSEED, NULL }, { "manual", CommandSetRNGManual, N_("Enter all dice rolls manually"), NULL, NULL }, { "md5", CommandSetRNGMD5, N_("Use the MD5 generator"), szOPTSEED, NULL }, { "mersenne", CommandSetRNGMersenne, N_("Use the Mersenne Twister generator"), szOPTSEED, NULL }, { "random.org", CommandSetRNGRandomDotOrg, N_("Use random numbers fetched from "), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetRolloutLatePlayer[] = { { "chequerplay", CommandSetRolloutPlayerLateChequerplay, N_("Specify parameters " "for chequerplay during later plies of rollouts"), NULL, acSetEvaluation }, { "cubedecision", CommandSetRolloutPlayerLateCubedecision, N_("Specify parameters " "for cube decisions during later plies of rollouts"), NULL, acSetEvaluation }, { "movefilter", CommandSetRolloutPlayerLateMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { NULL, NULL, NULL, NULL, NULL } }, acSetRolloutLimit[] = { { "enable", CommandSetRolloutLimitEnable, N_("Stop rollouts when STD's are small enough"), szONOFF, &cOnOff }, { "minimumgames", CommandSetRolloutLimitMinGames, N_("Always rollout at least this many games"), szMINGAMES, NULL}, { "maxerror", CommandSetRolloutMaxError, N_("Stop rollouts when STD's are less than this "), szMAXERR, NULL}, { NULL, NULL, NULL, NULL, NULL } },acSetRolloutJsd[] = { { "limit", CommandSetRolloutJsdLimit, N_("Stop when equities differ by this many J.S.D.s"), szJSDS, NULL}, { "minimumgames", CommandSetRolloutJsdMinGames, N_("Always rollout at least this many games"), szMINGAMES, NULL}, { "stop", CommandSetRolloutJsdEnable, N_("Stop entire rollout when J.S.D.s are large enough"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetRolloutPlayer[] = { { "chequerplay", CommandSetRolloutPlayerChequerplay, N_("Specify parameters " "for chequerplay during rollouts"), NULL, acSetEvaluation }, { "cubedecision", CommandSetRolloutPlayerCubedecision, N_("Specify parameters for cube decisions during rollouts"), NULL, acSetEvaluation }, { "movefilter", CommandSetRolloutPlayerMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { NULL, NULL, NULL, NULL, NULL } }; static command acSetRolloutBearoffTruncation[] = { { "exact", CommandSetRolloutBearoffTruncationExact, N_("Truncate *cubeless* rollouts at exact bearoff database"), NULL, &cOnOff }, { "onesided", CommandSetRolloutBearoffTruncationOS, N_("Truncate *cubeless* rollouts when reaching " "one-sided bearoff database"), NULL, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }; command acSetRolloutLate[] = { { "chequerplay", CommandSetRolloutLateChequerplay, N_("Specify parameters for chequerplay during later plies of rollouts"), NULL, acSetEvaluation }, { "cubedecision", CommandSetRolloutLateCubedecision, N_("Specify parameters " "for cube decisions during later plies of rollouts"), NULL, acSetEvaluation }, { "enable", CommandSetRolloutLateEnable, N_("Enable/Disable different evaluations for later plies of rollouts"), szONOFF, &cOnOff }, { "plies", CommandSetRolloutLatePlies, N_("Change evaluations for later plies in rollouts"), szPLIES, NULL }, { "movefilter", CommandSetRolloutLateMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { "player", CommandSetRolloutLatePlayer, N_("Control eval parameters on later plies for each side individually"), szPLAYER, acSetRolloutLatePlayer }, { NULL, NULL, NULL, NULL, NULL } }, acSetRollout[] = { { "bearofftruncation", NULL, N_("Control truncation of rollout when reaching bearoff databases"), NULL, acSetRolloutBearoffTruncation }, { "chequerplay", CommandSetRolloutChequerplay, N_("Specify parameters " "for chequerplay during rollouts"), NULL, acSetEvaluation }, { "cubedecision", CommandSetRolloutCubedecision, N_("Specify parameters " "for cube decisions during rollouts"), NULL, acSetEvaluation }, { "cube-equal-chequer", CommandSetRolloutCubeEqualChequer, N_("Use same rollout evaluations for cube and chequer play"), szONOFF, &cOnOff }, { "cubeful", CommandSetRolloutCubeful, N_("Specify whether the " "rollout is cubeful or cubeless"), szONOFF, &cOnOff }, { "initial", CommandSetRolloutInitial, N_("Roll out as the initial position of a game"), szONOFF, &cOnOff }, { "jsd", CommandSetRolloutJsd, N_("Stop truncations based on J.S.D. of equities"), NULL, acSetRolloutJsd}, {"later", CommandSetRolloutLate, N_("Control evaluation parameters for later plies of rollout"), NULL, acSetRolloutLate }, {"limit", CommandSetRolloutLimit, N_("Stop rollouts based on Standard Deviations"), NULL, acSetRolloutLimit }, {"log", CommandSetRolloutLogEnable, N_("Enable recording of rolled out games"), szONOFF, &cOnOff }, {"logfile", CommandSetRolloutLogFile, N_("Set template file name for rollout .sgf files"), szFILENAME, NULL }, { "movefilter", CommandSetRolloutMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { "player", CommandSetRolloutPlayer, N_("Control evaluation parameters for each side individually"), szPLAYER, acSetRolloutPlayer }, { "players-are-same", CommandSetRolloutPlayersAreSame, N_("Use same settings for both players in rollouts"), szONOFF, &cOnOff }, { "quasirandom", CommandSetRolloutRotate, N_("Permute the dice rolls according to a uniform distribution"), szONOFF, &cOnOff }, { "rng", CommandSetRolloutRNG, N_("Specify the random number " "generator algorithm for rollouts"), NULL, acSetRNG }, { "rotate", CommandSetRolloutRotate, N_("Synonym for `quasirandom'"), szONOFF, &cOnOff }, { "seed", CommandSetRolloutSeed, N_("Specify the base pseudo-random seed " "to use for rollouts"), szOPTSEED, NULL }, { "trials", CommandSetRolloutTrials, N_("Control how many rollouts to " "perform"), szTRIALS, NULL }, { "truncation", CommandSetRolloutTruncation, N_("Set parameters for " "truncating rollouts"), NULL, acSetTruncation }, { "truncate-equal-player0", CommandSetRolloutTruncationEqualPlayer0, N_("Use player 0 settings for rollout evaluation at truncation point"), szONOFF, &cOnOff }, { "varredn", CommandSetRolloutVarRedn, N_("Use lookahead during rollouts " "to reduce variance"), szONOFF, &cOnOff }, /* FIXME add commands for cube variance reduction, settlements... */ { NULL, NULL, NULL, NULL, NULL } }, acSetTruncation[] = { { "chequerplay", CommandSetRolloutTruncationChequer, N_("Set chequerplay evaluation when truncating a rollout"), NULL, acSetEvaluation}, { "cubedecision", CommandSetRolloutTruncationCube, N_("Set cubedecision evaluation when truncating a rollout"), NULL, acSetEvaluation}, { "enable", CommandSetRolloutTruncationEnable, N_("Enable/Disable truncated rollouts"), szONOFF, &cOnOff }, { "plies", CommandSetRolloutTruncationPlies, N_("End rollouts at a specific depth"), szPLIES, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static command acSetEval[] = { { "chequerplay", CommandSetEvalChequerplay, N_("Set evaluation parameters for chequer play"), NULL, acSetEvalParam }, { "cubedecision", CommandSetEvalCubedecision, N_("Set evaluation parameters for cube decisions"), NULL, acSetEvalParam }, { "movefilter", CommandSetEvalMoveFilter, N_("Set parameters for choosing moves to evaluate"), szFILTER, NULL}, { "sameasanalysis", CommandSetEvalSameAsAnalysis, N_("Select if evaluation settings should be the " "same as the analysis setting"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }; command acSetExportParameters[] = { { "evaluation", CommandSetExportParametersEvaluation, N_("show detailed parameters for evaluations"), szONOFF, &cOnOff }, { "rollout", CommandSetExportParametersRollout, N_("show detailed parameters for rollouts"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }; static command acSetExportHTMLType[] = { { "bbs", CommandSetExportHTMLTypeBBS, N_("Use BBS-type images for posting to, e.g., BGonline"), NULL, NULL }, { "fibs2html", CommandSetExportHTMLTypeFibs2html, N_("Use fibs2html-type pictures"), NULL, NULL }, { "gnu", CommandSetExportHTMLTypeGNU, N_("Default images"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportCSS[] = { { "head", CommandSetExportHTMLCSSHead, N_("Write CSS stylesheet in "), NULL, NULL }, { "external", CommandSetExportHTMLCSSExternal, N_("Write stylesheet to external file (\"gnubg.css\")"), NULL, NULL }, { "inline", CommandSetExportHTMLCSSInline, N_("Write stylesheet inside tags"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportHTML[] = { { "css", NULL, N_("Control how the CSS stylesheet is written"), szVALUE, acSetExportCSS }, { "pictureurl", CommandSetExportHTMLPictureURL, N_("set URL to pictures used in HTML export"), szURL, NULL }, { "type", NULL, N_("set type of HTML boards used in HTML export"), NULL, acSetExportHTMLType }, { "size", CommandSetExportHtmlSize, N_("Set size of board for HTML image export"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportMovesDisplay[] = { { "verybad", CommandSetExportMovesDisplayVeryBad, N_("show very bad moves"), szONOFF, &cOnOff }, { "bad", CommandSetExportMovesDisplayBad, N_("show bad moves"), szONOFF, &cOnOff }, { "doubtful", CommandSetExportMovesDisplayDoubtful, N_("show doubtful moves"), szONOFF, &cOnOff }, { "unmarked", CommandSetExportMovesDisplayUnmarked, N_("show unmarked moves"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportCubeDisplay[] = { { "actual", CommandSetExportCubeDisplayActual, N_("show actual cube decisions"), szONOFF, &cOnOff }, { "bad", CommandSetExportCubeDisplayBad, N_("show bad cube decisions"), szONOFF, &cOnOff }, { "close", CommandSetExportCubeDisplayClose, N_("show close cube decisions"), szONOFF, &cOnOff }, { "doubtful", CommandSetExportCubeDisplayDoubtful, N_("show doubtful cube decisions"), szONOFF, &cOnOff }, { "missed", CommandSetExportCubeDisplayMissed, N_("show missed doubles"), szONOFF, &cOnOff }, { "unmarked", CommandSetExportCubeDisplayUnmarked, N_("show unmarked cube decisions"), szONOFF, &cOnOff }, { "verybad", CommandSetExportCubeDisplayVeryBad, N_("show very bad cube decisions"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportInclude[] = { { "annotations", CommandSetExportIncludeAnnotations, N_("include annotations"), szONOFF, &cOnOff }, { "analysis", CommandSetExportIncludeAnalysis, N_("include analysis (evaluations/rollouts)"), szONOFF, &cOnOff }, { "statistics", CommandSetExportIncludeStatistics, N_("include statistics (# of bad moves, # of jokers, etc)"), szONOFF, &cOnOff }, { "matchinfo", CommandSetExportIncludeMatchInfo, N_("include information about the match" ), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportShow[] = { { "board", CommandSetExportShowBoard, N_("show board every [value] move (0 for never)"), szVALUE, NULL }, { "player", CommandSetExportShowPlayer, N_("which player(s) to show"), szPLAYER, &cPlayerBoth }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportMoves[] = { { "number", CommandSetExportMovesNumber, N_("show at most [value] moves"), szVALUE, NULL }, { "probabilities", CommandSetExportMovesProb, N_("show detailed probabilities"), szONOFF, &cOnOff }, { "parameters", CommandSetExportMovesParameters, N_("show detailed rollout/evaluation parameters"), NULL, acSetExportParameters }, { "display", NULL, N_("when to show moves"), NULL, acSetExportMovesDisplay }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportCube[] = { { "probabilities", CommandSetExportCubeProb, N_("show detailed probabilities"), szONOFF, &cOnOff }, { "parameters", CommandSetExportCubeParameters, N_("show detailed rollout/evaluation parameters"), NULL, acSetExportParameters }, { "display", NULL, N_("when to show moves"), NULL, acSetExportCubeDisplay }, { NULL, NULL, NULL, NULL, NULL } }, acSetExportPNG[] = { { "size", CommandSetExportPNGSize, N_("Set size of board for PNG export"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetExport[] = { { "folder", CommandSetExportFolder, N_("Set default folder " "for export"), szFOLDER, &cFilename }, { "html", NULL, N_("Set options for HTML export"), NULL, acSetExportHTML }, { "include", NULL, N_("Control which blocks to include in exports"), NULL, acSetExportInclude }, { "png", NULL, N_("Set options for PNG export"), NULL, acSetExportPNG }, { "show", NULL, N_("Control display of boards/players in exports"), NULL, acSetExportShow }, { "moves", NULL, N_("Control display of moves in exports"), NULL, acSetExportMoves }, { "cube", NULL, N_("Control display of cube in exports"), NULL, acSetExportCube }, { NULL, NULL, NULL, NULL, NULL } }, acSetImport[] = { { "folder", CommandSetImportFolder, N_("Set default folder " "for import"), szFOLDER, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acSetInvert[] = { { "matchequitytable", CommandSetInvertMatchEquityTable, N_("Invert match equity table"), szONOFF, &cOnOff }, { "met", CommandSetInvertMatchEquityTable, N_("alias for 'set invert matchequitytable'"), szONOFF, &cOnOff }, { NULL, NULL, NULL, NULL, NULL } }, acSetPriority[] = { { "abovenormal", CommandSetPriorityAboveNormal, N_("Set priority to above normal"), NULL, NULL }, { "belownormal", CommandSetPriorityBelowNormal, N_("Set priority to below normal"), NULL, NULL }, { "highest", CommandSetPriorityHighest, N_("Set priority to highest"), NULL, NULL }, { "idle", CommandSetPriorityIdle, N_("Set priority to idle"), NULL, NULL }, { "nice", CommandSetPriorityNice, N_("Specify priority numerically"), szPRIORITY, NULL }, { "normal", CommandSetPriorityNormal, N_("Set priority to normal"), NULL, NULL }, { "timecritical", CommandSetPriorityTimeCritical, N_("Set priority to time critical"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetSGF[] = { { "folder", CommandSetSGFFolder, N_("Set default folder " "for import"), szFOLDER, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acSetSoundSystem[] = { { "command", CommandSetSoundSystemCommand, N_("Specify external command for playing sounds"), szCOMMAND, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetSoundSound[] = { { "agree", CommandSetSoundSoundAgree, N_("Agree"), szOPTFILENAME, &cFilename }, { "analysisfinished", CommandSetSoundSoundAnalysisFinished, N_("Analysis is finished"), szOPTFILENAME, &cFilename }, { "botfans", CommandSetSoundSoundBotDance, N_("Bot fans"), szOPTFILENAME, &cFilename }, { "botwinsgame", CommandSetSoundSoundBotWinGame, N_("Bot wins game"), szOPTFILENAME, &cFilename }, { "botwinsmatch", CommandSetSoundSoundBotWinMatch, N_("Bot wins match"), szOPTFILENAME, &cFilename }, { "chequer", CommandSetSoundSoundChequer, N_("Chequer movement"), szOPTFILENAME, &cFilename }, { "double", CommandSetSoundSoundDouble, N_("Double"), szOPTFILENAME, &cFilename }, { "drop", CommandSetSoundSoundDrop, N_("Drop"), szOPTFILENAME, &cFilename }, { "exit", CommandSetSoundSoundExit, N_("Exiting of GNU Backgammon"), szOPTFILENAME, &cFilename }, { "humanfans", CommandSetSoundSoundHumanDance, N_("Human fans"), szOPTFILENAME, &cFilename }, { "humanwinsgame", CommandSetSoundSoundHumanWinGame, N_("Human wins game"), szOPTFILENAME, &cFilename }, { "humanwinsmatch", CommandSetSoundSoundHumanWinMatch, N_("Human wins match"), szOPTFILENAME, &cFilename }, { "move", CommandSetSoundSoundMove, N_("verb|Move"), szOPTFILENAME, &cFilename }, { "redouble", CommandSetSoundSoundRedouble, N_("Redouble"), szOPTFILENAME, &cFilename }, { "resign", CommandSetSoundSoundResign, N_("Resign"), szOPTFILENAME, &cFilename }, { "roll", CommandSetSoundSoundRoll, N_("verb|Roll"), szOPTFILENAME, &cFilename }, { "start", CommandSetSoundSoundStart, N_("Starting of GNU Backgammon"), szOPTFILENAME, &cFilename }, { "take", CommandSetSoundSoundTake, N_("Take"), szOPTFILENAME, &cFilename }, { NULL, NULL, NULL, NULL, NULL } }, acSetSound[] = { { "sound", NULL, N_("Set sound files"), NULL, acSetSoundSound }, { "enable", CommandSetSoundEnable, N_("Select whether sounds should be played or not"), szONOFF, &cOnOff }, { "system", NULL, N_("Select sound system"), NULL, acSetSoundSystem }, { NULL, NULL, NULL, NULL, NULL } }, acSetTutorSkill[] = { { "doubtful", CommandSetTutorSkillDoubtful, N_("Warn about `doubtful' play"), NULL, NULL }, { "bad", CommandSetTutorSkillBad, N_("Warn about `bad' play"), NULL, NULL }, { "verybad", CommandSetTutorSkillVeryBad, N_("Warn about `very bad' play"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSetTutor[] = { { "mode", CommandSetTutorMode, N_("Give advice on possible errors"), szONOFF, &cOnOff }, { "cube", CommandSetTutorCube, N_("Include cube play in advice"), szONOFF, &cOnOff }, { "chequer", CommandSetTutorChequer, N_("Include chequer play in advice"), szONOFF, &cOnOff }, { "skill", NULL, N_("Set level for tutor warnings"), NULL, acSetTutorSkill }, { NULL, NULL, NULL, NULL, NULL } }, acSetCheat[] = { { "enable", CommandSetCheatEnable, N_("Control whether GNU Backgammon is allowed to manipulate the dice"), szONOFF, &cOnOff }, { "player", CommandSetCheatPlayer, N_("Parameters for the dice manipulation"), szPLAYER, acSetCheatPlayer }, { NULL, NULL, NULL, NULL, NULL } }; command acSetCheatPlayer[] = { { "roll", CommandSetCheatPlayerRoll, N_("Which roll should GNU Backgammon choose (1=Best and 21=Worst)"), szVALUE, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static command acSetVariation[] = { { "1-chequer-hypergammon", CommandSetVariation1ChequerHypergammon, N_("Play 1-chequer hypergammon"), NULL, NULL }, { "2-chequer-hypergammon", CommandSetVariation2ChequerHypergammon, N_("Play 2-chequer hypergammon"), NULL, NULL }, { "3-chequer-hypergammon", CommandSetVariation3ChequerHypergammon, N_("Play 3-chequer hypergammon"), NULL, NULL }, { "nackgammon", CommandSetVariationNackgammon, N_("Play standard backgammon with Nackgammon starting position"), NULL, NULL }, { "standard", CommandSetVariationStandard, N_("Play standard backgammon"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acSet[] = { { "analysis", NULL, N_("Control parameters used when analysing moves"), NULL, acSetAnalysis }, #if defined(USE_GTK) { "annotation", CommandSetAnnotation, N_("Select whether move analysis and " "commentary are shown"), szONOFF, &cOnOff }, #endif { "appearance", CommandSetAppearance, N_("Modify the look and feel of the " "graphical interface"), szKEYVALUE, NULL }, { "automatic", NULL, N_("Perform certain functions without user input"), NULL, acSetAutomatic }, { "beavers", CommandSetBeavers, N_("Set whether beavers are allowed in money game or not"), szVALUE, NULL }, { "board", CommandSetBoard, N_("Set up the board in a particular " "position. Accepted formats are:\n" " set board =2 (sets the board to match the second position in the hint list.)\n" " set board simple 3 2 4 0 -3 -5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2\n" " set board 4PPgASjgc/ABMA (sets the board to match the position ID.)\n" " set board PPGPAABAAAPHNNAAAAAA (sets the board to match the gnubg-nn position string.)\n" ), szPOSITION, NULL }, { "browser", CommandSetBrowser, N_("Set web browser"), szOPTCOMMAND, NULL }, { "cache", CommandSetCache, N_("Set the size of the evaluation cache"), szSIZE, NULL }, { "calibration", CommandSetCalibration, N_("Specify the evaluation speed to be assumed for time estimates"), szOPTVALUE, NULL }, { "cheat", NULL, N_("Control GNU Backgammon's manipulation of the dice"), NULL, acSetCheat }, { "clockwise", CommandSetClockwise, N_("Control the board orientation"), szONOFF, &cOnOff }, { "colours", CommandSetAppearance, N_("Synonym for `set appearance'"), NULL, NULL }, #if defined(USE_GTK) { "commandwindow", CommandSetCommandWindow, N_("Display command window"), szONOFF, &cOnOff }, #endif { "confirm", NULL, N_("Confirmation settings"), NULL, acSetConfirm }, { "crawford", CommandSetCrawford, N_("Set whether this is the Crawford game"), szONOFF, &cOnOff }, { "cube", NULL, N_("Set the cube owner and/or value"), NULL, acSetCube }, { "cubeefficiency", NULL, N_("Set parameters for cube evaluations"), NULL, acSetCubeEfficiency }, { "delay", CommandSetDelay, N_("Limit the speed at which moves are made"), szMILLISECONDS, NULL }, { "dice", CommandSetDice, N_("Select the roll for the current move"), szDICE, NULL }, { "display", CommandSetDisplay, N_("Select whether the board is updated on the computer's turn"), szONOFF, &cOnOff }, #if defined(USE_GTK) { "dockpanels", CommandSetDockPanels, N_("Dock or float windows"), szONOFF, &cOnOff }, #endif { "evaluation", NULL, N_("Control position evaluation " "parameters"), NULL, acSetEval }, { "export", NULL, N_("Set settings for export"), NULL, acSetExport }, { "fullscreen", CommandSetFullScreen, N_("Change to full screen mode"), szONOFF, &cOnOff }, #if defined(USE_GTK) { "gamelist", CommandSetGameList, N_("Display game window with moves"), szONOFF, &cOnOff }, { "geometry", NULL, N_("Set geometry of windows"), NULL, acSetGeometry }, #endif { "gotofirstgame", CommandSetGotoFirstGame, N_("Control whether you want to go to the first or last game " "when loading matches or sessions"), NULL, NULL }, #if defined(USE_GTK) { "gui", NULL, N_("Control parameters for the graphical interface"), NULL, acSetGUI }, #endif { "import", NULL, N_("Set settings for import"), NULL, acSetImport }, { "sgf", NULL, N_("Set settings for sgf"), NULL, acSetSGF }, { "invert", NULL, N_("Invert match equity table"), NULL, acSetInvert }, { "jacoby", CommandSetJacoby, N_("Set whether to use the Jacoby rule in " "money games"), szONOFF, &cOnOff }, { "defaultnames", CommandSetDefaultNames, N_("Set default names for players"), szNAME, NULL }, { "keynames", CommandSetKeyNames, N_("Set key player names to highlight"), szNAME, NULL }, { "lang", CommandSetLang, N_("Set your language preference"), szLANG, NULL }, { "matchequitytable", CommandSetMET, N_("Read match equity table from XML file"), szFILENAME, &cFilename }, { "matchid", CommandSetMatchID, N_("set Match ID"), szMATCHID, NULL }, { "gnubgid", CommandSetGNUbgID, N_("set GNUbg ID"), szGNUBGID, NULL }, { "xgid", CommandSetXGID, N_("set GNUbg ID from XGID"), szXGID, NULL }, { "matchinfo", NULL, N_("Record auxiliary match information"), NULL, acSetMatchInfo }, { "matchlength", CommandSetMatchLength, N_("Specify the default length for new matches"), szLENGTH, NULL }, #if defined(USE_GTK) { "message", CommandSetMessage, N_("Display window with messages"), szONOFF, &cOnOff }, #endif { "met", CommandSetMET, N_("Synonym for `set matchequitytable'"), szFILENAME, &cFilename }, { "output", NULL, N_("Modify options for formatting results"), NULL, acSetOutput }, #if defined(USE_GTK) { "panels", CommandSetPanels, N_("Display game list, annotation and message panels/windows"), szONOFF, &cOnOff }, #endif { "panelwidth", CommandSetPanelWidth, N_("Set the width of the docked panels"), szVALUE, NULL }, { "player", CommandSetPlayer, N_("Change options for one or both " "players"), szPLAYER, acSetPlayer }, { "postcrawford", CommandSetPostCrawford, N_("Set whether this is a post-Crawford game"), szONOFF, &cOnOff }, { "priority", NULL, N_("Set the priority of the gnubg process"), NULL, acSetPriority }, { "prompt", CommandSetPrompt, N_("Customise the prompt GNUbg prints when " "ready for commands"), szPROMPT, NULL }, { "ratingoffset", CommandSetRatingOffset, N_("Set rating offset used for estimating abs. rating"), szVALUE, NULL }, { "record", CommandSetRecord, N_("Set whether all games in a session are " "recorded"), szONOFF, &cOnOff }, { "rng", CommandSetRNG, N_("Select the random number generator algorithm"), NULL, acSetRNG }, { "rollout", CommandSetRollout, N_("Control rollout parameters"), NULL, acSetRollout }, { "score", CommandSetScore, N_("Set the match or session score "), szSCORE, NULL }, #if defined(USE_GTK) { "scoremapply", CommandSetScoreMapPly, N_("Set the default evaluation ply in the ScoreMap window"), szVALUE, NULL }, { "scoremapmatchlength", CommandSetScoreMapMatchLength, N_("Set the default match length in the ScoreMap window"), szVALUE, NULL }, { "scoremaplabel", CommandSetScoreMapLabel, N_("Set the default axis label option in the ScoreMap window"), szVALUE, NULL }, { "scoremapjacoby", CommandSetScoreMapJacoby, N_("Set the default top-left square Jacoby option in the ScoreMap window"), szVALUE, NULL }, { "scoremapcubeequitydisplay", CommandSetScoreMapCubeEquityDisplay, N_("Set the default scoremapcubeequitydisplay option in the ScoreMap window"), szVALUE, NULL }, { "scoremapmoveequitydisplay", CommandSetScoreMapMoveEquityDisplay, N_("Set the default scoremapmoveequitydisplay option in the ScoreMap window"), szVALUE, NULL }, { "scoremapcolour", CommandSetScoreMapColour, N_("Set the default scoremapcolour option in the ScoreMap window"), szVALUE, NULL }, { "scoremaplayout", CommandSetScoreMapLayout, N_("Set the default scoremaplayout option in the ScoreMap window"), szVALUE, NULL }, #endif { "seed", CommandSetSeed, N_("Set the dice generator seed"), szOPTSEED, NULL }, { "sound", NULL, N_("Control audio parameters"), NULL, acSetSound }, { "styledgamelist", CommandSetStyledGameList, N_("Display colours for marked moves in game window"), szONOFF, &cOnOff }, #if defined(USE_GTK) { "theorywindow", CommandSetTheoryWindow, N_("Display game theory in window"), szONOFF, &cOnOff }, #endif #if defined(USE_MULTITHREAD) { "threads", CommandSetThreads, N_("Set the number of calculation threads"), szSIZE, NULL }, #endif { "toolbar", CommandSetToolbar, N_("Change if icons and/or text are shown on toolbar"), szVALUE, NULL }, { "turn", CommandSetTurn, N_("Set which player is on roll"), szPLAYER, &cPlayer }, { "tutor", NULL, N_("Control tutor setup"), NULL, acSetTutor }, #if 0 { "usekeynames", CommandSetUseKeyNames, N_("Set whether to use the list of key player names"), szONOFF, &cOnOff }, #endif { "variation", NULL, N_("Set which variation of backgammon is used"), NULL, acSetVariation }, { "vsync3d", CommandSetVsync3d, N_("Turn vertical sync on/off"), szONOFF, &cOnOff }, #if defined(USE_GTK) { "warning", CommandSetWarning, N_("Turn warnings on or off"), szWARNYN, NULL}, #endif { "autosave", NULL, N_("Control autosave"), NULL, acSetAutoSave }, { NULL, NULL, NULL, NULL, NULL } }, acShowStatistics[] = { { "game", CommandShowStatisticsGame, N_("Compute statistics for current game"), NULL, NULL }, { "match", CommandShowStatisticsMatch, N_("Compute statistics for every game in the match"), NULL, NULL }, { "session", CommandShowStatisticsSession, N_("Compute statistics for every game in the session"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }, acShowManual[] = { { "about", CommandShowManualAbout, N_("Show All about GNU Backgammon tutorial in a web browser"), NULL, NULL }, { "web", CommandShowManualWeb, N_("Show reference manual in a web browser"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }; command acShow[] = { { "analysis", CommandShowAnalysis, N_("Show parameters used for analysing " "moves"), NULL, NULL }, { "autosave", CommandShowAutoSave, N_("Show parameters used for autosaving"), NULL, NULL }, { "automatic", CommandShowAutomatic, N_("List which functions will be " "performed without user input"), NULL, NULL }, { "beavers", CommandShowBeavers, N_("Show whether beavers are allowed in money game or not"), NULL, NULL }, { "bearoff", CommandShowBearoff, N_("Lookup data in various bearoff databases "), NULL, NULL }, { "board", CommandShowBoard, N_("Redisplay the board position"), szOPTPOSITION, NULL }, { "buildinfo", CommandShowBuildInfo, N_("Display details of this build of GNUbg"), NULL, NULL }, { "browser", CommandShowBrowser, N_("Display the currently used web browser"), NULL, NULL }, #if CACHE_STATS { "cache", CommandShowCache, N_("Display statistics on the evaluation " "cache"), NULL, NULL }, #endif { "calibration", CommandShowCalibration, N_("Show the previously recorded evaluation speed"), NULL, NULL }, { "cheat", CommandShowCheat, N_("Show parameters for dice manipulation"), NULL, NULL }, { "clockwise", CommandShowClockwise, N_("Display the board orientation"), NULL, NULL }, { "commands", CommandShowCommands, N_("List all available commands"), NULL, NULL }, { "confirm", CommandShowConfirm, N_("Show whether confirmation is required before aborting a game"), NULL, NULL }, { "copying", CommandShowCopying, N_("Conditions for redistributing copies " "of GNU Backgammon"), NULL, NULL }, { "crawford", CommandShowCrawford, N_("See if this is the Crawford game"), NULL, NULL }, { "credits", CommandShowCredits, N_("Display contributors to GNUbg"), NULL, NULL }, { "cube", CommandShowCube, N_("Display the current cube value and owner"), NULL, NULL }, { "cubeefficiency", CommandShowCubeEfficiency, N_("Show parameters for cube evaluations"), NULL, NULL }, { "delay", CommandShowDelay, N_("See what the current delay setting is"), NULL, NULL }, { "dice", CommandShowDice, N_("See what the current dice roll is"), NULL, NULL }, { "display", CommandShowDisplay, N_("Show whether the board will be updated on the computer's turn"), NULL, NULL }, { "engine", CommandShowEngine, N_("Display the status of the evaluation " "engine"), NULL, NULL }, { "evaluation", CommandShowEvaluation, N_("Display evaluation settings " "and statistics"), NULL, NULL }, { "fullboard", CommandShowFullBoard, N_("Redisplay the board position"), szOPTPOSITION, NULL }, { "gammonvalues", CommandShowGammonValues, N_("Show gammon values"), NULL, NULL }, { "export", CommandShowExport, N_("Show current export settings"), NULL, NULL }, #if defined(USE_GTK) { "geometry", CommandShowGeometry, N_("Show geometry settings"), NULL, NULL }, { "history", CommandShowHistory, N_("Show plot of player's historical error rate"), NULL, NULL }, #endif { "isight", CommandShowIsight, N_("Calculate Isight Count for " "position"), szOPTPOSITION, NULL }, { "jacoby", CommandShowJacoby, N_("See if the Jacoby rule is used in money sessions"), NULL, NULL }, { "8912", CommandShow8912, N_("Use 8912 rule to predict cube action"), szOPTPOSITION, NULL }, { "keith", CommandShowKeith, N_("Calculate Keith Count for " "position"), szOPTPOSITION, NULL }, { "kleinman", CommandShowKleinman, N_("Calculate Kleinman count for " "position"), szOPTPOSITION, NULL }, { "lang", CommandShowLang, N_("Display your language preference"), NULL, NULL }, { "manual", NULL, N_("Show manual"), NULL, acShowManual }, { "marketwindow", CommandShowMarketWindow, N_("show market window for doubles"), NULL, NULL }, { "matchequitytable", CommandShowMatchEquityTable, N_("Show match equity table"), szOPTVALUE, NULL }, { "matchinfo", CommandShowMatchInfo, N_("Display auxiliary match information"), NULL, NULL }, { "matchlength", CommandShowMatchLength, N_("Show default match length"), NULL, NULL }, { "matchresult", CommandShowMatchResult, N_("Show the actual and luck adjusted result for each game " "and the entire match"), NULL, NULL }, { "met", CommandShowMatchEquityTable, N_("Synonym for `show matchequitytable'"), szOPTVALUE, NULL }, { "onesidedrollout", CommandShowOneSidedRollout, N_("Show misc race theory"), NULL, NULL }, { "output", CommandShowOutput, N_("Show how results will be formatted"), NULL, NULL }, #if defined(USE_GTK) { "panels", CommandShowPanels, N_("Show if the panels are displayed"), NULL, NULL}, #endif { "pipcount", CommandShowPipCount, N_("Count the number of pips each player must move to bear off"), szOPTPOSITION, NULL }, { "player", CommandShowPlayer, N_("View per-player options"), NULL, NULL }, { "postcrawford", CommandShowPostCrawford, N_("See if this is post-Crawford play"), NULL, NULL }, { "prompt", CommandShowPrompt, N_("Show the prompt that will be printed " "when ready for commands"), NULL, NULL }, { "ratingoffset", CommandShowRatingOffset, N_("Show the rating offset " "used for estimating abs. rating"), NULL, NULL }, { "rng", CommandShowRNG, N_("Display which random number generator " "is being used"), NULL, NULL }, { "rollout", CommandShowRollout, N_("Display the evaluation settings used " "during rollouts"), NULL, NULL }, { "rolls", CommandShowRolls, N_("Display evaluations for all rolls "), szOPTDEPTH, NULL }, { "score", CommandShowScore, N_("View the match or session score "), NULL, NULL }, { "scoresheet", CommandShowScoreSheet, N_("View the score sheet for the match or session"), NULL, NULL }, { "seed", CommandShowSeed, N_("Show the dice generator seed"), NULL, NULL }, { "sound", CommandShowSound, N_("Show information about sounds"), NULL, NULL }, { "statistics", NULL, N_("Show statistics"), NULL, acShowStatistics }, { "temperaturemap", CommandShowTemperatureMap, N_("Show temperature map (graphic overview of dice distribution)"), NULL, NULL }, { "scoremap", CommandShowScoreMap, N_("Show ScoreMap (graphic overview of cube decisions at different scores)"), NULL, NULL }, #if defined(USE_MULTITHREAD) { "threads", CommandShowThreads, N_("Show number of calculation threads"), NULL, NULL }, #endif { "thorp", CommandShowThorp, N_("Calculate Thorp Count for " "position"), szOPTPOSITION, NULL }, { "turn", CommandShowTurn, N_("Show which player is on roll"), NULL, NULL }, { "version", CommandShowVersion, N_("Describe this version of GNU Backgammon"), NULL, NULL }, { "tutor", CommandShowTutor, N_("Give warnings for possible errors in play"), NULL, NULL }, { "variation", CommandShowVariation, N_("Give information about which variation of backgammon is being played"), NULL, NULL }, #if defined(USE_GTK) { "warning", CommandShowWarning, N_("Show warning settings"), szWARN, NULL}, #endif { "warranty", CommandShowWarranty, N_("Various kinds of warranty you do not have"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static command acSwap[] = { { "players", CommandSwapPlayers, N_("Swap players"), NULL, NULL }, { NULL, NULL, NULL, NULL, NULL } }; command acTop[] = { { "accept", CommandAccept, N_("Accept a cube or resignation"), NULL, NULL }, { "agree", CommandAgree, N_("Agree to a resignation"), NULL, NULL }, { "analyse", NULL, N_("Run analysis"), NULL, acAnalyse }, { "analysis", NULL, NULL, NULL, acAnalyse }, { "analyze", NULL, NULL, NULL, acAnalyse }, { "annotate", NULL, N_("Record notes about a game"), NULL, acAnnotate }, { "end", NULL, N_("Automatically make plays"), NULL, acEnd }, { "beaver", CommandRedouble, N_("Synonym for `redouble'"), NULL, NULL }, { "calibrate", CommandCalibrate, N_("Measure evaluation speed"), szOPTVALUE, NULL }, { "clear", NULL, N_("Clear information"), NULL, acClear }, { "cmark", NULL, N_("Mark candidates"), NULL, acCmark }, { "copy", CommandCopy, N_("Copy current position to clipboard"), NULL, NULL }, { "decline", CommandDecline, N_("Decline a resignation"), NULL, NULL }, { "dicerolls", CommandDiceRolls, N_("Generate a list of rolls"), szTRIALS, NULL }, { "double", CommandDouble, N_("Offer a double"), NULL, NULL }, { "drop", CommandDrop, N_("Decline an offered double"), NULL, NULL }, { "eq2mwc", CommandEq2MWC, N_("Convert normalised money equity to match winning chance"), szVALUE, NULL }, { "eval", CommandEval, N_("Display evaluation of a position"), szOPTPOSITION, NULL }, { "exit", CommandQuit, N_("Leave GNU Backgammon"), NULL, NULL }, { "export", NULL, N_("Write data for use by other programs"), NULL, acExport }, { "external", CommandExternal, N_("Make moves for an external controller"), szFILENAME, &cFilename }, { "first", NULL, N_("Goto first move or game"), NULL, acFirst }, { "help", CommandHelp, N_("Describe commands"), szOPTCOMMAND, NULL }, { "hint", CommandHint, N_("Give hints on cube action or best legal moves"), szOPTVALUE, NULL }, #if defined(HAVE_LIB_READLINE) { "history", CommandHistory, N_("Display current history"), NULL, NULL }, #endif /* HAVE_LIB_READLINE */ { "invert", NULL, N_("Invert match equity table"), NULL, acSetInvert }, { "import", NULL, N_("Import matches, games or positions from other programs"), NULL, acImport }, { "list", NULL, N_("Show a list of games or moves"), NULL, acList }, { "load", NULL, N_("Read data from a file"), NULL, acLoad }, { "move", CommandMove, N_("Make a backgammon move"), szMOVE, NULL }, { "mwc2eq", CommandMWC2Eq, N_("Convert match winning chance to normalised money equity"), szVALUE, NULL }, { "n", CommandNext, NULL, szSTEP, NULL }, { "new", NULL, N_("Start a new game, match or session"), NULL, acNew }, { "next", CommandNext, N_("Step ahead within the game"), szSTEP, NULL }, { "p", CommandPrevious, NULL, szSTEP, NULL }, { "pass", CommandDrop, N_("Synonym for `drop'"), NULL, NULL }, { "play", CommandPlay, N_("Force the computer to move"), NULL, NULL }, { "previous", CommandPrevious, N_("Step backward within the game"), szSTEP, NULL }, { "quit", CommandQuit, N_("Leave GNU Backgammon"), NULL, NULL }, { "r", CommandRoll, NULL, NULL, NULL }, { "redouble", CommandRedouble, N_("Accept the cube one level higher " "than it was offered"), NULL, NULL }, { "reject", CommandReject, N_("Reject a cube or resignation"), NULL, NULL }, { "relational", NULL, N_("Log matches to an external relational database"), NULL, acRelational }, { "resign", CommandResign, N_("Offer to end the current game"), szVALUE, NULL }, { "roll", CommandRoll, N_("Roll the dice"), NULL, NULL }, { "rollout", CommandRollout, N_("Have GNUbg perform rollouts of the current position."), NULL, NULL }, { "save", NULL, N_("Write data to a file"), NULL, acSave }, { "set", NULL, N_("Modify program parameters"), NULL, acSet }, { "show", NULL, N_("View program parameters"), NULL, acShow }, { "swap", NULL, N_("Swap players"), NULL, acSwap }, { "take", CommandTake, N_("Agree to an offered double"), NULL, NULL }, { "?", CommandHelp, N_("Describe commands"), szOPTCOMMAND, NULL }, { NULL, NULL, NULL, NULL, NULL } }; static command cTop = { NULL, NULL, NULL, NULL, acTop }; gnubg-1.08.003/rollout.c000644 001751 000024 00000172026 14574155047 014510 0ustar00pmstaff000000 000000 /* * Copyright (C) 1999-2003 Gary Wong * Copyright (C) 2000-2021 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: rollout.c,v 1.262 2021/11/21 20:16:11 plm Exp $ */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "backgammon.h" #if defined(USE_GTK) #include "gtkgame.h" #endif #include "matchid.h" #include "positionid.h" #include "format.h" #include "multithread.h" #include "rollout.h" #include "lib/simd.h" #define LogCubeClamped(n) (n < (1 << STAT_MAXCUBE) ? LogCube(n) : (STAT_MAXCUBE - 1)) #if !defined(LOCKING_VERSION) f_BasicCubefulRollout BasicCubefulRollout = BasicCubefulRolloutNoLocking; #define BasicCubefulRollout BasicCubefulRolloutNoLocking int log_rollouts = 0; char *log_file_name = 0; static unsigned int initial_game_count; /* make sgf files of rollouts if log_rollouts is true and we have a file * name template to work with */ extern void log_cube(FILE * logfp, const char *action, int side) { if (!logfp) return; fprintf(logfp, ";%s[%s]\n", side ? "B" : "W", action); } extern void log_move(FILE * logfp, const int *anMove, int side, int die0, int die1) { int i; if (!logfp) return; fprintf(logfp, ";%s[%d%d", side ? "B" : "W", die0, die1); for (i = 0; i < 8; i += 2) { if (anMove[i] < 0) break; if (anMove[i] > 23) fprintf(logfp, "y"); else if (!side) fprintf(logfp, "%c", 'a' + anMove[i]); else fprintf(logfp, "%c", 'x' - anMove[i]); if (anMove[i + 1] < 0) fprintf(logfp, "z"); else if (!side) fprintf(logfp, "%c", 'a' + anMove[i + 1]); else fprintf(logfp, "%c", 'x' - anMove[i + 1]); } fprintf(logfp, "%s", "]\n"); } static void board_to_sgf(FILE * logfp, const unsigned int anBoard[25], int direction) { unsigned int i, j; int c = direction > 0 ? 'a' : 'x'; if (!logfp) return; for (i = 0; i < 24; ++i) { for (j = 0; j < anBoard[i]; ++j) fprintf(logfp, "[%c]", c); c += direction; } for (j = 0; j < anBoard[24]; ++j) fprintf(logfp, "[y]"); } static FILE * log_game_start(const char *name, const cubeinfo * pci, int fCubeful, TanBoard anBoard) { time_t t = time(0); struct tm *now = localtime(&t); const char *rule; FILE *logfp = NULL; if (pci->nMatchTo == 0) { if (!fCubeful) rule = "RU[NoCube:Jacoby]"; else if (!pci->fJacoby) { rule = ""; } else { rule = "RU[Jacoby]"; } } else { if (!fCubeful) { rule = "RU[NoCube:Crawford]"; } else if (fAutoCrawford) { rule = (ms.fCrawford) ? "RU[Crawford:CrawfordGame]" : "RU[Crawford]"; } else { rule = ""; } } if ((logfp = g_fopen(name, "w")) == 0) return NULL; fprintf(logfp, "(;FF[4]GM[6]CA[UTF-8]AP[GNU Backgammon:%s]MI" "[length:%d][game:0][ws:%d][bs:%d][wtime:0][btime:0]" "[wtimeouts:0][btimeouts:0]PW[White]PB[Black]DT[%d-%02d-%02d]" "%s\n", VERSION, pci->nMatchTo, pci->anScore[0], pci->anScore[1], 1900 + now->tm_year, 1 + now->tm_mon, now->tm_mday, rule); /* set the rest of the things up */ fprintf(logfp, ";PL[%s]\n", pci->fMove ? "B" : "W"); fprintf(logfp, ";CP[%s]\n", pci->fCubeOwner == 0 ? "w" : pci->fCubeOwner == 1 ? "b" : "c"); fprintf(logfp, ";CV[%d]\n", pci->nCube); fprintf(logfp, ";AE[a:y]AW"); if (!pci->fMove) { board_to_sgf(logfp, anBoard[1], 1); fprintf(logfp, "AB"); board_to_sgf(logfp, anBoard[0], -1); } else { board_to_sgf(logfp, anBoard[0], 1); fprintf(logfp, "AB"); board_to_sgf(logfp, anBoard[1], -1); } fprintf(logfp, "\n"); return logfp; } static void log_game_over(FILE * logfp) { if (!logfp) return; fprintf(logfp, ")"); fclose(logfp); } static void QuasiRandomSeed(perArray * pArray, int n) { int i, j, r; unsigned char k, t; randctx rc; if (pArray->nPermutationSeed == n) return; for (i = 0; i < RANDSIZ; i++) rc.randrsl[i] = (ub4) n; irandinit(&rc, TRUE); for (i = 0; i < 6; i++) for (j = i /* no need for permutations below the diagonal */ ; j < QRLEN; j++) { for (k = 0; k < 36; k++) pArray->aaanPermutation[i][j][k] = k; for (k = 0; k < 35; k++) { r = irand(&rc) % (36 - k); t = pArray->aaanPermutation[i][j][k + r]; pArray->aaanPermutation[i][j][k + r] = pArray->aaanPermutation[i][j][k]; pArray->aaanPermutation[i][j][k] = t; } } pArray->nPermutationSeed = n; } static int nSkip; extern int RolloutDice(int iTurn, int iGame, int fInitial, unsigned int anDice[2], rng * rngx, void *rngctx, const int fRotate, const perArray * dicePerms) { if (fInitial && !iTurn) { /* rollout of initial position: no doubles allowed */ if (fRotate) { if (!iGame) MT_SafeSet(&nSkip, 0); for (;; MT_SafeInc(&nSkip)) { unsigned int j = dicePerms->aaanPermutation[0][0][(iGame + MT_SafeGet(&nSkip)) % 36]; anDice[0] = j / 6 + 1; anDice[1] = j % 6 + 1; if (anDice[0] != anDice[1]) break; } return 0; } else { do { int n; if ((n = RollDice(anDice, rngx, rngctx)) != 0) return n; } while (anDice[0] == anDice[1]); return 0; } } else if (fRotate && iTurn < QRLEN) { unsigned int i, /* the "generation" of the permutation */ j, /* the number we're permuting */ k; /* 36**i */ for (i = 0, j = 0, k = 1; i < 6 && i <= (unsigned int) iTurn; i++, k *= 36) j = dicePerms->aaanPermutation[i][iTurn][((iGame + MT_SafeGet(&nSkip)) / k + j) % 36]; anDice[0] = j / 6 + 1; anDice[1] = j % 6 + 1; return 0; } else return RollDice(anDice, rngx, rngctx); } extern void ClosedBoard(int afClosedBoard[2], const TanBoard anBoard) { int i, j; for (i = 0; i < 2; i++) { int n = 0; for (j = 0; j < 6; j++) { if (anBoard[i][j] > 1) n++; } afClosedBoard[i] = (n == 6); } } #else #define BasicCubefulRollout BasicCubefulRolloutWithLocking static volatile unsigned int initial_game_count; #endif #if !defined(LOCKING_VERSION) static void initRolloutstat(rolloutstat * prs); #endif /* called with * cube decision move rollout * aanBoard 2 copies of same board 1 board * aarOutput 2 arrays for eval 1 array * iTurn player on roll same * iGame game number same * cubeinfo 2 structs for double/nodouble 1 cubeinfo * or take/pass * CubeDecTop array of 2 boolean 1 boolean * (TRUE if a cube decision is valid on turn 0) * cci 2 (number of rollouts to do) 1 * prc 1 rollout context same * aarsStatistics 2 arrays of stats for the NULL * two alternatives of * cube rollouts * * returns -1 on error/interrupt, fInterrupt TRUE if stopped by user * aarOutput array(s) contain results */ extern int BasicCubefulRollout(unsigned int aanBoard[][2][25], float aarOutput[][NUM_ROLLOUT_OUTPUTS], int iTurn, int iGame, const cubeinfo aci[], int afCubeDecTop[], unsigned int cci, rolloutcontext * prc, rolloutstat aarsStatistics[][2], int nBasisCube, perArray * dicePerms, rngcontext * rngctxRollout, FILE * logfp) { unsigned int anDice[2]; unsigned int cUnfinished = cci; cubeinfo *pci; cubedecision cd; int *pf; unsigned int i, j, k, ici; evalcontext ec; positionclass pc, pcBefore; unsigned int nPipsBefore = 0, nPipsAfter, nPipsDice; unsigned int anPips[2]; int afClosedBoard[2]; float arDouble[NUM_CUBEFUL_OUTPUTS]; float aar[2][NUM_ROLLOUT_OUTPUTS]; unsigned int aiBar[2]; int afClosedOut[2] = { FALSE, FALSE }; int afHit[2] = { FALSE, FALSE }; float rDP; float r; int nTruncate = prc->fDoTruncate ? prc->nTruncate : 0x7fffffff; int nLateEvals = prc->fLateEvals ? prc->nLate : 0x7fffffff; int useVarRedn = prc->fVarRedn; /* Make local copy of cubeinfo struct, since it * may be modified */ cubeinfo *pciLocal = g_alloca(cci * sizeof(cubeinfo)); int *pfFinished = g_alloca(cci * sizeof(int)); float (*aarVarRedn)[NUM_ROLLOUT_OUTPUTS] = g_alloca(cci * NUM_ROLLOUT_OUTPUTS * sizeof(float)); /* variables for variance reduction */ evalcontext aecVarRedn[2]; evalcontext aecZero[2]; float arMean[NUM_ROLLOUT_OUTPUTS]; unsigned int aaanBoard[6][6][2][25]; int aanMoves[6][6][8]; #if defined(USE_SIMD_INSTRUCTIONS) #define NUM_ROLLOUT_OUTPUTS_PADDED (NUM_ROLLOUT_OUTPUTS + VEC_SIZE - (NUM_ROLLOUT_OUTPUTS % VEC_SIZE)) SSE_ALIGN(float aaar[6][6][NUM_ROLLOUT_OUTPUTS_PADDED]); #else float aaar[6][6][NUM_ROLLOUT_OUTPUTS]; #endif evalcontext ecCubeless0ply = { FALSE, 0, FALSE, TRUE, 0.0 }; evalcontext ecCubeful0ply = { TRUE, 0, FALSE, TRUE, 0.0 }; /* local pointers to the eval contexts to use */ evalcontext *pecCube[2], *pecChequer[2]; if (useVarRedn) { /* * Create evaluation context one ply deep */ for (ici = 0; ici < cci; ici++) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) aarVarRedn[ici][i] = 0.0f; for (i = 0; i < 2; i++) { aecZero[i] = aecVarRedn[i] = prc->aecChequer[i]; aecZero[i].nPlies = 0; if (aecVarRedn[i].nPlies) aecVarRedn[i].nPlies--; aecZero[i].fDeterministic = aecVarRedn[i].fDeterministic = 1; aecZero[i].rNoise = aecVarRedn[i].rNoise = 0.0f; } } for (ici = 0; ici < cci; ici++) pfFinished[ici] = TRUE; memcpy(pciLocal, aci, cci * sizeof(cubeinfo)); while ((!nTruncate || iTurn < nTruncate) && cUnfinished) { if (iTurn < nLateEvals) { pecCube[0] = prc->aecCube; pecCube[1] = prc->aecCube + 1; pecChequer[0] = prc->aecChequer; pecChequer[1] = prc->aecChequer + 1; } else { pecCube[0] = prc->aecCubeLate; pecCube[1] = prc->aecCubeLate + 1; pecChequer[0] = prc->aecChequerLate; pecChequer[1] = prc->aecChequerLate + 1; } /* Cube decision */ for (ici = 0, pci = pciLocal, pf = pfFinished; ici < cci; ici++, pci++, pf++) { /* check for truncation at bearoff databases */ pc = ClassifyPosition((ConstTanBoard) aanBoard[ici], pci->bgv); if (prc->fTruncBearoff2 && pc <= CLASS_PERFECT && prc->fCubeful && *pf && !pci->nMatchTo && ((afCubeDecTop[ici] && !prc->fInitial) || iTurn > 0)) { /* truncate at two sided bearoff if money game */ if (GeneralEvaluationE(aarOutput[ici], (ConstTanBoard) aanBoard[ici], pci, &ecCubeful0ply) < 0) return -1; if (iTurn & 1) InvertEvaluationR(aarOutput[ici], pci); *pf = FALSE; cUnfinished--; } else if (((prc->fTruncBearoff2 && pc <= CLASS_PERFECT) || (prc->fTruncBearoffOS && pc <= CLASS_BEAROFF_OS)) && !prc->fCubeful && *pf) { /* cubeless rollout, requested to truncate at bearoff db */ if (GeneralEvaluationE(aarOutput[ici], (ConstTanBoard) aanBoard[ici], pci, &ecCubeless0ply) < 0) return -1; /* rollout result is for player on play (even iTurn). * This point is pre play, so if opponent is on roll, invert */ if (iTurn & 1) InvertEvaluationR(aarOutput[ici], pci); *pf = FALSE; cUnfinished--; } if (*pf) { if (prc->fCubeful && GetDPEq(NULL, &rDP, pci) && (iTurn > 0 || (afCubeDecTop[ici] && !prc->fInitial))) { if (GeneralCubeDecisionE(aar, (ConstTanBoard) aanBoard[ici], pci, pecCube[pci->fMove], 0) < 0) return -1; cd = FindCubeDecision(arDouble, aar, pci); switch (cd) { case DOUBLE_TAKE: case DOUBLE_BEAVER: case REDOUBLE_TAKE: if (logfp) { log_cube(logfp, "double", pci->fMove); log_cube(logfp, "take", !pci->fMove); } /* update statistics */ if (aarsStatistics) MT_SafeInc(&aarsStatistics[ici][pci->fMove].acDoubleTake[LogCubeClamped(pci->nCube)]); SetCubeInfo(pci, 2 * pci->nCube, !pci->fMove, pci->fMove, pci->nMatchTo, pci->anScore, pci->fCrawford, pci->fJacoby, pci->fBeavers, pci->bgv); break; case DOUBLE_PASS: case REDOUBLE_PASS: if (logfp) { log_cube(logfp, "double", pci->fMove); log_cube(logfp, "drop", !pci->fMove); } *pf = FALSE; cUnfinished--; /* assign outputs */ for (i = 0; i <= OUTPUT_EQUITY; i++) aarOutput[ici][i] = aar[0][i]; /* * assign equity for double, pass: * - mwc for match play * - normalized equity for money play (i.e, rDP=1) */ aarOutput[ici][OUTPUT_CUBEFUL_EQUITY] = rDP; /* invert evaluations if required */ if (iTurn & 1) InvertEvaluationR(aarOutput[ici], pci); /* update statistics */ if (aarsStatistics) { MT_SafeInc(&aarsStatistics[ici][pci->fMove].acDoubleDrop[LogCubeClamped(pci->nCube)]); MT_SafeInc(&aarsStatistics[ici][pci->fMove].acWin[LogCubeClamped(pci->nCube)]); } break; case NODOUBLE_TAKE: case TOOGOOD_TAKE: case TOOGOOD_PASS: case NODOUBLE_BEAVER: case NO_REDOUBLE_TAKE: case TOOGOODRE_TAKE: case TOOGOODRE_PASS: case NO_REDOUBLE_BEAVER: case OPTIONAL_DOUBLE_BEAVER: case OPTIONAL_DOUBLE_TAKE: case OPTIONAL_REDOUBLE_TAKE: case OPTIONAL_DOUBLE_PASS: case OPTIONAL_REDOUBLE_PASS: case NODOUBLE_DEADCUBE: case NO_REDOUBLE_DEADCUBE: case NOT_AVAILABLE: default: /* no op */ break; } } /* cube */ } } /* loop over ci */ /* Chequer play */ if (RolloutDice(iTurn, iGame, prc->fInitial, anDice, &prc->rngRollout, rngctxRollout, prc->fRotate, dicePerms) < 0) return -1; if (anDice[0] < anDice[1]) swap_us(anDice, anDice + 1); for (ici = 0, pci = pciLocal, pf = pfFinished; ici < cci; ici++, pci++, pf++) { if (*pf) { /* Save number of chequers on bar */ for (i = 0; i < 2; i++) aiBar[i] = aanBoard[ici][i][24]; /* Save number of pips (for bearoff only) */ pcBefore = ClassifyPosition((ConstTanBoard) aanBoard[ici], pci->bgv); if (aarsStatistics && pcBefore <= CLASS_BEAROFF1) { PipCount((ConstTanBoard) aanBoard[ici], anPips); nPipsBefore = anPips[1]; } /* Find best move :-) */ if (useVarRedn) { /* Variance reduction */ for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) arMean[i] = 0.0f; for (i = 0; i < 6; i++) for (j = 0; j <= i; j++) { if (prc->fInitial && !iTurn && j == i) /* no doubles possible for first roll when rolling * out as initial position */ continue; memcpy(&aaanBoard[i][j][0][0], &aanBoard[ici][0][0], 2 * 25 * sizeof(int)); /* Find the best move for each roll on ply 0 only */ if (FindBestMove(aanMoves[i][j], i + 1, j + 1, aaanBoard[i][j], pci, &aecZero[pci->fMove], defaultFilters) < 0) return -1; SwapSides(aaanBoard[i][j]); /* re-evaluate the chosen move at ply n-1 */ pci->fMove = !pci->fMove; if (GeneralEvaluationE(aaar[i][j], (ConstTanBoard) aaanBoard[i][j], pci, &aecVarRedn[pci->fMove]) < 0) return -1; pci->fMove = !pci->fMove; if (!(iTurn & 1)) InvertEvaluationR(aaar[i][j], pci); /* Calculate arMean: the n-ply evaluation of the position */ for (k = 0; k < NUM_ROLLOUT_OUTPUTS; k++) arMean[k] += ((i == j) ? aaar[i][j][k] : (aaar[i][j][k] * 2.0f)); } if (prc->fInitial && !iTurn) /* no doubles ... */ for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) arMean[i] /= 30.0f; else for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) arMean[i] /= 36.0f; /* Find best move */ if (pecChequer[pci->fMove]->nPlies || prc->fCubeful != pecChequer[pci->fMove]->fCubeful || pecChequer[pci->fMove]->rNoise > 0.0f) /* the user requested n-ply (n>0). Another call to * FindBestMove is required */ FindBestMove(aanMoves[anDice[0] - 1][anDice[1] - 1], anDice[0], anDice[1], aanBoard[ici], pci, pecChequer[pci->fMove], (iTurn < nLateEvals) ? prc->aaamfChequer[pci->fMove] : prc->aaamfLate[pci->fMove]); else { /* 0-ply play: best move is already recorded */ memcpy(&aanBoard[ici][0][0], &aaanBoard[anDice[0] - 1][anDice[1] - 1][0][0], 2 * 25 * sizeof(int)); SwapSides(aanBoard[ici]); } /* Accumulate variance reduction terms */ if (pci->nMatchTo) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) aarVarRedn[ici][i] += arMean[i] - aaar[anDice[0] - 1][anDice[1] - 1][i]; else { for (i = 0; i <= OUTPUT_EQUITY; i++) aarVarRedn[ici][i] += arMean[i] - aaar[anDice[0] - 1][anDice[1] - 1][i]; r = arMean[OUTPUT_CUBEFUL_EQUITY] - aaar[anDice[0] - 1][anDice[1] - 1] [OUTPUT_CUBEFUL_EQUITY]; aarVarRedn[ici][OUTPUT_CUBEFUL_EQUITY] += r * (float) (pci->nCube / aci[ici].nCube); } } else { /* no variance reduction */ FindBestMove(aanMoves[anDice[0] - 1][anDice[1] - 1], anDice[0], anDice[1], aanBoard[ici], pci, pecChequer[pci->fMove], (iTurn < nLateEvals) ? prc->aaamfChequer[pci->fMove] : prc->aaamfLate[pci->fMove]); } if (logfp) { log_move(logfp, aanMoves[anDice[0] - 1][anDice[1] - 1], pci->fMove, anDice[0], anDice[1]); } /* Save hit statistics */ /* FIXME: record double hit, triple hits etc. ? */ if (aarsStatistics && !afHit[pci->fMove] && (aiBar[0] < aanBoard[ici][0][24])) { MT_SafeInc(&aarsStatistics[ici][pci->fMove].nOpponentHit); MT_SafeAdd(&aarsStatistics[ici][pci->fMove].rOpponentHitMove, iTurn); afHit[pci->fMove] = TRUE; } if (fInterrupt) return -1; /* Calculate number of wasted pips */ pc = ClassifyPosition((ConstTanBoard) aanBoard[ici], pci->bgv); if (aarsStatistics && pc <= CLASS_BEAROFF1 && pcBefore <= CLASS_BEAROFF1) { PipCount((ConstTanBoard) aanBoard[ici], anPips); nPipsAfter = anPips[1]; nPipsDice = anDice[0] + anDice[1]; if (anDice[0] == anDice[1]) nPipsDice *= 2; MT_SafeInc(&aarsStatistics[ici][pci->fMove].nBearoffMoves); MT_SafeAdd(&aarsStatistics[ici][pci->fMove].nBearoffPipsLost, nPipsDice - (nPipsBefore - nPipsAfter)); } /* Opponent closed out */ if (aarsStatistics && !afClosedOut[pci->fMove] && aanBoard[ici][0][24]) { /* opponent is on bar */ ClosedBoard(afClosedBoard, (ConstTanBoard) aanBoard[ici]); if (afClosedBoard[pci->fMove]) { MT_SafeInc(&aarsStatistics[ici][pci->fMove].nOpponentClosedOut); MT_SafeAdd(&aarsStatistics[ici][pci->fMove].rOpponentClosedOutMove, iTurn); afClosedOut[pci->fMove] = TRUE; } } /* check if game is over */ if (pc == CLASS_OVER) { if (GeneralEvaluationE(aarOutput[ici], (ConstTanBoard) aanBoard[ici], pci, pecCube[pci->fMove]) < 0) return -1; /* Since the game is over: cubeless equity = cubeful equity * (convert to mwc for match play) */ aarOutput[ici][OUTPUT_CUBEFUL_EQUITY] = (pci->nMatchTo) ? eq2mwc(aarOutput[ici][OUTPUT_EQUITY], pci) : aarOutput[ici][OUTPUT_EQUITY]; if (iTurn & 1) InvertEvaluationR(aarOutput[ici], pci); *pf = FALSE; cUnfinished--; /* update statistics */ if (aarsStatistics) switch (GameStatus((ConstTanBoard) aanBoard[ici], pci->bgv)) { case 1: MT_SafeInc(&aarsStatistics[ici][pci->fMove].acWin[LogCubeClamped(pci->nCube)]); break; case 2: MT_SafeInc(&aarsStatistics[ici][pci->fMove].acWinGammon[LogCubeClamped(pci->nCube)]); break; case 3: MT_SafeInc(&aarsStatistics[ici][pci->fMove].acWinBackgammon[LogCubeClamped(pci->nCube)]); break; } } /* Invert board and more */ SwapSides(aanBoard[ici]); SetCubeInfo(pci, pci->nCube, pci->fCubeOwner, !pci->fMove, pci->nMatchTo, pci->anScore, pci->fCrawford, pci->fJacoby, pci->fBeavers, pci->bgv); } } iTurn++; } /* loop truncate */ /* evaluation at truncation */ for (ici = 0, pci = pciLocal, pf = pfFinished; ici < cci; ici++, pci++, pf++) { if (*pf) { /* ensure cubeful evaluation at truncation */ memcpy(&ec, &prc->aecCubeTrunc, sizeof(ec)); ec.fCubeful = prc->fCubeful; /* evaluation at truncation */ if (GeneralEvaluationE(aarOutput[ici], (ConstTanBoard) aanBoard[ici], pci, &ec) < 0) return -1; if (iTurn & 1) InvertEvaluationR(aarOutput[ici], pci); } /* the final output is the sum of the resulting evaluation and * all variance reduction terms */ if (!pci->nMatchTo) aarOutput[ici][OUTPUT_CUBEFUL_EQUITY] *= (float) (pci->nCube / aci[ici].nCube); if (useVarRedn) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) aarOutput[ici][i] += aarVarRedn[ici][i]; /* multiply money equities */ if (!pci->nMatchTo) aarOutput[ici][OUTPUT_CUBEFUL_EQUITY] *= (float) (aci[ici].nCube / nBasisCube); /* if ( pci->nMatchTo ) */ /* aarOutput[ ici ][ OUTPUT_CUBEFUL_EQUITY ] = */ /* eq2mwc ( aarOutput[ ici ][ OUTPUT_CUBEFUL_EQUITY ], pci ); */ /* else */ /* aarOutput[ ici ][ OUTPUT_CUBEFUL_EQUITY ] *= */ /* pci->nCube / aci [ ici ].nCube; */ } return 0; } #if !defined(LOCKING_VERSION) /* called with a collection of moves or a cube decision to be rolled out. * when called with a cube decision, the number of alternatives is always 2 * (nodouble/double or take/drop). Otherwise the number of moves is * a parameter supplied (alternatives) * * anBoard - an array[alternatives] of explicit pointers to Boards - the * individual boards are not in and of themselves a contiguous set of * arrays and can't be treated as int x[alternative][2][25]. 2 copies * of the same board for cube decisions, 1 per move for move rollouts * asz an array of pointers to strings. These will be a contiguous array of * text labels for displaying results. 2 pointers for cube decisions, * 1 per move for move rollouts * aarOutput - an array[alternatives] of explicit pointers to arrays for the * results of the rollout. Again, these may not be contiguous. 2 arrays for * cube decisions, 1 per move for move rollouts * aarStdDev - as above for std's of rollout * aarsStatistics - array of statistics used when rolling out cube decisions, * not maintained when doing move rollouts * pprc - an array of explicit pointers to rollout contexts. There will be * 2 pointers to the same context for cube decisions, 1 per move for move * rollouts * aci - an array of explicit pointers cubeinfo's. 2 for cube decisions, one * per move for move rollouts * alternatives - a count of the number of things to be rolled out. 2 for * cube decisions, number of different moves for move rollouts * fInvert - flag if equities should be inverted (used when doing take/drop * decisions, we evaluate the double/nodouble and invert the equities * to get take/drop * fCubeRollout - set if this is a cube decision rollout. This is needed if * we use RolloutGeneral to rollout an arbitrary list of moves (where not * all the moves correspond to a given game state, so that some moves will * have been made with a different cube owner or value or even come from * different games and have different match scores. If this happens, * calls to mwc2eq and se_mwc2eq need to be passed a pointer to the current * cubeinfo structure. If we're rolling out a cube decision, we need to * pass the cubeinfo structure before the double is given. This won't be * available * * returns: * -1 on error or if no games were rolled out * no of games rolled out otherwise. aarOutput, aarStdDev aarsStatistic arrays * will contain results. * pprc rollout contexts will be updated with the number of games rolled out for * that position. */ static int comp_jsdinfo_equity(const void *a, const void *b) { const jsdinfo *aa = a; const jsdinfo *bb = b; if (aa->rEquity < bb->rEquity) return 1; else if (aa->rEquity > bb->rEquity) return -1; return 0; } static int comp_jsdinfo_order(const void *a, const void *b) { const jsdinfo *aa = a; const jsdinfo *bb = b; if (aa->nOrder < bb->nOrder) return -1; else if (aa->nOrder > bb->nOrder) return 1; return 0; } /* Lots of shared variables - should probably not be globals... */ static int cGames; static cubeinfo *aciLocal; static int show_jsds; static float (*aarMu)[NUM_ROLLOUT_OUTPUTS]; static float (*aarSigma)[NUM_ROLLOUT_OUTPUTS]; static float (*aarResult)[NUM_ROLLOUT_OUTPUTS]; static float (*aarVariance)[NUM_ROLLOUT_OUTPUTS]; static int *fNoMore; static jsdinfo *ajiJSD; static int ro_alternatives = -1; static evalsetup **ro_apes; static ConstTanBoard *ro_apBoard; static const cubeinfo **ro_apci; static int **ro_apCubeDecTop; static rolloutstat(*ro_aarsStatistics)[2]; static int ro_fCubeRollout; static int ro_fInvert; static int ro_NextTrial; static unsigned int *altGameCount; static int *altTrialCount; static void check_jsds(int *active) { int alt; float v, s, denominator; for (alt = 0; alt < ro_alternatives; ++alt) { /* 1) For each move, calculate the cubeful (or cubeless if that's what we're doing) * equity */ rolloutcontext *prc = &ro_apes[alt]->rc; if (prc->fCubeful) { v = aarMu[alt][OUTPUT_CUBEFUL_EQUITY]; s = aarSigma[alt][OUTPUT_CUBEFUL_EQUITY]; /* if we're doing a cube rollout, we need aciLocal[0] for generating the * equity. If we're doing moves, we use the cubeinfo that goes with this move. */ if (ms.nMatchTo && !fOutputMWC) { v = mwc2eq(v, &aciLocal[(ro_fCubeRollout ? 0 : alt)]); s = se_mwc2eq(s, &aciLocal[(ro_fCubeRollout ? 0 : alt)]); } } else { v = aarMu[alt][OUTPUT_EQUITY]; s = aarSigma[alt][OUTPUT_EQUITY]; if (ms.nMatchTo && fOutputMWC) { v = eq2mwc(v, &aciLocal[(ro_fCubeRollout ? 0 : alt)]); s = se_eq2mwc(s, &aciLocal[(ro_fCubeRollout ? 0 : alt)]); } } ajiJSD[alt].rEquity = v; ajiJSD[alt].rJSD = s; } if (!ro_fCubeRollout) { /* 2 sort the list in order of decreasing equity (best move first) */ qsort((void *) ajiJSD, ro_alternatives, sizeof(jsdinfo), comp_jsdinfo_equity); /* 3 replace the equities with the equity difference from the best move (ajiJSD[0]), the JSDs * with the number of JSDs the equity difference represents and decide if we should either stop * or resume rolling a move out */ v = ajiJSD[0].rEquity; s = ajiJSD[0].rJSD; s *= s; for (alt = ro_alternatives - 1; alt > 0; --alt) { ajiJSD[alt].nRank = alt; ajiJSD[alt].rEquity = v - ajiJSD[alt].rEquity; denominator = sqrtf(s + ajiJSD[alt].rJSD * ajiJSD[alt].rJSD); if (denominator < 1e-8f) denominator = 1e-8f; ajiJSD[alt].rJSD = ajiJSD[alt].rEquity / denominator; if ((rcRollout.fStopOnJsd) && (altGameCount[ajiJSD[alt].nOrder] >= (rcRollout.nMinimumJsdGames))) { if (ajiJSD[alt].rJSD > rcRollout.rJsdLimit) { /* This move is no longer worth rolling out */ fNoMore[ajiJSD[alt].nOrder] = 1; ro_apes[alt]->rc.rStoppedOnJSD = ajiJSD[alt].rJSD; (*active)--; } else { /* this move needs to roll out further. It may need to be caught up * with other moves, because it's been stopped for a few trials */ if (fNoMore[ajiJSD[alt].nOrder]) { /* it was stopped, catch it up to the other moves and resume * rolling it out. While we're catching up, we don't want to do * these calculations any more so we'll change the minimum * games to do */ fNoMore[ajiJSD[alt].nOrder] = 0; (*active)++; } } } } /* fill out details of best move */ ajiJSD[0].rEquity = ajiJSD[0].rJSD = 0.0f; ajiJSD[0].nRank = 0; /* rearrange ajiJSD in move order rather than equity order */ qsort((void *) ajiJSD, ro_alternatives, sizeof(jsdinfo), comp_jsdinfo_order); } else { float eq_dp = fOutputMWC ? eq2mwc(1.0, &aciLocal[0]) : 1.0f; float eq_dt = ajiJSD[1].rEquity; if (eq_dp < eq_dt) { /* compare nd to dp */ ajiJSD[0].rEquity = ajiJSD[0].rEquity - eq_dp; denominator = ajiJSD[0].rJSD; if (denominator < 1e-8f) denominator = 1e-8f; ajiJSD[0].rJSD = fabsf(ajiJSD[0].rEquity / denominator); } else { /* compare nd to dt */ ajiJSD[0].rEquity = ajiJSD[0].rEquity - ajiJSD[1].rEquity; denominator = sqrtf(ajiJSD[0].rJSD * ajiJSD[0].rJSD + ajiJSD[1].rJSD * ajiJSD[1].rJSD); if (denominator < 1e-8f) denominator = 1e-8f; ajiJSD[0].rJSD = fabsf(ajiJSD[0].rEquity / denominator); } /* compare dt to dp */ ajiJSD[1].rEquity = ajiJSD[1].rEquity - eq_dp; denominator = ajiJSD[1].rJSD; if (denominator < 1e-8f) denominator = 1e-8f; ajiJSD[1].rJSD = fabsf(ajiJSD[1].rEquity / denominator); if (rcRollout.fStopOnJsd && (altGameCount[0] >= (rcRollout.nMinimumJsdGames)) && rcRollout.rJsdLimit < MIN(ajiJSD[0].rJSD, ajiJSD[1].rJSD)) { ro_apes[0]->rc.rStoppedOnJSD = ajiJSD[0].rJSD; ro_apes[1]->rc.rStoppedOnJSD = ajiJSD[1].rJSD; fNoMore[0] = 1; fNoMore[1] = 1; *active = 0; } } } static void check_sds(int *active) { int alt; for (alt = 0; alt < ro_alternatives; ++alt) { float s; int ioutput; int err_too_big = 0; rolloutcontext *prc; if (fNoMore[alt] || altGameCount[alt] < (rcRollout.nMinimumGames)) continue; prc = &ro_apes[alt]->rc; for (ioutput = OUTPUT_EQUITY; ioutput < NUM_ROLLOUT_OUTPUTS; ioutput++) { if (ioutput == OUTPUT_EQUITY) { /* cubeless */ if (!ms.nMatchTo) { /* money game */ s = fabsf(aarSigma[alt][ioutput]); if (ro_fCubeRollout) { s *= (float) (aciLocal[alt].nCube / aciLocal[0].nCube); } } else { /* match play */ s = fabsf(se_mwc2eq(se_eq2mwc(aarSigma[alt][ioutput], &aciLocal[alt]), &aciLocal[(ro_fCubeRollout ? 0 : alt)])); } } else { if (!prc->fCubeful) continue; /* cubeful */ if (!ms.nMatchTo) { /* money game */ s = fabsf(aarSigma[alt][ioutput]); } else { s = fabsf(se_mwc2eq(aarSigma[alt][ioutput], &aciLocal[(ro_fCubeRollout ? 0 : alt)])); } } if (rcRollout.rStdLimit < s) { err_too_big = 1; break; } } /* for (ioutput = OUTPUT_EQUITY; ioutput < NUM_ROLLOUT_OUTPUTS; ioutput++) */ if (!err_too_big) { fNoMore[alt] = 1; (*active)--; } } /* alt = 0; alt < ro_alternatives; ++alt) */ if (ro_fCubeRollout && (!fNoMore[0] || !fNoMore[1])) { /* cube rollouts should run the same number * of trials for nd and dt */ fNoMore[0] = fNoMore[1] = 0; *active = 2; } } extern void RolloutLoopMT(void *UNUSED(unused)) { TanBoard anBoardEval; float aar[NUM_ROLLOUT_OUTPUTS]; int active_alternatives; unsigned int j; int alt; FILE *logfp = NULL; rolloutcontext *prc = NULL; /* Each thread gets a copy of the rngctxRollout */ rngcontext *rngctxMTRollout = CopyRNGContext(rngctxRollout); perArray dicePerms; dicePerms.nPermutationSeed = -1; /* ============ begin rollout loop ============= */ while (MT_SafeIncValue(&ro_NextTrial) <= cGames) { active_alternatives = ro_alternatives; for (alt = 0; alt < ro_alternatives; ++alt) { int trial = MT_SafeIncValue(&altTrialCount[alt]) - 1; /* skip this one if it's already finished */ if (fNoMore[alt] || (trial > cGames)) { MT_SafeDec(&altTrialCount[alt]); continue; } prc = &ro_apes[alt]->rc; /* get the dice generator set up... */ if (prc->fRotate) QuasiRandomSeed(&dicePerms, (int) prc->nSeed); MT_SafeSet(&nSkip, 0); /* not multi-thread safe do quasi random dice for initial positions */ /* ... and the RNG */ if (prc->rngRollout != RNG_MANUAL) InitRNGSeed((unsigned int) (prc->nSeed + (trial << 8)), prc->rngRollout, rngctxMTRollout); memcpy(&anBoardEval, ro_apBoard[alt], sizeof(anBoardEval)); /* roll something out */ if (log_rollouts && log_file_name) { char *log_name = g_strdup_printf("%s-%7.7d-%c.sgf", log_file_name, trial, alt + 'a'); logfp = log_game_start(log_name, ro_apci[alt], prc->fCubeful, anBoardEval); g_free(log_name); } BasicCubefulRollout(&anBoardEval, &aar, 0, trial, ro_apci[alt], ro_apCubeDecTop[alt], 1, prc, ro_aarsStatistics ? ro_aarsStatistics + alt : NULL, aciLocal[ro_fCubeRollout ? 0 : alt].nCube, &dicePerms, rngctxMTRollout, logfp); if (logfp) { log_game_over(logfp); } if (fInterrupt) break; multi_debug("exclusive lock: update result for alternative"); MT_Exclusive(); altGameCount[alt]++; if (ro_fInvert) InvertEvaluationR(aar, ro_apci[alt]); /* apply the results */ for (j = 0; j < NUM_ROLLOUT_OUTPUTS; j++) { float rMuNew; aarResult[alt][j] += aar[j]; rMuNew = aarResult[alt][j] / (float) altGameCount[alt]; if (altGameCount[alt] > 1) { /* for i == 0 aarVariance is not defined */ float rDelta = rMuNew - aarMu[alt][j]; aarVariance[alt][j] = aarVariance[alt][j] * (1.0f - 1.0f / (float) (altGameCount[alt] - 1)) + (float) (altGameCount[alt]) * rDelta * rDelta; } aarMu[alt][j] = rMuNew; if (j < OUTPUT_EQUITY) { if (aarMu[alt][j] < 0.0f) aarMu[alt][j] = 0.0f; else if (aarMu[alt][j] > 1.0f) aarMu[alt][j] = 1.0f; } aarSigma[alt][j] = sqrtf(aarVariance[alt][j] / (float) altGameCount[alt]); } /* for (j = 0; j < NUM_ROLLOUT_OUTPUTS; j++ ) */ /* For normal alternatives nGamesDone and altGameCount will be equal. For cube decisions, * however, the two may differ by the number of threads minus 1. So we cheat a little bit, but * it would be better if the double and nodouble alternatives weren't linked */ if (prc->nGamesDone < altGameCount[alt]) prc->nGamesDone = altGameCount[alt]; MT_Release(); multi_debug("exclusive release: update result for alternative"); } /* for (alt = 0; alt < ro_alternatives; ++alt) */ if (fInterrupt) break; /* we've rolled everything out for this trial, check stopping conditions */ /* Stop rolling out moves whose Equity is more than a user selected multiple of the joint standard * deviation of the equity difference with the best move in the list. */ #if !defined(USE_MULTITHREAD) ProcessEvents(); #endif multi_debug("exclusive lock: rollout cycle update"); MT_Exclusive(); if (show_jsds) { check_jsds(&active_alternatives); } if (rcRollout.fStopOnSTD) { check_sds(&active_alternatives); } if ((active_alternatives < 2 && rcRollout.fStopOnJsd) || active_alternatives < 1) { multi_debug("exclusive release: rollout done early"); MT_Release(); break; } multi_debug("exclusive release: rollout cycle update"); MT_Release(); } g_free(rngctxMTRollout); } static rolloutprogressfunc *ro_pfProgress; static void *ro_pUserData; static gboolean UpdateProgress(gpointer UNUSED(unused)) { if (fShowProgress && ro_alternatives > 0) { int alt; multi_debug("exclusive lock: update progress"); MT_Exclusive(); for (alt = 0; alt < ro_alternatives; ++alt) { rolloutcontext *prc = &ro_apes[alt]->rc; (*ro_pfProgress) (aarMu, aarSigma, prc, aciLocal, initial_game_count, altGameCount[alt] - 1, alt, ajiJSD[alt].nRank + 1, ajiJSD[alt].rJSD, fNoMore[alt], show_jsds, ro_fCubeRollout, ro_pUserData); } MT_Release(); multi_debug("exclusive release: update progress"); } return TRUE; } extern int RolloutGeneral(ConstTanBoard * apBoard, float (*apOutput[])[NUM_ROLLOUT_OUTPUTS], float (*apStdDev[])[NUM_ROLLOUT_OUTPUTS], rolloutstat aarsStatistics[][2], evalsetup(*apes[]), const cubeinfo(*apci[]), int (*apCubeDecTop[]), int alternatives, int fInvert, int fCubeRollout, rolloutprogressfunc * pfProgress, void *pUserData) { unsigned int j; int alt; unsigned int i; int nFirstTrial; unsigned int trialsDone; rolloutcontext *prc = NULL, rcRolloutSave; evalsetup *pes; int nIsCubeless = 0; int nIsCubeful = 0; int fOutputMWCSave = fOutputMWC; int active_alternatives; int previous_rollouts = 0; show_jsds = 1; if (alternatives < 1) { errno = EINVAL; return -1; } ajiJSD = g_alloca(alternatives * sizeof(jsdinfo)); fNoMore = g_alloca(alternatives * sizeof(int)); aciLocal = g_alloca(alternatives * sizeof(cubeinfo)); altGameCount = g_alloca(alternatives * sizeof(int)); altTrialCount = g_alloca(alternatives * sizeof(int)); aarMu = g_alloca(alternatives * NUM_ROLLOUT_OUTPUTS * sizeof(float)); aarSigma = g_alloca(alternatives * NUM_ROLLOUT_OUTPUTS * sizeof(float)); aarResult = g_alloca(alternatives * NUM_ROLLOUT_OUTPUTS * sizeof(float)); aarVariance = g_alloca(alternatives * NUM_ROLLOUT_OUTPUTS * sizeof(float)); if (ms.nMatchTo == 0) fOutputMWC = 0; memcpy(&rcRolloutSave, &rcRollout, sizeof(rcRollout)); if (alternatives == 1) { rcRollout.fStopOnJsd = 0; } /* make sure cube decisions are rolled out cubeful */ if (fCubeRollout) { rcRollout.fCubeful = rcRollout.aecCubeTrunc.fCubeful = rcRollout.aecChequerTrunc.fCubeful = 1; for (i = 0; i < 2; ++i) rcRollout.aecCube[i].fCubeful = rcRollout.aecChequer[i].fCubeful = rcRollout.aecCubeLate[i].fCubeful = rcRollout.aecChequerLate[i].fCubeful = 1; } /* quasi random dice may not be thread safe when we need to skip * some rolls for initial positions */ if (rcRollout.fInitial) rcRollout.fRotate = FALSE; /* nFirstTrial will be the smallest number of trials done for an alternative */ nFirstTrial = cGames = rcRollout.nTrials; initial_game_count = 0; for (alt = 0; alt < alternatives; ++alt) { pes = apes[alt]; prc = &pes->rc; /* fill out the JSD stuff */ ajiJSD[alt].rEquity = ajiJSD[alt].rJSD = 0.0f; ajiJSD[alt].nRank = 0; ajiJSD[alt].nOrder = alt; /* save input cubeinfo */ memcpy(&aciLocal[alt], apci[alt], sizeof(cubeinfo)); /* Invert cubeinfo */ if (fInvert) aciLocal[alt].fMove = !aciLocal[alt].fMove; if ((pes->et != EVAL_ROLLOUT) || (prc->nGamesDone == 0)) { /* later the saved context may to be stored with the move, so cubeful/cubeless must be made * consistent */ rcRolloutSave.fCubeful = rcRolloutSave.aecCubeTrunc.fCubeful = rcRolloutSave.aecChequerTrunc.fCubeful = (fCubeRollout || rcRolloutSave.fCubeful); for (i = 0; i < 2; ++i) rcRolloutSave.aecCube[i].fCubeful = rcRolloutSave.aecChequer[i].fCubeful = rcRolloutSave.aecCubeLate[i].fCubeful = rcRolloutSave.aecChequerLate[i].fCubeful = (fCubeRollout || rcRolloutSave.fCubeful); memcpy(prc, &rcRollout, sizeof(rolloutcontext)); prc->nGamesDone = 0; prc->nSkip = 0; nFirstTrial = 0; altTrialCount[alt] = altGameCount[alt] = 0; if (aarsStatistics) { initRolloutstat(&aarsStatistics[alt][0]); initRolloutstat(&aarsStatistics[alt][1]); } /* initialise internal variables */ for (j = 0; j < NUM_ROLLOUT_OUTPUTS; ++j) { aarResult[alt][j] = aarVariance[alt][j] = aarMu[alt][j] = aarSigma[alt][j] = 0.0f; } } else { int nGames = prc->nGamesDone; previous_rollouts++; /* make sure the saved rollout contexts are consistent for cubeful/not cubeful */ prc->fCubeful = prc->aecCubeTrunc.fCubeful = prc->aecChequerTrunc.fCubeful = (prc->fCubeful || fCubeRollout); for (i = 0; i < 2; ++i) prc->aecCube[i].fCubeful = prc->aecChequer[i].fCubeful = prc->aecCubeLate[i].fCubeful = prc->aecChequerLate[i].fCubeful = (prc->fCubeful || fCubeRollout); altTrialCount[alt] = altGameCount[alt] = nGames; initial_game_count += nGames; if (nGames < nFirstTrial) nFirstTrial = nGames; /* restore internal variables from input values */ for (j = 0; j < NUM_ROLLOUT_OUTPUTS; ++j) { float r; r = aarMu[alt][j] = (*apOutput[alt])[j]; aarResult[alt][j] = r * (float) nGames; r = aarSigma[alt][j] = (*apStdDev[alt])[j]; aarVariance[alt][j] = r * r * (float) nGames; } } /* force all moves/cube decisions to be considered and reset the upper bound on trials */ fNoMore[alt] = 0; prc->nTrials = cGames; pes->et = EVAL_ROLLOUT; if (prc->fCubeful) ++nIsCubeful; else ++nIsCubeless; /* we can't do JSD tricks on initial positions */ if (prc->fInitial) { rcRollout.fStopOnJsd = 0; show_jsds = 0; } } /* we can't do JSD tricks if some rollouts are cubeful and some not */ if (nIsCubeful && nIsCubeless) rcRollout.fStopOnJsd = 0; /* if we're using stop on JSD, turn off stop on STD error */ if (rcRollout.fStopOnJsd) rcRollout.fStopOnSTD = 0; /* Put parameters in global variables - urgh, would be better in task variable really... */ ro_alternatives = alternatives; ro_apes = apes; ro_apBoard = apBoard; ro_apci = apci; ro_apCubeDecTop = apCubeDecTop; ro_aarsStatistics = aarsStatistics; ro_fCubeRollout = fCubeRollout; ro_fInvert = fInvert; ro_NextTrial = nFirstTrial; ro_pfProgress = pfProgress; ro_pUserData = pUserData; active_alternatives = ro_alternatives; /* check if rollout alternatives are done, but only when extending * all candidates */ if (previous_rollouts == active_alternatives) { if (show_jsds) { check_jsds(&active_alternatives); } if (rcRollout.fStopOnSTD) { check_sds(&active_alternatives); } } UpdateProgress(NULL); if (active_alternatives > 1 || (!rcRollout.fStopOnJsd && active_alternatives > 0)) { multi_debug("rollout adding tasks"); mt_add_tasks(MT_GetNumThreads(), RolloutLoopMT, NULL, NULL); multi_debug("rollout waiting for tasks to complete"); MT_WaitForTasks(UpdateProgress, 2000, fAutoSaveRollout); multi_debug("rollout finished waiting for tasks to complete"); } /* Make sure final output is up to date */ #if defined(USE_GTK) if (!fX) #endif if (!fInterrupt) outputf(_("\nRollout done. Printing final results.\n")); if (!fInterrupt) UpdateProgress(NULL); /* Signal to UpdateProgress() called from pending events that no * more progress should be displayed. */ ro_alternatives = -1; for (alt = 0, trialsDone = 0; alt < alternatives; ++alt) { if (apes[alt]->rc.nGamesDone > trialsDone) trialsDone = apes[alt]->rc.nGamesDone; } memcpy(&rcRollout, &rcRolloutSave, sizeof(rcRollout)); fOutputMWC = fOutputMWCSave; /* return -1 if no games rolled out */ if (trialsDone == 0) return -1; /* store results */ for (alt = 0; alt < alternatives; alt++) { if (apOutput[alt]) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) (*apOutput[alt])[i] = aarMu[alt][i]; if (apStdDev[alt]) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) (*apStdDev[alt])[i] = aarSigma[alt][i]; } if (fShowProgress && !fInterrupt #if defined(USE_GTK) && !fX #endif ) { for (i = 0; i < 79; i++) outputc(' '); outputc('\r'); fflush(stdout); } return trialsDone; } /* * General evaluation functions. */ extern int GeneralEvaluation(float arOutput[NUM_ROLLOUT_OUTPUTS], float arStdDev[NUM_ROLLOUT_OUTPUTS], rolloutstat arsStatistics[2], TanBoard anBoard, cubeinfo * const pci, const evalsetup * pes, rolloutprogressfunc * pf, void *p) { int i; switch (pes->et) { case EVAL_EVAL: for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) arStdDev[i] = 0.0f; return GeneralEvaluationE(arOutput, (ConstTanBoard) anBoard, pci, &pes->ec); case EVAL_ROLLOUT: return GeneralEvaluationR(arOutput, arStdDev, arsStatistics, (ConstTanBoard) anBoard, pci, &pes->rc, pf, p); case EVAL_NONE: for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) arOutput[i] = arStdDev[i] = 0.0f; break; } return 0; } extern int GeneralEvaluationR(float arOutput[NUM_ROLLOUT_OUTPUTS], float arStdDev[NUM_ROLLOUT_OUTPUTS], rolloutstat arsStatistics[2], const TanBoard anBoard, const cubeinfo * pci, const rolloutcontext * prc, rolloutprogressfunc * pf, void *p) { ConstTanBoard apBoard[1]; float (*apOutput[1])[NUM_ROLLOUT_OUTPUTS]; float (*apStdDev[1])[NUM_ROLLOUT_OUTPUTS]; evalsetup es; evalsetup(*apes[1]); const cubeinfo(*apci[1]); int cubedectop = 0; int (*apCubeDecTop[1]); apBoard[0] = anBoard; apOutput[0] = (float (*)[NUM_ROLLOUT_OUTPUTS]) arOutput; apStdDev[0] = (float (*)[NUM_ROLLOUT_OUTPUTS]) arStdDev; apes[0] = &es; apci[0] = pci; apCubeDecTop[0] = &cubedectop; es.et = EVAL_NONE; memcpy(&es.rc, prc, sizeof(rolloutcontext)); if (RolloutGeneral(apBoard, apOutput, apStdDev, (rolloutstat(*)[2]) arsStatistics, apes, apci, apCubeDecTop, 1, FALSE, FALSE, pf, p) < 0) return -1; return 0; } extern int GeneralCubeDecision(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], rolloutstat aarsStatistics[2][2], const TanBoard anBoard, cubeinfo * pci, evalsetup * pes, rolloutprogressfunc * pf, void *p) { int i, j; switch (pes->et) { case EVAL_EVAL: for (j = 0; j < 2; j++) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) aarStdDev[j][i] = 0.0f; return GeneralCubeDecisionE(aarOutput, anBoard, pci, &pes->ec, pes); case EVAL_ROLLOUT: return GeneralCubeDecisionR(aarOutput, aarStdDev, aarsStatistics, anBoard, pci, &pes->rc, pes, pf, p); case EVAL_NONE: for (j = 0; j < 2; j++) for (i = 0; i < NUM_ROLLOUT_OUTPUTS; i++) aarStdDev[j][i] = 0.0f; break; } return 0; } extern int GeneralCubeDecisionR(float aarOutput[2][NUM_ROLLOUT_OUTPUTS], float aarStdDev[2][NUM_ROLLOUT_OUTPUTS], rolloutstat aarsStatistics[2][2], const TanBoard anBoard, cubeinfo * pci, rolloutcontext * prc, evalsetup * pes, rolloutprogressfunc * pf, void *p) { evalsetup esLocal; evalsetup(*apes[2]); cubeinfo aci[2]; const cubeinfo(*apci[2]); int nTrials; int afCubeDecTop[] = { FALSE, FALSE }; /* no cube decision in * iTurn = 0 */ ConstTanBoard apBoard[2]; float (*apOutput[2])[NUM_ROLLOUT_OUTPUTS]; float (*apStdDev[2])[NUM_ROLLOUT_OUTPUTS]; int (*apCubeDecTop[2]); apCubeDecTop[0] = afCubeDecTop; apCubeDecTop[1] = afCubeDecTop; apStdDev[0] = (float (*)[NUM_ROLLOUT_OUTPUTS]) aarStdDev[0]; apStdDev[1] = (float (*)[NUM_ROLLOUT_OUTPUTS]) aarStdDev[1]; apci[0] = &aci[0]; apci[1] = &aci[1]; apBoard[0] = apBoard[1] = anBoard; apOutput[0] = (float (*)[NUM_ROLLOUT_OUTPUTS]) aarOutput; apOutput[1] = (float (*)[NUM_ROLLOUT_OUTPUTS]) aarOutput + 1; if (pes == 0) { /* force rollout from sratch */ pes = &esLocal; memcpy(&pes->rc, &rcRollout, sizeof(rcRollout)); pes->et = EVAL_NONE; pes->rc.nGamesDone = 0; } apes[0] = apes[1] = pes; SetCubeInfo(&aci[0], pci->nCube, pci->fCubeOwner, pci->fMove, pci->nMatchTo, pci->anScore, pci->fCrawford, pci->fJacoby, pci->fBeavers, pci->bgv); SetCubeInfo(&aci[1], 2 * pci->nCube, !pci->fMove, pci->fMove, pci->nMatchTo, pci->anScore, pci->fCrawford, pci->fJacoby, pci->fBeavers, pci->bgv); if (!GetDPEq(NULL, NULL, &aci[0])) { outputl(_("Cube not available!")); return -1; } if (!prc->fCubeful) { outputl(_("Setting cubeful on")); prc->fCubeful = TRUE; } if ((nTrials = RolloutGeneral(apBoard, apOutput, apStdDev, aarsStatistics, apes, apci, apCubeDecTop, 2, FALSE, TRUE, pf, p)) <= 0) return -1; pes->rc.nGamesDone = nTrials; pes->rc.nSkip = MT_SafeGet(&nSkip); return 0; } /* * Initialise rollout stat with zeroes. * * Input: * - prs: rollout stat to initialize * * Output: * None. * * Returns: * void. * */ static void initRolloutstat(rolloutstat * prs) { memset(prs, 0, sizeof(rolloutstat)); } /* * Calculate whether we should resign or not * * Input: * anBoard - current board * pci - current cube info * pesResign - evaluation parameters * * Output: * arResign - evaluation * * Returns: * -1 on error * 0 if we should not resign * 1,2, or 3 if we should resign normal, gammon, or backgammon, * respectively. * */ extern int getResignation(float arResign[NUM_ROLLOUT_OUTPUTS], TanBoard anBoard, cubeinfo * const pci, const evalsetup * pesResign) { float arStdDev[NUM_ROLLOUT_OUTPUTS]; rolloutstat arsStatistics[2]; float ar[NUM_OUTPUTS] = { 0.0, 0.0, 0.0, 1.0, 1.0 }; float rPlay; /* Evaluate current position */ if (GeneralEvaluation(arResign, arStdDev, arsStatistics, anBoard, pci, pesResign, NULL, NULL) < 0) return -1; /* check if we want to resign */ rPlay = Utility(arResign, pci); if (arResign[OUTPUT_LOSEBACKGAMMON] > 0.0f && Utility(ar, pci) == rPlay) /* resign backgammon */ return (!pci->nMatchTo && pci->fJacoby && pci->fCubeOwner == -1) ? 1 : 3; else { /* worth trying to escape the backgammon */ ar[OUTPUT_LOSEBACKGAMMON] = 0.0f; if (arResign[OUTPUT_LOSEGAMMON] > 0.0f && Utility(ar, pci) == rPlay) /* resign gammon */ return (!pci->nMatchTo && pci->fJacoby && pci->fCubeOwner == -1) ? 1 : 2; else { /* worth trying to escape gammon */ ar[OUTPUT_LOSEGAMMON] = 0.0f; return Utility(ar, pci) == rPlay; } } } extern void getResignEquities(float arResign[NUM_ROLLOUT_OUTPUTS], cubeinfo * pci, int nResigned, float *prBefore, float *prAfter) { float ar[NUM_OUTPUTS] = { 0, 0, 0, 0, 0 }; *prBefore = Utility(arResign, pci); if (nResigned > 1) ar[OUTPUT_LOSEGAMMON] = 1.0f; if (nResigned > 2) ar[OUTPUT_LOSEBACKGAMMON] = 1.0f; *prAfter = Utility(ar, pci); } extern int ScoreMoveRollout(move ** ppm, cubeinfo ** ppci, int cMoves, rolloutprogressfunc * pfRolloutProgress, void * pUserData) { int fCubeDecTop = TRUE; int i; int nGamesDone; TanBoard *anBoard = g_alloca(cMoves * 2 * 25 * sizeof(int)); ConstTanBoard *apBoard = g_alloca(cMoves * sizeof(int *)); float (**apOutput)[NUM_ROLLOUT_OUTPUTS] = g_alloca(cMoves * NUM_ROLLOUT_OUTPUTS * sizeof(float)); float (**apStdDev)[NUM_ROLLOUT_OUTPUTS] = g_alloca(cMoves * NUM_ROLLOUT_OUTPUTS * sizeof(float)); evalsetup(**apes) = g_alloca(cMoves * sizeof(evalsetup *)); const cubeinfo(**apci) = g_alloca(cMoves * sizeof(cubeinfo *)); cubeinfo(*aci) = g_alloca(cMoves * sizeof(cubeinfo)); int (**apCubeDecTop) = g_alloca(cMoves * sizeof(int *)); /* initialise the arrays we'll need */ for (i = 0; i < cMoves; ++i) { apBoard[i] = (ConstTanBoard) (anBoard + i); apOutput[i] = &ppm[i]->arEvalMove; apStdDev[i] = &ppm[i]->arEvalStdDev; apes[i] = &ppm[i]->esMove; apci[i] = aci + i; memcpy(aci + i, ppci[i], sizeof(cubeinfo)); apCubeDecTop[i] = &fCubeDecTop; PositionFromKey(anBoard[i], &ppm[i]->key); SwapSides(anBoard[i]); /* swap fMove in cubeinfo */ aci[i].fMove = !aci[i].fMove; } nGamesDone = RolloutGeneral(apBoard, apOutput, apStdDev, NULL, apes, apci, apCubeDecTop, cMoves, TRUE, FALSE, pfRolloutProgress, pUserData); /* put fMove back again */ for (i = 0; i < cMoves; ++i) { aci[i].fMove = !aci[i].fMove; } if (nGamesDone < 0) return -1; for (i = 0; i < cMoves; ++i) { const cubeinfo *pci; rolloutcontext *prc; /* Score for move: * rScore is the primary score (cubeful/cubeless) * rScore2 is the secondary score (cubeless) */ prc = &apes[i]->rc; pci = apci[i]; if (prc->fCubeful) { if (pci->nMatchTo) ppm[i]->rScore = mwc2eq(ppm[i]->arEvalMove[OUTPUT_CUBEFUL_EQUITY], pci); else ppm[i]->rScore = ppm[i]->arEvalMove[OUTPUT_CUBEFUL_EQUITY]; } else ppm[i]->rScore = ppm[i]->arEvalMove[OUTPUT_EQUITY]; ppm[i]->rScore2 = ppm[i]->arEvalMove[OUTPUT_EQUITY]; } return 0; } extern void InvertStdDev(float ar[NUM_ROLLOUT_OUTPUTS]) { float r; r = ar[OUTPUT_WINGAMMON]; ar[OUTPUT_WINGAMMON] = ar[OUTPUT_LOSEGAMMON]; ar[OUTPUT_LOSEGAMMON] = r; r = ar[OUTPUT_WINBACKGAMMON]; ar[OUTPUT_WINBACKGAMMON] = ar[OUTPUT_LOSEBACKGAMMON]; ar[OUTPUT_LOSEBACKGAMMON] = r; } #endif gnubg-1.08.003/install-sh000755 001751 000024 00000035776 14600637122 014647 0ustar00pmstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gnubg-1.08.003/gtkrace.c000644 001751 000024 00000034767 14574155047 014441 0ustar00pmstaff000000 000000 /* * Copyright (C) 2002-2003 Joern Thyssen * Copyright (C) 2003-2022 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * $Id: gtkrace.c,v 1.52 2022/09/03 21:12:09 plm Exp $ */ #include "config.h" #include #include #include #include #include #include "backgammon.h" #include "gtkrace.h" #include "osr.h" #include "format.h" #include "gtkwindows.h" typedef struct { GtkWidget *apwEPC[2]; GtkWidget *apwWastage[2]; } epcwidget; typedef struct { GtkAdjustment *padjTrials; GtkWidget *pwRollout, *pwOutput; TanBoard anBoard; epcwidget epcwOSR; int fMove; } racewidget; static gint current_page_num = 0; static GtkWidget * monospace_text(const char *szOutput) { GtkWidget *pwText; GtkTextBuffer *buffer; GtkTextIter iter; pwText = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(pwText), GTK_WRAP_NONE); buffer = gtk_text_buffer_new(NULL); gtk_text_buffer_create_tag(buffer, "monospace", "family", "monospace", NULL); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, szOutput, -1, "monospace", NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW(pwText), buffer); return pwText; } static GtkWidget * KleinmanPage(TanBoard anBoard, const int UNUSED(fMove)) { char sz[500]; show_kleinman(anBoard, sz); return monospace_text(sz); } static GtkWidget * TwoSidedPage(TanBoard anBoard, const int UNUSED(fMove)) { char sz[500]; show_bearoff(anBoard, sz); return monospace_text(sz); } static GtkWidget * KeithPage(TanBoard anBoard, const int UNUSED(fMove)) { char sz[500]; show_keith(anBoard, sz); return monospace_text(sz); } static GtkWidget * IsightPage(TanBoard anBoard, const int UNUSED(fMove)) { char sz[500]; show_isight(anBoard, sz); return monospace_text(sz); } static GtkWidget * Pip8912Page(TanBoard anBoard, const int UNUSED(fMove)) { char sz[500]; show_8912(anBoard, sz); return monospace_text(sz); } static GtkWidget * ThorpPage(TanBoard anBoard, const int UNUSED(fMove)) { char sz[500]; show_thorp(anBoard, sz); return monospace_text(sz); } static GtkWidget * EffectivePipCount(const float arPips[2], const float arWastage[2], const int fInvert, epcwidget * pepcw) { #if GTK_CHECK_VERSION(3,0,0) GtkWidget *pwGrid = gtk_grid_new(); #else GtkWidget *pwTable = gtk_table_new(3, 4, FALSE); #endif GtkWidget *pwvbox; GtkWidget *pw; GtkWidget *pwFrame; unsigned int i; pwFrame = gtk_frame_new(_("Effective pip count")); #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else pwvbox = gtk_vbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(pwFrame), pwvbox); gtk_container_set_border_width(GTK_CONTAINER(pwvbox), 4); /* table */ #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwvbox), pwGrid, FALSE, FALSE, 4); gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(_("EPC")), 1, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(_("Wastage")), 2, 0, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_box_pack_start(GTK_BOX(pwvbox), pwTable, FALSE, FALSE, 4); gtk_table_attach(GTK_TABLE(pwTable), gtk_label_new(_("EPC")), 1, 2, 0, 1, 0, 0, 4, 4); gtk_table_attach(GTK_TABLE(pwTable), gtk_label_new(_("Wastage")), 2, 3, 0, 1, 0, 0, 4, 4); #endif for (i = 0; i < 2; ++i) { gchar *sz = g_strdup_printf(_("Player %s"), ap[i].szName); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(sz), 0, i + 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); gtk_widget_set_halign(pw, GTK_ALIGN_START); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(sz), 0, 1, i + 1, i + 2, 0, 0, 4, 4); gtk_misc_set_alignment(GTK_MISC(pw), 0, 0.5); #endif g_free(sz); sz = g_strdup_printf("%7.3f", arPips[fInvert ? !i : i]); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(sz), 1, i + 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(sz), 1, 2, i + 1, i + 2, 0, 0, 4, 4); #endif g_free(sz); if (pepcw) pepcw->apwEPC[i] = pw; sz = g_strdup_printf("%7.3f", arWastage[fInvert ? !i : i]); #if GTK_CHECK_VERSION(3,0,0) gtk_grid_attach(GTK_GRID(pwGrid), pw = gtk_label_new(sz), 2, i + 1, 1, 1); #if GTK_CHECK_VERSION(3,12,0) gtk_widget_set_margin_start(pw, 4); gtk_widget_set_margin_end(pw, 4); #else gtk_widget_set_margin_left(pw, 4); gtk_widget_set_margin_right(pw, 4); #endif gtk_widget_set_margin_top(pw, 4); gtk_widget_set_margin_bottom(pw, 4); #else gtk_table_attach(GTK_TABLE(pwTable), pw = gtk_label_new(sz), 2, 3, i + 1, i + 2, 0, 0, 4, 4); #endif g_free(sz); if (pepcw) pepcw->apwWastage[i] = pw; } gtk_box_pack_start(GTK_BOX(pwvbox), pw = gtk_label_new(_("EPC = Effective pip count = Avg. rolls * 8.167")), FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pw, GTK_ALIGN_START); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(pw), 0, 0.5); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw = gtk_label_new(_("Wastage = EPC - Pips")), FALSE, FALSE, 0); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pw, GTK_ALIGN_START); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(pw), 0, 0.5); #endif return pwFrame; } static void PerformOSR(GtkWidget * UNUSED(pw), racewidget * prw) { unsigned int nTrials = (unsigned int) gtk_adjustment_get_value(prw->padjTrials); float ar[5]; int i; char sz[16]; unsigned int anPips[2]; const float x = (2 * 3 + 3 * 4 + 4 * 5 + 4 * 6 + 6 * 7 + 5 * 8 + 4 * 9 + 2 * 10 + 2 * 11 + 1 * 12 + 1 * 16 + 1 * 20 + 1 * 24) / 36.0f; float arMu[2]; GtkTreeIter iter; GtkTreeModel *store; raceProbs((ConstTanBoard) prw->anBoard, nTrials, ar, arMu); PipCount((ConstTanBoard) prw->anBoard, anPips); store = gtk_tree_view_get_model(GTK_TREE_VIEW(prw->pwOutput)); gtk_tree_model_get_iter_first(store, &iter); for (i = 0; i < 5; ++i) { if (fOutputWinPC) sprintf(sz, "%5.1f%%", ar[i] * 100.0f); else sprintf(sz, "%5.3f", ar[i]); gtk_list_store_set(GTK_LIST_STORE(store), &iter, i + 1, sz, -1); } /* effective pip count */ for (i = 0; i < 2; ++i) { gchar *pch; int j = prw->fMove ? i : !i; pch = g_strdup_printf("%7.3f", arMu[j] * x); gtk_label_set_text(GTK_LABEL(prw->epcwOSR.apwEPC[i]), pch); g_free(pch); pch = g_strdup_printf("%7.3f", arMu[j] * x - (float) anPips[j]); gtk_label_set_text(GTK_LABEL(prw->epcwOSR.apwWastage[i]), pch); g_free(pch); } } static GtkWidget * do_rollout_view(void) { GtkWidget *view; GtkListStore *store; GtkCellRenderer *renderer; GtkTreeIter iter; int i; const char *aszTitle[] = { " ", /* neither NULL (undefined behaviour as gettext argument) nor "" (special meaning) */ N_("Win"), N_("W g"), N_("W bg"), N_("L g"), N_("L bg") }; store = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_list_store_append(store, &iter); gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, _("Rollout"), -1); view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); renderer = gtk_cell_renderer_text_new(); for (i = 0; i < 6; i++) { gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, gettext(aszTitle[i]), renderer, "text", i, NULL); } return view; } static GtkWidget * OSRPage(TanBoard UNUSED(anBoard), racewidget * prw) { GtkWidget *pwvbox; GtkWidget *pw; float ar0[2] = { 0, 0 }; char *pch; #if GTK_CHECK_VERSION(3,0,0) pwvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); gtk_widget_set_halign(pwvbox, GTK_ALIGN_START); gtk_widget_set_valign(pwvbox, GTK_ALIGN_START); gtk_container_set_border_width(GTK_CONTAINER(pwvbox), 4); #else GtkWidget *align; align = gtk_alignment_new(0, 0, 0, 0); pwvbox = gtk_vbox_new(FALSE, 4); gtk_container_add(GTK_CONTAINER(align), pwvbox); gtk_container_set_border_width(GTK_CONTAINER(align), 4); #endif prw->padjTrials = GTK_ADJUSTMENT(gtk_adjustment_new(5760, 1, 1296 * 1296, 36, 36, 0)); #if GTK_CHECK_VERSION(3,0,0) pw = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else pw = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(pwvbox), pw, FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pw), gtk_label_new(_("Trials:")), FALSE, FALSE, 4); gtk_box_pack_start(GTK_BOX(pw), gtk_spin_button_new(prw->padjTrials, 36, 0), TRUE, TRUE, 4); gtk_box_pack_start(GTK_BOX(pw), prw->pwRollout = gtk_button_new_with_label(_("Roll out")), TRUE, TRUE, 4); g_signal_connect(G_OBJECT(prw->pwRollout), "clicked", G_CALLBACK(PerformOSR), prw); /* separator */ #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwvbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4); #else gtk_box_pack_start(GTK_BOX(pwvbox), gtk_hseparator_new(), FALSE, FALSE, 4); #endif /* result */ pch = g_strdup_printf(_("%s on roll:"), ap[prw->fMove].szName); gtk_box_pack_start(GTK_BOX(pwvbox), pw = gtk_label_new(pch), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) gtk_widget_set_halign(pw, GTK_ALIGN_START); gtk_widget_set_valign(pw, GTK_ALIGN_CENTER); #else gtk_misc_set_alignment(GTK_MISC(pw), 0, 0.5); #endif g_free(pch); prw->pwOutput = do_rollout_view(); gtk_box_pack_start(GTK_BOX(pwvbox), prw->pwOutput, FALSE, FALSE, 4); /* effective pip count */ #if GTK_CHECK_VERSION(3,0,0) gtk_box_pack_start(GTK_BOX(pwvbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4); #else gtk_box_pack_start(GTK_BOX(pwvbox), gtk_hseparator_new(), FALSE, FALSE, 4); #endif gtk_box_pack_start(GTK_BOX(pwvbox), EffectivePipCount(ar0, ar0, !prw->fMove, &prw->epcwOSR), FALSE, FALSE, 4); #if GTK_CHECK_VERSION(3,0,0) return pwvbox; #else return align; #endif } static void set_current_page(GtkWidget * UNUSED(pw), gpointer UNUSED(page), guint page_num, gpointer * UNUSED(data)) { current_page_num = page_num; return; } /* * Display widget with various race metrics */ extern void GTKShowRace(TanBoard anBoard) { GtkWidget *pwDialog; GtkWidget *pwNotebook; racewidget *prw; prw = g_malloc(sizeof(racewidget)); memcpy(prw->anBoard, anBoard, 2 * 25 * sizeof(int)); prw->fMove = ms.fMove; /* create dialog */ pwDialog = GTKCreateDialog(_("GNU Backgammon - Race Theory"), DT_INFO, NULL, DIALOG_FLAG_MODAL, NULL, NULL); /* add notebook pages */ pwNotebook = gtk_notebook_new(); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), pwNotebook); gtk_container_set_border_width(GTK_CONTAINER(pwNotebook), 4); /* 8-9-12 */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), Pip8912Page(anBoard, prw->fMove), gtk_label_new(_("8912 Rule"))); /* Kleinman */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), KleinmanPage(anBoard, prw->fMove), gtk_label_new(_("Kleinman Formula"))); /* Thorp */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), ThorpPage(anBoard, prw->fMove), gtk_label_new(_("Thorp Count"))); /* Keith */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), KeithPage(anBoard, prw->fMove), gtk_label_new(_("Keith Count"))); /* Isight */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), IsightPage(anBoard, prw->fMove), gtk_label_new(_("Isight Count"))); /* One sided rollout */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), OSRPage(anBoard, prw), gtk_label_new(_("One-Sided Rollout/Database"))); /* Two-sided database */ gtk_notebook_append_page(GTK_NOTEBOOK(pwNotebook), TwoSidedPage(anBoard, prw->fMove), gtk_label_new(_("Two-Sided Database"))); g_signal_connect_after(G_OBJECT(pwNotebook), "switch-page", G_CALLBACK(set_current_page), pwNotebook); g_object_set_data_full(G_OBJECT(pwDialog), "racewidget", prw, g_free); /* show dialog */ /* OSR can take a long time for non-race positions */ if (ClassifyPosition(msBoard(), ms.bgv) <= CLASS_RACE) PerformOSR(NULL, prw); gtk_widget_show_all(pwNotebook); gtk_notebook_set_current_page(GTK_NOTEBOOK(pwNotebook), current_page_num); GTKRunDialog(pwDialog); } gnubg-1.08.003/gtkrelational.h000644 001751 000024 00000002325 14610037046 015634 0ustar00pmstaff000000 000000 /* * Copyright (C) 2006-2008 Christian Anthon * Copyright (C) 2007-2024 the AUTHORS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "relational.h" #include #ifndef GTKRELATIONAL_H #define GTKRELATIONAL_H extern void GtkRelationalAddMatch(gpointer p, guint n, GtkWidget * pw); extern void GtkShowRelational(gpointer p, guint n, GtkWidget * pw); extern GtkWidget *RelationalOptions(void); extern void RelationalOptionsShown(void); extern void RelationalSaveOptions(void); extern void GtkShowQuery(RowSet * pRow); extern void ComputeHistory(int usePlayerName); /* for history plot*/ #endif gnubg-1.08.003/ChangeLog000644 001751 000024 00001073170 14613451100 014376 0ustar00pmstaff000000 000000 2024-04-28 Philippe Michel Version 1.08.003 released. 2024-02-24 Philippe Michel Version 1.08.002 released. 2024-02-18 Philippe Michel * gnubg.c: Fix potential corruption of gnubgautorc file. 2024-02-04 Philippe Michel Version 1.08.001 released. 2024-01-01 Philippe Michel * eval.c, eval.h, gnubg.weights: Fix old quirk in the implementation of the PIPLOSS input (bug #65035). Retrain the neural nets using it. The effect on evaluation accuracy is marginally positive. 2023-12-20 Philippe Michel * eval.c, eval.h, set.c, show.c: Use a different cube efficiency ratio for 0- and 1-ply evaluations (0.76 instead of 0.68). This improves cube decisions at these plies noticeably (cube error rates are approximately halved) and the repartition of errors (premature doubles vs. missed doubles vs. take or pass errors) is now similar to higher plies instead of being mostly premature doubles. 2023-12-18 Philippe Michel * gtkgame.c, gtkgame.h, gtklocdefs.h, gtkpanels.c, gtktoolbar.c: * gtktoolbar.h: build the GTK2 version using GtkUIManager by default. To revert to GtkItemFactory, add -DUSE_GTKITEMFACTORY to the compilation flags. 2023-11-17 Isaac Keslassy * backgammon.h, commands.inc, gnubg.c, gtkgame.c, gtkgame.h: * gtkrelational.c, gtkuidefs.h, relational.c, relational.h: * show.c: Add a feature to show how the player's GNU error rate has evolved throughout the player's history, as provided by the database records. 2023-10-18 Philippe Michel * met/cubeless.xml: Add cubeless MET contributed by Tilemachos Zoidis 2023-03-14 Philippe Michel * dice.c, osr.c, credits.sh: replace the original Mersenne Twister RNG by the improved SFMT version. 2023-02-09 Isaac Keslassy * backgammon.h, commands.inc, gnubg.c, gtkgame.c, gtkgame.h: * gtkoptions.c, gtkoptions.h, import.c, set.c, sgf.c, show.c: Introduce the "SmartSit" feature that enables to define a list of users that automatically sit at the bottom of the board (as player1) in opened matches. Names can be added or deleted in Settings > Options > Display. Remove the similar but more limited set/show aliases CLI commands. 2023-02-04 Isaac Keslassy * backgammon.h, commands.inc, gnubg.c, gtkfile.c, gtkfile.h: * gtkgame.c, gtktoolbar.c, gtkuidefs.h, set.c: Extend batch analysis feature with a new button in the main toolbar: "Analyse file". Three options are available in Settings / Analysis: - regular batch analysis as peviously available - single file analysis of a selected file - smart analysis: analysis of the newest file in the default import folder (where an external client presumably added it) 2023-01-22 Isaac Keslassy * analysis.c, backgammon.h, commands.inc, gnubg.c, gtkchequer.c: * gtkcube.c, gtkfile.c, gtkfile.h, gtkgame.c, gtktoolbar.c: * multithread.c, set.c: Introduce a background analysis feature with a new button in the main toolbar: "Analyse" - the "Analyze" button starts the analysis of the current match - its behaviour is defined in Settings / Analysis: - "background analysis" checkbox: * unchecked => regular "analyze match", blocking * checked => we can browse the moves list and check the analysis immediately - "automatic add-to-database" checkbox: * Unchecked => match can be added from statistics page * Checked => match is added automatically at the end of analysis 2023-01-17 Isaac Keslassy * gtkscoremap.c, gtkscoremap.h, backgammon.h, commands.inc: * gnubg.c, gtkchequer.c, gtkcube.c, gtkgame.c, gtkuidefs.h, set.c: Improvements to the score map feature ; notably its default configuration is now configurable via Settings/Analysis/ScoreMap. 2022-11-14 Philippe Michel Version 1.07.001 released. 2022-10-16 Philippe Michel * Makefile.am, configure.ac, backgammon.h, m4/Makefile.am, m4/ax_build_date_epoch.m4(+): Use SOURCE_DATE_EPOCH as defined in https://reproducible-builds.org/specs/source-date-epoch/ to set timestamps at build. 2021-10-05 Philippe Michel * Makefile.am, backgammon.h, commands.inc, gtkchequer.c, gtkchequer.h, gtkcube.c, gtkgame.c, gtkuidefs.h, show.c, gtkscoremap.c(+), gtkscoremap.h(+): Add a button to show a map of chequer or cube evaluations at various scores. (Contributed by Aaron Tikuisis and Isaac Keslassy) 2021-09-26 Philippe Michel * backgammon.h, gtkcube.c, gtkcube.h, gtktempmap.c, play.c, show.c, credits.sh: Add a button to the cube analysis widget to switch between at-score and money evaluations. (Contributed by Aaron Tikuisis and Isaac Keslassy) 2021-09-20 Philippe Michel * po/fi.po, configure.ac, gtkgame.c, flags/finland.png, flags/Makefile.am, credits.sh, README: Finnish translation by Matti Kamppinen. 2019-02-24 Philippe Michel * gnubg.c: Decrease doubtful/bad/very bad thresholds in analysis results from 0.04/0.08/0.16 to 0.03/0.06/0.12 point. 2019-01-10 Philippe Michel * gtkgame.c: Do not offer levels weaker than expert in the main analysis, tutor and rollout settings panel of the GUI (they are still accessible through the advanced settings subpanel). 2018-10-26 Philippe Michel * configure.ac: Build requires a C99- or gnu99-compatible compiler. 2018-08-02 Philippe Michel Version 1.06.002 released. 2018-07-31 Philippe Michel * dbprovider.h, dbprovider.c: Add PostgreSQL support on Win32 platforms using Python and PyGreSQL. 2018-05-12 Philippe Michel * configure.ac, gnubg.c, m4/ax_ext.m4, lib/simd.h, lib/neuralnet.c, lib/neuralnetsse.c, lib/inputs.c: Add ARM NEON instructions support. It should be explicitly enabled at configuration with --enable-simd=neon 2018-01-15 Philippe Michel * configure.ac, multithread.h, multithread.c, mtsupport.c: Remove support of win32 native threads, as discussed in bug-gnubg (http://lists.gnu.org/archive/html/bug-gnubg/2015-01/msg00034.html). --enable-threads is now a yes (GLib threads) / no choice only. 2018-01-14 Philippe Michel * configure.ac: Build 32-bit Windows binaries as Large Address Aware. This is needed to use the largest bearoff databases. On 32-bit versions of the operating system this change by itself is not enough (but is harmless). See https://docs.microsoft.com/en-us/windows/desktop/Memory/4-gigabyte-tuning on how to enable it. 2017-12-26 Philippe Michel * gtkboard.c: Set the cube value to 1, not 0 when clicking on a chequers tray in edit mode. 2017-12-16 Michael Petch * doc/gnubg/*, po/* Update static documentation files and translation files Version 1.06.001 released 2017-12-15 Philippe Michel * lib/neuralnetsse.c : Work around AVX issue when generating code with GCC 7.x and 8.x 2017-12-05 Michael Petch * doc/gnubg/*, po/* Update static documentation files and translation files Version 1.06.000 released 2017-12-03 Philippe Michel * eval.c: Tune the number of candidate moves selected by the pruning nets depending on the number of legal moves in the position. This slightly improves evaluations speed without degrading the playing strength. 2017-08-26 Philippe Michel * gtkgame.c: When entering edit mode via New / Edit position instead of the Edit button: - dont clear the dice - set the score and match length to 0-0 in a default match or session - set the player on roll to be the bottom player, swapping the board if needed creating a reference position from the one at hand. 2017-08-19 Philippe Michel * gtkboard.c: In edit mode, clicking on the bearoff-side tray clears the board and clicking on the midpoint-side one resets it to the initial position. This used to leave the dice and cube unchanged ; now it resets the cube to 1 and centered, and clears the dice. 2017-05-25 Philippe Michel * gtkgame.c, gtkuidefs.h, commands.inc: Use "Copy as BGonline" instead of "Copy as GammOnLine" in the Edit menu. The second name tends to confuses new users who wish to post a position at bgonline but don't know the older, now less popular forum and that both use the same format. 2017-02-19 Philippe Michel * configure.ac, bearoff.c, bearoff.h: Raise minimum version requirement for GLib to 2.8. 2017-01-29 Philippe Michel * gnubg.c, text.c: In text format, display Crawford games match information as " point match (Crawford game)" to distinguish them from post-Crawford ones (" point match (Cube: 1)". Until now the second form was used in both cases. Issue recently reported in rec.games.backgammon. 2017-01-08 Philippe Michel * gnubg.c, configure.ac: Remove the no-longer-needed LIB_OVERLAYSCROLLBARS hack introduced on 2012-07-01. 2016-08-20 Philippe Michel * Makefile.am, configure.ac, gnubg.css(+), gtktheory.c, gtktempmap.c, gtkmovelistctrl.c, gtklocdefs.h, gtkgamelist.c, gtkgame.c, gtkboard.h, gtkboard.c, gtk-multiview.c, credits.sh Add option to build with gtk3 instead of gtk2 (works with 2D boards only). Use : "./configure --with-gtk3 --without-board3d" to configure. (Contributed by Jeremy Moore) 2016-07-16 Philippe Michel * backgammon.h, commands.inc, eval.c, eval.h, gtkrace.c, show.c Add Isight count to the Race Theory widget. 2016-06-07 Michael Petch * doc/gnubg/*, po/* Update static documentation files and translation files Version 1.05.002 released 2016-03-02 Philippe Michel * po/el.po, configure.ac, gtkgame.c, flags/greece.png, flags/Makefile.am, credits.sh : Greek translation by Vangelis Skarmoutsos. 2015-10-07 Michael Petch * common.h, configure.ac, copying.awk, credits.sh, output.h, lib/simd.h, m4/Makefile.am, non-src/copying.c, non-src/credits.c, non-src/gnubg-stock-pixbufs.h, +m4/ax_c___attribute__.m4, external_l.l, external_y.y, sgf_l.l, sgf_y.y, non-src/external_l.c, non-src/external_y.c, non-src/external_y.h, non-src/sgf_l.c, non-src/sgf_y.c, non-src/sgf_y.h, backgammon.h : Fix problem identified by Mike Frysinger where __attribute__ and _GNU_SOURCE may not be properly defined in some situations. This may result in an infinite loop on newer compilers. 2015-09-28 Michael Petch * gnubg.c: Set export default paths to "." rather than NULL to fix problem with GTK crashes on some platforms. Reported by Tom Meyer. See bug report https://savannah.gnu.org/bugs/?46069 2015-09-27 Philippe Michel * backgammon.h, commands.inc, set.c, gtkoptions.c, gnubg.c, dice.h, dice.c, configure.ac: Remove availability of ANSI and BSD random number generators. These are mediocre algorithms and not thread-safe. Much better alternatives like Mersenne twister and BBS are implemented in GNU Backgammon (and used by default). 2015-09-03 Michael Petch * board3d/Makefile.am: Include FREETYPE2_LIBS linker flags to libboard3d. Fixes issue with build using MinGW 2015-09-01 Michael Petch * commands.inc, configure.ac, gnubg.c, gtkgame.c, gtkgame.h, pylocdefs.h: Change autoconf use of HAVE_LIBREADLINE to HAVE_LIB_READLINE. pyconfig.h may define it even if the readline header files aren't installed on a distro. 2015-08-31 Michael Petch * dice.c, multithread.h, openurl.c, osr.c, sound.c, timer.c, lib/mt19937ar.c, lib/mt19937ar.h: Resolve #define conflict in Mersenne twister under Win32. Resolve other minor Win32 warnings. 2015-08-30 Michael Petch * Makefile.am configure.ac m4/ChangeLog m4/Makefile.am, +m4/ax_python_devel.m4, -python-config -m4/az_python.m4: Modernize Python detection of development requirements. 2015-08-25 Michael Petch * m4/ax_ext.h : Update this autconf script to detect all currently known supplemental instruction sets and extensions for the x86 processors. Includes HAVE_MMX, HAVE_RDRND, HAVE_BMI1,HAVE_BMI2, HAVE_ADX, HAVE_MPX, HAVE_PREFETCHWT1, HAVE_ABM, HAVE_SSE, HAVE_SSE2, HAVE_SSE3, HAVE_SSSE3, HAVE_SSE4_1, HAVE_SSE4_2, HAVE_SSE4a, HAVE_SHA, HAVE_AES, HAVE_AVX, HAVE_FMA3, HAVE_FMA4, HAVE_XOP, HAVE_AVX2, HAVE_AVX512_F, HAVE_AVX512_CD, HAVE_AVX512_PF, HAVE_AVX512_ER, HAVE_AVX512_VL, HAVE_AVX512_BW, HAVE_AVX512_DQ, HAVE_AVX512_IFMA, HAVE_AVX512_VBMI 2015-07-31 Michael Petch * doc/gnubg/*, po/* Update static documentation files and translation files Version 1.05.001 released 2015-07-31 Michael Petch * Makefile.am bearoff.c configure.ac dice.c eval.c, export.c file.c glib-ext.c glib-ext.h gnubg.c gtkgame.c, gtkprefs.c html.c import.c latex.c makebearoff.c makehyper.c, makeweights.c relational.c rollout.c sgf.c text.c, board3d/matrix.c board3d/misc3d.c Workaround problem with g_fopen & Unicode on some WIN32 build environments that produce "Invalid Argument" errors when a file is opened. 2015-06-26 Michael Petch * drawboard.c, drawboard.h, external.c, gnubg.c, gtkboard.c play.c : Fix problem with erroneous decisions generated when using the external interface. Reported by Philippe Michel. 2015-04-21 Michael Petch * export.c: Fix code to avoid compiler warnings when using a switch statement keyed on an enum. 2015-04-20 Michael Petch * doc/gnubg/*, po/* Update static documentation files and translation files Version 1.05.000 released 2015-04-12 Philippe Michel * export.c, import.c: Add a comment in .mat exports of hypergammon sessions to indicate variation. Use it on import. 2015-01-19 Michael Petch * configure.ac, Makefile.am, Makefile.w32, backgammon.h, dice.c, gnubg.c, +randomorg.c, +randomorg.h, set.c, +m4/libcurl.m4 Add https support for random.org using libcurl. Libcurl is an optional dependency that is required to use ranom.org as a dice source. 2014-12-04 Michael Petch Version 1.04.001 released. 2014-12-04 Michael Petch * play.c. external.c : Fix external interface bug that prevented external socket players from working. Fix bug that prevented external socket interface errors being displayed. Reported by Philippe Michel. See bug report: https://savannah.gnu.org/bugs/?43747 2014-10-21 Michael Petch Version 1.04 released. 2014-09-08 Philippe Michel * eval.c, eval.h: Don't use SanityCheck() on positions evaluated with the one-sided database. The latter is more accurate about the possibility of a gammon. This fixes the issue reported by Michael Petch in http://lists.gnu.org/archive/html/bug-gnubg/2012-10/msg00010.html 2014-09-07 Philippe Michel * gnubg.c: fix re-evaluation of chequer play from the analysis panel. It used to clear the skill flag of the associated cube decision. Issue reported by Neil Robins to the bug-gnubg list in Dec 2012. 2014-08-21 Philippe Michel * import.c: fix a bug introduced July 20th in mat files import where some games could have the wrong player set as winner. 2014-08-09 Michael Petch * rollout.c: declare initial_game_count as volatile. It may be updated from multiple threads when multithreading is enabled. We don't want an optimizing compiler to optimize this variable away. 2014-08-08 Michael Petch * configure.ac: modify configure to properly support an argument to --with-python. Supplying a python interpreter as an argument will force configure to use the specified one. General Python checking cleanup 2014-08-07 Michael Petch * configure.ac dbprovider.c gnubgmodule.c gnubgmodule.h m4/az_python.m4 scripts/gnubg.py scripts/db_import.py scripts/batch.py scripts/matchseries.py +pylocdefs.h: Support compiling with Python 3.x and modify Python modules to support Python 2.x and 3.x. 2014-08-04 Michael Petch Version 1.03 released. 2014-07-26 Michael Petch * analysis.c mtsupport.c play.c: Fix problem with aMoves data structures being double freed. This bug would cause prgram to crash on termination or crash after stopping an analysis. 2014-07-26 Michael Petch * gnubgmodule.c: cfevaluate and evaluate now make asynchronous calls to retrieve cube and move results. This allows Python to to call these functions from any of its own threads. Fix bug with the eval context in PythonEvaluate. 2014-07-25 Michael Petch * Makefile.am, glib-ext.c, glib-ext.h, gnubg.c, makebearoff.c, makehyper.c: Modify code to properly compile on systems with GLib < 2.14. Make sure GLib threading is initialized in environments where it is needed. This includes makebearoff and makehyper. * mtsupport.c, multithread.c, multithread.h: Fix problem with mutexes being incorrectly initialized/freed/locked/unlocked on environemnts with GLib >= 2.32. This bug was identified with recent GLib builds with extra runtime checks. See crash reported by Chris Fahlman using unstable Ubuntu. See https://bugs.launchpad.net/ubuntu/+source/gnubg/+bug/1346567 2014-06-26 Philippe Michel * import.c, show.c, gnubg.c, backgammon.h, set.c, commands.inc: Minor changes to the "set aliases" feature from 2014-02-03 after users feedback : separator is now ';' * doc/gnubgdb.xml: Document the above. 2014-06-23 Michael Petch * external_y.y, external_l.l, external.c, external.h : Added debug command to the external interface limited debugging output support 2014-06-21 Michael Petch * gtklocdefs.c, gtklocdefs.h, glib-ext.h: add g_list_free_full function for environments using GLib < 2.28. 2014-06-21 Michael Petch * drawboard.c, drawboard.h, external.c, external.h, external_l.l, external_y.y, non-src/external_l.c, non-src/external_y.c, non-src/external_y.h Replace the external interface with a reentrant version that is more extensible for storing more complex datatypes in the future. Yacc will no longer compile, as it uses Bison extensions. The external interface is compatible with the previous version although the error messages have changed. Added new command "quit" that allows a remote session to close the connection. A new "Version" command will return the version of the external interface. The "Noise" option was broken. Noise can work with an integer (divide by 10000 to get a noise value). Noise also supports a float type where the value represents the actual noise value. The evaluation and session options can now appear in any order. Player names can now be quoted strings. When a remote session is connected a single control-c rather than 2 will return to the gnubg command line. A bug that made a blank line execute the previous command has been fixed. Now an error message is displayed. 2014-06-21 Michael Petch * +glib-ext.c, +glib-ext.h, Makefile.am Makefile.w32: Add GLib utility functions and macros to provide extra list functionality and string to GValue maps. 2014-05-26 Philippe Michel * import.c: Fix interpretation of eXtreme Gammon's "; Set Pos=..." extension to mat format. Non-centered cubes were set to the wrong side. 2014-03-31 Michael Petch * gtkprefs.c: Fix problem with some build environments that incorrectly encoded and decoded some board appearance colours. This fix was provided by Jon Kinsey via Tom Martin to fix problems changing between 2D board designs on the MinGW(Win32) builds. 2014-03-09 Philippe Michel * gtkgame.c: Use terser format (one line only) when copying GNUbg ID. Fixes bug #27716. 2014-02-26 Michael Petch * gnubgmodule.c, backgammon.h: More Python module cleanup. Add basic support for move filters. Initial support for eval/hint filters. Modify findbestmove to use a user supplied move filter. Add new function calcgammonprice. TODO: Create a method to retrieve a filter by name. Create a method to get/set analysis filter 2014-02-25 Michael Petch * gnubgmodule.c, backgammon.h, gnubg.c: Convert error related printf's to Python Errors. If a user interrupt occurs during a Python operation then reset the interrupt handling. Modify gnubg.findbestmove function to utilize asynchronous processing to help avoid thread issues when called from Python. 2014-02-12 Philippe Michel * html.c: Clean up headers in positions copied as GammOnLine HTML. Issue mentionned by Stick in the bgonline forum. 2014-02-11 Michael Petch * gnubgmodule.c: Modify findbestmove to use the user selected analysis level when no evaluation context is passed as a parameter. * import.c: Fix missing GStatBuf type on Win32 platforms * configure.ac: Moving towards release 1.03.000. Fix problem detecting GLU on WIN32 platform * gtklocdefs.h: Fix problem with GtkComboBoxText type on GTK < 2.24 2014-02-03 Philippe Michel * gnubg.c, backgammon.h, commands.inc, import.c, set.c, show.c: Add "set aliases ::" command to list player names that should always be set as player 1 (bottom player) when importing a MAT file. This setting is only available in the CLI for now. Add related "show aliases" command. 2014-01-13 Jon Kinsey * gtkprefs.c: Fix some board design bugs: switching 2d wood paint setting, invalid xml characters in design name/description, reduce wrong pop-up about losing design (Thanks to Tom Martin for reports). 2014-01-12 Philippe Michel * import.c: Interpret eXtreme Gammon's "; Set Pos=..." extension to mat format. For now, games or matches containing this kind of record cannot be re-exported to mat or Snowie txt format. 2013-11-30 Philippe Michel * gtkgame.c: Display match statistics when a match analysis is completed (GUI only, and does not apply to those run from a command file or a batch analysis). 2013-11-26 Michael Petch * gnubgmodule.c: Fix a serious bug created by a previous commit that prevented many of the python interface function from working correctly. Add new classifypos python function to the gnubg python interface. 2013-11-12 Philippe Michel * README, backgammon.h, commands.inc, file.c, file.h, import.c, doc/gnubgdb.xml: Remove support of Berliner's BKG format. * gnubg.c: Include pip counts in positions copied to clipboard as ASCII. 2013-10-25 Philippe Michel * eval.c: Show the weights file and bearoff databases installation directory in Help|About GNU Backgammon|Evaluation Engine or "show engine" output. 2013-10-20 Philippe Michel * file.c: Fix automatic import of mat files starting with many comment lines (Backgammon NJ can create such files). 2013-09-22 Philippe Michel * gnubg.c, gtkgame.c (comment only): Fix assertion failure when asking for a hint on a resignation while reviewing a game. Reported via Debian bugs tracker and Russ Allbery. http://lists.gnu.org/archive/html/bug-gnubg/2013-09/msg00006.html 2013-08-20 Michael Petch * boards.xml, gnubg.gtkrc, gnubg.sql, met/met.dtd, met/met.xsl, scripts/batch.py, scripts/batch_win.py, scripts/database.py, scripts/db_import.py, scripts/gnubg.py, scripts/matchseries.py: Update license information. 2013-08-20 Michael Petch * +doc/bearoffdump.6, +doc/makebearoff.6, +doc/makehyper.6, +doc/makeweights.6, doc/Makefile.am, Makefile.am: Add man pages for the GNUbg utilities, based upon the man pages created by Russ Allbery for Debian GNU/Linux. Fix docdir usage, and compress the man pages. 2013-08-20 Michael Petch * configure.ac: Apply patch provided by Christopher Hofmann. Autoconf now checks for the GLU library when building with 3D boards. * mkinstalldirs: Update to a newer version from automake-1.14 2013-07-28 Michael Petch Version 1.02 released. 2013-07-22 Michael Petch * configure.ac, openurl.c: Add a configure option --with-default-browser to override the default value "xdg-open". if --with-default-browser is specified without an argument it will look for a default in this order sensible-browser, xdg-open, firefox . If none are found the default xdg-open will be used. This option is not available on Win32 platforms. Add a new configure option --enable-gasserts . Previously g_assert macros have been enabled by default. They are now disabled by default. This option is used to enable those macros. Take the AVX code out of the experimental stage. If AVX is supported on the processor and OS then it will be used by default. 2013-07-22 Michael Petch * gtk-multiview.c, gtk-multiview.h, mec.c, sound.c, board3d/tr.c, board3d/tr.h, lib/mm_malloc.h: Fix some licensing inconsistencies identified by Russ Allbery. 2013-07-21 Michael Petch * gnubg.c: When displaying "save settings to" attempt to output the message immediately. This prevents some unnecessary popup messages. 2013-07-20 Michael Petch * multithread.c: Fix bug on thread disabled builds that caused an assertion while updating the progress bar. Ensure the callback timer is removed when all tasks are done. 2013-07-20 Michael Petch * eval.c lib/neuralnet.c, lib/neuralnet.h: Remedy a bug that produced inconsistent results when producing non-SIMD builds. Make sure that EvaluateFromBase is using comparable nets when using a neural net shortcut. 2013-07-17 Michael Petch * analysis.c, dbprovider.c, eval.c, gnubgmodule.c, gnubgmodule.h, multithread.c, lib/inputs.c, lib/neuralnetsse.c, lib/simd.h: Fix stack issues that cause AVX WIN32 builds to segfault when optimizations are used. 2013-07-17 Michael Petch * sound.c: Allow GNUBG to build on OS/X builds using the CLang compiler. CLang supports AVX instructions. GCC shipped by Apple is based upon the older 4.2 version of GCC. 2013-07-12 Michael Petch * sound.c: On systems using libcanberra it is possible that the canberra sound system may be available, but disabled by default. When the sound context is created enable the canberra sound system explicitly. Bug report (and patch) received from Dan Fandrich. See: http://lists.gnu.org/archive/html/bug-gnubg/2013-07/msg00008.html 2013-07-11 Michael Petch * gnubg.c, utils.h, utils.c: Added a new command line option '-s ' to specify the location of the user's GNUBG preferences directory. This overrides the default location of $(HOME)/.gnubg . If you wish to save your settings to the directory that GNUBG was run from then use '-s .' 2013-07-10 Michael Petch * gtkgame.c: Fixed bug that prevented the stop button in the status bar from being active. 2013-07-10 Michael Petch * +mtsupport.c, Makefile.am, Makefile.w32, bearoffdump.c, makebearoff.c, makehyper.c, multithread.c, multithread.h: Reduce the cpu cycle overhead of the new heap allocated thread local data. Rework the multithreaded code. Split multithreaded support functions out of multithread.c and into mtsupport.c . mtsupport.c can be used by the utiltity programs (makebearoff etc). 2013-07-08 Michael Petch * Makefile.am, bearoffdump.c, eval.c, eval.h, gnubg.c, makebearoff.c, makehyper.c multithread.c multithread.h po/*: Move static thread local data from eval.c into thread local storage (multithread.c). This reduces the bss data size. Thread storage is allocated on the heap as required. Ensure that the data is properly aligned for SIMD usage. 2013-07-06 Michael Petch * lib/inputs.c, lib/simd.h, Makefile.am, configure.ac: Fix an AVX alignment bug while creating the baseinputs for the NN on Win32 platforms with GNUC. * eval.c, gnubgmodule.c, multithread.c, multithread.h, m4/ax_ext.m4: Fix some warnings and general cleanup 2013-06-29 Michael Petch * backgammon.h, gnubg.c, gnubgmodule.c: Added preliminary support for Python module function 'hint'. Work in progress The function interface and the dictionary returned may change. Added module functions mwc2eq_stderr and eq2mwc_stderr. Inefficient memory use for eval and rollout contexts should be cleaned up. Rollout contexts should include all the cube and chequer play sub contexts. The hint dictionary needs to be documented. 2013-06-25 Michael Petch * backgammon.h, gnubg.c, play.c: hint_move has been modified to support external callbacks. Part of future Python integration. 2013-06-25 Michael Petch * eval.c, lib/neuralnet.c: If SIMD instructions are compiled in and they are not supported by the processor, output an error message and then terminate immediately. 2013-06-22 Michael Petch * INSTALL, configure.ac, eval.c, gnubg.c, gnubg.spec, po/POTFILES.in Rename file sse.h to simd.h. Rename USE_SSE_VECTORIZE to USE_SIMD_INSTRUCTIONS, rename SSE_Supported to SIMD_Supported, rename DISABLE_SSE_TEST to DISABLE_SIMD_TEST, rename SSE_CFLAGS to SIMD_CFLAGS Make sse/simd usage more consistent, ./configure option --enable-sse/--disable-sse is now --enable-simd/--disable-simd 2013-06-20 Michael Petch * +m4/ax_check_compile_flag.m4, +m4/ax_ext.m4 +m4/ax_gcc_x86_avx_xgetbv.m4 +m4/ax_gcc_x86_cpuid.m4, configure.ac: Added better autoconf support to determine whether the processor supports certain SIMD instruction sets like SSE,SSE2,AVX etc. --enable-simd behaves a bit different. --enable-simd with no parameters is the same as --enable-simd=yes . The behavior of --enable-simd=yes has been changed to find the latest supported SIMD instruction set used by the build machines CPU. Priority is given in this order (highest first): SSE2, SSE, AVX, None. Since AVX is still experimental it is not given priority over SSE2 during build time autodetection. 2013-06-19 Michael Petch * +output.c +output.h, gnubg.c, backgammon.h, lib/Makefile.am lib/neuralnet.c: Moved the output functions from gnubg.c to their own files. 2013-06-19 Michael Petch * gnubg.c, eval.c, lib/neuralnet.c, lib/neuralnet.h, configure.ac: Add support for plm's new AVX instruction additions. Separate the cputest from the --enable-simd configure option. Created a new option --disable-cputest Supports cputest functionality on GCC builds with either 64-bit or 32-Bit OSes on Intel processors. Code will work with builds that use -fpic option. 2013-06-18 Michael Petch * gnubg.c: When using the -r flag to start GNUBG (start without reading the gnubgautorc file), the gnugbautorc file will be overwritten with defaults if running with the GUI. Reported by plm, see: https://savannah.gnu.org/bugs/?38497#postcomment 2013-06-17 Michael Petch * gtkgame.c: Fix language bug that prevented the GUI from properly refreshing the screen when a new Language was chosen * Makefile.am: Win32 builds have a localedir of ./locale relative to the executables directory. A bug had newer windows builds seeking locale files in the default locations which was incorrect, and consquently language translation didn't occur. 2013-06-15 Michael Petch * All .c and .h files: Standardized the code formatting with indent -kr -l120 -fc1 -sc -nut -psl . K&R style, 120 column limit process comment in column 1, multiline comments have an asterisk at the beginning of each line, convert all tabs to spaces, and split the return type of a function from the function name (each on their own line). K&R uses 4 spaces for an indentation level. Update the language files. * script/*.py : Reformat the python files to conform to PEP8 standard. See http://www.python.org/dev/peps/pep-0008/#indentation 2013-06-15 Michael Petch * gnubgmodule.c, scripts/gnubg.py: Modify the python interpreter processing so that it falls back to a simple command line interface on older versions of Windows (Versions before WinXP SP2). Fix segfault related to launching the Python command line interpreter 2013-06-15 Philippe Michel * configure.ac, lib/neuralnetsse.c, lib/sse.h, lib/inputs.c: Use AVX instructions when built with "configure --enable-simd=avx" 2013-06-13 Michael Petch * gtkprefs.c: Save board preferences when clicking "OK" on the board appearance configuration dialog. 2013-06-12 Michael Petch * dbprovider.c, dbprovider.h, gtkrelational.c, relational.c, scripts/database.py : Allow hostname to be specified in the database connection dialog box. Hostnames can be any valid combination of hostname:portnumber 2013-06-07 Michael Petch * gtkwindows.c, play.c: Fix a bug that segfaulted the "end game" command when built with GTK and the "-t" option is used to launch GNUBG. 2013-06-06 Michael Petch * gnubgmodule.c, gnubgmodule.h, gtkgame.c, scripts/gnubg.py: Move loading of the Python command line interpreter to Python functions in gnubg.py. The Python command line now supports IPython if present. IPython takes precedence over the standard Python interpreter. If the standard interpreter is used, attempt to load command history (readline module) and then try loading auto completion (rlcompleter module) support if present. Fix Python related ifdefs to allow compiling when built without Python support. 2013-06-05 Michael Petch * scripts/gnubg.py: Add the scripts directory to the Python path so that files in the directory can be imported. 2013-06-05 Michael Petch * gnubgmodule.c, gtkgame.c, play.c: Modify the interactive Python interpreter to support tab completion and command history. Begin reintroducing Python IDLE, since it functions on MS Windows and various GNU/Linux distros. Ubuntu/Debian installation of IDLE can be done via: apt-get install idle . If IDLE is not present it will drop back to the old method. CLI builds don't use IDLE at present. IDLE is not on the GUI menu but can be activated by turning on the "command" pane and entering '>' (greater than sign without quotes) as a command. IF IDLE is not presnt and usable it will do nothing. This is a work in progress. 2013-06-04 Michael Petch * gtkrelational.c: Don't allow a user to create a player database that already exists. * dbprovider.h, dbprovider.c, scripts/database.py, gnubgmodule.c: Add Mysql support on Win32 platforms using pymysql (a purely python based database driver for mysql) 2013-06-04 Michael Petch * configure.ac, multithread.h: Allow a new autoconf/configure parameter --with-eval-max-threads=size to allow the maximum number of evaluation threads to be specified. Default is 48 if not specified. * dbprovider.h, dbprovider.c, relational.c scripts/database.py: Fix bugs that prevented proper connections and database usage when using the Mysql and Postgres player database providers. Mysql and Postgres are unsupported on the MS Windows platform - Disable them in the GUI 2013-05-31 Michael Petch * play.c: Under certain situations (load commands from a file containing a play command within the GUI) would stop on an assertion. PlayCommand not properly resetting the notification handler. Reported by Ian Shaw 2013-05-28 Michael Petch * gnubg.c: Fix bugs related to python handling of ParseMove and FormatMove . Fix bug that would cause crash when command "load commands" used unquoted filenames on Win32 platform. Reported by Ian Shaw 2013-05-17 Michael Petch * configure.ac eval.h gnubg.weights doc/gnubgdb.xml doc/gnubg/* doc/gnubgman.xml: Version bumped to V1.00.0 . * gnubg.c: Change default MET to Kazaross-XG2.xml 2013-04-13 Philippe Michel * import.c: Interpret some of the comments eXtreme Gammon puts at the start of .mat files to fill match information in and determine game variation. * export.c: Writes similar comments when exporting as .mat 2013-03-26 Philippe Michel * matchequity.c: Recalculate gammon prices after inverting the MET. This is needed for asymetric tables. Problem reported by Maik Stiebler in bug-gnubg. 2013-03-15 Michael Petch * doc/gnubg/* doc/gnubgdb.xml doc/gnubgman.xml: Version bumped to V0.91.0 in the documentation. 2013-03-07 Philippe Michel * gnubg.c: Use stronger default settings for Computer opponent, Tutor and Analysis (2 ply instead of 0 ply) and for rollouts (0 ply checker play and 2 ply cube instead of 0 ply for everything). Increase the default JSDs and minimum trials to stop a rollout early. * eval.c: Use SSE instructions, if available, in the pruning nets computations. This is a small speed improvement but constrains the size of the pruning nets' intermediate layer to be a multiple of 4. 2013-03-06 Philippe Michel * configure.ac, credits.sh, eval.h, gnubg.weights: New nets. Version bumped to 0.91. 2013-02-17 Philippe Michel * format.c: Use EMG by default in matchplay analysis output since these numbers are generally easier to interpret than MWC. 2013-01-23 Philippe Michel * simpleboard.c, simpleboard.h, export.c: Improve export of positions in cairo graphics. Problem reported by Leo Bueno. 2012-10-25 Michael Petch * gnubgmodule.c : Add movetupletostring method to the Python interface. Added support for tuples generated by findbestmove and parsemove. 2012-10-23 Michael Petch * gnubgmodule.c : recent removal of reduced dict item from the Python eval contexts introduced a bug that produced an error processing the noise dict item. Reported by Bagrat Lazaryan 2012-10-21 Michael Petch * play.c, gnubgmodule.c : Fix issue with GNUbg not resigning if the opponent is guaranteed to win a backgammon or a gammon. Discovered in matches played by Murat (R.G.B.). Add number of points resigned (1=regular,2=gammon,3=backgammon) to Python resign dictionary item. 2012-10-20 Michael Petch * analysis.c, gtkpanels.c : Fix issues with crawford games. If not using "automatically start next game" and you analyse a game or match in the game preceding the crawford game the next game will not be treated as a crawford game. See: https://savannah.gnu.org/bugs/?35179 Fixed bug with the Crawford flag beneath the board not being properly set when Crawford game is reached. 2012-10-19 Michael Petch * gtkprefs.c, renderprefs.c, set.c : Export of positions/matches didn't honour the board styles when GNUBG launched with -t or was built with --without-gtk option. Reported by Fredrik. See: http://lists.gnu.org/archive/html/bug-gnubg/2012-10/msg00011.html 2012-10-19 Michael Petch * gnubgmodule.c, gnubgmodule.h : Stack alignment issue. On Win32/GCC builds, SSE instructions acting on variables allocated on the stack in Python code would cause a segfault. Properly align stack in Python functions that may call SSE code. Reported by bagratte. See https://savannah.gnu.org/bugs/?37583 2012-10-18 Michael Petch * play.c : Murat (R.G.B.) noticed that resignations acted differently in some cases. Found that resignations can be analysed in 0 ply in some places and 2 ply in others. To remain consistent we now compute them at 0 ply. 2012-10-11 Michael Petch * import.c : Fix BGRoom import bug reported by Adi Kadmon where player names were not properly applied to Player 1 and Player 2 (They could be reversed). 2012-10-11 Michael Petch * configure.ac : Configure process modified to support a thread type with --enable-threads default threading is GLib threads. Supports win32, GLib and no threading 2012-10-08 Philippe Michel * configure.in: This file name is deprecated, rename it to configure.ac. 2012-10-07 Michael Petch * backgammon.h, gnubg.c, configure.in : Convert BUILD_DATE define to literal string before usage. Allow VERSION_EXT environment variable to be passed to autogen.sh to specify an extension on a version number. VERSION_EXT="-mingw" would yield a version that would appear as 0.90.0-mingw . 2012-10-07 Michael Petch * +win32/*, pixmaps/Makefile.am, configure.in, Makefile.am: Added WIN32 resource support (icons etc), and general automake cleanup 2012-09-18 Michael Petch * backgammon.h, dice.c, gnubg.c, gtkoptions.c, set.c, lib/mt19937ar.c lib/mt19937ar.h Better Mersenne Twister seed support when compiled with libgmp. MT Seeds with libgmp support can be full range from 0 to 2^19973-1. To retain backward comaptibility with rolls generated from seeds between 0 and 2^32-1 on previous releases of GNUBG, seeds in this range will be set using the old method. GUI modified to support a seed value between 0 and 2^32-1 instead of 2^31-1 When libgmp support is absent we now support unsigned 32 bit integers rather than signed. When compiling 64bit (without libgmp), seeds will be limited to 32 bit integers. Compile with libgmp to support seeds greater than 32 bits. Note: In previous releases, if libgmp support was present, seeds exceeding 2^32-1 did not work as expected even though the seed appeared to be successfully set. 2012-08-05 Michael Petch * gtkchequer.c: Fix string buffer over run when copying move analysis data. Reported by Mike Mannon, see bug http://savannah.gnu.org/bugs/?37025. TODO: introduce a better way to allocate space for the text buffer. 2012-08-01 Philippe Michel * import.c: Fix some import problems with files exported by eXtreme Gammon and GridGammon. 2012-07-01 Michael Petch * gnubg.c: Added a define NO_OVERLAYSCROLLBARS that can be used to override LIB_OVERLAYSCROLLBARS to be 0 on platforms where overlay scrollbars currently cause problems. The long term fix is to replace GtkCList with GtkTreeview. mdpetch is curretly working on this solution. More information on this problem can be found at: https://bugs.launchpad.net/ubuntu/+source/gnubg/+bug/1002063 2012-06-21 Michael Petch * gtkboard.c: Fix bug reported by motiv4u and Tim Chow that caused edit mode to act oddly when the player on roll is changed. 2012-05-15 Michael Petch * play.c: Fix bug reported on R.G.B. by murat that prevented the GUI from navigating to the next game when a resignation is offered and the "End Game" feature is used. The issue only occurred in 3D view. 2012-05-04 Jon Kinsey * drawboard3d.c: remove no longer needed board resize when cube moves to top of screen. 2012-03-03 Philippe Michel * eval.c: Improve backgammons estimation in race pruning by using the same method than in the regular evaluation. 2011-12-31 Philippe Michel * lib/neuralnetsse.c: Fixes error in sigmoid approximation when using SSE instructions. This will cause occasional small discrepancies in evalation output compared to previous code. 2011-12-07 Philippe Michel * dice.c: fix small modulo bias in dice generation with some RNGs. Affects ansi, bsd, isaac, md5 and mersenne. As a consequence, a match or session started with the same seed can very occasionally unfold differently from how it did before the change. Rollouts using the same seed can give a marginally different result as well. The probability of the dice sequence diverging at each roll is on the order of 1 in 1,000,000,000. Mon Oct 31 12:22:59 CET 2011 Christian Anthon * gtklocdefs.c, gtklocdefs.h, m4/Makefile.am m4/versioncompare.m4: compile on centos5 Mon Oct 31 10:40:01 CET 2011 Christian Anthon * analysis.c, backgammon.h, export.c, format.c, gtkboard.c, gtkgame.c, gtkgame.h, gtklocdefs.c, gtkpanels.c, gtktheory.c, import.c, makebearoff.c, play.c, set.c, sgf.c, board3d/graph.c, board3d/widget3d.c, lib/inputs.c: silence compiler warnings from gcc 2011-09-29 Michael Petch * html.c: BBS Match output rendered with white space when outputting a complete match. Rendering problem was because Strict XHTML DocType. Reported by Chris Yep BBS output cleaned up to validate properly as Strict XHTML 1.0. 2011-09-08 Philippe Michel * import.c: Don't replace spaces by underscores in players' names while importing. 2011-09-02 Michael Petch * gtkboard.c, gtkfile.c, gtkgame.c, gtklocdefs.c, gtklocdefs.h, gtktoolbar.c, gtktoolbar.h, gtkwindows.c: Work around more deprecated functions. 2011-08-30 Michael Petch * Makefile.am, credits.sh gtk-multiview.c, gtkboard.c, gtkexport.c, gtkgame.c, gtkgame.h, gtkgamelist.c, gtkmovefilter.c, gtkmovefilter.h, gtkmovelist.c, gtkmovelistctrl.c, gtkoptions.c, gtkpanels.c, gtkprefs.c, gtkrace.c, gtksplash.c, gtktempmap.c, gtktheory.c, gtktoolbar.c, gtktoolbar.h, gtkwindows.c, set.c, board3d/graph.c, board3d/gtkcolour3d.c, board3d/inc3d.h, board3d/misc3d.c, board3d/widget3d.c, +gtklocdefs.h, +gtklocdefs.c, +gtkuidefs.h: Work around deprecated functions in GTK 2.24, remove direct member access of opaque types, convert GtkItemFactory to GtkUIManager for the menu and toolbars. Building with 2.24 using compile flags -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE is a first step to supporting GTK3. Keep the code backward compatible with GTK 2.6 with conditional expressions. The above DISABLE_DEPRECATED flags are intrusive and may not allow to build a working gnubg on some platforms. When simply making changes to the menus and toolbars, it is enough to check that they work with -DUSE_GTKUIMANAGER -DGSEAL_ENABLE as well as without these flags. 2011-08-24 Michael Petch * met/Kazaross-XG2.xml: Add XG2 MET generated by Neil Kazaross 2011-08-21 Michael Petch * gtkchequer.c,gtkcube.c: Fixed bug #33781. When doing a chequer play rollout from the hint window, destroy the rollout window when the user hits "Stop" or the rollout finishes. This is the same behavior as doing "Rollout" from the move list in the game record pane. Fix similar issue with cube rollout. Please see https://savannah.gnu.org/bugs/index.php?33781 for additional comments and other coding options to resolve these issues 2011-08-20 Philippe Michel * eval.c: Improve evaluation of late bearoff positions in match play. Problem reported by Neil Robins (in 2009). 0- and 1-ply can still be way off if there is an impending automatic redouble but evaluations with deeper lookahead should be adequate. 2011-08-20 Michael Petch * gnubg.c: Fixed bug #33781. When doing a chequer play rollout from the hint window, detroy the rollout window when the user hits "Stop" or the rollout finishes. This is the same behavior as doing "Rollout" from the move list in the game record pane. 2011-08-20 Michael Petch * gnubg.c: Fixed bug #33141. Under Windows convert file name from locale to utf8 to handle special characters in file names. 2011-08-19 Michael Petch * set.c: Fixed bug reported by Chris Yep. If you use "hint" on a Crawford position, edit the position and remove Crawford flag, and click "Hint" it used the previous position info and produced identical results. Also occurred if using "set crawford" command directly. 2011-08-18 Michael Petch * configure.in, Makefile.am, gnubgmodule.c: Fixed build issues with Mingw/Msys environment. MingW doesn't output Binary data by default to stdout. Use makeweights "-f" argument to output proper binary weights files. On Windows path names need to be properly escaped when passed to the Python interpreter. 2011-08-16 Michael Petch * sound.c, configure.in: Play CoreAudio sounds in the background on OS/X builds. Deficiency found by Louis Zulli. 2011-08-16 Philippe Michel * eval.c, eval.h: Add 4ply with large movefilter to predefined play levels. Bump grandmaster movefilter up to large. 2011-08-15 Michael Petch * Makefile.am, configure.in, util.c, board3d/Makefile.am, doc/Makefile.am: better support for Mingw/Msys windows builds. 2011-08-12 Michael Petch * play.c, gtkgame.c, gtkboard.c: Fixed bug #33866 reported by Gerhard. In 3D mode with option "Start new Games immediately" turned off, match would not continue properly if the computer offered a resignation. Also fixes the bug where the resignation flag is not cleared after accepting/rejecting a resignation. Fixed Bug #33701, #33313 - When "Start Game Immediately" option is off, resigning gets the user stuck trying to start a new game. Now allow user to click dice area on board to start new game after a resign. 2011-08-11 Michael Petch * set.c: When importing XGIDs prompt user in positions where person on roll is on top before swapping. In non interactive mode swapping will not occur. This option exists because XG2 swaps players when exporting (default), so person on roll appears on bottom. Unfortunately, XG2 does not change the XGID to account for the change. 2011-08-09 Michael Petch * play.c, gtkoptions.c: A new bug was introduced that broke canceling of a match where bot played bot (or potentially other scenario of automatic play). Fixed an old bug where canceling automated bearoff of the human didn't work properly. Cache size is now reported as MB (Megabyte) not "Mb" (Megabit). 2011-08-07 Michael Petch * set.c: Some imported XGID cube positions were not properly swapped when the board was displayed. Reported by Philippe (plm) 2011-08-07 Michael Petch * play.c: Fixed bug #33143 reported by Kevin McDonough where interrupting a forced move in 2D got into wrong state causing bot not to continue automatic play. 2011-08-03 Michael Petch * gnubgmodule.c: Add PythonParseMove function 2011-08-03 Michael Petch * set.c: Fixed the display of the board when importing XGID's so that they appear *similar* to those HTML positions pasted to websites. Reported by Leo Bueno (on BGO). Assume that most people are using XG2 and exporting with default setting "Player on roll always at the bottom". 2011-08-03 Philippe Michel * gnubg.c, gtkboard.c, play.c, set.c: More fixes to swap players feature. 2011-08-01 Philippe Michel * play.c, gnubg.c, set.c: Fixed display of SETBOARD records in the game record panel (bug #32778). Fixed Game|Swap players for games ending with a SETBOARD record (in practice, games created from a pasted id). 2011-07-29 Michael Petch * analysis.c: Previous getLuckRating change had unintended side effects when we stopped using hard coded values. Hard coded values were off by an approximate factor of 10. Although this has been fixed it may wish to be revisited as to why the values were hardcoded in this fashion originally. Reported by Chris (pck). 2011-07-17 Michael Petch * gnubgmodule.c: Fixed Python position key functions to internally call the old style position keys functions. Fixes compiler errors due to new position key changes made on 2011/07/15. 2011-07-15 Philippe Michel * positionid.c, positionid.h, lib/cache.c, lib/gnubg-types.h: Use a simpler position key for internal use. PositionKey() and PositionFromKey() are much faster. The global speed improvement is about 10%. A side effect is that the evalution cache becomes 38% larger. 2011-07-09 Philippe Michel * gnubg.c, gtkgame.c: Set players names from default_names at program launch and when pasting a position id, in addition to when starting a match. 2011-07-08 Philippe Michel * play.c: Update players names in game record panel when starting a new match. 2011-06-13 Michael Petch * analysis.c: getLuckRating was returning values based on old hard coded luck thresholds. Use the user supplied ones instead 2011-06-08 Michael Petch * gnubgmodule.c: Add new python function "DiceRolls" to return the next "n" rolls from the current RNG. 2011-05-18 Michael Petch * configure.in: --enable-threads and --enable-extmatchid are now the default. amd64 cpu types will automatically enable SSE2 2011-05-17 Michael Petch * gtkgame.c: Modify the Menu to support copying of GNUBGID's, as well as the MatchId or positionID's individually. 2011-05-17 Michael Petch * configure.in: Modify the ./configure process to now enable Extended match ID's by default. They can be disabled with --disable-extmatchid 2011-05-17 Michael Petch * gnubg.c, backgammon.h, gtkfile.c, gtkrelational.c: The word "Relational" has been removed from the GUI when referring to the database. This makes more sense to the casual users. Fixed the situation where a Batch sometimes had to be preceded by a clear match/session. Fixed bug reported by Leo that prevented matches being analysed with incomplete analysis settings. Fixed bug reported by Leo Bueno that prevented matches that may not have been played to completion from being analysed. Added Warning if you use incomplete analysis settings and have requested to save the matches to the database 2011-05-13 Philippe Michel * eval.c, lib/inputs.c (new file), lib/Makefile.am: Computation of baseInputs() with SSE. The code was already there in eval.c, but commented out. 2011-05-08 Philippe Michel * lib/gnubg-types.h, lib/cache.h, lib/cache.c, backgammon.h, positionid.h, positionid.c, analysis.c, eval.c, export.c, eval.h, gnubg.c, gnubgmodule.c, gtkboard.c, gtkpanels.c, import.c, play.c, rollout.c, set.c, sgf.c, makebearoff.c, makehyper.c: Use a defined type for the position key. Small speed up with faster EqualKeys and CopyKey macros. 2011-04-10 Michael Petch * board3d/drawboard3d.c board3d/fun3d.h board3d/shadow.c: Converted int to GLint where appropriate to avoid compiler warnings about incompatible types in certain build environments. 2011-04-09 Philippe Michel * gtkexport.c, gtkgame.c, gtktempmap.c: Alter some pop-up panels that were too tall too be usable on smaller screens (the OK button was below the bottom of the display). Affected are Settings|Export, Settings|Rollouts and Analyze|Temperature Map. 2011-04-08 Michael Petch * gtkprefs.c: Fixed bug that disallowed import/export board designs from using file names with paths that had spaces on Windows (WIN32) platform. 2011-04-08 Michael Petch * gtkgame.c, play.c: Fixed bug that didn't update the cube properly when navigating from a non crawford game to crawford game. Reported by Ongun Alsac. 2011-04-06 Michael Petch * configure.in, board3d/font3d.c, board3d/inc3d.h: Added better 3dboard autoconf support for Apple build environments. Use Apple OpenGL, and add appropriate check for GTK X windows headers. GTK does not necessarily rely on X as a backend. 2011-04-06 Michael Petch * gnubg.c: Fixed WIN32 specific bug that caused command filenames with spaces to not be processed. Reported by Nardy. 2011-03-23 Michael Petch * gtkboard.c, play.c, gtkgame.c: Fixed bug that caused crawford flag to be unset in the GUI if you changed to a crawford game in the game list. Reported by Phillipe Michel. Fixed bug that caused a new money session to not correctly use the global Jacoby setting in some cases. 2011-03-23 Michael Petch * gtkboard.c: Update global match state with changes in score made through edit mode. Fixes hint/edit bug reported by Pierre Zakia 2011-03-23 Michael Petch * gtkboard.c: Did cleanup of new Jacoby code. Modified the edit GUI to enforce proper Crawford settings when editing. If scores and match length make Crawford impossible, disable Crawford toggle and turn off Crawford until settings make it possible 2011-03-22 Michael Petch * gnubg.c, gtkgame.c, gtkboard.c, matchid.c, play.c set.c, gtkboard.h: Improve support for Jacoby. - When using extended Match ID's - Jacoby comes from the ID, - When using regular ID's Jacoby is decided by the global "Jacoby" setting in options. - Fixed bug with Jacoby being read from an extended ID. - Added Jacoby flag to the table. When MatchLen is 0 (money session) Crawford flag replaced by Jacoby and vice versa. - Fixed some editing issues with Crawford 2011-03-22 Michael Petch * gtkgame.c, simpleboard.c, gnubgmodule.c, matchid.c matchid.h, configure.in, play.c : Began adding support for an extended matchID that includes Jacoby. While in testing phase ./configure supports --enable-extmatchid and a USE_EXTENDEDMATCHID define in config.h. By default builds do not have this feature turned on. 2011-03-20 Philippe Michel * gnubg.c: Fixed missing handling of MOVE_SETBOARD records in swapGame(). Needed for single positions (bug #32272) and games with illegal moves. 2011-03-19 Philippe Michel * set.c: Don't change the global Jacoby setting when pasting a XGID. 2011-03-17 Michael Petch * gtkgame.c : Fixed ClipBoard copy from the Match statistics dialog that caused both players data to be the same. Added player names to the match statistic tables (treeviews). Reported by Boomslang 2011-03-17 Philippe Michel * positionid.h, eval.c: Speed improvements. 2011-03-16 Michael Petch * gnubgmodule.c : Added GNUBG python module functions: gnubgid, matchid, posinfo ToDo: xgid 2011-03-14 Michael Petch * gnubg.c, sound.c, configure.in : Added support for Apple CoreAudio sound on platforms that are supported. CoreAudio takes precedence over QuickTime. This should allow for native 64bit builds without the need for an external sound player. 2011-03-10 Michael Petch * gnubg.c: Fixed bug with random numbers being read from www.random.org preventing GNUBG from exiting. We now skip HTTP headers and make sure we don't read more numbers than the dice array can hold. Reported by Leo Bueno. 2011-03-07 Michael Petch * board3d/drawboard3d.c: Fixed array indexing issue in drawDice that would cause hangs/crashes on OS/X when "set gui dicearea on" with 3D boards were on. Crash would occur during program startup. May be related to fix committed on 2009-03-26 by Christian. Reported by Pierre Viau. 2011-03-04 Michael Petch * gtkgame.c: Fixed problem with language change getting stuck in loop 2011-02-24 Philippe Michel * gnubg.c: In Tutor/Hint, always evaluate the tried move at the deepest ply. Problem pointed by Michael Depreli in bug-gnubg. 2011-02-14 Philippe Michel * sgf.c, eval.h (comment only), gtkgame.c, gnubg.c, analysis.c: Fixed crash when loading a take or drop saved as a position (bug #32270). Mon Feb 14 21:11:28 CET 2011 Christian Anthon * backgammon.h, commands.inc, gnubg.c, gtkchequer.c, gtkcube.c, gtkexport.c, gtkfile.c, gtkgame.c, gtkmet.c, gtkmovefilter.c, gtkoptions.c, gtktoolbar.c, gtkwindows.c, play.c, set.c: Have different default and current player names. Only change default player names in dialog, not in edit mode. Attempt to autosave settings. Mon Feb 14 18:05:09 CET 2011 Christian Anthon * sound.c: Fix sound in cl interface (unix) 2011-02-13 Philippe Michel * play.c: Fix display of MOVE_SETCUBEPOS in game record panel. Sat Feb 12 22:19:18 CET 2011 Christian Anthon * gtkgame.c: Just one clist to go. 2011-02-10 Philippe Michel * po/ro.po, configure.in, gtkgame.c, flags/romania.png, flags/Makefile.am : Romanian translation by Mihai Varzaru. 2011-02-09 Philippe Michel * eval.c: Small speed improvements. 2011-02-08 Philippe Michel * eval.c, lib/neuralnetsse.c, lib/neuralnet.h : Řystein Johansen's patch to handle a different number of hidden nodes with SSE. Tue Feb 8 20:23:42 CET 2011 Christian Anthon * Makefile.am, backgammon.h, commands.inc, gtkgame.c, R record.c, R record.h: remove the rest of old player records Tue Feb 8 19:54:13 CET 2011 Christian Anthon : : * gtkgame.c: cleanup after previous commit * progress.c: convert the rollout clist to tree view, sortable and simpler, but fewer details than before. Tue Feb 8 19:16:12 CET 2011 Christian Anthon : * gtkgame.c, gtkgame.h: update the evaluation summary to gtk_combo_box Tue Feb 8 18:24:42 CET 2011 Christian Anthon * gtkmovefilter.c: update movefilter selection to gtk_combo_box Tue Feb 8 17:58:05 CET 2011 Christian Anthon * gtkgame.c: update the stats navigation to gtk_combo_box Sun Feb 6 21:04:11 CET 2011 Christian Anthon * Makefile.am, configure.in, gnubgstock.c, gnubgstock.h, gtkgame.c, gtkpanels.c, gtktoolbar.c, gtkwindows.c, gtkwindows.h, pixmaps/Makefile.am, pixmaps/gnubg-stock-pixbufs.h, pixmaps/24x24/actions/anti_clockwise_24.png, pixmaps/24x24/actions/clockwise_24.png, pixmaps/24x24/actions/new0_24.png, pixmaps/24x24/actions/new11_24.png, pixmaps/24x24/actions/new13_24.png, pixmaps/24x24/actions/new15_24.png, pixmaps/24x24/actions/new17_24.png, pixmaps/24x24/actions/new1_24.png, pixmaps/24x24/actions/new3_24.png, pixmaps/24x24/actions/new5_24.png, pixmaps/24x24/actions/new7_24.png, pixmaps/24x24/actions/new9_24.png, pixmaps/24x24/actions/resignsb_24.png, pixmaps/24x24/actions/resignsg_24.png, pixmaps/24x24/actions/resignsn_24.png, R xpm/*: Cleanup of the pixmaps Sat Feb 5 18:27:35 CET 2011 Christian Anthon * gtkpanels.c: one less clist Wed Feb 2 22:00:24 CET 2011 Christian Anthon * gtkgame.c: one less clist. 2011-01-30 Philippe Michel * export.c, commands.inc, file.c, backgammon.h : Export games and matches in Snowie standard text format. 2011-01-23 Philippe Michel * positionid.h : Speed improvement. 2011-01-20 Philippe Michel * export.c : More robust .mat export in case of illegal moves. Stepping stone to Snowie standard text export. 2011-01-10 Philippe Michel * latex.c: Escapes characters reserved by TeX/LaTeX (%, $, _, etc...) + other minor fixes. * gnubg.c, html.c, latex.c, text.c : Should avoid ??-numbered moves in exports. 2011-01-05 Philippe Michel * gtkmovefilter.c, gtktheory.c: Prevent warnings about deprecated usage of GtkSpinButton that appeared with a recent GTK2 update. * gtkgame.c: Decrease absurdly high page_increments in some GtkSpinButtons. * gtktheory.c: Decrease a page_increment that seemed too high. 2010-12-21 Philippe Michel * import.c: Fix handling of resignations in .mat files created by eXtreme Gammon. 2010-11-29 Philippe Michel * gtkcube.c: More unwarranted assertion failures. * speed.c: Fix speed calibrating. 2010-11-21 Philippe Michel * rollout.c: Fix for crashes in rollouts. This is essentially Guido Flohr's patch from the discussion of bug #29880. * gtkcube.c: Avoid assertion failure when asking for a cube decision hint after rolling the dice. Bug #31713. 2010-11-13 Philippe Michel * gtktempmap.c: Retain temperature map's checkboxes status (for a given instance, not in gnubgautorc). Bug/wish #27150. 2010-11-11 Philippe Michel * rollout.c: In multithreaded rollouts, make every alternative stop at the right number of trials instead of when the speediest one reaches it. * progress.c, format.c, format.h, gnubg.c: fix TextOutputProgress() display of match cubes (bug #27149). 2010-11-01 Philippe Michel * play.c: workaround for bug #27178 * backgammon.h, commands.inc, gtkgame.c, html.c: copy position as URL to image.backammonbase.com. Submitted by Noriyuki Hosaka : http://lists.gnu.org/archive/html/bug-gnubg/2010-04/msg00024.html 2010-10-31 Philippe Michel * play.c: don't do luck analysis while playing as highlighting very lucky or unlucky rolls in the game record panel gives away big equity swings. http://lists.gnu.org/archive/html/bug-gnubg/2010-06/msg00034.html * eval.h, eval.c, gtkoptions.c: bump up evaluation cache size default x4 to 21Mb, maximum settable from GUI x2 to 336Mb 2010-10-29 Philippe Michel * NEWS, dice.c, eval.c, gtkpanels.c, show.c: typos Picked from Debian and FreeBSD ports. 2010-10-17 Philippe Michel * file.c: Fix in automatic import. Detect sgg now. * gtkfile.c: In the Open File panel, with supported files filters, show both lowercase and uppercase file extensions. 2010-09-27 Philippe Michel * set.c: XGIDs with large cubes were not correctly decoded Wed Jul 28 16:42:36 CEST 2010 Christian Anthon * set.c: checkers weren't swapped when reading XGIDs Fri Jul 16 21:52:51 CEST 2010 Christian Anthon * gtkboard.c: Allow rolling on both sides and start new game/match as appropriate Fri Jul 16 18:12:30 CEST 2010 Christian Anthon * gtkboard.c: fix redraw bug when navigating an unfinished move where dice are rolled. Fri Jul 16 14:03:13 CEST 2010 Christian Anthon * render.c: fix clockwise display. Bar was reversed. Mon Jul 5 20:00:46 CEST 2010 Christian Anthon * format.c: fix text output of rolled out cube analysis Mon Jul 5 19:39:35 CEST 2010 Christian Anthon * play.c: remove TurnDone from CancelCubeAction. Fixes a batch analyse bug. Fri Jun 25 16:00:08 CEST 2010 Christian Anthon * gtkfile.c: Show the discard dialog before batch analyse starts. Fri Jun 25 10:49:12 CEST 2010 Christian Anthon * backgammon.h, commands.inc, gnubg.c, gtkboard.c, set.c: support for xg ids - please test Thu Jun 24 01:31:48 CEST 2010 Christian Anthon * analysis.c: don't refind move, when none made Sun Jun 20 17:42:38 CEST 2010 Christian Anthon * analysis.c: refind made move after cmark_rollout Sat Jun 19 09:22:16 CEST 2010 Christian Anthon * eval.c, import.c: Fix a counting error in the import match code. Ask if you want to try another variation after the first one fails. 2010-06-02 Philippe Michel * commands.inc, file.c: if an export format is not supported by the build, #if it out of the UI. * configure.in, export.c, gnubgmodule.c : patches by Christopher Hofmann via bug-gnubg@gnu.org 2010-05-29 Philippe Michel * rollout.c: partial fix for stop-on-jsd criterion From http://lists.gnu.org/archive/html/bug-gnubg/2010-01/msg00041.html * matchequity.c: wasteful computations in GetPoints() Pointed by Massimiliano Maini in http://lists.gnu.org/archive/html/bug-gnubg/2009-07/msg00002.html 2010-05-26 Philippe Michel * gtkgame.c: compiles again with pre-2.12 GTK From http://lists.gnu.org/archive/html/bug-gnubg/2009-11/msg00016.html 2010-05-23 Philippe Michel * gtkpanels.c: Crawford game highlighted in the games pulldown in the Game record panel. Bug #28463. * rollout.c: change "Stop when STD is small enough" criterion for rollouts. Parameter is stdev of equity, not the ratio of stdev/value for every output. See rationale at http://lists.gnu.org/archive/html/bug-gnubg/2009-02/msg00035.html and http://lists.gnu.org/archive/html/bug-gnubg/2009-10/msg00159.html * gtkgame.c: GUI change * gnubg.c, sgf.c: older default values for maxerr become inadequate 2010-05-08 Philippe Michel * text.c: fix double output of match statistics in plain text export 2010-05-03 Philippe Michel * gnubg.c: use Rockwell-Kazaross MET by default Tue Dec 29 19:56:07 CET 2009 Christian Anthon * rollout.c: minor fixes: a) check jsd's before rollout b) fix a minor jsd bug where the number of trials where checked for the wrong alternative. c) allow trials to catch up when extending rollouts Tue Dec 29 07:36:41 MST 2009 Michael Petch : * gnubg.c: Fix random.org buffer overrun, Cleanup code and add appropriate User-Agent string Wed Dec 23 22:34:19 CET 2009 Christian Anthon * gnubg.c: random.org has been restructered, update the GET accordingly Sat Dec 12 15:25:58 CET 2009 Christian Anthon * gtktoolbar.c: reset of board when entering edit mode didn't work Mon Nov 30 19:54:56 CET 2009 Christian Anthon * gtkgame.c: add keyboard short-cuts to marked navigation menu items Tue Nov 24 21:51:56 CET 2009 Christian Anthon : * gtkrolls.c: fix a bug where the printed average equity was wrong when MWC printed as EM Sat Nov 21 21:56:58 CET 2009 Christian Anthon * gtkoptions.c, gtkpanels.c: Minor warnings, fix resizing of commentary panel. Fri Nov 13 23:30:00 2009 Jon Kinsey * gtkoptions.c, dice.c: Simplify dice entry method dialog Tue Nov 03 17:30:00 2009 Jon Kinsey * gtkgame.c, gtkboard.c: Improve manual dice selection colours and text Sat Oct 31 21:48:27 CET 2009 Christian Anthon * backgammon.h, gtkgame.c, import.c, timer.c: dnd didn't work under linux at all. Plus minor compiler warnings. Thu Oct 29 11:30:00 2009 Jon Kinsey * gtkgame.c: Allow files to be dropped onto gnubg to open them Bug #27685 suggested by Eric. Mon Oct 26 16:30:00 2009 Jon Kinsey * render.c, gtkboard.c + others: Sort out 2d dice colours when in 3d mode Sun Oct 18 12:30:00 2009 Jon Kinsey * gtkgame.c: Sort out full screen transitions Tue Oct 13 19:30:00 2009 Jon Kinsey * gtkgame.c, gtkboard.c + others: Move gnubgid into status bar Mon Oct 12 21:30:00 2009 Jon Kinsey * gtkgame.c: Simplify player and rollout evaluation settings Fri Oct 9 15:46:17 CEST 2009 Christian Anthon * analysis.c: error in last checkin source and dest reversed Wed Oct 7 21:17:04 CEST 2009 Christian Anthon * analysis.c: protect movelist during autosave Tue Oct 2 04:32:27 MDT 2009 Michael Petch * progress.c: Fix assert/crash when doing a single rollout when no stopall button is present Thu Oct 1 23:04:28 CEST 2009 Christian Anthon * analysis.c, backgammon.h, commands.inc, external.c, gnubg.c, gtkgame.c, gtkoptions.c, gtkprefs.c, gtksplash.c, import.c, multithread.c, multithread.h, play.c, rollout.c, set.c, sgf.c, show.c, speed.c: add autosave functionallity during analysis and rollout. disabled by default -- needs testing. Thu Oct 1 15:18:32 CEST 2009 Christian Anthon * gtktoolbar.c: remove labels from navigation buttons and add previous marked and cmarked buttons. Wed Sep 30 08:57:54 CEST 2009 Christian Anthon * gtkfile.c: quote filename input to Open Commands Wed Sep 30 00:07:22 CEST 2009 Christian Anthon * analysis.c, gnubg.c, gtkchequer.c, gtkcube.c, gtkgame.c, progress.c, progress.h: add button to stop all cmarked rollouts. Fix a few minor cmark navigation problems Tue Sep 29 21:45:37 CEST 2009 Christian Anthon * simpleboard.c: fix a language problem with fonts Wed Sep 23 23:18:09 CEST 2009 Christian Anthon * gtkgame.c: fix problem with inactive navigation buttons Wed Sep 23 23:15:00 CEST 2009 Christian Anthon * gtkgame.c: only update eval/hint settings when sameasanalysis is uncticked. Wed Sep 23 23:07:10 CEST 2009 Christian Anthon * analysis.c, eval.c, evallock.c, gnubg.c, multithread.c, multithread.h, progress.c, rollout.c: use mt rollout code for non-threaded rollouts. Only generate unlocked code with --disable-threads Mon Sep 21 09:41:27 CEST 2009 Christian Anthon * analysis.c, backgammon.h, gnubgmodule.c, gnubgstock.c, gnubgstock.h, gtkgame.c, gtkpanels.c, gtktoolbar.c, play.c, pixmaps/Makefile.am, pixmaps/gnubg-stock-pixbufs.h, pixmaps/16x16/actions/go-prev-marked_16.png, pixmaps/16x16/actions/go_next_16.png, pixmaps/16x16/actions/go_next_cmarked_16.png, pixmaps/16x16/actions/go_next_game_16.png, pixmaps/16x16/actions/go_next_marked_16.png, pixmaps/16x16/actions/go_prev_16.png, pixmaps/16x16/actions/go_prev_cmarked_16.png, pixmaps/16x16/actions/go_prev_game_16.png, pixmaps/16x16/actions/go_prev_marked_16.png, pixmaps/24x24/actions/go-prev-marked_24.png, pixmaps/24x24/actions/go_next_24.png, pixmaps/24x24/actions/go_next_cmarked_24.png, pixmaps/24x24/actions/go_next_game_24.png, pixmaps/24x24/actions/go_next_marked_24.png, pixmaps/24x24/actions/go_prev_24.png, pixmaps/24x24/actions/go_prev_cmarked_24.png, pixmaps/24x24/actions/go_prev_game_24.png, pixmaps/24x24/actions/go_prev_marked_24.png, pixmaps/scalable/actions/go_next_cmarked.svg, pixmaps/scalable/actions/go_next_marked.svg, pixmaps/scalable/actions/go_prev_cmarked.svg, pixmaps/scalable/actions/go_prev_marked.svg: add cmark navigation, move navigation toolbar to main toolbar. Works best with toolbar->icons only. Fri Sep 18 11:40:40 CEST 2009 Christian Anthon * Makefile.am, backgammon.h, configure.in, dbprovider.c, dbprovider.h, gnubg.c, gtkgame.c: allow compiling without sqlite even when found. Notice that HAVE_SQLITE is now USE_SQLITE in your config.h Fri Sep 18 00:37:23 CEST 2009 Christian Anthon * gtkcube.c: Print cubeless details in take/drop for EVAL_ROLLOUT. Wed Sep 16 23:30:00 2009 Jon Kinsey * gtkgame.c + others: Simplify analysis gui settings Tue Sep 13 06:30:12 MDT 2009 Michael Petch * eval.c: Properly initialize all thread specific data to NULL Tue Sep 13 00:03:19 MDT 2009 Michael Petch * analysis.c: Fixed non threaded build errors Sat Sep 12 21:41:50 CEST 2009 Christian Anthon * gtkchequer.c: Update board on MoveListMove to allow it to work with tutor. Sat Sep 5 14:10:46 CEST 2009 Christian Anthon * gtkmovelist.c: Fix a bug where worst move were reported as outside the list. Tue Sep 4 00:48:46 MDT 2009 Michael Petch * eval.c: Increased bits for score keys to allow appropriate hashing for matches up to 64away-64away corresponding to the current maximum match length of 64. Tue Sep 4 00:41:50 MDT 2009 Michael Petch * sgf.c: FIXED: cmark data is not restored properly when an SGF file is opened. The last candidate move for each position will lose its cmark status. Tue Sep 1 22:41:46 CEST 2009 Christian Anthon * gnubgmodule.c: Avoid calling PyRun_File to allow linking against official windows python. Needs testing. Tue Sep 1 21:12:24 CEST 2009 Christian Anthon * eval.c, eval.h, gtkgame.c, rollout.c, rollout.h: silence prototype warnings Tue Sep 01 19:30:00 2009 Jon Kinsey * eval.c: Remove noise entry from cache key and increase plies size Tue Sep 01 19:00:00 2009 Jon Kinsey * various files: Remove the (currently unused) reduction evaluation code. Sun Aug 30 22:00:00 2009 Jon Kinsey * eval.c/.h, rollout.c/.h, cache.c/.h, multithread.c: Try to speed up single threaded code in multi-threaded build. Sat Aug 22 22:50:38 CEST 2009 Christian Anthon * backgammon.h, commands.inc, format.c, gnubg.c, gtkgame.c, rollout.c, set.c: Simplify stop on jsd by just having one option. Sat Aug 22 22:40:22 CEST 2009 Christian Anthon * gnubg.c: silence unknown keyword error during load of rc files Fri Aug 21 23:02:38 CEST 2009 Christian Anthon * play.c: fix problems with storing computer cube evals Fri Aug 21 18:22:55 CEST 2009 Christian Anthon * gnubg.c: check for et == EVAL_NONE before displaying skills Fri Aug 14 21:05:09 CEST 2009 Christian Anthon * dbprovider.c: width has size of size_t, which is different from int on 64 bit platforms causing crash on db lookup Tue Aug 11 22:45:52 CEST 2009 Christian Anthon * analysis.c, backgammon.h, commands.inc, gnubg.c, gtkgame.c, set.c, show.c: Remove set analysis move limit. Didn't do any good. Mon Aug 10 21:15:32 CEST 2009 Christian Anthon * eval.c: more or less revert to a cleaned up version of FindBestMoveInEval, but declare pm a volatile pointer. Sat Aug 8 20:07:51 CEST 2009 Christian Anthon * gnubg.c: hint didn't annotate MOVE_DROP Sat Aug 8 14:42:20 CEST 2009 Christian Anthon * eval.c: clean up the prune evaluation function (FindBestMoveInEval) and circumvent a compiler bug causing invalid prune evaluation on certain systems using gcc compiler optimization. This is a critical function and should be optimized further if possible. Thu Aug 6 10:44:28 CEST 2009 Christian Anthon * play.c: destroy pmr_hint on changed dice Wed Aug 5 18:21:59 CEST 2009 Christian Anthon * gnubgmodlule.c: remove inline from DictItemSteal, isn't inlined by gcc, and pointless anyway. Mon Aug 3 23:57:49 CEST 2009 Christian Anthon * gnubg.c, gtkgame.c, gtksplash.c, show.c, util.c, util.h: add options to specify datadir, pkgdatadir and docdir Tue Jul 21 11:52:24 CEST 2009 Christian Anthon * backgammon.h, commands.inc, gnubg.c: add command to turn off output Thu Jul 16 22:55:06 CEST 2009 Christian Anthon * po/da.mo, progress.c: port rollout stat page to gtk_tree_view Thu Jul 9 21:12:42 CEST 2009 Christian Anthon * play.c: fix a problem with disappearing dice when Previous reaches game border and let Next and Previous Marked skip game borders Tue Jul 07 12:00:00 2003 Jon Kinsey * gtkgame.c: Tidy stop button Tue Jun 30 12:00:00 2003 Jon Kinsey * neuralnet.c, gnubg.c, eval.c: Simplify SSE, now it's either supported or it isn't Tue Jun 30 09:10:24 CEST 2009 Christian Anthon * po/da.mo, board3d/Makefile.am, po/POTFILES.in, po/cs.po, po/da.po, po/de.po, po/en_US.po, po/es.po, po/fr.po, po/gnubg.pot, po/is.po, po/it.po, po/ja.po, po/ru.po, po/tr.po: update the danish translation and remove misc3d.h from Makefiles and POTFILES.in Mon Jun 29 20:00:00 2003 Jon Kinsey * neuralnet.c, gnubg.c: Add check for SSE2 Thu Jun 25 22:50:54 CEST 2009 Christian Anthon * gnubg.c, gtkfile.c: fix a problem with translated text in the save dialog used for the "save" command. Wed Jun 24 22:19:44 CEST 2009 Christian Anthon * backgammon.h, commands.inc, gtkgame.c, play.c, set.c: add a menu point to clear turn (dice and cubes) and add the functionally to the dice widget as a button. Mon Jun 22 05:47:27 CEST 2009 Michael Petch * configure.in, lib/neuralnetsse.c, fixed SSE2 build problems and defaulted Apple OS/X i386 builds to use SSE2 Sun Jun 21 23:21:36 CEST 2009 Christian Anthon * configure.in, lib/neuralnetsse.c, lib/sigmoid.h: check Řysteins sigmoid SSE2 patch in. Sun Jun 14 22:00:00 2003 Jon Kinsey * positionid.c: Rewrite position key functions (hopefully faster) Sat Jun 13 02:04:28 CEST 2009 Christian Anthon * err? gmon.out, Makefile.am, Makefile.w32, TODO, configure.in, matchequity.c, matchequity.h, board3d/Makefile.am, board3d/Makefile.win, board3d/drawboard3d.c: minor cleanups after removal of libxml code Wed Jun 12 23:00:00 2003 Jon Kinsey * matchequity.c: Replace libxml code that reads met (code from Řystein) Fri May 8 14:29:05 CEST 2009 Christian Anthon * import.c: fix tmg import of resigns Fri May 8 13:08:57 CEST 2009 Christian Anthon * gnubg.c, html.c, latex.c, text.c: checkin of Philippe Michel's export patch. Wed May 6 21:24:09 CEST 2009 Christian Anthon * gtkfile.c, gtkfile.h, gtkgame.c: Re-implement the load commands menu item Wed May 6 15:44:22 CEST 2009 Christian Anthon * gnubg.c: too good to redouble-pass errors didn't get annotated Tue May 5 22:55:53 CEST 2009 Christian Anthon * backgammon.h, commands.inc, eval.c: add command to clear cache for test purposes Tue May 5 18:08:56 CEST 2009 Christian Anthon * gtktempmap.c: fix font size for locales using comma Sun Apr 26 23:01:07 CEST 2009 Christian Anthon * format.c, format.h, gnubg.c, html.c, progress.c, progress.h, rollout.c, rollout.h: Fix the rollout timer to allow for stopped rollouts and differing number of games done. Print the rollout context in the text progress. Sun Apr 26 01:02:06 CEST 2009 Christian Anthon * rollout.c: mt rollouts stopped one short of the minum number of trials when using jsd or sd criteria. Sat Apr 25 22:01:35 CEST 2009 Christian Anthon * AUTHORS, credits.sh, non-src/credits.c: Add Ingo Macherius to list of code contributors. Fri Apr 24 21:55:27 CEST 2009 Christian Anthon * gnubg.c, renderprefs.c, renderprefs.h: Clean the CommandSaveSettings function up, and fix a (gtk) bug where saving the settings would pop an error message about resource unavailable. Wed Apr 22 18:28:09 CEST 2009 Christian Anthon * progress.c: show the number of trials finished for each of candidates Tue Apr 21 01:08:20 CEST 2009 Christian Anthon * import.c: match wasn't cleared before import of mat files Mon Apr 20 17:46:37 CEST 2009 Christian Anthon * gtkboard.c, play.c: fix a minor problem in quick_roll and dont' call CommandPlay when clicking during computer turn (may crash) Mon Apr 20 17:42:19 CEST 2009 Christian Anthon * gtkrace.c, osr.c: only perform automatic osr when the position is a race and fix a problem in osr with chequers in the 3rd or 4th quadrant Sat Apr 18 23:45:02 CEST 2009 Christian Anthon * gtkchequer.c, play.c: fix two problems with the update of skill labels reported by Philippe Michel. Sat Apr 18 22:29:37 CEST 2009 Christian Anthon * gtkgame.c: set shrink FALSE in the panel pane * rollout.c: fix typo in jsd check causing cube rollouts to stop early Wed Apr 15 19:51:11 CEST 2009 Christian Anthon * import.c: check for bg variations when importing mat. Sun Apr 5 17:16:41 CEST 2009 Christian Anthon * gtkboard.c, gtkgame.c: add labels to the manual dice widget Fri Apr 3 22:04:43 CEST 2009 Christian Anthon * gtkboard.c: Use the player's dice color to chose who wins the opening roll with manual dice. Fri Apr 3 21:45:17 CEST 2009 Christian Anthon * gnubgmodule.c, gtkprefs.c, import.c, multithread.c, play.c, relational.c, text.c: minor compile stuff, an error in the last checkin, and ifdef WIN32 the align in multithread.c Fri Apr 3 13:59:50 CEST 2009 Christian Anthon * backgammon.h, gtkboard.c, gtkchequer.c, play.c: CommandMove didn't accept moves of type 25/16. Thu Apr 2 23:33:25 CEST 2009 Christian Anthon * play.c: hopefully fix a crash related to canceling of manual dice Thu Apr 2 22:32:14 CEST 2009 Christian Anthon * play.c: fix a crash (assert in getCubeDecisionOrdering) when updating the current game annotions. Thu Apr 2 10:13:47 CEST 2009 Christian Anthon * gnubg.c: hint - don't update annotation when working through tutor Wed Apr 1 17:41:13 CEST 2009 Christian Anthon * gtkoptions.c: display options was added twice and rng was update even if unchanged Mon Mar 30 13:52:31 CEST 2009 Christian Anthon * gtkgame.c: rc files should be added before gtk_init Mon Mar 30 10:46:29 CEST 2009 Christian Anthon * gtkgame.c: add highligting to the skill label when take/drop Sun Mar 29 21:25:51 CEST 2009 Christian Anthon * gnubgmodule.c: Avoid calling PythonNextTurn in PythonCommand, since PythonNextTurn always plays the next turn, and the command doesn't imply that. Sun Mar 29 15:50:38 CEST 2009 Christian Anthon * dice.c, dice.h, gnubg.c, play.c, rollout.c: fall back to mersenne twister if dice generator fails Sat Mar 28 23:12:15 CET 2009 Christian Anthon * analysis.c, gnubg.c, gtkcube.c, gtkgame.c: minor fixes to hint/analysis of games with beavers: account for initial double in statistics, but not the following ones and show the take/beaver widget when applicable (i.e. not for raccoons). Sat Mar 28 22:49:14 CET 2009 Christian Anthon * play.c: fix to find the dice after updating the gamelist Sat Mar 28 22:42:43 CET 2009 Christian Anthon * gtkoptions.c, show.c: fix tooltips for rngs and refactor the options page function Sat Mar 28 22:30:41 CET 2009 Christian Anthon * m4/az_python.m4: detect python2.5 and python2.6 Sat Mar 28 22:16:21 CET 2009 Christian Anthon * commands.inc, gnubg.c: fix a few command help strings Sat Mar 28 22:11:39 CET 2009 Christian Anthon * eval.c: delete a debug message and reformat a few things Thu Mar 26 13:56:00 CET 2009 Christian Anthon * gtkboard.c: don't call update_move in board size allocation, leads to a hang. Thu Mar 26 11:48:33 CET 2009 Christian Anthon * analysis.c, eval.c, play.c, sgf.c: make hint and cmark features work together and fix save match / hint bug report by Philippe Michel. Wed Mar 25 22:30:30 CET 2009 Christian Anthon * eval.c, play.c: sort moves according to "back" chequer as a last resort in analysis and computer moves to avoid some silly looking moves when the game is over, but not resigned yet. Wed Mar 25 11:48:28 CET 2009 Christian Anthon : * gtkboard.c, gtkoptions.c: minor pips/epc display changes Wed Mar 25 11:05:57 CET 2009 Christian Anthon * backgammon.h, eval.c, gtk-multiview.c, gtkgame.h, html.c, relational.c: fix minor compiler warnings Wed Mar 25 00:44:46 CET 2009 Christian Anthon * analysis.c, analysis.h, backgammon.h, commands.inc, formatgs.c, formatgs.h, gnubg.c, gtkgame.c, html.c, record.c, record.h, relational.c, relational.h, text.c: Remove the player records (may still be viewed if existing). Add simple stats from the relational db to html and text exports Wed Mar 25 00:39:33 CET 2009 Christian Anthon * export.c, gnubg.c, html.c, play.c, sgf.c, text.c: don't create a hint move record when we gs!=GAME_PLAYING Mon Mar 23 09:54:12 CET 2009 Christian Anthon * gtkgame.c: gtkcubehint shouldn't be modal either. Sun Mar 22 23:33:50 CET 2009 Christian Anthon * gnubg.c, gtkchequer.c, gtkchequer.h, gtkcube.c, gtkcube.h, gtkgame.c, gtkgame.h: only update the annotation when we have a move history. * matchid.c: sign warning Sun Mar 22 22:00:17 CET 2009 Christian Anthon * gtkfile.c, relational.c : add an open button and an option to add to the relational database when done. Sun Mar 22 09:24:09 CET 2009 Christian Anthon * set.c: destroy pmr_hint in CommandSetTurn Sat Mar 21 22:44:02 CET 2009 Christian Anthon * analysis.c, analysis.h, backgammon.h, eval.h, gnubg.c, gtkboard.c, gtkchequer.c, gtkcube.c, gtkcube.h, gtkgame.c, gtkgame.h, gtkpanels.c, gtktoolbar.c, html.c, matchid.c, matchid.h, play.c, set.c, simpleboard.c, text.c, lib/gnubg-types.h: another bunch of hint related changes. Sat Mar 21 11:44:35 WEST 2009 Řystein Johansen * gtkprefs.c: Parse XML-boards with g_markup_parse. Fri Mar 20 21:37:46 WEST 2009 Řystein Johansen * boards.xml: Change encoding to UTF-8. Fri Mar 20 17:17:44 CET 2009 Christian Anthon * Makefile.am, configure.in, gnubg.c, sound.c: use libcanberra as a simple sound wrapper and remove gstreamer support Tue Mar 17 14:23:23 CET 2009 Christian Anthon * sound.c: make gstreamer sounds wait till play is ready Fri Mar 13 22:50:48 CET 2009 Christian Anthon * backgammon.h, gnubg.c, gtkchequer.c, gtkchequer.h, gtkcube.c, gtkcube.h, gtkgame.c, gtkgame.h, gtkgamelist.c, html.c, play.c: fix the color for chosen move problem. Attempt to keep the gamelist annotation marks up to date. Fri Mar 13 17:23:57 CET 2009 Christian Anthon * gtkgame.c, gtkmovelist.c, gtkmovelistctrl.c: fix double-click move in movelist crash. Add star to mark chosen move. Thu Mar 12 22:08:49 CET 2009 Christian Anthon * analysis.c, backgammon.h, commands.inc, export.c, gnubg.c, gtkgame.c, gtkoptions.c, html.c, play.c, set.c, sgf.c, show.c, text.c: hopefully fix the problems introduced by the hint changes Tue Mar 10 17:50:43 CET 2009 Christian Anthon * backgammon.h, commands.inc, gnubg.c, gtkboard.c, gtkboard.h, gtkgame.c, gtkoptions.c, renderprefs.c, set.c: minor changes to pip count display Tue Mar 10 14:08:18 CET 2009 Christian Anthon * backgammon.h, gtkgame.c: Minor changes to BUILD_DATE use Sat Mar 7 21:47:05 CET 2009 Christian Anthon * Makefile.am, backgammon.h, bearoff.c, boardpos.c, commands.inc, common.h, configure.in, dice.c, dice.h, gnubg.c, gtkgame.c, gtkmovelistctrl.c, gtkoptions.c, htmlimages.c, import.c, render.c, set.c, show.c userrng.c, board3d/gtkcolour3d.c, lib/md5.h: Various autoconf centered cleanups. Wed Mar 4 23:07:11 CET 2009 Christian Anthon * backgammon.h, credits.sh, gnubg.c, gtkgame.c: use configurable BUILD_DATE instead of __DATE__ to mark the build. Update copyright notice. Tue Mar 3 14:19:11 CET 2009 Christian Anthon * Makefile.am, configure.in, m4/az_python.m4: improve python detection Tue Mar 3 13:53:25 CET 2009 Christian Anthon * htmlimages.c, render.c: allow compilation without cairo Tue Mar 3 13:42:13 CET 2009 Christian Anthon * bearoff.c, gtksplash.c: minor cleanup * gtkprefs.c, matchequity.c: allow compiling without xml Mon Mar 2 10:35:14 CET 2009 Christian Anthon * eval.c, eval.h, osr.c: use swap_us * osr.h, osr.c: conflicting definitions of raceProbs * gtkmet.c: the meaning of const int a[][] and const int **a is not defined in C. We need confusing casts to avoid warnings in gcc. Sun Mar 1 10:02:02 CET 2009 Řystein Johansen * makebearoff.c, bearoff.c: Repair building of onesided bearoff databases w/o gammon distributions. Fixed heuristic bearoff databases. (HEURISTIC_C => 15) Mon Feb 23 20:55:11 CET 2009 Christian Anthon * gtkcube.c: fix a bug in cubehint Sun Feb 22 23:38:44 CET 2009 Christian Anthon * backgammon.h, export.c, gnubg.c, gtkchequer.c, gtkchequer.h, gtkcube.c, gtkcube.h, gtkgame.c, gtkgame.h, gtkmovelist.c, html.c, latex.c, play.c, set.c, sgf.c, text.c: fix the hint functionality, so that it normally works on the moverecord, or at the end of the game, creates a tmp moverecord. Make sure that it is used in exports and saves. Sun Feb 22 10:02:42 CET 2009 Christian Anthon * eval.c, eval.h, gtkboard.c: fix the legal dest points function once and for all Sat Feb 21 22:05:58 CET 2009 Oystein Johansen * removed file: makebearoff.rc Wed Feb 18 00:12:58 CET 2009 Christian Anthon * analysis.c, backgammon.h, commands.inc, eval.c, eval.h, gnubg.c, gtkchequer.c, gtkchequer.h, gtkcube.c, gtkcube.h, gtkgame.c, gtkmovelist.c, gtkmovelistctrl.c, play.c, progress.c, progress.h, sgf.c: Add functionality to mark moves and cubes for rollout Sat Feb 7 09:56:10 CET 2009 Christian Anthon * po/it.po: Update the italian translation Fri Feb 6 14:02:25 CET 2009 Christian Anthon * gnubg.c, gtkgame.c, gtkwindows.c, gtkwindows.h, progress.c: Clean up the rollout command. It hardly ever did what people wanted anyway. Now only roll-outs the current position. Fri Feb 6 11:05:29 CET 2009 Christian Anthon * analysis.c, backgammon.h, commands.inc, play.c, progress.c: Add a Command "analyse rollout double". Warn if user tryes to use analyse move on a take. Print final result if user interrupts rollouts in the cl interface. Tue Feb 3 21:43:32 CET 2009 Christian Anthon * backgammon.h, play.c: remove quick_roll from non-gtk code Sun Feb 1 16:59:04 CET 2009 Christian Anthon : * gtkboard.c, play.c: New games/matches could be started when ms.gs==GAME_NONE even though the move wasn't the last in the match Sun Feb 1 16:48:01 CET 2009 Christian Anthon * htmlimages.c: fix creation of htmlimages in the export dialog Sat Jan 31 15:21:55 CET 2009 Christian Anthon * format.c, gtkchequer.c, gtkcube.c: Make the Copy button open a text window for easy display of analysis details. Thu Jan 29 09:09:16 CET 2009 Christian Anthon * analysis.c: use the right index in the new analyse rollout move function Thu Jan 29 09:07:26 CET 2009 Christian Anthon * bearoff.c: avoid assert_false when hypergammon db present Tue Jan 27 14:40:32 CET 2009 Christian Anthon * doc/allabout.xml, doc/gnubgdb.xml, doc/gnubg/allabout.html, doc/gnubg/allabout.pdf, doc/gnubg/gnubg.6, doc/gnubg/gnubg.html, doc/gnubg/gnubg.info, doc/gnubg/gnubg.pdf, doc/gnubg/gnubg.texi: Update document license to GFDL 1.3. Mon Jan 26 12:09:19 CET 2009 Christian Anthon * progress.c: jSD not printed in text interface for fCubeRollout. Mon Jan 26 10:49:56 CET 2009 Christian Anthon * rollout.c: fix stop on stds in the MT code. May well be broken in the non-MT code as well. Sun Jan 25 16:21:08 CET 2009 Christian Anthon * gtkboard.c, play.c: Clicking anywhere on the board before first match is started starts a new match. Clicking in the dice area either starts a new game or roll the dice as appropriate. Sat Jan 24 21:31:10 CET 2009 Christian Anthon * analysis.c, backgammon.h, commands.inc: Add a command to rollout the current analysed move. "analyse rollout move 1 2 3" will rollout the first three candidates in the movelist. Fri Jan 23 09:34:07 CET 2009 Christian Anthon * board3d/drawboard3d.c: Protect some function calls if shadows not initialised. Thu Jan 22 23:33:24 CET 2009 Christian Anthon * eval.c, rollout.c: Stop adding noise to EvalOver and to the variance reduction. Thu Jan 22 12:42:57 CET 2009 Christian Anthon * relational.c: Assume that sql always uses . for decimal separator in input/output. Sat Jan 17 21:57:31 CET 2009 Christian Anthon * rollout.c: Fix a small bug in BasicRollout. The first move (0-ply) in the variance reduction was cubeless, regardless of the cube setting. Only the cubeful 0-ply rollouts should be affected with infinite trials, but the variance reduction will change a bit for all rollouts. Sun Jan 11 21:32:44 CET 2009 Christian Anthon * progress.c, progress.h, rollout.c, rollout.h: The JSD printed for cube rollouts is now sensible. Top JSD for nodouble / double decision and buttom JSD for take / pass decision. (MT code only) * rollout.c: minor cleanup in JSD for cubeless possible since the cube rollouts are always cubeful. Sun Jan 11 01:06:47 CET 2009 Christian Anthon * play.c: Add warning and cancel if fDoubled is set in SetMatchID Sun Jan 11 00:07:30 CET 2009 Christian Anthon * play.c: Allow canceling of dice on the first roll a match Sat Jan 10 21:16:19 CET 2009 Christian Anthon * gtkgame.c: Make edit_new more smooth, and work with more obscure options Fri Jan 9 14:06:05 CET 2009 Christian Anthon * play.c: set matchid was missing a call to AddGame Fri Jan 9 13:00:25 CET 2009 Christian Anthon * set.c: set turn should invalidate the gtk dice as well as the match state ones. Fri Jan 9 11:29:14 CET 2009 Christian Anthon * bearoff.c: fix bug also printing 1-sided in bearoffstatus Thu Jan 8 21:32:44 CET 2009 Christian Anthon * gnubg.c, gtkgame.c: use autoimport for loading from commandline Thu Jan 8 12:25:27 CET 2009 Christian Anthon * gnubg.c, play.c, po/cs.po, po/da.po, po/de.po, po/en_US.po, po/es.po, po/fr.po, po/gnubg.pot, po/is.po, po/it.po, po/ja.po, po/ru.po, po/tr.po: Collect the check for last move in one function and let GetInputYN return TRUE when run non-interactively. Update the translations. Sat Jan 3 23:53:54 CET 2009 Christian Anthon * backgammon.h, gtkgame.c, gtkgame.h, play.c, render.c, set.c: Change confusing use of types in SetRNG, and other minor stuff Tue Dec 30 18:12:45 2008 Jon Kinsey * render.c: Minor adjustment to 2d arrow size and outline colour. Tue Dec 30 11:12:45 2008 Jon Kinsey * gtkgame.c, play.c: Add warning for simplified resign action. Tue Dec 30 00:36:27 CET 2008 Christian Anthon * gnubg.c, gtkboard.c, gtkgame.c, play.c: add "resign -1" as a command to guess the resign level and add appropriately (i.e. resign if the error is below 0.05). Use it to autoresign or pop the resign dialog in the gui. Mon Dec 29 23:12:45 2008 Jon Kinsey * gtkgame.c, gnubg.c: Fix rare crash on exit. Mon Dec 29 23:12:45 2008 Jon Kinsey * util.c: Hack GetTemporaryFile() so it will work properly. Mon Dec 29 22:06:40 CET 2008 Christian Anthon * common.h, configure.in, lib/neuralnet.c, lib/neuralnetsse.c: move replacement declarations of signbit and lrint to common.h Mon Dec 29 21:11:31 CET 2008 Christian Anthon * po/es.po: updated spanish translation Mon Dec 29 11:56:38 CET 2008 Christian Anthon * gnubg.c: turn splash screen off by default Mon Dec 29 11:36:28 CET 2008 Christian Anthon * play.c: make end game work without gtk Mon Dec 29 00:08:28 CET 2008 Christian Anthon * util.c: fix CreateTempFile to something that hopefully works universally Thu Dec 28 22:12:45 2008 Jon Kinsey * gtktoolbar.c: Fix size of edit button * gtkgame.c: Fix menu toolbar state (on startup) Sun Dec 28 01:18:17 CET 2008 Christian Anthon * eval.c: fix a bug in eval lookup in hypergammon db. iPos was (by accident) made an unsigned short int in november 2004, but should be at least an int. Fri Dec 26 00:33:04 CET 2008 Christian Anthon * gtkprefs.c, gtktoolbar.c: we don't use the old tooltip api anymore Thu Dec 18 22:12:45 2008 Jon Kinsey * gtkprogress.c: Fix bug in number of rollouts displayed when alternatives finish early (reported by Bob Koca) Wed Dec 17 22:12:45 2008 Jon Kinsey * gtkprefs.c: Replace clist control with tree view Wed Dec 17 10:12:45 2008 Jon Kinsey * util.c: Dodgy temp file fix to get export to gol working. Tue Dec 16 22:12:45 2008 Jon Kinsey * gtkmovelist.c, gtkmovelistctrl.c: Draw move analysis lines closer together. Sun Dec 14 20:12:45 2008 Jon Kinsey * gtktoolbar.c: Sort out spacing on toolbar with new "end game" button. Update toolbar code to new style at same time. Sun Dec 14 18:41:20 CET 2008 Christian Anthon * import.c: issue warning when importing matchfiles with length > MAXSCORE Sun Dec 14 11:12:45 2008 Jon Kinsey * play.c: Sort out "stop" button for "end game" and gnubg vs gnubg. Fri Dec 12 22:12:45 2008 Jon Kinsey * play.c: Add warning when end game clicked. Fri Dec 12 14:57:42 CET 2008 Christian Anthon * gtkboard.c: remove deprecate gtk_drawing_area_size Fri Dec 12 14:05:30 CET 2008 Christian Anthon * gtk-multiview.c, gtk-multiview.h, gtkboard.c, gtkboard.h: remove the deprecated use of GtkType Thu Dec 11 23:11:16 CET 2008 Christian Anthon * backgammon.h, commands.inc, gnubgstock.c, gnubgstock.h, gtkgame.c, gtktoolbar.c, play.c, set.c: minor changes to the end-game button. Tue Dec 9 16:59:54 CET 2008 Christian Anthon * import.c: do not try to import failed formats * gtkfile.c: output not recognized format in batch analyse, when appropriate. Do not try to set non-valid files and directories in the file selection dialog (Savannah bug). Tue Dec 9 14:03:52 CET 2008 Christian Anthon * analysis.c: fix a bug causing wrong luck stats in matches as reported on savannah Tue Dec 9 01:32:30 CET 2008 Christian Anthon * gnubg.c, sound.c: missing frees Mon Dec 8 22:22:19 CET 2008 Christian Anthon * backgammon.h, commands.inc, gnubgstock.c, gnubgstock.h, gtkgame.c, gtktoolbar.c, play.c, pixmaps/Makefile.am, pixmaps/gnubg-stock-pixbufs.h, pixmaps/16x16/actions/runit_16.png, pixmaps/24x24/actions/runit_24.png: Add a quickgame button Mon Dec 8 21:29:12 CET 2008 Christian Anthon : * gtkgame.c: UserCommand("set ..."); may have strange sideeffects through GTKSet, and cannot be used in edit_new Fri Dec 5 10:30:38 CET 2008 Christian Anthon : * bearoff.c, bearoff.h: disable gmappedfile code when GLib is old, and fix a bug causing a crash when mapping of the bearoffdb fails. Thu Dec 4 23:11:23 CET 2008 Christian Anthon * file.c, gnubg.c, gtkcube.c, gtkgamelist.c: more minor memory errors Wed Dec 3 12:06:57 CET 2008 Christian Anthon * gtktheory.c: remove missed debug stuff Wed Dec 3 11:51:33 CET 2008 Christian Anthon * dice.c, dice.h, gnubg.c: free gmp random data * gtkboard.c: init bd->cube and remove unused widget from board_init * gtkgame.c: the list returned by gtk_container_get_children should be freed * gtkgamelist.c: widget destroy doesn't work (gtk bug) * gtkprefs.c: free the xml parser context * gtkwindows.c: we cannot rely on the response cb to free the data as the widget may be destroyed in other ways * board3d/drawboard3d.c, board3d/misc3d.c: simple frees Tue Dec 2 01:19:31 CET 2008 Christian Anthon * gnubg.c, gnubgmodule.c, gnubgmodule.h: Py_SetProgramname should be parsed argv[0]; * gtkboard.c: init bd->turn to avoid a warning from valgrind * gtktheory.c: small memory leak caused by missing g_objec_unref Mon Dec 1 23:07:43 CET 2008 Christian Anthon * gtktempmap.c: make "show equities" more readable Sun Sep 29 19:12:45 2008 Jon Kinsey * gtkgame.c, flags/spain.png: add a spanish flag Mon Nov 24 17:07:00 CET 2008 Christian Anthon * configure.in, po/es.po: add es translation Sat Nov 15 23:32:42 CET 2008 Christian Anthon * gnubgstock.c, gnubgstock.h, gtkgame.c, gtktoolbar.c, pixmaps/Makefile.am, pixmaps/gnubg-stock-pixbufs.h, pixmaps/16x16/actions/resign_16.png, pixmaps/24x24/actions/hint_16.png, pixmaps/24x24/actions/resign_24.png, xpm/resign.xpm: Make a stock item of the resign xpm Tue Nov 11 23:39:30 CET 2008 Christian Anthon * gnubg.c, gtkboard.c, gtkboard.h: fix two minor bugs causing crashes on closing Tue Nov 11 11:59:52 CET 2008 Christian Anthon * backgammon.h, eval.c, eval.h, play.c: Evaluate accept resign at 2ply. Const a few evalcontext's. Mon Nov 10 23:39:32 CET 2008 Christian Anthon * gtkboard.c: fix a bug in LegalDestPoints when skipping pips during bearoff Mon Nov 10 00:18:25 CET 2008 Christian Anthon * gtkgame.c: add notidy flag to the bearoff database creation window Mon Nov 10 00:10:06 CET 2008 Christian Anthon * makebearoff.c: delete special win32 code Sat Nov 1 14:31:07 CET 2008 Christian Anthon * dbprovider.c, dbprovider.h, gnubg.c: fix minor compile problems with and without python Fri Oct 24 17:07:03 CEST 2008 Christian Anthon * dbprovider.c, dbprovider.h, gnubg.c, gnubgmodule.c, gnubgmodule.h, gtkrelational.c, relational.c, relational.h: improve on the inter-dependencies a bit by moving pure database functions to dbprovider.c Wed Oct 22 22:20:42 CEST 2008 Christian Anthon * play.c: delete some debug code that doesn't work anymore Wed Oct 22 22:17:53 CEST 2008 Christian Anthon * gtkboard.c: set the page-size to zero in gtkadjustment for gtkspinbutton to silence a gtk warning in 2.14.3 Wed Oct 22 21:42:38 CEST 2008 Christian Anthon * gtkgame.c, html.c, import.c, makebearoff.c, makehyper.c, makeweights.c, record.c: check the return value of fread, fwrite, and fscanf Wed Oct 22 21:21:45 CEST 2008 Christian Anthon * export.c: check the return value of fwrite to silence a compiler warning. Wed Oct 22 21:10:02 CEST 2008 Christian Anthon * gnubg.c: check the return value of fgets to silence a compiler warning. Wed Oct 22 20:50:55 CEST 2008 Christian Anthon * relational.c: check the return value of fgets to silence a compiler warning. Mon Oct 20 21:15:01 CEST 2008 Christian Anthon * configure.in: die if gtk or board3d is requested but gtk/gtkglext not found Thu Oct 9 22:44:44 CEST 2008 Christian Anthon * play.c: add safeguard questions to avoid accidental destruction of the match when "playing from here" Wed Oct 8 12:16:04 CEST 2008 Christian Anthon * bearoff.c, bearoff.h, format.c, format.h, gtkgame.c, gtkmovefilter.c, gtkmovefilter.h, rollout.c, rollout.h, board3d/drawboard3d.c, board3d/fun3d.h, board3d/misc3d.c, board3d/misc3d.h: remove a number of unused codefragments Sun Oct 5 07:52:09 CEST 2008 Christian Anthon * gtkboard.c: check for legal dest points for normal click moves. Fri Oct 3 11:44:47 CEST 2008 Christian Anthon * gnubgmodule.c: fix a couple of sizeof usage errors introduced by TanBoard Mon Sep 29 11:59:31 CEST 2008 Christian Anthon * backgammon.h commands.inc export.h gnubg.c gtkexport.c, gtkoptions.c gtkrolls.c html.c import.c makebearoff.c, makehyper.c play.c record.c rollout.c set.c show.c text.c, po/Makefile.in.in po/cs.po po/da.po po/de.po po/en_US.po, po/fr.po po/gnubg.pot po/is.po po/it.po po/ja.po po/ru.po, po/tr.po: completed the danish translation and updated a number of strings Sat Sep 27 22:27:05 CEST 2008 Christian Anthon * lib/Makefile.am, lib/neuralnet.c, lib/neuralnet.h, lib/neuralnetsse.c, lib/sigmoid.h: allow a small speedup by inlining the sigmoid function again. Tue Sep 23 21:59:02 CEST 2008 Christian Anthon * gtkmovefilter.c, gtkrace.c, gtkrelational.c, gtkwindows.c, gtkwindows.h: remove GtkSignalFunc as it will be deprecated Tue Sep 23 17:41:15 CEST 2008 Christian Anthon * text.c: fix minor \n output bug Tue Sep 23 17:29:17 CEST 2008 Christian Anthon * configure.in, render.c, pixmaps/Makefile.am: fix a few minor without gtk issues Tue Sep 23 12:44:36 CEST 2008 Christian Anthon * backgammon.h, commands.inc, gnubg.c, gtkboard.c, gtkboard.h, gtkoptions.c, set.c: add option to disable boardgraying Sun Sep 29 19:12:45 2008 Jon Kinsey * gtkboard.c, render.c: Attempt to gray board in edit mode Mon Sep 15 21:20:28 CEST 2008 Christian Anthon * configure.in, pixmaps/Makefile.am: allow building even if gdk-pixbuf-csource is not found Sun Sep 14 22:32:57 CEST 2008 Christian Anthon * : update danish translation and adjust a few strings Thu Sep 4 15:18:09 CEST 2008 Christian Anthon * gtk-multiview.[ch]: port to g_object Tue Sep 2 23:05:52 CEST 2008 Christian Anthon * gtkcolour.c, gtkcolour.h, gtkprefs.c, gtkprefs.h, board3d/gtkcolour3d.c, board3d/misc3d.h, board3d/inc3d.h: use the gtk_color_button, rather than designing our own. Tue Aug 12 19:12:45 2008 Jon Kinsey * board3d files, removed total.bmp: Replace totoal.bmp with text in graph Mon Aug 11 10:48:21 CEST 2008 Christian Anthon * gnubg.c, gnubgmodule.c, gtkcube.c, gtkgame.c, gtkgamelist.c, set.c: update a few strings for translation. Sun Aug 10 01:35:06 CEST 2008 Christian Anthon * gtktempmap.c: improve a bit on printing of equties and best moves Thu Aug 7 15:28:33 CEST 2008 Christian Anthon * configure.in: add options to disable deprecated GLib/GTK functions * gtkgame.c, gtktempmap.c: replace gtk_object_weakref with g_object_weakref Thu Aug 7 15:19:09 CEST 2008 Christian Anthon * board3d/gtkcolour3d.c: replace a gtk_combo with a gtk_combo_box * gtkgame.c, gtkrace.c, gtkrelational.c, gtktheory.c: g_object_unref the gtktreemodel in a couple of places where forgotten Wed Jul 30 20:27:26 CEST 2008 Christian Anthon * backgammon.h: issue warning if libintl.h is included too early to avoid libintl_printf warnings under mingw. Wed Jul 30 17:01:07 CEST 2008 Christian Anthon * gtkboard.c, gtkchequer.c, gtkcube.c, gtkgame.c, gtkgame.h, gtkgamelist.c, gtkmovefilter.c, gtkmovelist.c, gtkpanels.c, gtkprefs.c, gtksplash.c, gtktempmap.c, gtktoolbar.h, gtkwindows.c: more deprecated gtk functions Wed Jul 30 13:20:05 CEST 2008 Christian Anthon * gtkboard.c, gtkgame.c, gtkgame.h, gtkoptions.c, gtkpanels.c, gtktempmap.c, gtkwindows.c: port tooltips to the gtk-2.12 version, which is more flexible than the old one (e.g. treeview cells). Allow for tips with the older gtk versions to work as well. Wed Jul 30 12:50:47 CEST 2008 Christian Anthon * play.c: show board when dice rolled if, and only if, fX or fDisplay. Tue Jul 29 00:31:04 CEST 2008 Christian Anthon * gtktheory.c: port to gtk_tree_view Thu Jul 24 14:32:45 CEST 2008 Christian Anthon * gtkrelational.c, gtkrace.c: cleanup of deprecated gtk functions Thu Jul 24 11:36:21 CEST 2008 Christian Anthon * gtkchequer.c, gtkgame.c, gtkprefs.c, gtkrace.c, gtktheory.c: get rid of deprecated functions gtk_notebook_set_page and gtk_paint_string Wed Jul 23 11:34:27 CEST 2008 Christian Anthon * set.c, gnubg.c, gtkgame.c: give a sensible error message if language change fails, i.e. locale unsupported. * gtkwindows.c: don't run gtk_widget_present(parent) if parent isn't realized. Sat Jul 19 23:54:09 CEST 2008 Christian Anthon * bearoff.c, eval.c, osr.c: replace 6, 15 with nChequers and nPoints in a couple of places Fri Jul 18 18:07:38 CEST 2008 Christian Anthon * backgammon.h, credits.sh, gnubg.c, gtkgame.c, gtkgame.h, relational.c, show.c: Changes to allow GTKTextWindow to be called from within a dialog. Make license, etc. be printed as text rather than gtk_lists. Make the intro text conform with the GPL3 suggestion. Minor translational changes. Sun Jul 13 21:07:17 CEST 2008 Christian Anthon * bearoff.c, eval.c, export.c, file.c, gnubg.c, gnubgmodule.c, gtkprefs.c, html.c, import.c, latex.c, makebearoff.c, makehyper.c, makeweights.c, relational.c, rollout.c, sgf.c, text.c, board3d/matrix.c, board3d/misc3d.c: replace fopen with gnubg_g_fopen to avoid problems with special characters in filenames Sat Jul 12 09:10:43 CEST 2008 Christian Anthon * gnubg.c, renderprefs.c, renderprefs.h: fix places where g_strdup wasn't followed by g_free Fri Jul 11 22:54:46 CEST 2008 Christian Anthon * bearoff.c, dice.c, eval.c, format.c, gnubg.c, show.c, renderprefs.c: fix some printf format related compiler warnings Fri Jul 11 22:48:59 CEST 2008 Christian Anthon * rollout.c: fix type of board in log_game_start Fri Jul 11 11:23:02 CEST 2008 Christian Anthon * rollout.c: move log_name out of globals Mon Jul 7 22:42:20 CEST 2008 Petr Kadlec * eval.c, gnubg.c, gtkgame.c, matchequity.c, render.c, renderprefs.c show.c, sound.c: minor fixes for MSVC compiler happinnes (mainly adding "float" suffix to decimal number literals etc.) Mon Jul 7 12:12:45 2008 Jon Kinsey * rollout.c: Give each thread separate random number context to try and get results the same as single-threaded rollouts. Mon Jul 7 00:22:35 CEST 2008 Christian Anthon * rollout.c: fix multithreaded dice generation and logfiles Mon Jul 7 00:20:52 CEST 2008 Christian Anthon * gnubg.c: print prompt and answer for automatic questions Sun Jul 6 00:00:22 CEST 2008 Christian Anthon * format.c: correct minor error introduced by translational changes Wed Jul 2 00:01:04 CEST 2008 Christian Anthon * backgammon.h, commands.inc, gnubg.c, gtkfile.c, gtkoptions.c, import.c, play.c, set.c, sgf.c, show.c: fix minor problems with the batch analyse function and add an option for setting default answers to yes/no questions. Mon Jun 30 23:12:09 CEST 2008 Christian Anthon * Makefile.am, analysis.c, backgammon.h, bearoff.c, configure.in, dbprovider.c, dice.c, drawboard.c, eval.c, export.c, external.c, file.c, format.c, formatgs.c, gnubg.c, gtkgame.c, gtkmovefilter.c, gtkoptions.c, util.c, pixmaps/Makefile.am, po/cs.po, po/da.po, po/de.po, po/en_US.po, po/fr.po, po/gnubg.pot, po/is.po, po/it.po, po/ja.po, po/ru.po, po/tr.po, po/gnubg-langs/__catstatus.php, mkinstalldirs, po/LINGUAS: fix minor translation problems and update the pot/po files to use GLib macros * gnubgi18n.c, gnubgi18n.h: removed as similar functions are provided by glib/gettext Mon Jun 30 19:38:38 CEST 2008 Christian Anthon * po/* m4/*, configure.in: modify gettext and friends to use GLib gettext macros Sun Jun 29 21:12:45 2008 Jon Kinsey * analysis.c - gnubg.c: First part of translation string cleanup Tue Jun 24 01:06:38 CEST 2008 Christian Anthon * formatgs.c: make 95% ci interval an interval rather than a number Thu Jun 19 22:00:38 CEST 2008 Christian Anthon * Makefile.am, configure.in, gnubgstock.c, gnubgstock.h, gtkgame.c, gtktoolbar.c, pixmaps/.cvsignore, pixmaps/Makefile.am, pixmaps/gnubg-stock-pixbufs.h, pixmaps/16x16/actions/cancel_16.png, pixmaps/16x16/actions/double_16.png, pixmaps/16x16/actions/hint_16.png, pixmaps/16x16/actions/ok_16.png, pixmaps/24x24/actions/cancel_24.png, pixmaps/24x24/actions/double_24.png, pixmaps/24x24/actions/hint_16.png, pixmaps/24x24/actions/hint_24.png, pixmaps/24x24/actions/ok_24.png, xpm/beaver.xpm, xpm/hint_alt.xpm, xpm/stock_cancel.xpm, xpm/stock_ok.xpm: Make stock icons for double, hint, cancel, accept and reject actions. Remove beaver button and add general purpose double button instead. Thu Jun 19 21:54:55 CEST 2008 Christian Anthon * Makefile.am: add multithread.c to non-threaded build * gtkgame.c: signed/unsigned compiler warning * bearoff.c: signed/unsigned compiler warning (fread returns size_t) Mon Mar 17 21:12:45 2008 Jon Kinsey * multithread.c + others: Simplify multithreaded code a little bit Tue Jun 17 21:13:03 CEST 2008 Christian Anthon * gtktoolbar.c: fix icon sizes Tue Jun 17 16:34:17 CEST 2008 Christian Anthon * bearoff.c: be more silent when db files are missing Tue Jun 17 16:31:10 CEST 2008 Christian Anthon * gtktoolbar.c, xpm/Makefile.am, xpm/gnubg-big.xpm, xpm/stock_edit.xpm, xpm/stock_new.xpm, xpm/stock_open.xpm, xpm/stock_save.xpm, xpm/stock_undo.xpm, xpm/tb_double.xpm, xpm/tb_edit.xpm, xpm/tb_no.xpm, xpm/tb_roll.xpm, xpm/tb_stop.xpm, xpm/tb_undo.xpm, xpm/tb_yes.xpm: use gtk stock icons where directly applicable Fri Jun 13 13:04:19 CEST 2008 Christian Anthon * bearoff.c, bearoff.h, eval.c, configure.in: always mmap datase files using g_mapped_file. Read using fopen rather than open. Various cleanups. * gtkgame.c, util.c: revert some recent visual c++ prompted changes Thu Jun 12 10:23:38 CEST 2008 Christian Anthon * bearoff.c, bearoff.h: more cleanup of unused code Thu Jun 12 00:20:30 CEST 2008 Christian Anthon * bearoff.c, bearoff.h: remove unused code to read non-gnubg exact bearoff databases. Wed Jun 11 16:34:04 CEST 2008 Christian Anthon * dice.c, dice.h, set.c: use fopen instead of open Wed Jun 11 15:06:45 CEST 2008 Christian Anthon * html.c, htmlimages.c, board3d/misc3d.c: replace access by g_file_test Tue Jun 10 10:07:33 CEST 2008 Christian Anthon * gtkame.c, xpm/Makefile.am: use GTK_STOCK_STOP rather than keeping out own copy. Mon Jun 9 17:56:00 CEST 2008 Christian Anthon * M gtkgame.c, gtkwindows.c, gtkwindows.h, pixmaps/Makefile.am, pixmaps/gnubg-big.png, gtksplash.c: move gnubg-big.png out of xpm Mon Jun 9 00:14:45 CEST 2008 Christian Anthon * pixmaps, gtkgame.c, Makefile.am, configure.in: add expected directory structure for the icon. Make a windows .ico file Sat Jun 7 22:41:53 CEST 2008 Christian Anthon * rollout.c: fix a problem with too many trials done. Be a bit more verbose when rolling out in the text interface. * gnubg.c: extend the CommandRollout help Fri Jun 6 17:42:04 CEST 2008 Christian Anthon * Makefile.am, show.c, doc/Makefile.am, util.c, util.h: install documentation in DOCDIR Wed Jun 4 20:27:41 CEST 2008 Christian Anthon * dbprovider.c, show.c, lib/neuralnet.c: minor compiler warnings Wed Jun 4 14:26:16 CEST 2008 Christian Anthon * render.c: fix problems with 2d player turn arrows Wed Jun 4 10:38:36 CEST 2008 Christian Anthon * Makefile.am, board3d/Makefile.am, configure.in: do "PKGDATADIR" the recommended way Wed May 14 10:19:43 CEST 2008 Christian Anthon * gnubg.c, sound.c, sound.h: Make the quiet option work again. Mon May 5 16:29:51 CEST 2008 Christian Anthon * gnubg.c, relational.c, play.c: cleanup of the UserCommand function. Avoid using UserCommand outside gtk. Mon May 5 09:36:34 CEST 2008 Christian Anthon * record.c: fix illegal g_free in RecordRead Sun May 4 21:53:07 CEST 2008 Christian Anthon * gtkgame.c: cleanup use of the word 'session' Sat May 3 00:07:21 CEST 2008 Christian Anthon * gtkgame.c, play.c: allow double command to be used for beavers. Merge double/beaver menu items. Merge take/pass with accept/reject resignation menu items. Tue Apr 29 22:46:50 CEST 2008 Christian Anthon * gtkwindows.c: change GTKMessage to use gtk_text_view and fix a sizing problem on the way. Tue Apr 29 13:11:02 CEST 2008 Christian Anthon * sound.c, gtkoptions.c: minor gstreamer changes. Use sync play of max 6 seconds in gtk sound options. Sun Apr 27 22:15:13 CEST 2008 Christian Anthon * backgammon.h, credits.sh, dice.c, dice.h, drawboard.c, drawboard.h, export.h, format.c, formatgs.c, gnubg.c, gnubgmodule.c, gtkboard.c, gtkboard.h, gtkfile.c, gtkfile.h, gtkgame.c, gtkgame.h, gtkgamelist.c, gtkprefs.c, html.c, htmlimages.c, import.c, latex.c, play.c, progress.c, relational.c, renderprefs.c, renderprefs.h, set.c, sgf.c, show.c, board3d/fun3d.h, board3d/misc3d.c: use const char* in a number of places. Sat Apr 26 19:09:00 CEST 2008 Christian Anthon * bearoff.c, boarddim.h, eval.c, external_y.y, gnubg.c, gnubgmodule.c, gtkfile.c, gtkgame.c, gtkmovelist.c, gtktempmap.c, html.c, htmlimages.c, makebearoff.c, multithread.c, play.c, set.c, sgf.c, sgf_y.y, simpleboard.c, util.c, board3d/font3d.c, board3d/misc3d.c, lib/neuralnet.c, non-src/external_l.c, non-src/external_y.c, non-src/sgf_l.c, non-src/sgf_y.c: #if's to #ifdef for things not normally defined by configure Fri Apr 25 17:33:11 CEST 2008 Christian Anthon * configure.in: try to guess the right SSE flag according to cpu type Fri Apr 25 00:04:58 CEST 2008 Christian Anthon * backgammon.h ,gnubg.c ,gtkboard.c ,gtkboard.h ,gtkgame.c ,matchid.c ,matchid.h ,positionid.c ,positionid.h ,set.c: merge position and match ids Mon Apr 21 11:05:10 CEST 2008 Christian Anthon * gnubg.c, sound.c: minor gstreamer issues when compiling without threads or without gtk. * set.c: CommandSetGUIShowWastage needs to be defined when compiling without gtk Sun Apr 20 23:25:42 CEST 2008 Christian Anthon * backgammon.h, gnubg.c, gtkboard.c, gtkboard.h, gtkoptions.c, set.c: make showing of epc wastage optional and fix minor sizing problems. Sun Apr 20 20:36:28 CEST 2008 Christian Anthon * play.c: fix cube tutoring after changes to make the progress indicator async. Wed Apr 16 22:05:24 CEST 2008 Christian Anthon * eval.c: in FindBestCubeDecision. Fix rare case where no double, beaver was returned as double, beaver. Wed Apr 16 20:58:34 CEST 2008 Christian Anthon * Makefile.am, configure.in, gnubg.c, gtkgame.c, gtkoptions.c, set.c, sound.c, sound.h: Change sound system from esound to gstreamer. Fix minor problems in PrompForExit and CommandSetClockwise. Sun Apr 13 23:08:43 CEST 2008 Christian Anthon * file.c: relax recognition of JF Pos files. Sun Apr 13 22:38:55 CEST 2008 Christian Anthon * sound.c, matchequity.c: deal more gracefully with people relocating their program paths. Thu Apr 10 21:33:59 CEST 2008 Christian Anthon * configure.in, Makefile.am: cleanup and remove x86 host test * multithread.c: only align stack when USE_SSE_VECTORIZE Wed Apr 9 21:21:58 UTC 2008 mdpetch * gnubg.c, sound.c: Changed to Apple Quicktime for sound under OS/X rather than ESD This change may be revisted if it is decided to use another sound subsystem * multithread.c, configure.in: modified to support multithreaded version on non Intel system (Apple PPC etc) Sun Apr 6 22:33:51 CEST 2008 Christian Anthon * lib/neuralnet.c: fix minor apple compile problem. Sun Apr 6 22:33:04 CEST 2008 Christian Anthon * INSTALL: update . Mon Mar 31 12:58:06 CEST 2008 Christian Anthon * dbprovider.c, gnubgmodule.c: include stdint.h on win32 Fri Mar 28 15:25:34 CET 2008 Achim Mueller * changed configure.in: new release number 0.9.0 Fri Mar 28 00:40:32 CET 2008 Christian Anthon * gtkrelational.c: rearrange player details and stats view Thu Mar 27 22:37:01 CET 2008 Christian Anthon * po/gnubg.pot, non-src/credits.c, po/it.po: update italian translation Tue Mar 25 14:30:42 CET 2008 Christian Anthon * dbprovider.c: fix a compiler warning when without python and sqlite Tue Mar 18 23:47:53 CET 2008 Christian Anthon * bearoffdump.c, gnubg.c, makebearoff.c, makehyper.c: minor compile problems without threads Tue Mar 18 02:25:32 CET 2008 Christian Anthon * analysis.c, formatgs.c: edit the texts in the game analysis Tue Mar 18 01:54:21 CET 2008 Christian Anthon * po/*.po, po/gnubg.pot: update the translation files Mon Mar 17 21:12:45 2008 Jon Kinsey * credits.sh/c: Update copyright to 2008. Sun Mar 16 22:01:07 CET 2008 Christian Anthon * set.c, gtkgame.c: fix minor problems with the hide/show ids Sun Mar 16 21:56:59 CET 2008 Christian Anthon * credits.sh, gnubg.c, non-src/credits.c, non-src/external_l.c, non-src/external_y.c, non-src/sgf_l.c, non-src/sgf_y.c, non-src/sgf_y.h: minor updates to version printing and to non-src files Sun Mar 16 10:12:45 2008 Jon Kinsey * gtkgame.c, gtktoolbar.c: Change menus: Add menu items for edit position and swap direction toolbar commands. Add option to hide toolbar. Add option to show/hide ids. Remove Python shell item. Put panel items in a sub menu. Move match info to file menu. Sat Mar 15 13:12:45 2008 Jon Kinsey * gtkgame.c: Merge match/session analysis menu items. Thu Mar 13 22:27:26 CET 2008 Christian Anthon * gtkexport.c: change html export type and style sheet to combo_box Thu Mar 13 22:16:39 CET 2008 Christian Anthon * gktoptions.c: change cheat roll and rng choosers to combo_box Thu Mar 13 21:54:24 CET 2008 Christian Anthon * gtkprefs.c: change the wood type to combo_box Thu Mar 13 22:12:45 2008 Jon Kinsey * gtktoolbar.c, gtkgame.c: Move stop button from toolbar to status bar. Thu Mar 13 22:12:45 2008 Jon Kinsey * gtk files: Tidy up some common gtk functions and remove SIG_IO signal. Wed Mar 12 23:06:32 CET 2008 Christian Anthon * gtkgame.c, gtkpanels.c, gtkpanels.h: update game selection menu to gtk_combo_box and remove the redundant names Wed Mar 12 20:36:40 CET 2008 Christian Anthon * gtkgame.c: cleanup the Go menu Tue Mar 11 14:53:12 CET 2008 Christian Anthon * gtkexport.c, gtkgame.c, gtktoolbar.c, xpm/dice.xpm, xpm/leftarrow.xpm, xpm/rightarrow.xpm, xpm/stock_export.xpm, xpm/stock_import.xpm, xpm/stock_stop_16.xpm, xpm/stock_undo_16.xpm, xpm/tb_redouble.xpm: cleanup in the help menu and delete some unused xpms Mon Mar 10 09:12:45 2008 Jon Kinsey * gtkgame.c, gtkfile.c: Remove export button/menu item (use save instead) Sun Mar 9 12:12:45 2008 Jon Kinsey * gtkgame.c, gtkfile.c: Move load commands from menu into load dialog. (and other small changes to this dialog) * gtkexport.c: Move generate html images from file menu into export settings. Sat Mar 8 09:12:45 2008 Jon Kinsey * boardpos.c, render.c: Change 2d direction arrow to look like 3d arrow (smaller and near bearoff tray). Move cube to side of board. Swap position of pieces on bar. Fri Mar 7 22:28:52 CET 2008 Christian Anthon * backgammon.h, gnubg.c, gtkgame.c, gtkpanels.c, board3d/Makefile.am, board3d/gtkcolour3d.c: minor stuff and warnings Fri Feb 29 19:12:45 2008 Jon Kinsey * gtkprefs.c, gtkcolour3d.c: Change 3d previews to use widgets not pixmaps. Thu Feb 28 15:15:08 CET 2008 Christian Anthon * osr.c: fix bug introduced by uint changes Wed Feb 27 21:22:47 CET 2008 Christian Anthon * gtkoptions.c: add reset all to defaults button. * sound.c: fix sound default file bug on windows Tue Feb 26 12:35:23 CET 2008 Christian Anthon * makebearoff.c: don't print progress to stderr unless on a TTY. Mon Feb 25 23:16:26 CET 2008 Christian Anthon * text.c, html.c, latex.c: Allow export of games with beavers/raccoons in them. Mon Feb 25 15:12:08 CET 2008 Christian Anthon * backgammon.h, gnubg.c, set.c, sgf.h: cleanup in lists of commands. Removed declared but undefined, and defined, but unused. Move all declarations to backgammon.h and all lists of commands to gnubg.c. Sun Feb 24 10:12:45 2008 Jon Kinsey * gnubg.c, play.c, multithreaded.c, others: Fix multi-threaded progress indicator. Wed Feb 20 23:52:48 CET 2008 Christian Anthon * relational.c: fix bug caused by APPENDI and APPENDF not being properly {}'ed. * dbprovider.h, relational.c: fix minor compiler warnings. * dbprovider.c: add input string to SQL warnings. Wed Feb 20 23:50:02 CET 2008 Christian Anthon * gtkgame.c: update GTKOutput to use a g_string instead of a list. Sun Feb 17 13:19:58 CET 2008 Christian Anthon * bearoff.c, dbprovider.c, dbprovider.h, gnubg.sql, gnubgmodule.c, gtkrelational.c, gtkrelational.h, relational.c: more relational db changes and a few minor compiler warnings. Added new item to matchstat and gamestat. Fri Feb 15 16:59:43 CET 2008 Christian Anthon * drawboard.c: revert to Jan 19 after accidental checkin (fix board after uint changes) Fri Feb 15 13:03:31 CET 2008 Christian Anthon * .cvsignore, backgammon.h, gtkoptions.c, makebearoff.c, play.c, util.h, board3d/Makefile.am, po/POTFILES.in: minor cleanups and compiler warnings Sun Feb 10 23:21:33 CET 2008 Christian Anthon * backgammon.h, export.c, export.h, file.c, gnubg.c, html.c, play.c, simpleboard.c, text.c: allow cairo ps and pdf to export games and matches Sun Feb 10 11:12:45 2008 Jon Kinsey * gtkoptions.c: Move database settings to options dialog. Sat Feb 9 23:12:45 2008 Jon Kinsey * gtkrelational.c: Put simple stats into relational dialog Sat Feb 9 14:12:45 2008 Jon Kinsey * dbprovider.c, relational.c: Added game stats to database Fri Feb 8 23:11:13 CET 2008 Christian Anthon * Makefile.am, dbprovider.c, relational.h: allow code to compile without python and fix a couple of minor warnings Fri Feb 8 11:24:23 CET 2008 Christian Anthon * Makefile.am, configure.in: compile in native sqlite3 on linux Thu Feb 7 22:12:45 2008 Jon Kinsey * dbprovider.c: Added native sqlite interface. Wed Feb 6 22:12:45 2008 Jon Kinsey * dbprovider.c+.h, gnubg.c, relational.c, gtkrelational.c, database.py: Move relational code out of database.py and into relational.c Sun Feb 3 16:34:37 CET 2008 Christian Anthon * gtkboard.c: size cube and dice widgets according to board size * gtkgame.c, gtkpanels.c, gtkprefs.c, gtkrelational.c, gtktheory.c: replace deprecated gtk_widget_set_usize with gtk_widget_set_size_request Sun Feb 3 01:02:54 CET 2008 Christian Anthon * gnubg.c, relational.c, scripts/database.py: allow creation of default sqlite database in szHomeDirectory. Look for database conf file in szHomeDirectory. MIGHT DISTURB EXISTING USERS? Sun Feb 3 00:47:49 CET 2008 Christian Anthon * gnubg.c, gtksplash.c: disable splash unless asked for. Shorten pauses a bit Thu Jan 31 17:20:11 CET 2008 Christian Anthon * multithread.c: check if g_threads already initialized. Mon Jan 21 00:36:53 CET 2008 Christian Anthon * backgammon.h, dice.c, eval.c, gnubg.c, gtkboard.c, gtkexport.c, gtkoptions.c, import.c, makebearoff.c, makehyper.c, relational.c, render.c, rollout.c, sgf.c: replace uint with unsigned int Sat Jan 19 21:45:51 CET 2008 Christian Anthon * eval.c: fix a potential signed/unsigned problem in crashed net Sat Jan 19 09:58:13 CET 2008 Christian Anthon * drawboard.c: fix board after uint changes Tue Jan 15 22:12:45 2008 Jon Kinsey * gnubg-types.h + others: change board type to unsigned hopefully not breaking anything on the way (esp. bearoff) Tue Jan 15 19:05:58 CET 2008 Christian Anthon * analysis.c, backgammon.h, dice.c, eval.c, gnubg.c, gtkboard.c, gtkexport.c, gtkgame.c, gtkmovelist.c, gtkoptions.c, import.c, makebearoff.c, makehyper.c, multithread.c, play.c, render.c, sgf.c, board3d/drawboard3d.c, relational.c, rollout.c: Fix some minor uint//int gcc warnings Sun Jan 13 09:03:18 CET 2008 Christian Anthon * backgammon.h, bearoff.c, bearoff.h, external_l.l, external_y.y, gnubg.c, gtkgame.c, gtkgame.h, gtkpanels.c, multithread.c, multithread.h, sound.c, sound.h, board3d/fun3d.h, lib/cache.c, non-src/external_y.c, non-src/external_l.c: fix some incomplete or missing prototypes Sun Jan 13 01:07:21 CET 2008 Christian Anthon * bearoffdump.c, gnubg.c, makehyper.c, multithread.c, sound.c: compiler warnings and Sleep is a win32 function Sun Jan 13 00:36:48 CET 2008 Christian Anthon * configure.in, common.h: change how acosf, signbit and lrint are checked for to allow to compile with -Werror Sat Jan 12 23:12:45 2008 Jon Kinsey * sound.c, set.c, gnubg.c: Re-introduce exit sound, but disabled by default Wed Jan 2 15:48:02 CET 2008 Christian Anthon * Makefile.am, doc/Makefile.am, lib/Makefile.am, non-src/Makefile.am, po/POTFILES.in: fix make distcheck * multithread.h: fix typo and add MT_SafeDecCheck Tue Jan 01 21:12:45 2008 Jon Kinsey * relational.c, gtkrelational.c, database.py, gnubg.sql: Simplify relational database by removing "environments". Wed Dec 19 11:06:45 CET 2007 Christian Anthon * lib/cache.c: only lock one level Wed Dec 19 10:32:27 CET 2007 Christian Anthon * Makefile.am, util.c, board3d/drawboard3d.c, board3d/misc3d.h, lib/cache.c: small changes to previous Tue Dec 18 21:12:45 2007 Jon Kinsey * Code changes so -ansi -pedantic (just about) works for gcc on windows. Tue Dec 18 14:14:10 CET 2007 Christian Anthon * set.c, board3d/drawboard3d.c, board3d/fun3d.h, board3d/inc3d.h, board3d/matrix.c, board3d/matrix.h, board3d/misc3d.c, board3d/misc3d.h, board3d/shadow.c, board3d/widget3d.c: let new board3d code compile under linux. Tue Dec 18 14:10:55 CET 2007 Christian Anthon * bearoffdump.c, makebearoff.c, makehyper.c, record.c: make utily programs compile with threads enabled Mon Dec 17 16:33:01 CET 2007 Christian Anthon * lib/cache.c: Fix multithreaded hang when running quad core with four threads. WaitForManualEvent appears to be broken, at least on GLib threads Mon Dec 17 15:06:44 CET 2007 Christian Anthon * Makefile.am, dice.c, dice.h, eval.c, format.c, gnubg.c, gtkgame.c, gtkgame.h: move things around a bit so that utility programs compile without ugly fixes (only without threads for now) Mon Dec 17 15:04:42 CET 2007 Christian Anthon * sgf.c, gtkgame.c, show.c: use %lu instead of casting to uint. Mon Dec 17 14:59:20 CET 2007 Christian Anthon * sounds/Makefile.am, configure.in: we haven't beeen able to recompile the sounds for a long time, so let's stop trying. Sat Dec 15 21:27:19 CET 2007 Christian Anthon * Renamed sgf.y to sgf_y.y and sgf.l sgf_l.l to avoid conflicts with sgf.c * bearoff.c, eval.c, format.c, gnubg.c, gtkgame.c, gtkrolls.c, makebearoff.c, multithread.c, play.c, relational.c, rollout.c, sgf.c, show.c: minor compiler warnings Sat Dec 15 21:23:49 CET 2007 Christian Anthon * board3d/gtkcolour3d.c: remove unneeded gdk_gl_drawable_begin calls since they causes assertions on newer X window. Thu Dec 13 22:39:56 CET 2007 Christian Anthon * Makefile.am, backgammon.h, bearoff.c, bearoff.h, bearoffdump.c, drawboard.c, drawboard.h, gnubg.c, gtkrolls.c, makebearoff.c, makehyper.c, multithread.c, positionid.c, positionid.h, render.h, rollout.c, sgf.y, util.c, util.h, lib/gnubg-types.h: fixes to make gnubg compile after Jon's changes. board3d doesn't compile. utility programs doesn't compile. Wed Dec 12 23:12:45 2007 Jon Kinsey * movelistctrl: Fix spacing in German (reported by Thomas Steiner) * bearoff.c: Fix multithreaded disk bearoff access (reported by Hugh Sconyers) * list.h + others: list type renamed to listOLD (ideally replace with glist in future) Wed Dec 12 15:40:08 CET 2007 Christian Anthon * Makefile.am, gnubg.6: manual now maintained in doc Wed Dec 12 13:52:14 CET 2007 Christian Anthon * Makefile.am, board3d/Makefile.am, doc/Makefile.am, lib/Makefile.am, m4/Makefile.am, met/Makefile.am, po/POTFILES.in: cleanup and fixes to make distcheck Wed Nov 28 09:43:59 CET 2007 Christian Anthon * po/POTFILES.in: remove pub_eval.c * doc/Makefile.am: remove *.txt from EXTRA_DIST Sun Nov 25 12:09:04 CET 2007 Christian Anthon * import.c: fix partygammon import. Games terminated badly. Sun Nov 18 07:04:44 CET 2007 Christian Anthon * eval.c, makebearoff.c: Fix messed up evaluation of hypergammon. Redirect loading of hyper databases to pkgdir. Sat Nov 17 11:27:28 CET 2007 Christian Anthon * eval.c eval.h gnubg.c lib/neuralnet.c lib/neuralnet.h: cleanup neuralnet.[ch] Fri Nov 16 23:24:02 CET 2007 Christian Anthon * backgammon.h, gtkchequer.h, gtkgame.c, gtkgame.h, gtkpanels.c, gtkrelational.c, gtkrelational.h, relational.c, rollout.h: cleanup gtkgame.h Fri Nov 16 22:11:05 CET 2007 Christian Anthon * backgammon.h, export.h, gnubg.c, gtkfile.c, gtkfile.h, import.h, makeweights.c, multithread.h, play.c, timer.c: cleanup backgammon.h Fri Nov 16 14:32:04 CET 2007 Christian Anthon * : update manuals Thu Nov 8 01:29:47 CET 2007 Christian Anthon * text.c: fix small bug reported by Philippe Mon Nov 5 21:31:24 CET 2007 Christian Anthon * doc/.cvsignore, doc/Makefile.am, doc/gnubg/allabout.pdf, doc/gnubg/gnubg.pdf, doc/images/appearence.png, doc/images/cubeful-ex1.png: build pdf files Wed Oct 24 17:17:50 CEST 2007 Christian Anthon * external_y.y, file.c, gnubg.c, gnubgmodule.c, gtk-multiview.c, gtkboard.c, gtkgame.c, gtksplash.c, htmlimages.c, import.c, makebearoff.c, relational.c, renderprefs.c, set.c, sgf.y, simpleboard.c, board3d/gtkcolour3d.c, board3d/misc3d.c, lib/neuralnet.c: fix a bunch of minor compiler warnings Tue Oct 23 12:38:57 CEST 2007 Christian Anthon * gktgame.c, gtkpanels.c: cleanup of InitGTK, move command widget to gtkpanels.c Mon Oct 8 15:46:22 CEST 2007 Christian Anthon * gtkcube.c: add rollout presets to cube tool Wed Oct 3 19:23:28 CEST 2007 Christian Anthon * analysis.c, rollout.c: fix to minor mt problems Wed Oct 3 18:58:41 CEST 2007 Christian Anthon * bearoffdump.c eval.c gnubg.c gtkgame.c gtkmovelistctrl.c gtkpanels.c latex.c makebearoff.c makehyper.c matchequity.c play.c render.c: compiler warnings Mon Oct 1 23:06:52 CEST 2007 Christian Anthon * Makefile.am, configure.in, export.c, multithread.c, simpleboard.c, simpleboard.h: make code compile without gtk, cairo or pangocairo Sat Sep 29 23:10:12 CEST 2007 Christian Anthon * backgammon.h, eval.c, eval.h, gnubg.c, gtkgame.c, set.c, show.c: remove unused training functions. Fri Sep 28 11:27:57 CEST 2007 Christian Anthon * Makefile.am po/LINGUAS po/POTFILES.in po/da.po po/en_US.po po/gnubg.pot po/is.po po/ru.po po/tr.po: make sure that "make dist" works. Remove unmaintained languages. Fri Sep 28 00:28:34 CEST 2007 Christian Anthon * backgammon.h, bearoff.c, bearoff.h, ChangeLog, export.c, export.h, file.c, file.h, formatgs.c, gnubg.c, gtkfile.c, gtkgame.c, html.c, lib/.cvsignore, lib/Makefile.am, Makefile.am, matchid.h, rollout.c, text.c: add a simple cairo board capable of exporting positions to svg, pdf and postscript surfaces * simpleboard.c, simpleboard.h: new files * lib/dynarray.c, lib/dynarray.h, lib/event.c, lib/event.h, lib/event.texi, lib/hash.c, lib/hash.h, lib/heap.c, lib/heap.h, lib/stamp-vti, postscript.c: removed files Thu Sep 27 22:50:16 CEST 2007 Christian Anthon * analysis.c, analysis.h, formatgs.c, gnubg.c, gnubgmodule.c, gtkexport.c, gtkgame.c, play.c, relational.c, set.c, show.c: remove SKILL_GOOD completely as the use was overlapping with that of SKILL_NONE Thu Sep 27 16:22:08 CEST 2007 Christian Anthon * gtkfile.c: allow default extension to be .sgf when saving and last used extension otherwise. Thu Sep 27 16:20:17 CEST 2007 Christian Anthon * AUTHORS, INSTALL, Makefile.am, README, configure.in, credits.sh, non-src/credits.c, non-src/external_l.c, non-src/external_y.c, non-src/external_y.h, non-src/sgfl.c, non-src/sgfp.c, non-src/sgfp.h: cleanup of readme and install files and minor updates to the rest Mon Sep 24 22:56:56 CEST 2007 Christian Anthon * makebearoff.c: fix tmp file creation problem Wed Sep 19 22:15:09 CEST 2007 Christian Anthon * rollout.c: change assertion to error message when mt_rollout results in too many rollouts done. Sat Sep 15 14:30:36 CEST 2007 Christian Anthon * Makefile.am: fix external_l.c dependency problem Fri Sep 14 23:40:14 CEST 2007 Christian Anthon * remove unused makebearoff1 program Fri Sep 14 13:58:36 CEST 2007 Christian Anthon * gnubg.c, configure.in: remove need for fstat Fri Sep 14 13:28:57 CEST 2007 Christian Anthon * .cvsignore, backgammon.h, bearoff.c, bearoffgammon.h, boarddim.h, boardpos.h, common.h, dice.c, eval.h, gnubgmodule.c, gtk-multiview.h, gtkboard.h, gtkcolour.h, gtkprefs.c, render.c, render.h, renderprefs.c, board3d/drawboard3d.c, board3d/matrix.c, board3d/misc3d.c, board3d/model.c: header clean-up. Use definitions from glib.h instead. Fri Sep 14 09:52:15 CEST 2007 Christian Anthon * gnubg.c, set.c: Make lang change more robust Mon Sep 3 11:40:07 CEST 2007 Christian Anthon * html.c: fix tmpfile creation problem to allow export of gammonline to clipboard under MS Vista. Mon Sep 3 01:18:12 CEST 2007 Christian Anthon * rollout.c: fix buffer overflow on 64 bit platforms * analysis.c, gnubg.c, multithread.c, rollout.c: add a new --debug option to turn on debugging for multithreaded code. Sun Sep 2 22:20:43 CEST 2007 Christian Anthon * board3d/misc3d.h, speed.h: new files * analysis.c, analysis.h, backgammon.h, board3d/drawboard3d.c, board3d/fun3d.h, board3d/graph.c, board3d/gtkcolour3d.c, board3d/Makefile.am, board3d/misc3d.c, board3d/widget3d.c, dice.c, eval.c, eval.h, external_y.y, format.c, gnubg.c, gnubgmodule.c, gnubgmodule.h, gtkboard.c, gtkchequer.c, gtkchequer.h, gtkfile.c, gtkgame.c, gtkgame.h, gtkgamelist.c, gtkmovelist.c, gtkmovelistctrl.c, gtkmovelistctrl.h, gtkoptions.c, gtkoptions.h, gtkpanels.c, gtkpanels.h, gtkprefs.c, gtkrace.c, gtkrelational.c, gtkrelational.h, gtkrolls.c, gtktoolbar.c, gtktoolbar.h, gtkwindows.c, gtkwindows.h, import.c, lib/cache.c, Makefile.am, matchequity.c, multithread.c, multithread.h, play.c, progress.c, pub_eval.c, relational.c, relational.h, render.c, renderprefs.c, rollout.c, rollout.h, set.c, show.c, speed.c, timer.c, userrng.c, util.c, util.h: make sure that functions are either static or declared in an appropriate header. Fri Aug 31 23:36:49 CEST 2007 Christian Anthon * gnubg.c, gtkgame.c, set.c, gtkgame.h: make sure that GTKOutput calls are rejected if the gtk interface isn't up and running. Fix a few potential language setting problems. Wed Aug 22 22:59:26 CEST 2007 Christian Anthon * gtkboard.c: fix player name setting bug Tue Aug 14 15:10:14 CEST 2007 Christian Anthon * gtkgame.c, gnubg.svg, gnubg.png: Add png file in case svg load unsupported. Sun Aug 12 10:45:16 CEST 2007 Christian Anthon * gtkcube.c, gtkmet.c, gtkrolls.c, gtksplash.c, gtktheory.c, gtktoolbar.c: update deprecated gtk_object_set_data Sat Aug 11 21:30:46 CEST 2007 Christian Anthon * gtkboard.c: update deprecated gtk_entry_new_with_max_length Sat Aug 11 21:09:41 CEST 2007 Christian Anthon * gtkwindows.c, gtkgame.c: update deprecated gtk_window_set_policy and gtk_container_children Sat Aug 11 20:58:02 CEST 2007 Christian Anthon * play.c, gtkboard.c: update deprecated gtk_timeout* Sat Aug 11 20:26:54 CEST 2007 Christian Anthon * board3d/fun3d.h, board3d/misc3d.c: make export position png work when using board3d Wed Aug 1 20:57:30 CEST 2007 Christian Anthon * gtkgame.c: set default icon for all windows Tue Jul 31 00:27:34 CEST 2007 Christian Anthon * analysis.c, configure.in, multithread.c, multithread.h, rollout.c, speed.c: make windows threads compile again and make a few simplifying changes * M html.c: UserCommand not awailable without gtk Sun Jul 29 08:27:41 CEST 2007 Christian Anthon * file.c, file.h, gtkfile.c, import.c: allow manual setting of the import file format in the GUI Sun Jul 29 08:24:22 CEST 2007 Christian Anthon * html.c: export html-images dir if non-existing * gtkgame.c: always export images to html-images/ Sun Jul 29 00:42:50 CEST 2007 Christian Anthon * multithread.c: another attempt to fix the check for all tasks done * rollout.c: fix mt rollout bug (wrong count) Wed Jul 18 14:35:32 CEST 2007 Christian Anthon * gnubg.c, gtkboard.c, gtkgame.c, gtkgame.h, gtkgamelist.c, gtkoptions.c, gtkpanels.c, gtkprefs.c, gtktoolbar.c, play.c, render.c, renderprefs.c, board3d/fun3d.h, board3d/graph.c, board3d/misc3d.c, board3d/widget3d.c: Allow startup in 2D mode if gtk_gl_init_check fails Sat Jul 14 22:54:29 CEST 2007 Christian Anthon * multithread.c: Fix hangup when all task done signal was missed and fix a closing bug for gthreads. Win32 threads are likely a bit messed up after these changes. Sat Jul 14 22:53:32 CEST 2007 Christian Anthon * gtkchequer.[ch]: Add quick rollout buttons Sat Jul 14 22:50:07 CEST 2007 Christian Anthon * export.c, import.c: Fix two Jellyfish MAT format bugs. One import and one export. Sat Jul 14 22:47:19 CEST 2007 Christian Anthon * backgammon.h, gnubg.c, set.c: Fix a couple of set sound options. Sat Jul 14 22:41:22 CEST 2007 Christian Anthon * Makefile.w32, Makefile.am, bearoffdump.c, getopt*, makebearoff.c, makebearoff1.c, makehyper.c, tctutorial.h, lib/Makefile.am, lib/hashtest.c, lib/md5test.c: Code clean, remove unused test programs and getopt. Wed Jul 11 15:37:49 CEST 2007 Christian Anthon * Makefile.w32: Delete a few unused files * eval.c: Fix startup bug when gnubg.wd was missing Tue Jul 10 17:22:33 CEST 2007 Christian Anthon * set.c, show.c, gnubg.c: Fix a language setting problem Tue Jul 10 10:42:39 CEST 2007 Christian Anthon * progress.c, rollout.c: Fix counting bug in multithreaded code for cube rollouts. Revert changes in progress.c so that the displayed number of games i correct for both non-threaded and multi-threaded code. Wed Jul 4 00:01:48 CEST 2007 Christian Anthon * : Updated GNU Backgammon to use GPL version 3. Achim did the work. I'm removing a few obsoleted and autotools related files. Sun Jul 1 13:05:02 CEST 2007 Christian Anthon * gtkprefs.c: fix bug with default board designs not being loaded Thu Jun 28 21:20:45 CEST 2007 Christian Anthon * import.c: Fix TMG post-Crawford import bug Mon Jun 11 20:54:35 CEST 2007 Christian Anthon * boardpos.c, copying.awk, corecount.c, credits.sh, erf.c, erftest.c, external_l.l, getopt.c, getopt1.c, gnubgmodule.h, gtk-multiview.c, gtkboard.c, gtkchequer.c, gtkcolour.c, gtkcube.c, gtkexport.c, gtkfile.c, gtkgame.c, gtkgamelist.c, gtkmet.c, gtkmovefilter.c, gtkmovelist.c, gtkoptions.c, gtkpanels.c, gtkprefs.c, gtkrace.c, gtkrelational.c, gtkrolls.c, gtksplash.c, gtktempmap.c, gtktheory.c, gtktoolbar.c, gtkwindows.c, htmlimages.c, progress.c, pub_eval.c, rollout.c, sgf.l, sound.c, speed.c, userrng.c, util.c, board3d/drawboard3d.c, board3d/font3d.c, board3d/graph.c, board3d/gtkcolour3d.c, board3d/inc3d.h, board3d/matrix.c, board3d/misc3d.c, board3d/model.c, board3d/shadow.c, board3d/widget3d.c, lib/cache.c, lib/dynarray.c, lib/hash.c, lib/heap.c, lib/isaac.c, lib/list.c, lib/md5.c, lib/md5test.c, lib/mt19937ar.c, non-src/copying.c, non-src/credits.c, non-src/external_l.c, non-src/sgfl.c: replace deprecated gtk_signal functions with g_signal functions. Make sure that config.h is included at the top of all .c files and not in .h files for better control (e.g. #define GTK_DISABLE_DEPRECATED). Fri Jun 8 00:07:30 CEST 2007 Christian Anthon * analysis.c, analysis.h, gnubg.c, gtkfile.c, progress.c, relational.c: make a gtkwidget for batch_analysis Fri Jun 1 08:43:07 CEST 2007 Christian Anthon * gnubg.c: fix rollout problem in cl interface. Allow doubling before rolling the dice when positions are obtained from the move hint list, but not when rolling out a single position. Fri Jun 1 00:27:53 CEST 2007 Christian Anthon * backgammon.h, gnubg.c, openurl.c, openurl.h, set.c, show.c: fix some problems with setting the web browser Thu May 31 11:43:08 CEST 2007 Christian Anthon * gnubg.c, sound.c: update a few strings. Thu May 31 23:22:37 CEST 2007 Christian Anthon * gnubg.c, dice.c: fix a few text mode locale problems Thu May 31 22:11:00 CEST 2007 Christian Anthon * sound.c: minor bug * gtkboard.c, gtkgame.c: make pasting of position and match id's work in edit mode and before starting a new match. Wed May 30 16:43:08 CEST 2007 Christian Anthon * sound.c: print to stdout instead of stderr in case of missing sound files, etc. Tue May 29 20:37:13 CEST 2007 Christian Anthon * gtkoptions.c: removed bearoff options Mon May 28 23:37:57 CEST 2007 Christian Anthon * sound.c: fix small sound setting problem Fri May 25 17:56:41 CEST 2007 Christian Anthon * sound.c, show.c, gtkoptions.c: fix small sound setting problem Wed May 23 22:44:14 CEST 2007 Christian Anthon * render.c: malloc more space for the labels to avoid crashes on small board sizes. Wed May 23 17:12:54 CEST 2007 Christian Anthon * file.c, file.h, Makefile.am, backgammon.h, export.c, export.h, gnubg.c, gtkfile.c, gtkgame.c, html.c, import.c, import.h, sgf.h: move some import/export/load/save functions for consistency. New files file.[ch] to allow the new cl command "import auto". Fri May 18 21:02:50 CEST 2007 Christian Anthon * openurl.c: small win32 improvement Thu May 17 21:35:00 CEST 2007 Christian Anthon * util.c: win32 fixes Thu May 17 15:53:42 CEST 2007 Christian Anthon * gtkgame.c, gtkwindows.c, progress.c: fix problem with DIALOG_FLAG_NOTIDY not being used. Make sure that the parent of the dialog is present. * util.c, board3d/matrix.c, board3d/matrix.h: compiler warnings Mon May 14 12:21:13 CEST 2007 Christian Anthon * util.[ch]: new files. Keeps the common parts of the ugly fixes of the util programs in one place. Mon May 14 01:18:33 CEST 2007 Christian Anthon * makehyper.c: rename WriteFile to WriteHyperFile to avoid conflict with windows.h Mon May 14 01:10:14 CEST 2007 Christian Anthon * gnubg.c, gtkgame.c, set.c: Fix problems in SetupLang Tue May 8 02:22:42 CEST 2007 Christian Anthon * gtkgame.c, rollout.c: solved problem with calibration widget causing crash. Modality disabled, because of an unresolved issue. DIALOG_FLAG_NOTIDY is unused?? Mon May 7 23:29:33 CEST 2007 Christian Anthon * gnubg.c: fix problem with lang settings not being loaded. * po/: now fuzzy matching, since po files are ill maintained. Fri May 4 10:21:14 CEST 2007 Christian Anthon * gnubg.c: fix issue with matches loaded twice from command line * analysis.c: fix issue with progress bar when running multithreaded * export.c, multithread.c: fix WIN32 compiler warnings Wed May 2 00:00:38 CEST 2007 Christian Anthon * Makefile.am, backgammon.h, bearoff.c, bearoff.h, bearoffdump.c, dice.c, eval.c, eval.h, gnubg.c, gnubgmodule.c, gnubgmodule.h, gtkfile.c, gtkgame.c, gtkoptions.c, gtkprefs.c, html.c, makebearoff.c, matchequity.c, matchequity.h, openurl.c, path.c, path.h, render.c, set.c, show.c, sound.c, sound.h, board3d/font3d.c, board3d/misc3d.c: remove path.[ch] Sun Apr 29 01:18:40 CEST 2007 Christian Anthon * analysis.c ,backgammon.h ,gnubg.c ,html.c ,latex.c ,play.c ,postscript.c ,relational.c ,text.c: removed MOVE_TIME Fri Apr 27 10:50:01 CEST 2007 Christian Anthon * Makefile.am, analysis.c, analysis.h, backgammon.h, configure.in, drawboard.c, formatgs.c, gnubg.c, gnubgmodule.c, gtkboard.c, gtkboard.h, gtkgame.c, gtkgame.h, import.c, play.c, set.c, sgf.c, show.c, sound.c, sound.h, text.c: removed timecontrol Fri Apr 27 01:35:36 CEST 2007 Christian Anthon * configure.in: cleanup Fri Apr 27 00:04:02 CEST 2007 Christian Anthon * eval.c, gnubg.c, gtkoptions.c, set.c, show.c: removed egyptian rule Thu Apr 26 23:52:57 CEST 2007 Christian Anthon * gtkbearoff.c, gtkbearoff.h, Makefile.am, backgammon.h, bearoff.c, bearoff.h, eval.c, eval.h, gnubg.c, gtkgame.c, gtkoptions.c, gtkrace.c, onechequer.c, onechequer.h, set.c, show.c: race cleanup. Removed Sconyers support. Thu Apr 26 23:06:04 CEST 2007 Christian Anthon * dice.c, gnubg.c, configure.in: replace gettimeofday by g_get_current_time Mon Apr 23 13:52:56 CEST 2007 Christian Anthon * gtkfile.c: fixed problem with . being added to filename on eache export. Fri Apr 20 18:00:10 CEST 2007 Christian Anthon * gtkfile.c, gtkgame.c: compiler warnings and fixed problem with extension not being remembered when exporting. Wed Apr 18 20:52:26 CEST 2007 Christian Anthon * gtkgame.h, gtktoolbar.c, gtktoolbar.h, play.c, speed.c: hack to make edit start a new game if gameste is none. Added an edit new position button to the new game widget. Tue Apr 17 09:13:43 CEST 2007 Christian Anthon * gnubg.c: swap r ratings when swapping players Tue Apr 17 09:08:36 CEST 2007 Christian Anthon * doc/Makefile.am: DESTDIR support Thu Apr 12 20:43:03 2007 Řystein Johansen * gtkfile.[ch], gtkgame.c: New feature: Batch analysis (still buggy) Thu Apr 12 16:57:39 CEST 2007 Christian Anthon * gnubg.c: init_sconyers unused, protect spaces in LoadRC Tue Apr 10 00:41:03 CEST 2007 Christian Anthon * backgammon.h, configure.in, gnubg.c, gnubgmodule.c, gtkgame.c, gtkgame.h, gtkwindows.c, show.c, doc/.cvsignore: cleanup of the main function. Fix problem with error messages during startup. Postpone efectuation of -p and -c options so that they may be used under gtk. Fix problem with readline not being detected under redhat. Sun Apr 8 18:44:45 CEST 2007 Christian Anthon * analysis.c, eval.c, eval.h, external.c, format.c, format.h, gnubg.c, gnubgmodule.c, gtkcube.c, gtkwindows.c, html.c, latex.c, makebearoff.c, play.c, postscript.c, progress.c, rollout.c, set.c, sgf.c, show.c, text.c: icc compiler fixes Sun Apr 8 13:40:34 CEST 2007 Christian Anthon * backgammon.h, eval.c, eval.h, gnubg.c, gtkgame.c, gtkrace.c, gtkrace.h, gtktoolbar.c, show.c: race theory update and simplification of analyse menu. Wed Apr 4 00:07:07 CEST 2007 Christian Anthon * bearoff.c: fix the fnd function, which was messed up by a typecast. Thu Mar 29 17:57:17 CEST 2007 Christian Anthon * board3d/Makefile.am: fix --without-board3d Thu Mar 29 09:51:40 CEST 2007 Christian Anthon * configure.in, m4/az_python.m4: Fix --without-python Mon Mar 26 17:05:29 CEST 2007 Christian Anthon * configure.in, m4/az_python.m4: OS/X changes Thu Mar 22 00:22:47 CET 2007 Christian Anthon * import.c, openurl.c, sound.c, doc/Makefile.am: a few compile fixes after previous checkins Wed Mar 21 00:23:10 CET 2007 Christian Anthon * : Sound system cleanup. We now allow only an external command or for system that support it: either esound, or win32 sound. Wed Mar 21 00:21:08 CET 2007 Christian Anthon * import.c: Allow import of nackgammon mat files. (thx, Joerg Picard ) Tue Mar 20 19:28:06 CET 2007 Christian Anthon * : Removed gtktexi. Added Albert Silver's 'All about GNU'. Updated the openurl function and allowed user configuration of the web browser. Tue Mar 20 16:49:37 CET 2007 Christian Anthon * eval.[ch]: fix bug caused by signed/unsigned changes Fri Mar 16 02:30:26 CET 2007 Christian Anthon * : updated documentation. It now contains the information from the dokuwiki as well as the old info files. The documentation is now written in docbook format, and texinfo and info files are now generated from the docbook source. The manpage has been updated as well. Fri Mar 16 00:04:44 CET 2007 Christian Anthon * gnubg.c, gtkgame.c, gtkwindows.c, play.c: replace gtk_idle with g_idle. Fri Mar 16 00:04:29 CET 2007 Christian Anthon * : silence a bunch of intel c compiler warnings (recomitting after savannah crash) Fri 15 Mar 21:47:53 2007 GMT Jim Segrave * rollout.c: was using the 'this is a cube rollout' flag to decide whether to calculate JSDs from cubeful or cubeless equities Sun 25 Feb 12:11:40 2007 GMT Jim Segrave * rollout.c : if settings were for cubeful rollouts, then extending rollouts used cubeful equity. Threading aggravates the problem, this is not a complete fix (rcRollout is used globally but needs to be modified to match the set of moves being rolled out. Ensuring it's put back for all sequences which might terminate a rollout is non-trivial Mon Feb 12 21:56:45 2006 GMT Jon Kinsey * speed.c : Make calibration test multi-threaded Wed Feb 14 11:07:07 CET 2007 Christian Anthon * multithread.h: first argument to MT_Safe* is pointer not value also when compiled without threads Wed Feb 14 10:03:35 CET 2007 Christian Anthon * Makefile.am, configure.in: remove pthread Mon Feb 12 21:56:45 2006 GMT Jon Kinsey * multithread.c : Remove pthread tls code and reduce #ifs/tidy win32 code Sun Feb 11 22:18:33 CET 2007 Christian Anthon * bearoffdump.c, eval.c, makebearoff.c, makehyper.c, rollout.c: small fixes to let gnubg and tools compile without warnings. Thu Feb 08 19:56:45 2006 GMT Jon Kinsey * multithread.c, rollout.c : Multi-thread rollouts. Fri Feb 02 18:56:45 2006 GMT Jon Kinsey * multithread.c/.h, lib/neuralnet.c, lib/neuralnetsse.c, lib/cache.c (new) : synchronize cache access, fix mis-aligned mingw thread stack, remove frombase optimisation for SSE. Wed Jan 31 12:49:00 CET 2007 Christian Anthon * Makefile.am, configure.in, eval.c, gnubg.c, multithread.c, multithread.h, lib/neuralnet.c, lib/neuralnetsse.c: various changes to make gnubg compile with ./configure --enable-threads Thu Jan 25 20:27:53 CET 2007 Christian Anthon * makehyper.c, lib/neuralnet*.c: small fixes needed to compile without threads on linux Thu 25 Jan 09:43:30 2007 GMT Jim Segrave * gnubg.c: restore some code dropped some revisions ago Sun Jan 05 10:56:45 2006 GMT Jon Kinsey * eval.c: Fix some concurrency problems. Fri Jan 05 21:56:45 2006 GMT Jon Kinsey * analysis.c multithread.c: Add multi-thread compatibility for game analysis. Fri Dec 29 12:51:42 CET 2006 Christian Anthon * lib/Makefile.am, lib/fifo.[ch], lib/buffer.[ch]: removed as they are not used anymore. Thu Dec 28 10:03:36 CET 2006 Christian Anthon * common.h, board3d/matrix.c, board3d/matrix.h, lib/fifo.c, lib/fifo.h, lib/neuralnet.c: small linux compile fixes after last commit. Tue Dec 26 11:56:45 2006 GMT Jon Kinsey * lib/board3d: Run through lint, added consts to pointers and made some int's unsigned. Wed Dec 20 10:06:46 CET 2006 Christian Anthon * */: add some filenames to .cvsignore Wed Dec 20 09:25:49 CET 2006 Christian Anthon * non-src/: updated the flex/bison files to versions supplied by Ingo Tue Dec 19 23:30:58 CET 2006 Christian Anthon * configure.in: fix small python and png problems Tue Dec 19 12:03:14 CET 2006 Christian Anthon * configure.in, common.h, render.c, lib/neuralnet.c: declare signbit and lrint as macros if undeclared Mon Dec 18 23:58:05 2006 GMT Jim Segrave * analysis.c: fix casts and parens in relativeFibsRating Sun Dec 16 20:56:45 2006 GMT Jon Kinsey * gtkmovelist.c: Fix for bug #18526 s Thu Dec 14 17:56:45 2006 GMT Jon Kinsey * gtkmovelist.c: Fix for bug #17845 multiple highlights in hint * import.c: Small partygammon fix * gnubg.c: Fix for bug #12131 menus while analysing games Tue Dec 12 15:54:22 CET 2006 Christian Anthon * gnubg.c, gtkgame.c: Save/Load rollout settings added to gtk interface Sun Dec 10 17:27:29 CET 2006 Christian Anthon * configure.in, lib/neuralnet.c: configure option to disable the SSE test (e.g. on amd64) Thu Dec 7 16:57:14 CET 2006 Christian Anthon * gnubg.c: make CommandImportParty compile without gtk Thu Dec 7 00:59:04 CET 2006 Christian Anthon * various: mingw fixes of autotool changes Thu Dec 7 00:10:46 CET 2006 Christian Anthon * too many to list: major autotools/library cleanup. Likely some things will be broken on some systems. Tue Dec 5 09:53:54 CET 2006 Christian Anthon * ChangeLog, configure.in, gnubg.c, gtkprefs.c, gtktexi.c, matchequity.c, rollout.c: vprintf cleanup Tue Dec 5 00:44:07 CET 2006 Christian Anthon * common.h, configure.in, dice.c, eval.c, export.c, gnubg.c, gtkchequer.c, gtkcube.c, gtkexport.c, gtkgame.c, gtkmet.c, gtkmovefilter.c, gtkrace.c, gtktexi.c, gtktheory.c, osr.c, path.c, render.c, rollout.c, lib/Makefile.am, lib/buffer.c, lib/neuralnet.c: alloca cleanup (we allways have g_alloca). Mon Dec 4 10:10:29 CET 2006 Christian Anthon * gtkoptions.c: hide sound options when compile without USE_SOUND Sat Dec 2 21:52:04 CET 2006 Christian Anthon * rollout.c, progress.c: Disable view rollout statistics after close/reopen. Add drops to won games in rollout statistics. Thu Nov 30 23:43:03 CET 2006 Christian Anthon * eval.c, gtkgame.c: remove meaningless data from evaluation window and fix window size Thu Nov 30 22:17:24 CET 2006 Christian Anthon * gtkwindows.c: fix sizing problem in messages window Thu Nov 30 20:14:05 CET 2006 Christian Anthon * gtkoptions.c: fix gtk sizing problem in sound options. Tue Nov 28 23:59:09 CET 2006 Christian Anthon * sound.c: cleanup of play_file Sun Nov 26 21:56:45 2006 GMT Jon Kinsey * gtkoptions.c (mainly): Selectable sound files (in gui) Sun Nov 26 16:59:28 CET 2006 Christian Anthon * backgammon.h, gnubg.c, gtkfile.c, import.c, import.h: "import gam", "import party" and "import empire", respectively imports, jellyfish .gam, partygammon .gam and gammonempire .gam. Sun Nov 26 16:24:30 CET 2006 Christian Anthon * gtkfile.c: Default folders on win32 Sat Nov 25 17:56:45 2006 GMT Jon Kinsey * import.c: First try at PartyGammon import (based on convert-to-mat script by gunnar bluth and achim mueller) Thu Nov 23 18:56:45 2006 GMT Jon Kinsey * gtkfile.c: Add warning if trying to import PartyGammon game files Sat Nov 18 14:56:45 2006 GMT Jon Kinsey * gtkprefs.c: Fix bug in saving/exporting custom designs Wed Nov 15 16:53:19 CET 2006 Christian Anthon * gnubg.c, set.c, show.c: in fresh installs: g11.xml, more sensible rollout settings, infinite number of moves analysed. * gtkboard.c, gtkgame.c, gtkpanels.c: docked panels wider by default. gnubg starts maximized(make this an option?). Attempt to fix ugly resizes in player/score frames. Thu Nov 16 15:27:32 CET 2006 Christian Anthon * gnubg.c, gtkgame.c, record.c, record.h, gtkprefs.c: Move all rc files to g_get_home_dir()/.gnubg (both windows and unix). Tue Nov 14 21:17:55 GMT 2006 Jim Segrave * gtkgame.c : GTKShowScoreSheet callback to MoveListIntoView 2nd parameter is pointer to int, not int Mon Nov 13 22:32:37 CET 2006 Christian Anthon * Makefile.am, configure.in,g gnubg.c , gtkbearoff.c , gtkgame.c , gtkprefs.c , record.c: attempt fix of recent problems with szHomeDirectory Mon Nov 13 18:50:22 CET 2006 Christian Anthon * Makefile.am, configure.in, board3d/.cvsignore, board3d/Makefile.am, lib/.cvsignore, lib/Makefile.am: Use libtool static libs. Mon Nov 13 12:16:54 CET 2006 Christian Anthon * Makefile.am, configure.in, board3d/Makefile.am, lib/Makefile.am, non-src/Makfile.am: Add various files to EXTRA_DIST or sources. Fri Nov 10 15:22:46 CET 2006 Christian Anthon * fonts/Makefile.am, flags/Makefile.am: Add flags and fonts to EXTRA_DIST Fri Nov 10 12:40:47 CET 2006 Christian Anthon * configure.in: Version bump, MAIN now version 0.16-devel Fri Nov 10 12:35:50 CET 2006 Christian Anthon * gnubgmodule.c: Hopefully fix AMD64 relational database crash Fri Nov 10 08:31:26 2006 GMT TAKAHASHI Kaoru * gtktheory.c: Fix typo. Use TG instead of TP for "Too good". Tue Nov 7 19:56:45 2006 GMT Jon Kinsey * import.c, gktfile.c : Add money game import for .gam files Thu Nov 9 20:56:45 2006 GMT Jon Kinsey * font3d.c, render.c : Minor changes to 3d cube font and 2d point number font to make them look slightly better. Mon Nov 6 15:11:40 CET 2006 Christian Anthon * render.c, board3d/font3d.c, board3d/widget3d.c: Allow fallback when no stencil buffer and make vera fonts work in 3d. Mon Nov 6 13:28:52 CET 2006 Christian Anthon * Makefile.am, configure.in, render.c, board3d/font3d.c, R luxi.c, A fonts/: Use the free bitstream vera fonts instead of the non-free luxi.c Thu Nov 2 20:56:45 2006 GMT Jon Kinsey * gtkfile.c + .h: Removed import option and now open any file type automatically. Thu Nov 2 20:56:45 2006 GMT Jon Kinsey * gtkgame.c + .h: Show 3 decimals for epc and include wastage. (By Ian Shaw) Wed Nov 1 00:52:26 CET 2006 Christian Anthon * gnubg.c, backgammon.h, Makefile.am: Move option parser to GLib option parser, since it facilitates the integration of gnubg options with gtk options. getopt*.[ch] still needed for utility programs. Wed Oct 25 11:36:58 CEST 2006 Christian Anthon * Makefile.am, backgammon.h, export.c, gnubg.c, gnubgmodule.c, gtkfile.c, gtkgame.c, gtkgame.h, gtkoptions.c, gtkprefs.c, gtktoolbar.c, html.c, latex.c, postscript.c, set.c, sgf.c, show.c, text.c: Moved file dialogs to gtk_file_chooser * gtkfile.h: new file * gtkpath.c gtkpath.h: removed Wed Oct 18 14:54:34 CEST 2006 Christian Anthon * Makefile.am, configure.in, gtkgame.c, flags/.cvsignore, flags/Makefile.am: automake and install stuff for the new flags Wed Oct 18 09:31:12 CEST 2006 Christian Anthon * backgammon.h, gnubg.c, gtkgame.c, postscript.c, sgf.c: charset conversion cleanup Tue Oct 17 15:03:08 CEST 2006 Christian Anthon * drawboard.c: avoid assuming length of translated strings Mon Oct 16 15:45:49 CEST 2006 Christian Anthon * gtkgame.c: Correct locales. Call language changes directly instead of through UserCommand. * gnubg.c: Use environment locale. Replace putenv by setenv. Thu Oct 12 19:56:45 2006 GMT Jon Kinsey * gtkgame.c, gtkoptions.c, flags dir: Added new dialog to set language Thu Oct 5 23:51:15 CEST 2006 Christian Anthon * gtkgame.c: Fix compiler warnings without USE_PYTHON after last commit Wed Oct 4 14:18:35 CEST 2006 Christian Anthon * Makefile.am analysis.c, analysis.h, formatgs.c, formatgs.h, html.c, text.c: minor changes to allow "relational show details" * database, database.example: rename * gtkgame.c, gtkgame.h, gtkrelational.c, gtkrelational.h, relational.c: detailed player stats in the CL version. List of all player stats and details upon double-clicking in the GUI. Wed Oct 4 11:58:50 CEST 2006 Christian Anthon * gtktoolbar.c: make sure labels are shown * .cvsignore: add linked files Mon Oct 2 00:49:27 CEST 2006 Christian Anthon * several: compiler warnings mainly on 64bit platforms. Avoid casting integer to pointer and back. Sat Sep 30 09:56:45 2006 GMT Jon Kinsey * gtkgame.c: Fix minor edit bug (labels dissappearing when panels moved) Sun Sep 24 06:12:42 2006 GMT TAKAHASHI Kaoru * makebearoff.c: Fix typo: #include . Wed Sep 20 21:56:45 2006 GMT Jon Kinsey * gtkgame.c: Save full screen state and show pip count Mon Sep 18 22:17:39 CEST 2006 Christian Anthon * misc: Keith Count Wed Sep 13 21:42:45 CEST 2006 Christian Anthon * gtk*, Makefile.am: Cleanup after modal commit Wed Sep 13 21:38:50 CEST 2006 Christian Anthon * sgf.c: make save/load locale independent Mon Sep 11 23:56:45 2006 GMT Jon Kinsey * gtkwindows.c+.h, lots of gtk files: Move dialog code to new file Fixed modal dialog z order problems (mainly on windows) Sat Sep 9 14:11:25 CEST 2006 Christian Anthon * gtkgame.c: Reimplement the idle python shell Wed Sep 6 19:16:04 CEST 2006 Christian Anthon * gtkgame.c: make ctrl-c and ctrl-v work for gtktextview Tue Sep 5 12:42:29 CEST 2006 Christian Anthon * gtkgame.c and friends: replace gtktext (gtk1) with gtktextview Tue Aug 29 14:32:51 CEST 2006 Christian Anthon * drawboard.c: 'off' and 'bar' should not be translated Wed Aug 23 2006 Jim Segrave * gnubg.c: initialise rollout context when calling RolloutGeneral Tue Jul 4 18:45:04 CEST 2006 Christian Anthon * several files: fix gcc4 compiler warnings due to xml using usigned char Mon Jul 3 17:58:33 CEST 2006 Christian Anthon * doc/gnubg.xml, non-src/README: gnubg.xml moved (edit gnubg.texi instead). Fri Jun 30 11:41:51 CEST 2006 Christian Anthon * gtkgame.c: fix save settings when using gnubg -t Thu Jun 29 11:41:00 CEST 2006 Christian Anthon * gnubg.weights: added to archive Thu Jun 29 11:27:09 CEST 2006 Christian Anthon * Several files: move generated files to non-src. Make the generated files actually compile and automake work as expected. Mon Jun 26 22:05:50 CEST 2006 Christian Anthon * Several files: remove simplelibgen Mon Jun 26 21:00:44 2006 UTC CEST 2006 Christian Anthon * Several files: remove gtk_1 code missed first time Thu Jun 22 23:56:45 2006 GMT Jon Kinsey * Several files: Moved some 3d settings and code into 3d lib. Thu Jun 22 20:53:54 CEST 2006 Christian Anthon * Several files: remove gtk_1 code Sun Jun 18 01:26:05 CEST 2006 Christian Anthon * Several files: cleanup after Řystein i18n changes Sat Jun 17 19:42:19 2006 Řystein Johansen * Many files: Remove i18n functions like PushLocale and PopLocale, use GLib's g_ascii_strtod and g_ascii_formatd instead. * gnubg.c and others: Remove gdbm database training Sat Jun 10 00:02:19 CEST 2006 Christian Anthon * : Removal of USE_GUI, USE_EXT, xgame* xboard*, the ext directory Tue Jun 22 Christian Anthon * Makefile.am (SUBDIRS): Remove intl. (EXTRA_DIST): Add config.rpath. Upgrade to gettext-0.14.5. Mon May 29 13:01:07 CEST 2006 Christian Anthon * M Makefile.am, configure.in, gnubg.gtkrc : gtk1/gtk2 cleanup, we now expect gtk-2.6.0 * M README,TODO : guile clean * R config.guess, config.sub, ltmain.sh, libtool : autoconfig cleanup * M gnubg.c, gtkgame.c : gtk1/gtk2 cleanup, get rid of gdkx.h, which seems unneeded, update evaluate widget to gtk_text_view * M gnubg.gtkrc : gtk2 cleanup, don't autogenerate from gnubg.gtkrc.in anymore Fri May 26 20:35:05 2006 Řystein Johansen * gnubg.c: Simple Win32 fixes (Windows doesn't use gdkx.h) Fri May 26 11:51:05 CEST 2006 Christian Anthon * Many files : Updated the autobuild system. Please read INSTALL in the topdir. Gtk1 and guile are no longer supported. Tue May 24 19:56:45 2006 GMT Jon Kinsey * gnubg.c : Fixed memory overwrite and .mat export for foreign languages Tue May 24 19:56:45 2006 GMT Jon Kinsey * render.c, htmlimages.c : Rewrite libart 2d board arrows using cairo Sat May 21 15:56:45 2006 GMT Jon Kinsey * boards.xml : Added two new designs by Wilson Amaral Jorge. Mon May 8 21:32:34 2006 Řystein Johansen * renderprefs.c: A revised 64 bit patch from Alex applied. Sun May 7 18:49:34 2006 Řystein Johansen * renderprefs.c: Revert Alex' patch. Tue May 2 00:33:07 CEST 2006 Christian Anthon * gtkgame.c: fix display of gtkeval window Mon May 1 22:06:34 2006 Řystein Johansen * renderprefs.c: Apply Alex patch. * texture.txt: Bump version Sun Apr 16 12:48:31 CEST 2006 Christian Anthon * rollout.c: Use abs in time check * gnubg.py : Fix typo Tue Apr 14 09:56:45 2006 GMT Jon Kinsey * export.c : Fix 3d png export (and 3d preview bars in appearance dialog) Thu Apr 13 01:37:29 CEST 2006 Christian Anthon * Make Jon's SSE-splitup actually compile on linux. Moved SSE_Support() to neuralnet.c to make makeweights compile. Added some autoconf magick. Tue Apr 12 07:56:45 2006 GMT Jon Kinsey * backgammon.h +various: Tidy up min/max to use MIN/MAX everywhere Tue Apr 11 21:56:45 2006 GMT Jon Kinsey * gtkboard.c: Minor bugfix when hitting chequers in edit mode Tue Apr 11 17:56:45 2006 GMT Jon Kinsey * rollout.c: Only update rollout stats once a second at most Tue Apr 11 17:56:45 2006 GMT Jon Kinsey * gtkfile.c: Fix bug changing met with gtk 2 Mon Apr 10 09:49:03 CEST 2006 Christian Anthon * gtkgame.c: Fixed typo causing crash in RelationalAddMatch Fri Apr 7 13:46:58 CEST 2006 Christian Anthon * gnubg.c, gtkgame.c: Fix problems with help menus in gtk * gtkgame.c : Enable add game to relational in gtk(thx MaX) * database.py : Create games database when appropriate(thx MaX) * html.c : small improvement on previous Thu Apr 6 22:30:58 CEST 2006 Christian Anthon * html.c make it clearer who is who when exporting to gammonline Wed Mar 29 10:13:39 CEST 2006 Christian Anthon * **/Makefile.in aclocal.m4 config.h.in configure: Sync auto-tools files. Tue Mar 28 23:45:53 CEST 2006 Christian Anthon * gnubg.game.mysql gnubg.game.sql gnubg.sql: Fix switched order of normalised/unnormalised for some error_, so that it matches database.py. Tue Mar 28 23:37:40 CEST 2006 Christian Anthon * remove m4/gettext.m4 Tue Mar 28 23:24:14 CEST 2006 Christian Anthon * format.c eval.c analysis.c: Clean up isCloseCube and lower limit to 0.16 Sat Mar 20 23:16:45 2006 Řystein Johansen * analysis.c: Fix for problem with wrong double statistics. (Thanks to Christian Anthon) Sat Mar 03 10:56:45 2006 GMT Jon Kinsey * gtkgame.c: Change mouse pointer to watch when computer is thinking Sat Mar 03 09:56:45 2006 GMT Jon Kinsey * gtktoolbar.c: Undo any partial move that may have been made when entering edit mode. Sat Mar 03 09:56:45 2006 GMT Jon Kinsey * gtkgame.c: Remove old ClearText function Mon Feb 27 10:56:45 2006 GMT Jon Kinsey * play.c: Fix 'too good' tutor bug Fri Feb 24 17:56:45 2006 GMT Jon Kinsey * gtkgame.c and others: Sort out copy/paste for gtk 2 Sat Feb 11 09:56:45 2006 GMT Jon Kinsey * import.c: Fixed an import bug for TMG files (reported by Christian Anthon). Mon Feb 06 08:56:45 2006 GMT Jon Kinsey * gtkfile.c, eval.c, matchequity.c: 3 small fixes from Philippe Michel Thu Feb 02 07:56:45 2006 GMT Jon Kinsey * gtkgame.c, gtkgamelist.c: Replace old gdk_string_width() calls Thu Jan 31 07:56:45 2006 GMT Jon Kinsey * gtkgame.c: Add menu option to switch between 2d and 3d views Sun Jan 29 19:32:05 GMT 2006 Jim Segrave * gtkpanels.c - don't do anything to undock panels in CLI mode ChangeLog entry for 27/01 listed the wrong source file, sigh Fri Jan 27 18:36:46 GMT 2006 Jim Segrave * play.c - don't do anything to undock panels in CLI mode Sat Dec 17 -3:31:09 GMT 2005 Jim Segrave * gtkchequer.c - CreateMoveListTools() must be called before calling MoveListCreate(), otherwise coredumps can result Sat Dec 17 -1:22:09 GMT 2005 Jim Segrave * html.c - copy basemane() from simplelibgen.c to get_basename(), as basename() is not promised to be re-entrant. This caused all the links between html game files to be set to the last call to basename() Thu Dec 12 13:23:12 GMT 2005 Jim Segrave *eval.c change assembler code labels to locals. gcc 3.42 saw labels as redfined. I don't know what this will do to MS compilers or the Intel compiler. Fri Nov 18 16:38:11 GMT 2005 Jim Segrave *gtktexi.c - make inclusion of io.h dependent on not having unistd.h, as done in other routines (io.h is a Windows-only header) Mon Sep 19 22:37:25 GMT 2005 Jim Segrave * relational.c, gtkgame.c - don't reference non-existent gtk objects postgresql does not accept queries in the form SELECT column from A INNER JOIN B INNER JOIN C ON A.id1 = B.id1 AND B.id2 = C.id2 must be SELECT column from A INNER JOIN B ON A.id1 = B.id1 INNER JOIN C ON B.id2 = C.id2 Sun Sep 18 14:10:02 GMT 2005 Jim Segrave * gnubg.game.sql, gnubg.game.mysql - create databases with tables for game statistics * database - sample database configuration file Mon Aug 29 15:56:45 2005 GMT Jon Kinsey * gtkchequer.c (and a few others), gtkmovelist(.h, .c, ctrl.c) - new files Added win/loss stats to movelist Fri Aug 5 11:45:31 2005 GMT Jim Segrave * gtkexport.c - fix to skip SKILL_GOOD for cube decisions Sun May 8 12:56:45 2005 GMT Jon Kinsey * gtkgame.c, gtkpanels.c: full screen improvements (for gtk 2.6) * progress.c: alloc mismatch Wed May 4 18:10:43 GMT 2005 Jim Segrave * eval.c: Don't use mmap for reading weights when using SSE Fri Apr 29 20:56:45 2005 GMT Jon Kinsey * progress.c: Limit list updates in rollouts to reduce flicker and improve speed (gtk 2.6) * eval.c: Minor speed improvment Thu Apr 28 22:35:45 2005 Oystein Johansen Vectorization of neural net evaluation. * eval.c: Change callers to NeuralNetEvaluate to use vectorized code. * set.c: Fix typo. Thanks Jim Curtis. Wed Mar 30 16:56:45 2005 GMT Jon Kinsey * gtkfile.c : Allow spaces in filenames (new 2.6 file dialog), not tested with linux * gtkgame.c : Fix maximised window->full screen (gtk 2+) Sat Mar 26 00:17:49 GMT 2005 Jim Segrave * gtkgame.c, sound.c - fix for Cygwin FASYNC vs O_ASYNC (from Ingo Macherius Fri Mar 11 19:25:45 2005 Oystein Johansen * gtkgame.c (InitGTK): move the 'Go' menu to the right place according to HIG. * gtkgame.c (GTKHelp): Make the command reference window a dialog. Sun Mar 06 18:00:45 2005 Oystein Johansen * gtkgame.c InitGTK(): Exclude GTK_STOCK_ABOUT when gtkversion < 2.6 Sat Mar 05 23:50:45 2005 Oystein Johansen This is the first commit in a large GUI cleanup I intend to do. Cleanup in the menu system. Simplify all the 'File' menues. Rearrange according to Human Interface Guidlines 2.0 (HIG 2.0). Add some stock icons to some of the menu items. Please comment on the stock items. * gtkgame.[ch], gtkpanels.c, gtktoolbar.c: Menu cleanup. Fri Feb 25 11:56:45 2005 GMT Jon Kinsey * gtk(some).c : Make event boxes transparent (By Ingo Macherius) Tue Feb 23 18:26:45 2005 Oystein Johansen * gtkgame.c, progress.c: Make all progress bars with gtk_progress_bar instead of the deprecated gtk_progress_*, when compiled with GTK+2. Wed Feb 23 06:49:52 2005 GMT Jim Segrave * gtkpanels.c: use string.h rather than strings.h to get prototype for strcasecmp() Tue Feb 22 19:26:45 2005 Oystein Johansen * gtkcube.c (CubeAnalysisEvalPly): Get the evalcontext right! Tue Feb 22 19:06:45 2005 Oystein Johansen * gtkgame.c (GTKFileCommand): Apply a fix from Ingo Fri Feb 18 16:56:45 2005 GMT Jon Kinsey * matchequity.c : Fix met xml files met/catalog (By Ingo Macherius) Thu Feb 17 16:56:45 2005 GMT Jon Kinsey * gtkgame.c, gtkfile.c (and a few others): First part of new file dialogs (By Ingo Macherius) * gtkpanels.c: Minor gtk 2 window fix Tue Feb 15 17:56:45 2005 GMT Jon Kinsey * gnubg.c, gtkpanels.c: Remember maximised state of windows Mon Feb 14 12:56:45 2005 GMT Jon Kinsey Fixes from Philippe Michel: rollout.c, format.c: Fix bugs in rollout output gnubg.c: Fix for bug 10099 makebearoff1.c: Typo Thu Feb 10 10:56:45 2005 GMT Jon Kinsey Fixes from Ingo Macherius: external_l.l, external_y.y: Minor parser change gnubg.c: No-gui build fixes gtkpanels.c: Remove compiler warning gnubgmodule.c/h: Add paramater to FindCubeDecision Fix from Philippe Michel: matchid.c: Buffer fix for matchidfromkey Fixes for gtk 2.6: gnubg.c: Don't hide windows on close - so sound finishes correctly gtkprefs.c: Fix long pause if no boards.xml file misc3d.c, play.c: Dice not shown until after roll sound (3d) Wed Feb 8 16:56:45 2005 GMT Jon Kinsey * Various fixes for gtk 2.6: eval.c : Increase poll time gnubg.c : Fix ok click problem for gtk 2.6 gtkgame.c : Fix dock/undock problem for gtk 2.6 gtkoptions.c gtkbearoff.c gtktempmap.c : Fix dialog modality Tue Feb 7 17:56:45 2005 GMT Jon Kinsey * gnubg.c: change get install dir to look at path to exe (windows) Tue Feb 2 19:56:45 2005 GMT Jon Kinsey * gtkgamelist.c: Remove gtk loop, hopefully fixing "can't move" bug * gtkgame.c: More relational db code Tue Jan 5 8:56:45 2005 GMT Jon Kinsey * relational.c: Add warning if adding unfinished or unanalyzed match * gtkpanels.c: Fix for console build Tue Jan 4 9:56:45 2005 GMT Jon Kinsey * gtkpanels.c: Move remaining window/panel code to this file and fix a couple of small bugs Tue Jan 4 00:16:32 2005 GMT Jim Segrave * gnubgmodule.c - add detail to python doc strings Sun Jan 2 13:44:55 2005 GMT Jim Segrave * gnubgmodule.h - reinclude config.h to set HAVE_FSTAT (gcc doesn't like trying to redfine it and config.h is not idempotent) * gnubgmodule.c - replace _getcwd with getcwd, _MAX_PATH with PATH_MAX, which should be available in all C implementations Sun Jan 2 11:56:45 2005 GMT Jon Kinsey * gnubgmodule.c: Look for local python installation (windows) Sun 12 Dec 13:27:54 gmt 2004 Jim Segrave * fix some bugs in scripts/database.py Sun 28 Nov 01:04:30 GMT 2004 Jim Segrave * import.c - patch Fibs code to ignore non-game lines in input Wed Nov 23 10:56:45 2004 GMT Jon Kinsey * play.c: Fix wrong resign acceptance * eval.c, bearoff.c, set.c: Hypergammon fixes Thu Nov 18 23:06:46 2004 GMT Holger Bochnig * bearoffdump.c: allow posids as arguments Mon Nov 15 10:56:45 2004 GMT Jon Kinsey * gtkgame.c (and others) : Simplify widget grabbing, hopefully fixing multiple "can't move" bug Mon Nov 8 11:56:45 2004 GMT Jon Kinsey * gtkgame.c : Fixed bug with credits Fri Nov 5 14:56:45 2004 GMT Jon Kinsey * gnubg.sql, gtkgame.c, realational.c, database.py : Added multiple environments to the realational database Fri Nov 5 14:08:48 2004 Joseph Heled * eval.c (EvalInitialise): Fix bug with prunning. Order of crash and race nets was reversed, So crashed/race prune nets were returning garbage. Thu Nov 4 13:12:07 2004 Joseph Heled * eval.c: Make evals after prunning cubeful. See if it makes a difference. Would be nice to offer this as a global option. Wed Nov 03 20:44:45 2004 Oystein Johansen * gtkgame.c (EvalWidget): Fix a copy'n'waste error * eval.c: Change 'Tiny' movefilter to 5 candidates. Wed Nov 03 20:07:45 2004 Oystein Johansen * gtkchequer.c (CreateMoveList): Use NULL instead of "" Wed Nov 03 09:15:45 2004 Oystein Johansen * i18n.h: reenter #include "config.h" Tue Nov 02 22:03:30 2004 CET Petr Kadlec * gtkprefs.c: Fixed an issue when not using HAVE_LIBXML2 Wed Oct 27 01:20:45 2004 Oystein Johansen * boards.xml: Add design by Ian Curtis. Wed Oct 27 01:20:45 2004 Oystein Johansen * gtktheory.c gtktempmap.c: Two files I missed in the last commit. Tue Oct 26 21:00:45 2004 Oystein Johansen Hate me or love me! I've committed the code that removes the reduced searches. (Sorry Nis! Hope it won't cause you any trouble). Hopefully I will be able to combine the two reduction methods later. * gtkgame.c, eval.c and other files: Add user interface to prune nets Fri Oct 22 15:56:45 2004 GMT Jon Kinsey * html.c, and others : Fix exports to display cube analysis whenever analysis available Thu Oct 21 15:56:45 2004 GMT Jon Kinsey * matchequity.c, set.c : Bug fix while inverting met Tue Oct 19 17:56:45 2004 GMT Jon Kinsey * gtkprefs.c : Fixes for import/export appearance designs Sun Oct 17 22:14:00 2004 UTC Jim Segrave * Makefile.in - missing gtkpanels.* * sgf.c - versioning for pruning * gnubg.c - move reduction variables inside ifdef * eval.c - cosmetic fix for compiler warnings * xpm/x.xpm - missing final line of bmp * eval.h - add version numbers for pruning in .sgf files Sat Oct 16 23:36:45 2004 Oystein Johansen * gnubgmodule.c: Fix dice option handling Thu Oct 14 17:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkgame.c : Remember last import+export file type Thu Oct 14 12:56:45 2004 GMT Jon Kinsey * eval.c : Minor (non gcc) compiler fixes Tue Oct 12 19:44:00 2004 Oystein Johansen * gnubgmodule.c: Add methods for FindBestMove and EvaluateCubeful Tue Oct 12 21:36:00 2004 Joseph Heled * eval.c (FindBestMoveInEval): Add usage of prunning nets. This is quite a large change, and since it adds a member to evalcontext, possibly a destructive one. Sun Oct 10 23:04:14 GMT 2004 Jon Nall * backgammon.h, gnubg.c, play.c: Added support for adding comments to moves from the command line. Closes bug #10638 Tue Oct 5 16:56:45 2004 GMT Jon Kinsey * database.py, relational.c, gtkgame.c (and others) : Added check for match in database Wed Sep 29 21:29:45 2004 Oystein Johansen * relational.c: make it compile without gtk Wed Sep 29 18:56:45 2004 GMT Jon Kinsey * database.py, relational.c, gtkgame.c: Added more relational database code Wed Sep 29 15:10:45 2004 Oystein Johansen * makebearoff.c: Display 'usage' on Windows. Sun Sep 19 14:56:45 2004 GMT Jon Kinsey * gtkgame.c: Fix gtk2 panel bug Thu Sep 16 8:56:45 2004 GMT Jon Kinsey * eval.c: Fix bug (navigate to last match crash) - hopefully Fri Sep 10 10:56:45 2004 GMT Jon Kinsey * gtkboard.c, gtkgame.c, gnubg.c, gtkpanels.c: Added command and theory panels (test) and slider for panels. Thu Sep 9 12:56:45 2004 GMT Jon Kinsey * gtkboard.c, render.*, gnubg.c: Small memory leaks, uninitialized memory reads and tidy up code added. May fix import .mat bugs Mon Sep 6 00:27:04 2004 GMT Jim Segrave * show.c = fix for running off array end in show path command Wed Sep 1 17:56:45 2004 GMT Jon Kinsey * gtkgame.c: Small import bug fixed Wed Aug 25 18:56:45 2004 GMT Jon Kinsey * gtkgame.c, gtkgamelist.c, import.c, sgf.c: Speed up loading and remove flickering Fri Aug 13 09:56:45 2004 GMT Jon Kinsey * play.c: Small bug fix (bug 9926) Wed Aug 11 23:39:41 CEST 2004 Joern Thyssen * external_y.y: remove %output to stop ylwrap complaining. Thu Aug 12 07:46:18 2004 Joseph Heled * gnubg.c: Add search in "scripts/gnubg.py" if all else fails in CommandLoadPython, since this IS the place 'gmake install' puts on my Linux box (i.e./usr/local/share/gnubg/scripts/gnubg.py). Mon Aug 02 09:56:45 2004 GMT Jon Kinsey * play.c: Fixed 3d quick draw bug Sun Aug 01 00:40:47 UTC 2004 Jim Segrave * gnubgmodule.c - calls to PythonGame had arguments in different order, so database ratings were calculated on 1 point matches Fri Jul 30 23:08:58 CEST 2004 Oystein Johansen * gtkgame.c (PythonShell): starting "idle" differs between platforms. Sun Jul 25 20:34:35 2004 GMT TAKAHASHI Kaoru * gnubg.c (Convert): Suppress compiler warnings. Synch with iconv() prototype. Sun Jul 25 19:19:41 2004 GMT TAKAHASHI Kaoru * rollout.h: Suppress compiler warnings; static declaration for `nSkip' follows non-static. Sun Jul 25 18:15:47 UTC 2004 Jim Segrave * gtkexport.c - fix handling of cube export settings (typo and corrections for unused entries) Mon Jul 19 09:53:10 CEST 2004 Joern Thyssen * gnubg.c (real_main): initialise random seed for rollout RNG. (bug reported by Chuck Bower, fix suggested by Jim) Mon Jul 12 22:48:32 CEST 2004 Petr Kadlec * gtkprefs.c (ImportDesign): Use ngettext. * html.c (HTMLBoardHeader): Ditto. Sun Jul 11 16:37:02 2004 GMT TAKAHASHI Kaoru * eval.c (EvalInitialise): Suppress compiler warnings. Sun Jul 11 14:47:30 2004 GMT TAKAHASHI Kaoru * gtkgame.c: include for isspace(). Sun Jul 11 14:42:51 2004 GMT TAKAHASHI Kaoru * dice.h: Added extern UserRNGOpen(); Sun Jul 11 13:30:11 2004 GMT TAKAHASHI Kaoru * htmlimages.c: include . Sun Jul 11 12:07:25 CEST 2004 Joern Thyssen * external.c: pacify fussy compilers. Sun Jul 11 07:17:35 2004 GMT TAKAHASHI Kaoru * gnubg.c (DisplayTimeAnalysis, ShowBoard, CommandCopy): Use ngettext. And tabify. * gtkboard.c (ReturnHits): Ditto. * gtkgame.c (TimeAnalysis, GTKShowScoreSheet): Ditto. * html.c (HTMLPrologue, ExportGameHTML): Ditto. * html.c (ExportPositionGammOnLine): Ditto. * play.c (ApplyMoveRecord): Ditto. Sat Jul 10 14:35:26 2004 GMT TAKAHASHI Kaoru * gtkoptions.c (aaszLang): Use ja_JP instead of ja_JA. Added ru_RU. Sat Jul 10 08:17:26 2004 GMT TAKAHASHI Kaoru * i18n.h [!ENABLE_NLS] (ngettext): New macro. Sun Jul 4 14:22:59 CEST 2004 Joern Thyssen * analysis.c (CashPoint): fix bug leading to wrong classification of wrong doubles. (reported by Hans-Jürgen Schäfer) * eval.c (calculate_gammon_rates): new function. * openurl.c, gtkgame.c, relational.c: pacify fussy compilers. Sun Jul 4 11:41:54 CEST 2004 Joern Thyssen * gtkprefs.c: add functions for importing and exporting board designs. Sat Jul 3 14:41:56 CEST 2004 Joern Thyssen * configure.in: rewrite test for ftgl. * gtkgame.[ch]: declare SelectFile external. Wed Jun 30 22:28:07 CEST 2004 Joern Thyssen * configure.in: write test for ftgl. Wed Jun 30 20:42:53 CEST 2004 Nis Joergensen * gtkboard.c: fix bug that disallowed certain legal moves. Mon Jun 28 16:56:45 2004 GMT Jon Kinsey * boards.xml: Add 2 new designs by Ruth Schneider and Ausbilder Schmidt Mon Jun 28 10:56:45 2004 GMT Jon Kinsey * gtkgamelist.c: Allow last move to be selected in game list * render.c: Small bug in design dialog Sun Jun 27 11:56:45 2004 GMT Jon Kinsey * gtkboard.c: Fixed bug - 2d chequers disappearing if dragged off board * positionid.c: Fixed bug - illegal position id's not being errored Sat Jun 26 16:49:31 CEST 2004 Nis Joergensen * speed.c (CommandCalibrate): Speed Calibration" now avoids using the same seed for randomization every time, so gives reliable results on consecutive runs. * gtkboard.c: Dragging checkers allows for pick-and-pass. The logic I have implemented is to hit if possible, and if there are two options, hit with the "left" die (ie highest in standard setup). I am still working on undo of pick-and-pass. * play.c: Gnubg allows you to resign AFTER you roll, based on what you rolled. This actually fixes a way to cheat - resigning if your equity drops to below -1 or -2 when you roll. Thu Jun 17 10:56:45 2004 GMT Jon Kinsey * gtkchequer.c, gtkgamelist.c: Fixes for styles in gamelist Wed Jun 16 20:50:46 CEST 2004 Joern Thyssen * gnubg.gtkrc.in: backport changes to gnubg.gtkrc Wed Jun 16 12:56:45 2004 GMT Jon Kinsey * gtkchequer.c, gtkboard.c, gnubg.gtkrc: separate styles for current move and done move in move list Wed Jun 16 12:56:45 2004 GMT Jon Kinsey * gtkchequer.c: use move style for hint window, also removed highlight code from several files Tue Jun 15 20:32:05 CEST 2004 Joern Thyssen * gnubg.gtkrc.in: autogenerate gnubg.gtkrc Tue Jun 15 15:56:45 2004 GMT Jon Kinsey * gtkgame.c: gtk_widget_destroy error message when opening hint window (reported by Ian) Tue Jun 15 12:56:45 2004 GMT Jon Kinsey * gtkgamelist.c, gnubg.gtkrc: Fix font styles for gtk2 and style order Tue Jun 15 05:58:34 2004 TAKAHASHI Kaoru * credits.sh, credits.c, AUTHORS: Fix Japanese translations credit. Sun Jun 13 22:32:09 CEST 2004 Jim Segrave * import.c - allow handling uncompleted matches in .mat files Sat Jun 12 12:25:54 CEST 2004 Joern Thyssen * import.c (ParseSGGOptions): use strcasecmp for deciding which variant of backgammon is used. (reported by Hugh Sconyers) Fri Jun 11 18:56:45 GMT 2004 Jon Kinsey * gtkboard.c: Fix minor chequer display bug Fri Jun 11 19:00:05 CEST 2004 Jim Segrave * gtkgamelist.c gnubg.gtkrc * Add gtkrc support for any-blunder/any-error/any-doubtful Thu Jun 10 17:41:40 CEST 2004 Joern Thyssen * Makefile.am: add gtkgamelist.c Thu Jun 10 14:56:45 2004 GMT Jon Kinsey * gtkgamelist.c, gnubg.gtkrc: Multiple styles and new defaults for game list Wed Jun 9 14:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkgamelist.c, gnubg.gtkrc: Get game list colours from gtkrc file Tue Jun 8 8:56:45 2004 GMT Jon Kinsey * gtkgame.c, gtkgamelist.c: Colour mistakes in game list Mon Jun 7 8:56:45 2004 GMT Jon Kinsey * gtkgame.c: Remove keyboard focus from game window, fix minor bug with new right click menu. * gnubg.c: Empty board on startup (try #2) Sun Jun 6 18:56:45 2004 GMT Jon Kinsey * gnubg.c: Empty board on startup * gtkboard.c: Close hint window when editing * import.c: Ignore empty lines in mat import Fri Jun 4 22:58:22 CEST 2004 Joern Thyssen * eval.c (EvalKey): add another bit to match scores in hash key. (fixes bug #9211 reported by Casey Hopkins) Fri Jun 4 18:56:45 2004 GMT Jon Kinsey * gtkgame.c, gnubg.c: Add show scoresheet command (to right click menu) Wed Jun 2 9:56:45 2004 GMT Jon Kinsey * gtkgame.c, gtkboard.c: Add undo right click menu Thu May 27 19:05:49 CEST 2004 Joern Thyssen * import.c (ParseMatMove): fix logic for calculating resignations. (reported by Joachim Matussek) Tur May 20 15:56:45 2004 GMT Jon Kinsey * external.*: Remove memory leaks Tue May 18 15:56:45 2004 GMT Jon Kinsey * external.*: Minor changes to parser Tue May 18 8:56:45 2004 GMT Jon Kinsey * gtkprefs.c, render.c: Several small fixes to board appearance options Wed May 12 10:56:45 2004 GMT Jon Kinsey * boards.xml, gtkprefs.c, render.c+.h, renderprefs.c: Add Taki-style rounded points Mon May 10 21:33:28 CEST 2004 Joern Thyssen * external.h: move "#define closesocket close" to external.h Sat May 8 11:25:08 CEST 2004 Joern Thyssen * gnubg.c, show.c: enlarge buffers Fri May 7 21:13:26 CEST 2004 Joern Thyssen * external_l.l: fix buffer overflow. Fri May 8 10:56:45 2004 GMT Jon Kinsey * external.c, dice.c, set.c: Fix socket code for windows Fri May 7 16:17:09 CEST 2004 Joern Thyssen Change union moverecord into struct moverecord (this is step 1 towards better support for editing positions and storing analysis) * backgammon.h: Change union moverecord into struct moverecord (change a gazillion subroutines) Fri May 8 10:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkgame.c, gtkpath.c, set.c: Added png to set path command Fri May 7 07:48:47 CEST 2004 Joern Thyssen Prerelease 0.14.3. CVS tag is pre-rel-0-14-3 * configure.in, gtkgame.c: prelease 0.14.3 Fri May 7 07:27:18 CEST 2004 Joern Thyssen * gnubg.c: fix problems with initialisation of rollout contexts. This lead the problem about cubeless and cubeful equities being different for -1,-3C rollouts reported by Robert Eberlein. Thu May 6 15:56:45 2004 GMT Jon Kinsey * gtktempmap.c, gtkboard.c: Show correct dice colour in temperature map when in 3d Mon May 3 15:20:43 CEST 2004 Joern Thyssen * osr.c, dice.c: add mti as parameter to init_genrand. Fri Apr 30 18:56:45 2004 GMT Jon Kinsey * gtkgame.c, gtkboard.c: Change dice and cube selection dialogs to fixed size * gtkboard.c board3d/graph.c: Remove event->count optimization as now done in gtk * i18n.c: Warn if too many PopLocale() calls attempted * gtkprefs.c, htmlimages.c: No libart build fixes * gtkprefs.c: Small bug in colours when switching from 3d to 2d Thu Apr 29 20:44:24 CEST 2004 Joern Thyssen * bearoff.c (GetDistCompressed): fix sanity check for huge databases. Wed Apr 28 20:28:22 CEST 2004 Joern Thyssen Add new utility program bearoffdump for inspection of databases. * bearoffdump.c: new file. * Makefile.am: add bearoffdump as installable file. Wed Apr 28 16:56:45 2004 GMT Jon Kinsey * set.c: Change "set priority idle" to set the process priority to idle (for windows). Mon Apr 26 13:56:45 2004 GMT Jon Kinsey * gnubg.c, credits.*: Moved copyright string to credits.sh Sun Apr 25 08:46:27 CEST 2004 Dmitri I GOULIAEV * credits.sh: add Dmitri I GOULIAEV * NEWS: add russian translation Fri Apr 23 22:12:51 CEST 2004 Joern Thyssen * gnubg.c: according to FSF we must give individual years rather than an interval. * gtkboard.c (update_pipcount): show epc in lowercase. * gnubg.c: fix a typo in the definition for "relational" command. * relational.c: add code for most functions. * scripts/database.py: adapt code to relational.c Fri Apr 23 13:56:45 2004 GMT Jon Kinsey * gnubg.c: Change year to 2004 for command line build Thu Apr 22 21:09:01 CEST 2004 Joern Thyssen Introduce RNG context for storage of RNG-specific private data. * dice.c (many functions): add rngctx to a number of functions (change all callers) * show.c (CommandShowSeed): show RNG counter as well. Wed Apr 21 22:53:44 CEST 2004 Petr Kadlec Corrected some i18n-related problems + typos. * gnubg.c, gtkgame.c, gtkprefs.c, gtkrace.c, html.c, play.c, set.c, show.c, text.c: Added calls to gettext, marked some previously unmarked translatable strings (and vice versa), corrected a few typos. Tue Apr 20 17:56:25 CEST 2004 Joern Thyssen * matchequity.c (initPostCrawfordMETFromParameters): add missing call to PushLocale. (reported by Joachim Matussek) Mon Apr 19 22:52:41 CEST 2004 Joern Thyssen * gnubg.c (EPC): fix "same dice sequence for several games in a row"-bug, reported by several users (Erik Barfoed, Řystein, Murat etc). Well, this is not really a fix, I've just changed the code to avoid calling the OSR code, that resets the seed. We really need to introduce several RNG contexts... Mon Apr 19 10:56:45 2004 GMT Jon Kinsey * gtkprefs.c: Small 3d bug fix Sun Apr 18 10:53:26 CEST 2004 Joern Thyssen Define functions for CLI and GUI support for relational database interface. * gnubg.c: new functions "relational ...". * relational.c, Makefile.am: new file * gtkgame.c: menu items for relational database. * dice.c (InitRNGSeedLong): allow setting seed = 0. Sat Apr 17 23:43:07 2004 Oystein Johansen * render.c (RenderFrameWood): Fix typo. Sat Apr 17 20:01:07 CEST 2004 Joern Thyssen * set.c (CommandSetMet): call "clear hint". Sat Apr 17 10:58:18 CEST 2004 Joern Thyssen Save leading comment lines in the match information when reading Jellyfish .mat files (e.g., the information Dueller adds to .mat files) * import.c (ImportMat): same comments. * html.c (HTMLMatchInfo): rearrange match info into a Fri Apr 16 22:02:23 CEST 2004 Joern Thyssen Add built-in support for mec * mec.c: new file (copy of original mec.c with modfications for gnubg) * Makefile.am: add mec.c * matchequity.c (initMetFromParameters, initPostCrawfordMETFromParameters): support for mec. Fri Apr 16 16:56:45 2004 GMT Jon Kinsey * sound.c: Fix bug if no sound card on windows Wed Apr 14 22:41:23 CEST 2004 Joern Thyssen * set.c (SetMoveFilter): insert some debug code. * set.c: set szSetCommand a few places. Wed 14 Apr 2004 16:39:45 GMT Jim Segrave * play.c - turn off Crawford on one point matches * board3d/misc3d.c - avoid segfault if no textures (CLI mode) Mon 12 Apr 2004 13:12:06 GMT Jim Segrave * set.c - put if (fX) wrapper around SetToolbarStyle, stops GTK complaints in text mode Sun Apr 11 22:52:49 CEST 2004 Joern Thyssen * gtkprefs.c (SetTitle): move misplaced pbdeSelected. (contributed by Petr Kadlec) * gnubg.c (real_main): no env. variable DISPLAY on wintendo. (contributed by Petr Kadlec) Sun Apr 11 19:20:52 CEST 2004 Joern Thyssen Various patches from Mike Petch. * gnubg.c (real_main): avoid segfaults with gnubg -t * sound.c (SoundWait): do nothing if sound is disabled. * sound.c: only include stropts.h when HAVE_STROPTS_H * openurl.c, import.c: include glib.h * Makefile.am: move openurl.c to common files (it's now being used by CommandShowManualWeb) * configure.in: various checks for Mac. * set.c (CommandSetGUIShowEPCs): define a NO_GUI variant of function Thu Apr 8 16:03:09 CEST 2004 Joern Thyssen Show EPCs in GUI. (suggested by Ian Shaw) * gtkboard.c (update_pipcount): show EPCs * gnubg.c: new command "set gui showepcs on|off" * set.c (CommandSetGUIShowEPCs): new sub. * gnubg.c (EPC): new parameter fOnlyRace * gtkoptions.c: gui control for setting fGUIShowEPCs Wed Apr 7 10:46:00 CEST 2004 Joern Thyssen * configure.in, sound.c, config.h.in: check for _af_ulaw2linear Mon Apr 5 08:24:52 CEST 2004 Joern Thyssen * Makefile.am: add gnubg.sql to DATA * gnubg.sql, scripts/database.py: rename stat to matchstat, and change some PKs/FKs * gnubg.c (CommandLoadPython): use PathSearch. Sun Apr 4 15:50:55 CEST 2004 Joern Thyssen First implementation of gnubg-rel.database interface. * gnubg.sql: DDLs for gnubg database. * scripts/database.py: python script for adding match to database. Sun Apr 4 15:11:10 2004 Joern Thyssen * gnubgmodule.c (PyGameStats): add missing statistics. * gnubgmodule.c: new functions "gnubg.luckrating" and "gnubg.errorrating". Sun Apr 4 10:35:13 2004 Joern Thyssen Respect $BROWSER (http://www.catb.org/~esr/BROWSER/index.html) * openurl.c: use env. variable BROWSER. Also, call "system" instead of g_command_line_sync which doesn't seem to work with lynx. * gnubg.c: new commands "show manual [web|gui]". * gtkgame.c: use "show manual [web|gui]". * show.c: new functions "show manual [web|gui]". Sun Apr 4 09:43:17 2004 Joern Thyssen * sound.c: include Thu Apr 1 11:56:45 2004 GMT Jon Kinsey * gtkchequer.c: Reset interrupt flag on analysis start * sound.c: Add some error handiling to windows sound Wed Mar 31 20:58:49 2004 Joern Thyssen * Makefile.am: add BR1_SOURCES to makebearoff and makehyper. * configure.in: whoops, remove "dynamic".. * sound.c: include [SIGIO] Wed Mar 31 9:56:45 2004 GMT Jon Kinsey * gtkprefs.c and other files: Moved preview in preferences Mon Mar 29 17:56:45 2004 GMT Jon Kinsey * gtkgame.c: Fixed small bug to allow both names to be swapped Mon Mar 29 09:40:02 CEST 2004 Joern Thyssen * Makefile.am: target for br1.c not kept up to date with changes in makebearoff * Makefile.am: FLEX->LEX, BISON->YACC * bearoff.h: declare BearoffAlloc extern * configure.in: add "dynamic" as parameter to --enable-bearoff * makebearoff1.c: update code to match latest version of bearoff.h * play.c (DumpGameList): fix typo, add linebreak (reported by Mike Whitton) * gtkgame.c: use correct release_id when reporting bugs. Sun Mar 28 09:07:48 2004 Joern Thyssen * matchequity.c (initMETZadeh): use G1 for calculation of 1-away pre-Crawford values. Sat Mar 27 10:45:08 CET 2004 Joern Thyssen Prerelease 0.14.2 Thu Mar 25 22:22:57 CET 2004 Joern Thyssen * Makefile.am, */Makefile.am: add a few missing files (reported by Christian Anthon) Thu Mar 25 21:04:54 CET 2004 Joern Thyssen * credits.sh, gtkgame.c, show.c, credits.c, credits.h: Move generation of cred entries into credits.sh for easy reuse in the text version of CommandShowCredits. Wed Mar 24 12:56:45 2004 GMT Jon Kinsey * gtkgame.c: More credits and version info now copyable. Tue Mar 23 12:56:45 2004 GMT Jon Kinsey * boards.xml, textures.txt: Added settings for final few 3d designs, tidied up design a bit too. Mon Mar 22 12:56:45 2004 GMT Jon Kinsey * gtkgame.c: Make sure messages shown when docked panels are hidden, also don't show a message when setting cube (bug 3973) Fri Mar 19 12:56:45 2004 GMT Jon Kinsey * gtkgame.c: Change window order and titles, and put back accelerators from windows (Ned's suggestions) Fri Mar 19 00:26:45 2004 Oystein Johansen * external.c (and other files): changes to use winsock2.h Thu Mar 18 10:56:45 2004 GMT Jon Kinsey * gtkgame.c: Panel bug fixed (removed warning) Mon Mar 16 11:56:45 2004 GMT Jon Kinsey * gtkgame.c: Panel bug fixed (crash at startup) Mon Mar 15 17:56:45 2004 GMT Jon Kinsey * sound.c: Wait when multiple sounds attempted to be played (windows) Mon Mar 15 11:56:45 2004 GMT Jon Kinsey * gnubg.c gtkgame.c: Reorganized about box Mon Mar 15 07:49:53 2004 Joern Thyssen * gnubgmodule.c (PythonInitialise): fix bug for szDir==NULL (reported by Joseph Heled) Sun Mar 14 08:55:39 2004 Joseph Heled * gtkcolour.h: Change broken type for GtkColourPicker::func and prototype. Fri Mar 12 10:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkprefs.c, gtkgame.c: Removed texture load errors when in 2d mode Mon Mar 8 8:56:45 2004 GMT Jon Kinsey * gtkcolor.c, gtkprefs.c: Remove "property delete" gtk warning message when changin colours Thu Mar 4 10:56:45 2004 GMT Jon Kinsey * gtkgame.c, gnubg.c: Replace USE_OLD_LAYOUT compile flag with menu option * gtkboard.c: Crawford flag only changeable when editing Sun Feb 29 18:17:14 2004 TAKAHASHI Kaoru * gnubg.c: #include only if WIN32 defined. Wed Feb 25 10:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkgame.c: Add option so toolbar can show text, icon or both Wed Feb 25 10:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkgame.c, set.c: Save shown panels * gnubg.c : Fixed small show epc bug Fri Feb 20 15:10:39 CET 2004 Joern Thyssen * Makefile.am, configure.in: move gnubg.py to scripts. * gnubgmodule.c: _MAX_PATH only defined onwintendo. Thu Feb 19 13:56:45 2004 GMT Jon Kinsey * import.c: Fixed import jellyfish pos problem (bug 6086) Thu Feb 19 9:56:45 2004 GMT Jon Kinsey * scripts: Added new directory to cvs for python scripts Wed Feb 18 11:56:45 2004 GMT Jon Kinsey * gtkgame.c: Remove maximum column size of text copied to clipboard from statistics view (Bug 4161). Mon Feb 16 21:57:18 CET 2004 Joern Thyssen * bearoff.c (HeuristicDatabase): align heuristic database with GetBearoffDistUncompressed (a.k.a. the 40 byte offset). (reported by Daniel Murphy) Mon Feb 16 9:56:45 2004 GMT Jon Kinsey * html.c: Tidy text version of html export Sat Feb 14 20:32:24 CET 2004 Joern Thyssen * gnubg.c: new command "load python ". Mon Feb 9 22:56:17 CET 2004 Joern Thyssen * import.c (ImportTMG): don't call SwapPlayers unless a game is in progress. (reported by John Marttila) Thu Feb 5 19:06:31 CET 2004 Joern Thyssen * progress.c (formatDelta): fix small bug leading to gnubg thining that there is 60 hours/day. (reported by Michael Depreli) Wed Feb 4 17:56:45 2004 GMT Jon Kinsey * import.c (and minor changes in others) : Limit size of player names in import files, bug #7526 Mon Feb 02 2004 18:42:05 GMT * timer.c - wrong #if around include Fri Jan 30 9:56:45 2004 GMT Jon Kinsey * several files: Small changes for msdev compiler Thu Jan 29 10:56:45 2004 GMT Jon Kinsey * gtkboard.c, gtkprefs.c: 3d quick draw-last options added Wed Jan 28 10:56:45 2004 GMT Jon Kinsey * gtkboard.c: 3d quick draw-chequer target help added Tue Jan 27 9:56:45 2004 GMT Jon Kinsey * gtkboard.c, gtkprefs.c: Some more 3d quick draw code Mon Jan 26 19:24:34 2004 Joern Thyssen NetBSD compilation fixes by Adrian Bunk. * gnubg.c (real_main): HAVE_NL_INFO does not necessarily imply HAVE_LANGINFO_CODESET * sound.c: include sys/types.h before sys/audioio.h to define u_int. Mon Jan 26 07:31:03 2004 TAKAHASHI Kaoru * htmlimages.c [!HAVE_LIBPNG] (CommandExportHTMLImages): Argument synch with HAVE_LIBPNG version. Wed Jan 21 21:17:12 2004 Joern Thyssen * bearoff.c (GetDistCompressed): fix stupid stupid stupid bug. (reported by several users) Tue Jan 20 00:22:21 CET 2004 Joern Thyssen Prerelease 0.14.1 * configure.in: bump to 0.14.1-devel Tue Jan 20 00:02:30 CET 2004 Joern Thyssen * bearoff.c (GetDistCompressed): add sanity check to detect corrupted bearoff files. (inspired by bug #7296 by Rod Roark) Mon Jan 19 10:56:45 2004 GMT Jon Kinsey * timer.c timecontrol.c: Small timing changes Mon Jan 19 9:56:45 2004 GMT Jon Kinsey * gnubg.c, gtkboard.c, gtkchequer.c, gtkgame.c, gtkgame.h, gtkprefs.c, gtktoolbar.c: More 3d quick draw option stuff Fri Jan 16 9:56:45 2004 GMT Jon Kinsey * set.c, render.c, play.c, renderprefs.c, gtkprefs.c, gtkoptions.c, gtkgame.c, gtkboard.c: 3d quick draw option Fri Jan 16 9:56:45 2004 GMT Jon Kinsey * bearoff.c, show.c, progress.c: Removed some build warnings Sun Jan 4 13:35:16 2004 Joern Thyssen * gtkchequer.c (CreateMoveList): remove the old layout version as the new can do both versions. (reported by Nardy) Sun Jan 4 11:05:03 2004 Joern Thyssen The hint dialog will now always show the w/g/bg's whereas the panelled analysis only shows the equity/MWC. Pressing the "details" button will pop up the hint dialog. * gtkchequer.c: restore some of the old non-panel code Sun Jan 4 2004 00:51:45 Jim Segrave * makebearoff.c: va_start needs stdarg.h Sat Jan 3 16:53:09 2004 Oystein Johansen * makebearoff.c: Add progress bar. (Win32 only) * makebearoff.rc: New file. Sat Jan 3 14:32:46 2004 Joern Thyssen Some updates to EPCs: * gnubg.c (EPC): return mu and sigma if requested. * gnubg.c (ShowEPC): calculate GWC from mu and sigma. * onechequer.c (GWCFromMuSigma, GWCFromDist): new funtions. Sat Jan 3 01:02:49 2004 Joern Thyssen * configure.in: look for socklen_t. Fri Jan 2 19:23:09 2004 Oystein Johansen * render.c (RenderDice): Redesign the dice in the 2D board. * gtkboard.c (DrawDie): Redesign the dice in the dice selection dialog. Fri Jan 2 12:14:52 2004 Joern Thyssen Use one chequer racing formulae from Zadeh & Kobliska, Management Science, 1977. * onechequer.c (GWCFromPipCount): new function. Delete obsolete OneChequer and GetDistFromPipCount. (change all callers) Thu Jan 1 22:59:09 2004 Oystein Johansen * external.c: Add som #if USE_SOCKETS to make it compile w/o socket support. Thu Jan 1 20:29:09 2004 Joern Thyssen * gnubg.c (DisplayAnalysis, DisplayTimeAnalysis): show time analysis in cli. * gtkgame.c (TimeAnalysis, SetAnnotation): show time analysis in gui. * analysis.c, import.c: remove debug output * format.c (OutputMWCDiff): new function. Thu Jan 1 18:56:50 2004 Joern Thyssen Report equity loss due to "time outs", e.g., when importing matches from TMG which ended with "time out". [USE_TIMECONTROL] TODOs: save in SGF file, text/gtk analysis output * analysis.c (AnalyzeMove): analyse time-outs. * analysis.c (updateStatContext): calculate equity loss from time-outs. * formatgs.c (formatGS): output time-outs. * import.c (ParseTMGGame): don't record dice rolls with dice recorded as '?' Thu Jan 1 12:44:52 2004 Joern Thyssen Happy New Year to all! * gtktoolbar.c (ToolbarUpdate): disable edit button if there is no match in progress (reported by Misja Alma) Wed Dec 31 23:24:55 2003 Joern Thyssen Change external interface to use yacc/lex parser/scanner. * configure.in: look for yacc, lex using correct macros. * external_l.l, external_y.y: new files * external.c: use yacc/lex Mon Dec 29 23:58:34 2003 Joern Thyssen * play.c (NewGame): remove some old code that led to gnubg deleting the current game. I wonder why I originally inserted that code??? (bug #7008 reported by Petr Kadlec) Mon Dec 29 23:17:20 2003 Joern Thyssen * progress.c: move cpp directive. Mon Dec 29 23:14:35 2003 Joern Thyssen * Makefile.am, configure.in: don't use old X code anymore. (bug #7003, reported by Rod Roark) Thu Dec 18 23:35:16 2003 Joern Thyssen * configure.in: search for ATLAS libblas. * bearoff.c: disable cache, since it appears to be rather inefficient. * bearoff.c (ReadBearoffOneSidedExact): only use cache when initialised. * show.c (CommandShowEPC): new subroutines. * gnubg.c (ShowEPC, EPC): new functions. * gnubg.c: new command "show epc". * onechequer.c (DistFromEPC): new function. * makebearoff.c (BearOff): fix database lookup bug. * gtktheory.c, gtkbearoff.c, gtkgame.c: fix font bug introduced earlier. * gtkbearoff.c (GTKShowEPC): new function. * eval.c (EvalInitialise): initialise table used for neural net evaluation * gtkgame.c: add "show epc" to menu. Sat Dec 13 21:15:52 2003 Joern Thyssen * gtkrace.c (OneChequerPage): remove call to SwapSides (reported by Ned Cross and Petr Kadlec) * gnubg.c (HintChequer): compile error: move "moverecord *pmr" outside USE_GTK. (reported by Nardy) * gtkgame.c (ReportBug): remove extra slash in path (bug #6898 by Kennedy Fraser) * analysis.c (AnalyzeMove): generalise calculation of is_initial_position. Use is_initial_position for calculation of luck. (reported by Mathias Kegelmann) * progress.c: print time elapsed, estimated time left, and estimated final standard error. * show.c (CommandShowVariation): * bearoff.c, format.c, gtktheory.c: add some gettexts. * import.c (isAscending): fix off-by-one bug. (reported by Joseph Heled) * set.c (CommandSetVariation): add some extra output to emphasize that the new setting won't be effective until a new match or session has been started. Mon Dec 29 10:56:45 2003 GMT Jon Kinsey * htmlimages.c, html.c: Small fixes and variable size html image generation Wed Dec 3 11:56:45 2003 GMT Jon Kinsey * htmlimages.c: Tidied code Sun Nov 30 13:15:48 2003 Joern Thyssen * gnubg.c (real_main): honour env. var HISTSIZE. * gnubg.c (CommandHistory): show all entries in history. (suggested by Achim) Son Nov 30 12:50:45 2003 Joern Thyssen * html.c (HTMLPrologue): set Charset to GNUBG_CHARSET instead of hardcoded ISO-8859-1. (suggested by Petr Kadlec) Sun Nov 30 09:56:25 2003 Joern Thyssen * gtkbearoff.c, gtkgame.c, gtktheory.c: subst. "iso8859-1" with "*" in font names. (suggested by Petr Kadlec) Sun Nov 30 09:10:46 2003 Joern Thyssen * gnubg.c (HintCube): improve logic for determining whether a move has been made: (a) by having moved something in the GUI (old logic) (b) by going back in the match and doing a hint on an already stored move (suggested by Michael Depreli) Sun Nov 30 08:47:01 2003 Joern Thyssen New command "clear hint" to allow CLI users to force re-evaluation of "hint" after changing settings. (suggested by Achim) * gnubg.c (CommandClearHint): new command "clear hint". * gnubg.c (InvalidateStoredCube): new function. * gnubg.c (HintCube): fix typo Sat Nov 29 21:22:13 2003 Joern Thyssen Implement history * gnubg.c (real_main, PromptForExit, ProcessInput): implement history * gnubg.c (CommandHistory): new command "history". Sat Nov 29 11:02:50 2003 Joern Thyssen * gnubgmodule.c: new python command "nextturn" to emulate C routine "NextTurn". * gnubgmodule.c (PyGameStats): add a few stats. * gnubgmodule.c (PythonCommand): add calls to nextturn. Sat Nov 29 10:14:33 2003 Joern Thyssen * gtkgame.c (ReportBug): use uname to improve logic. Thu Nov 27 9:56:45 2003 GMT Jon Kinsey * htmlimages.c: Fix dice colour * gtkboard.c: Remove previous fix... Wed Nov 26 22:12:37 2003 GMT Holger Bochnig * gtkgame.c: when opening the bug report page in a browser window make gnubg fill in its version, build date and the operating system Mon Nov 24 9:56:45 2003 GMT Jon Kinsey * gtkprefs.c: Make sure preview appears if libxml not present * gtkboard.c: Remove valgrind error Sun Nov 23 21:07:12 GMT Jim Segrave * gnubg.c function header comments for token handling Sat Nov 21 21:19:17 2003 Oystein Johansen * gtkgame.c: corrected some links (reported by Frank Grosse) Thu Nov 20 20:24:04 GMT Jim Segrave * rollout.c - board setup in .sgf files of rollouts only worked if player 0 made first move, now appears to be correct for both players and double by both players Thu Nov 20 07:44:55 2003 TAKAHASHI Kaoru * gtkgame.c (EvalWidget): Add /* xgettext: no-c-format */ comment. Wed Nov 19 19:52:16 2003 GMT Jim Segrave * gtkgame.c gtkprefs.c gtkrace.c add some more I18n strings Wed Nov 19 19:16:25 2003 GMT Jim Segrave * play.c - always output moves to stdout/message window Wed Nov 19 16:35:25 2003 GMT Holger Bochnig * htmlimages.c, play.c, progress.c, rollout.c: make CLI version compile, get rid of compiler warnings Wed Nov 19 07:15:17 2003 Oystein Johansen * latex.c: use unicode and decrease size of board Mon Nov 17 20:04:17 2003 GMT Holger Bochnig * gtkoptions.c: add GUI menu entry for Czech language Sun Nov 16 10:56:59 2003 Joern Thyssen * play.c (DiceRolled): add call to ShowBoard for CLI. (reported by Achim) Wed Nov 12 01:17:58 2003 Oystein Johansen * gnubg.iss: New file for building MS-Windows installation archives with Inno Setup. Sat Nov 8 19:56:58 GMT 2003 Jim Segrave * analysis.c - set up cubeinfo before analysis of a SET_DICE moverecord. Thu Nov 6 13:18:48 GMT 2003 Jim Segrave * analysis.c - Stupid, stupid, stupid. My silly last minute change prevented cube analysis on any position except the initial one. Arrgh. Wed Nov 5 00:31:27 GMT 2003 Jim Segrave * analysis.c - don't analyse cube if board is in initial position (spurious annotations for not doubling when tutor mode was enabled) * gtkoptions.c - fix bug which crashed with invalid language option Mon Nov 3 11:56:45 2003 GMT Jon Kinsey * gtkgame.c: Changes to the panel view Sat Nov 1 14:36:45 2003 Joern Thyssen * htmlimages (CommandExportHTMLImages): make the html image export work with the new board dimensions. (reported by Olivier Croisille) * html.c (printHTMLBoardGNU): some new images. Wed Oct 29 12:26:45 2003 GMT Jon Kinsey * gtkgame.c: Moved .xpm files in root directory to xpm directory Tue Oct 28 21:10:39 GMT 2003 Jim Segrave * gtkoptions.c - add Turkish and Icelandic to language options Tue Oct 28 11:56:45 2003 GMT Jon Kinsey * import.c: Minor memory bug * gtkboard.c: Minor chequer sound fix Fri Oct 25 10:10:07 GMT Jim Segrave * rollout.c - correct stupid mistake causing board setup in sgf file to be reversed Fri Oct 25 10:10:07 GMT Jim Segrave * rollout.c - cast to keep compiler happy Thu Oct 24 22:52:23 2003 GMT Jim Segrave * set.c backgammon.h rollout.c gnubg.c - added text mode commands set rollout log on/off, set rollout logfile