From e318fe58650504f498c9b4139837c9a44a01ee22 Mon Sep 17 00:00:00 2001 From: Guankai Zhai Date: Fri, 6 Mar 2026 16:02:06 -0800 Subject: [PATCH 1/2] =?UTF-8?q?Add=20study=5F013:=20Keh,=20Foo=20&=20Lim?= =?UTF-8?q?=20(2002)=20=E2=80=94=20Opportunity=20Evaluation=20under=20Risk?= =?UTF-8?q?y=20Conditions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New study contribution examining how cognitive biases (overconfidence, illusion of control, planning fallacy, belief in small numbers) affect entrepreneurs' opportunity evaluation, mediated by risk perception. Based on survey data from 77 Singaporean SME founders. Includes: - Full questionnaire (Sections A-D) with verbatim stimuli from paper appendix - 10 overconfidence items with answers verified against Singapore Yearbook of Statistics 2000 - 5 findings (F1-F5): overconfidence t-test + 4 Pearson correlations - config.py with persona-varied prompt generation (40 questions per trial) - evaluator.py with one-sample t-test and correlation-based replication testing Co-Authored-By: Claude Opus 4.6 --- studies/study_013/README.md | 70 ++++ studies/study_013/index.json | 16 + studies/study_013/scripts/config.py | 333 ++++++++++++++++++ studies/study_013/scripts/evaluator.py | 306 ++++++++++++++++ studies/study_013/scripts/stats_lib.py | 86 +++++ studies/study_013/scripts/study_utils.py | 150 ++++++++ ...eh-Foo-Lim-2002-Opportunity-Evaluation.pdf | Bin 0 -> 110900 bytes studies/study_013/source/ground_truth.json | 162 +++++++++ .../materials/section_a_risk_propensity.json | 86 +++++ .../materials/section_b_cognitive_biases.json | 91 +++++ .../materials/section_c_overconfidence.json | 117 ++++++ .../materials/section_d_case_vignette.json | 81 +++++ studies/study_013/source/metadata.json | 85 +++++ studies/study_013/source/specification.json | 62 ++++ 14 files changed, 1645 insertions(+) create mode 100644 studies/study_013/README.md create mode 100644 studies/study_013/index.json create mode 100644 studies/study_013/scripts/config.py create mode 100644 studies/study_013/scripts/evaluator.py create mode 100644 studies/study_013/scripts/stats_lib.py create mode 100644 studies/study_013/scripts/study_utils.py create mode 100644 studies/study_013/source/Keh-Foo-Lim-2002-Opportunity-Evaluation.pdf create mode 100644 studies/study_013/source/ground_truth.json create mode 100644 studies/study_013/source/materials/section_a_risk_propensity.json create mode 100644 studies/study_013/source/materials/section_b_cognitive_biases.json create mode 100644 studies/study_013/source/materials/section_c_overconfidence.json create mode 100644 studies/study_013/source/materials/section_d_case_vignette.json create mode 100644 studies/study_013/source/metadata.json create mode 100644 studies/study_013/source/specification.json diff --git a/studies/study_013/README.md b/studies/study_013/README.md new file mode 100644 index 00000000..cf88e901 --- /dev/null +++ b/studies/study_013/README.md @@ -0,0 +1,70 @@ +# Study 013: Opportunity Evaluation under Risky Conditions + +**Authors:** Hean Tat Keh, Maw Der Foo, Boon Chong Lim + +**Year:** 2002 + +**Journal:** *Entrepreneurship Theory and Practice*, 27(2), 125-148 + +## Description + +This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. Using a survey of 77 founders of top SMEs in Singapore, the study measures four cognitive biases (overconfidence, illusion of control, belief in the law of small numbers, and planning fallacy) and tests how they influence risk perception and opportunity evaluation of a standardized business case vignette. + +## Participants + +- **N = 77** founders and owners of the top 500 SMEs in Singapore +- 97% male, mean age 46.6 years +- 92.4% Chinese, 79% founded their business +- Business revenue: 48.6% between S$1M-S$25M, 44.4% between S$25M-S$50M + +## Key Findings Tested + +| Finding | Hypothesis | Human Result | +|---------|-----------|--------------| +| F1 | Entrepreneurs are overconfident (mean items outside 90% CI > 1) | Mean = 5.17, SD = 2.64 | +| F2 | Risk perception negatively associated with opportunity evaluation | r = -.58, p < .01 | +| F3 | Illusion of control negatively associated with risk perception | r = -.44, p < .01 | +| F4 | Illusion of control positively associated with opportunity evaluation | r = .34, p < .01 | +| F5 | Overconfidence positively associated with opportunity evaluation | r = .30, p < .05 | + +## Questionnaire Structure + +- **Section A:** 5 forced-choice gamble items (risk propensity) +- **Section B:** 7 Likert items (2 filler, 2 planning fallacy, 3 illusion of control) +- **Section C:** 10 confidence-interval estimation items (overconfidence) +- **Section D:** Business case vignette + 4 risk perception items + 3 opportunity evaluation items + 1 open-ended item + +## File Structure + +``` +study_013/ +├── index.json +├── README.md +├── source/ +│ ├── Keh-Foo-Lim-2002-Opportunity-Evaluation.pdf +│ ├── metadata.json +│ ├── specification.json +│ ├── ground_truth.json +│ └── materials/ +│ ├── section_a_risk_propensity.json +│ ├── section_b_cognitive_biases.json +│ ├── section_c_overconfidence.json +│ └── section_d_case_vignette.json +└── scripts/ + ├── config.py + ├── evaluator.py + ├── study_utils.py + └── stats_lib.py +``` + +## Overconfidence Answer Key + +The 10 confidence-interval items reference Singapore statistics circa 1999-2000. Correct answers have been verified against: +- Yearbook of Statistics Singapore 2000 (Department of Statistics) +- Changi Airport Group corporate history +- LTA Vehicle Quota Tender Results 2000-2004 +- SingStat residential dwelling datasets + +## Contributor + +Guankai Zhai ([@zgk2003](https://github.com/zgk2003)) diff --git a/studies/study_013/index.json b/studies/study_013/index.json new file mode 100644 index 00000000..7c85d29a --- /dev/null +++ b/studies/study_013/index.json @@ -0,0 +1,16 @@ +{ + "title": "Opportunity Evaluation under Risky Conditions: The Cognitive Processes of Entrepreneurs", + "authors": [ + "Hean Tat Keh", + "Maw Der Foo", + "Boon Chong Lim" + ], + "year": 2002, + "description": "This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. Using a survey of 77 founders of top SMEs in Singapore, the study measures overconfidence, illusion of control, belief in the law of small numbers, and planning fallacy, and tests how these biases influence risk perception and opportunity evaluation of a standardized business vignette. Results show that illusion of control reduces risk perception, which in turn increases opportunity evaluation (full mediation), while belief in the law of small numbers directly increases opportunity evaluation. Entrepreneurs are found to be significantly overconfident in their knowledge calibration.", + "contributors": [ + { + "name": "Guankai Zhai", + "github": "https://github.com/zgk2003" + } + ] +} diff --git a/studies/study_013/scripts/config.py b/studies/study_013/scripts/config.py new file mode 100644 index 00000000..f0ffb84d --- /dev/null +++ b/studies/study_013/scripts/config.py @@ -0,0 +1,333 @@ +import json +import re +import numpy as np +from scipy import stats +from pathlib import Path +from typing import Dict, Any, List, Optional + +import sys +sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent)) +from study_utils import BaseStudyConfig, PromptBuilder + +import random + + +# Demographics distributions from Table 2 for persona generation +INDUSTRIES = [ + "Retail", "Manufacturing", "Wholesale", "Construction", + "Transportation and Communication", "Financial", "Professional" +] + +AGE_DISTRIBUTION = [ + (range(30, 40), 0.222), # Less than 40 + (range(40, 61), 0.715), # 40 to 60 + (range(61, 70), 0.063), # More than 60 +] + +BUSINESS_SIZE_OPTIONS = [ + "Less than S$1m", + "Between S$1m and S$25m", + "Between S$25m and S$50m", + "More than S$50m", +] + +BUSINESS_SIZE_WEIGHTS = [0.028, 0.486, 0.444, 0.042] + + +def weighted_age_sample(): + """Sample an age from the Table 2 age distribution.""" + r = random.random() + cumulative = 0 + for age_range, prob in AGE_DISTRIBUTION: + cumulative += prob + if r < cumulative: + return random.choice(list(age_range)) + return random.randint(40, 60) + + +class CustomPromptBuilder(PromptBuilder): + """Builds the full Keh, Foo & Lim (2002) questionnaire prompt.""" + + def build_trial_prompt(self, trial_metadata): + profile = trial_metadata.get("profile", {}) + items_a = trial_metadata.get("items_a", []) + items_b = trial_metadata.get("items_b", []) + items_c = trial_metadata.get("items_c", []) + items_d = trial_metadata.get("items_d", []) + vignette_text = trial_metadata.get("vignette_text", "") + + lines = [] + + # --- Persona Introduction --- + age = profile.get("age", 48) + industry = profile.get("industry", "Manufacturing") + business_size = profile.get("business_size", "Between S$1m and S$25m") + years_exp = profile.get("years_experience", 15) + founder = profile.get("is_founder", True) + + lines.append("You are participating in a research study on entrepreneurial decision-making.") + lines.append(f"Imagine you are a {age}-year-old entrepreneur in Singapore who {'founded' if founder else 'acquired'} a {industry.lower()} business (annual revenue: {business_size}). You have {years_exp} years of business experience.") + lines.append("Please answer all questions honestly based on your perspective as a business owner.\n") + + q_counter = 1 + + # --- Section A: Risk Propensity (5 forced-choice items) --- + lines.append("=" * 60) + lines.append("SECTION A: RISK PREFERENCES") + lines.append("=" * 60) + lines.append("Please answer the following five items by choosing the alternative (\"a\" or \"b\") you would feel most comfortable with.\n") + + for item in items_a: + options = item.get("options", []) + lines.append(f"Q{q_counter}: Which would you prefer?") + lines.append(f" a) {options[0]}") + lines.append(f" b) {options[1]}") + lines.append(f" (Answer Q{q_counter}=a or Q{q_counter}=b)\n") + item["q_idx"] = q_counter + q_counter += 1 + + # --- Section B: Cognitive Biases (7 Likert items) --- + lines.append("=" * 60) + lines.append("SECTION B: BUSINESS ATTITUDES") + lines.append("=" * 60) + lines.append("Please indicate how much you agree with each statement.") + lines.append("Scale: 1 = Strongly Disagree, 2 = Disagree, 3 = Slightly Disagree, 4 = Neutral, 5 = Slightly Agree, 6 = Agree, 7 = Strongly Agree\n") + + for item in items_b: + lines.append(f"Q{q_counter}: {item['question']}") + lines.append(f" (Answer Q{q_counter}=1 to Q{q_counter}=7)\n") + item["q_idx"] = q_counter + q_counter += 1 + + # --- Section C: Overconfidence (10 confidence-interval items) --- + lines.append("=" * 60) + lines.append("SECTION C: GENERAL KNOWLEDGE") + lines.append("=" * 60) + lines.append("For each question below, provide a LOWER LIMIT and UPPER LIMIT such that you are 90% confident the correct answer falls within your range.") + lines.append("If you have absolutely no idea, provide the widest reasonable range.\n") + + for item in items_c: + unit = item.get("unit", "") + lines.append(f"Q{q_counter} (Lower Limit) and Q{q_counter + 1} (Upper Limit): {item['question']}") + lines.append(f" Unit: {unit}") + lines.append(f" (Answer Q{q_counter}= Q{q_counter + 1}=)\n") + item["q_idx_lower"] = q_counter + item["q_idx_upper"] = q_counter + 1 + q_counter += 2 + + # --- Section D: Case Vignette + Risk Perception + Opportunity Evaluation --- + lines.append("=" * 60) + lines.append("SECTION D: BUSINESS CASE EVALUATION") + lines.append("=" * 60) + lines.append("Please read the following case study carefully, then answer the questions.\n") + lines.append(vignette_text) + lines.append("") + lines.append("Based on the case above, please indicate how much you agree with each statement.") + lines.append("Scale: 1 = Strongly Disagree, 2 = Disagree, 3 = Slightly Disagree, 4 = Neutral, 5 = Slightly Agree, 6 = Agree, 7 = Strongly Agree\n") + + for item in items_d: + if item["type"] == "likert_7": + lines.append(f"Q{q_counter}: {item['question']}") + lines.append(f" (Answer Q{q_counter}=1 to Q{q_counter}=7)\n") + item["q_idx"] = q_counter + q_counter += 1 + elif item["type"] == "open_ended": + lines.append(f"Q{q_counter}: {item['question']}") + lines.append(f" (Answer Q{q_counter}=)\n") + item["q_idx"] = q_counter + q_counter += 1 + + # --- Response format --- + lines.append("=" * 60) + lines.append("RESPONSE FORMAT (MANDATORY)") + lines.append("=" * 60) + lines.append("Output ONLY answer lines in the format: Qk=") + lines.append("One answer per line. Do not include explanations.") + lines.append(f"Expected number of answer lines: {q_counter - 1}") + + return "\n".join(lines) + + +class StudyStudy013Config(BaseStudyConfig): + """Study config for Keh, Foo & Lim (2002) — Opportunity Evaluation under Risky Conditions.""" + + prompt_builder_class = CustomPromptBuilder + PROMPT_VARIANT = "v1" + + def create_trials(self, n_trials=None): + spec = self.load_specification() + n = n_trials if n_trials is not None else spec["participants"]["n"] + + # Load all materials + mat_a = self.load_material("section_a_risk_propensity") + mat_b = self.load_material("section_b_cognitive_biases") + mat_c = self.load_material("section_c_overconfidence") + mat_d = self.load_material("section_d_case_vignette") + + vignette_text = mat_d.get("vignette_text", "") + + trials = [] + for i in range(n): + # Generate randomized entrepreneur profile from Table 2 demographics + age = weighted_age_sample() + industry = random.choice(INDUSTRIES) + business_size = random.choices(BUSINESS_SIZE_OPTIONS, weights=BUSINESS_SIZE_WEIGHTS, k=1)[0] + years_exp = max(3, age - random.randint(22, 30)) + is_founder = random.random() < 0.79 + + profile = { + "age": age, + "industry": industry, + "business_size": business_size, + "years_experience": years_exp, + "is_founder": is_founder, + } + + # Deep copy items to avoid mutation across trials + import copy + trial = { + "sub_study_id": "keh_foo_lim_opportunity_evaluation", + "scenario_id": "mr_tan_vignette", + "scenario": "mr_tan_vignette", + "profile": profile, + "items_a": copy.deepcopy(mat_a["items"]), + "items_b": copy.deepcopy(mat_b["items"]), + "items_c": copy.deepcopy(mat_c["items"]), + "items_d": copy.deepcopy(mat_d["items"]), + "vignette_text": vignette_text, + "variant": self.PROMPT_VARIANT, + } + trials.append(trial) + + return trials + + def aggregate_results(self, raw_results): + """Parse Qk=value responses and compute per-participant construct scores.""" + participants = [] + + for record in raw_results.get("individual_data", []): + trial_info = record.get("trial_info", {}) + response_text = record.get("response_text", "") + + # Parse Qk=Value + responses = {} + for line in response_text.split("\n"): + match = re.match(r"Q(\d+)\s*[:=]\s*(.+)", line.strip()) + if match: + q_num = int(match.group(1)) + responses[q_num] = match.group(2).strip() + + items_a = trial_info.get("items_a", []) + items_b = trial_info.get("items_b", []) + items_c = trial_info.get("items_c", []) + items_d = trial_info.get("items_d", []) + + # --- Risk Propensity: count of risky choices (0-5) --- + risk_propensity = 0 + for item in items_a: + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + choice = responses[q_idx].strip().lower() + risky = item.get("metadata", {}).get("risky_option", "a") + if choice == risky: + risk_propensity += 1 + + # --- Planning Fallacy: sum of B3 + B4 --- + planning_fallacy = 0 + planning_count = 0 + for item in items_b: + if item.get("metadata", {}).get("construct") == "planning_fallacy": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = self.extract_numeric(responses[q_idx]) + if 1 <= val <= 7: + planning_fallacy += val + planning_count += 1 + + # --- Illusion of Control: sum of B5 + B6 + B7 --- + illusion_of_control = 0 + ioc_count = 0 + for item in items_b: + if item.get("metadata", {}).get("construct") == "illusion_of_control": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = self.extract_numeric(responses[q_idx]) + if 1 <= val <= 7: + illusion_of_control += val + ioc_count += 1 + + # --- Overconfidence: count of items where correct answer is outside [lower, upper] --- + overconfidence = 0 + oc_count = 0 + for item in items_c: + q_lower = item.get("q_idx_lower") + q_upper = item.get("q_idx_upper") + correct = item.get("correct_answer") + if q_lower and q_upper and correct is not None: + if q_lower in responses and q_upper in responses: + try: + lower = float(responses[q_lower]) + upper = float(responses[q_upper]) + oc_count += 1 + if correct < lower or correct > upper: + overconfidence += 1 + except (ValueError, TypeError): + pass + + # --- Risk Perception: sum of D1 + D2 + D3 + D4 --- + risk_perception = 0 + rp_count = 0 + for item in items_d: + if item.get("metadata", {}).get("construct") == "risk_perception": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = self.extract_numeric(responses[q_idx]) + if 1 <= val <= 7: + risk_perception += val + rp_count += 1 + + # --- Opportunity Evaluation: sum of D5 + D6 + D7 --- + opportunity_evaluation = 0 + oe_count = 0 + for item in items_d: + if item.get("metadata", {}).get("construct") == "opportunity_evaluation": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = self.extract_numeric(responses[q_idx]) + if 1 <= val <= 7: + opportunity_evaluation += val + oe_count += 1 + + # Only include participant if they have sufficient data + if oc_count >= 5 and rp_count >= 3 and oe_count >= 2: + participants.append({ + "risk_propensity": risk_propensity, + "planning_fallacy": planning_fallacy, + "illusion_of_control": illusion_of_control, + "overconfidence": overconfidence, + "risk_perception": risk_perception, + "opportunity_evaluation": opportunity_evaluation, + "profile": trial_info.get("profile", {}), + }) + + # Compute descriptive statistics + if not participants: + return {"participants": [], "descriptive_statistics": {}, "n_valid": 0} + + constructs = ["risk_propensity", "planning_fallacy", "illusion_of_control", + "overconfidence", "risk_perception", "opportunity_evaluation"] + + desc_stats = {} + for c in constructs: + values = [p[c] for p in participants] + desc_stats[c] = { + "mean": float(np.mean(values)), + "sd": float(np.std(values, ddof=1)), + "n": len(values), + } + + return { + "participants": participants, + "descriptive_statistics": desc_stats, + "n_valid": len(participants), + } diff --git a/studies/study_013/scripts/evaluator.py b/studies/study_013/scripts/evaluator.py new file mode 100644 index 00000000..d1d74b3e --- /dev/null +++ b/studies/study_013/scripts/evaluator.py @@ -0,0 +1,306 @@ +import json +import re +import numpy as np +from scipy import stats +from pathlib import Path +from typing import Dict, Any, List + +import sys +sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent)) +from stats_lib import parse_p_value_from_reported + +# Module-level cache for ground truth and metadata +_ground_truth_cache = None +_metadata_cache = None + + +def parse_agent_responses(response_text: str) -> Dict[int, str]: + """ + Parse standardized responses: Qk=Value or Qk: Value + Returns dict mapping question number (int) to value string. + """ + parsed = {} + matches = re.findall(r"Q(\d+)\s*[:=]\s*([^,\n]+)", response_text) + for q_num, val in matches: + parsed[int(q_num)] = val.strip() + return parsed + + +def _expected_direction_to_int(expected_dir_str: str) -> int: + """Convert expected_direction string to int: 1 = positive, -1 = negative, 0 = unknown.""" + if not expected_dir_str: + return 0 + s = str(expected_dir_str).lower() + if s in ("positive", "greater", ">"): + return 1 + if s in ("negative", "less", "<"): + return -1 + return 0 + + +def extract_numeric(text: str, default: float = None): + """Extract a numeric value from response text.""" + if text is None: + return default + match = re.search(r"(-?\d+\.?\d*)", str(text)) + return float(match.group(1)) if match else default + + +def compute_participant_scores(response_text: str, trial_info: Dict) -> Dict[str, Any]: + """ + Parse a single participant's responses and compute all construct scores. + Returns a dict of construct scores, or None if insufficient data. + """ + responses = parse_agent_responses(response_text) + items_a = trial_info.get("items_a", []) + items_b = trial_info.get("items_b", []) + items_c = trial_info.get("items_c", []) + items_d = trial_info.get("items_d", []) + + # --- Risk Propensity: count of risky choices (0-5) --- + risk_propensity = 0 + for item in items_a: + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + choice = responses[q_idx].strip().lower() + risky = item.get("metadata", {}).get("risky_option", "a") + if choice == risky: + risk_propensity += 1 + + # --- Planning Fallacy: sum of planning fallacy items --- + planning_fallacy = 0 + pf_count = 0 + for item in items_b: + if item.get("metadata", {}).get("construct") == "planning_fallacy": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = extract_numeric(responses[q_idx]) + if val is not None and 1 <= val <= 7: + planning_fallacy += val + pf_count += 1 + + # --- Illusion of Control: sum of IoC items --- + illusion_of_control = 0 + ioc_count = 0 + for item in items_b: + if item.get("metadata", {}).get("construct") == "illusion_of_control": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = extract_numeric(responses[q_idx]) + if val is not None and 1 <= val <= 7: + illusion_of_control += val + ioc_count += 1 + + # --- Overconfidence: items where correct answer outside [lower, upper] --- + overconfidence = 0 + oc_count = 0 + for item in items_c: + q_lower = item.get("q_idx_lower") + q_upper = item.get("q_idx_upper") + correct = item.get("correct_answer") + if q_lower and q_upper and correct is not None: + if q_lower in responses and q_upper in responses: + try: + lower = float(responses[q_lower]) + upper = float(responses[q_upper]) + oc_count += 1 + if correct < lower or correct > upper: + overconfidence += 1 + except (ValueError, TypeError): + pass + + # --- Risk Perception: sum of risk perception items --- + risk_perception = 0 + rp_count = 0 + for item in items_d: + if item.get("metadata", {}).get("construct") == "risk_perception": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = extract_numeric(responses[q_idx]) + if val is not None and 1 <= val <= 7: + risk_perception += val + rp_count += 1 + + # --- Opportunity Evaluation: sum of OE items --- + opportunity_evaluation = 0 + oe_count = 0 + for item in items_d: + if item.get("metadata", {}).get("construct") == "opportunity_evaluation": + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + val = extract_numeric(responses[q_idx]) + if val is not None and 1 <= val <= 7: + opportunity_evaluation += val + oe_count += 1 + + # Require minimum data completeness + if oc_count < 5 or rp_count < 3 or oe_count < 2: + return None + + return { + "risk_propensity": risk_propensity, + "planning_fallacy": planning_fallacy, + "illusion_of_control": illusion_of_control, + "overconfidence": overconfidence, + "risk_perception": risk_perception, + "opportunity_evaluation": opportunity_evaluation, + } + + +def evaluate_study(results): + """ + Evaluates the agent's performance on Study 013 (Keh, Foo & Lim 2002). + Computes construct scores from agent responses and tests hypothesized relationships. + Returns test_results with raw stats; no BF/PAS aggregation. + """ + global _ground_truth_cache, _metadata_cache + + # 1. Load Ground Truth and Metadata (with caching) + study_dir = Path(__file__).resolve().parent.parent / "source" + + if _ground_truth_cache is None: + with open(study_dir / "ground_truth.json", "r") as f: + _ground_truth_cache = json.load(f) + + if _metadata_cache is None: + metadata_path = study_dir / "metadata.json" + if metadata_path.exists(): + with open(metadata_path, "r") as f: + _metadata_cache = json.load(f) + else: + _metadata_cache = {} + + ground_truth = _ground_truth_cache + sig_level = 0.05 + + # 2. Parse all agent responses into participant score vectors + participant_scores = [] + + for participant in results.get("individual_data", []): + for response in participant.get("responses", []): + response_text = response.get("response_text", "") + trial_info = response.get("trial_info", {}) + + scores = compute_participant_scores(response_text, trial_info) + if scores is not None: + participant_scores.append(scores) + + # 3. Build test results for each finding + test_results = [] + + if not participant_scores: + # Return empty results if no valid participants + for study_gt in ground_truth.get("studies", []): + for finding in study_gt.get("findings", []): + test_results.append({ + "study_id": "keh_foo_lim_opportunity_evaluation", + "finding_id": finding["finding_id"], + "n_agent": 0, + "error": "No valid participant data", + }) + return {"test_results": test_results} + + # Extract score arrays + overconfidence_scores = np.array([p["overconfidence"] for p in participant_scores]) + risk_perception_scores = np.array([p["risk_perception"] for p in participant_scores]) + opp_eval_scores = np.array([p["opportunity_evaluation"] for p in participant_scores]) + ioc_scores = np.array([p["illusion_of_control"] for p in participant_scores]) + planning_scores = np.array([p["planning_fallacy"] for p in participant_scores]) + risk_prop_scores = np.array([p["risk_propensity"] for p in participant_scores]) + + n_agent = len(participant_scores) + + for study_gt in ground_truth.get("studies", []): + for finding in study_gt.get("findings", []): + finding_id = finding["finding_id"] + stat_tests = finding.get("statistical_tests", []) + test_gt = stat_tests[0] if stat_tests else {} + expected_dir_str = test_gt.get("expected_direction", "") + h_expected = _expected_direction_to_int(expected_dir_str) + reported_stats = test_gt.get("reported_statistics", "") + + # Parse human p-value + human_p_value = None + human_significant = None + parsed_p, parsed_sig, _ = parse_p_value_from_reported(reported_stats, sig_level) + if parsed_p is not None: + human_p_value = parsed_p + human_significant = parsed_sig + + t_stat = None + r_stat = None + p_value = None + agent_significant = None + direction_match = None + mean_agent = None + sd_agent = None + + if finding_id == "F1": + # Overconfidence: one-sample t-test against baseline of 1 + baseline = 1.0 + mean_agent = float(np.mean(overconfidence_scores)) + sd_agent = float(np.std(overconfidence_scores, ddof=1)) if n_agent > 1 else 0.0 + + # For F1, human significance must be computed from reported stats + # since the reported_statistics string has no p-value + human_mean = 5.17 + human_sd = 2.64 + human_n = 77 + human_t = (human_mean - baseline) / (human_sd / np.sqrt(human_n)) + human_p_value = float(stats.t.sf(human_t, human_n - 1)) + human_significant = human_p_value < sig_level + + if sd_agent > 0 and n_agent >= 2: + t_stat_val, p_value_val = stats.ttest_1samp(overconfidence_scores, baseline) + t_stat = float(t_stat_val) + # One-sided test: mean > baseline + p_value = float(p_value_val / 2) if t_stat > 0 else float(1 - p_value_val / 2) + agent_significant = p_value < sig_level + direction_match = (mean_agent > baseline) + + elif finding_id in ("F2", "F3", "F4", "F5"): + # Correlation-based findings + corr_pairs = { + "F2": (risk_perception_scores, opp_eval_scores), + "F3": (ioc_scores, risk_perception_scores), + "F4": (ioc_scores, opp_eval_scores), + "F5": (overconfidence_scores, opp_eval_scores), + } + x_arr, y_arr = corr_pairs[finding_id] + + # Require sufficient data and non-constant arrays + if (len(x_arr) >= 3 and + np.std(x_arr) > 0 and np.std(y_arr) > 0): + r_val, p_val = stats.pearsonr(x_arr, y_arr) + if not np.isnan(r_val): + r_stat = float(r_val) + p_value = float(p_val) + mean_agent = r_stat + agent_significant = p_value < sig_level + agent_dir = 1 if r_stat > 0 else -1 + direction_match = (h_expected == 0) or (agent_dir == h_expected) + + # Compute replication metric + replication = None + if human_significant is not None and agent_significant is not None and direction_match is not None: + replication = human_significant and agent_significant and direction_match + + test_result = { + "study_id": "keh_foo_lim_opportunity_evaluation", + "sub_study_id": "keh_foo_lim_opportunity_evaluation", + "finding_id": finding_id, + "n_agent": n_agent, + "mean_agent": mean_agent, + "sd_agent": sd_agent, + "t_stat": t_stat, + "r_stat": r_stat, + "p_value": float(p_value) if p_value is not None else None, + "significant": agent_significant, + "direction_match": direction_match, + "human_p_value": human_p_value, + "human_significant": human_significant, + "replication": replication, + } + test_results.append(test_result) + + return {"test_results": test_results} diff --git a/studies/study_013/scripts/stats_lib.py b/studies/study_013/scripts/stats_lib.py new file mode 100644 index 00000000..b4fbb0c4 --- /dev/null +++ b/studies/study_013/scripts/stats_lib.py @@ -0,0 +1,86 @@ +""" +Minimal stats utilities for evaluator. +Parse p-value from reported_statistics strings; no BF/PAS. +""" + +import re +from typing import Tuple, Optional + + +def parse_p_value_from_reported( + reported_statistics: str, significance_level: float = 0.05 +) -> Tuple[Optional[float], bool, str]: + """ + Parse p-value from reported_statistics string. + + Handles formats like: + - "p < .001" or "p < 0.001" + - "p < .05" or "p < 0.05" + - "p = 0.023" + - "F(1, 312) = 49.1, p < .001" + + Args: + reported_statistics: String containing reported statistics + significance_level: Default significance level (usually 0.05) + + Returns: + tuple: (p_value, is_significant, confidence) + - p_value: Parsed p-value (float) or None if not found + - is_significant: bool indicating if p < significance_level + - confidence: "high" if exact value, "medium" if inequality, "low" if inferred + """ + if significance_level is None: + significance_level = 0.05 + + if not reported_statistics: + return None, False, "low" + + text = reported_statistics.lower() + + # Try to extract exact p-value: "p = 0.023" or "p=0.023" + exact_match = re.search(r"p\s*[=:]\s*([0-9.]+)", text) + if exact_match: + p_val = float(exact_match.group(1)) + is_sig = p_val <= significance_level if significance_level is not None else False + return p_val, is_sig, "high" + + # Try to extract inequality: "p < .001" or "p < 0.05" + inequality_match = re.search(r"p\s*[<>]\s*([0-9.]+)", text) + if inequality_match: + threshold = float(inequality_match.group(1)) + is_less_than = "<" in text[ + inequality_match.start() : inequality_match.end() + ] + + if is_less_than: + p_val = threshold / 2.0 + is_sig = True + return p_val, is_sig, "medium" + else: + p_val = threshold + is_sig = threshold < significance_level if significance_level is not None else False + return p_val, is_sig, "medium" + + # If no p-value found, infer from test statistic + t_match = re.search(r"t\s*\([^)]+\)\s*=\s*([0-9.]+)", text) + if t_match: + t_val = abs(float(t_match.group(1))) + if t_val > 2.0: + return 0.025, True, "low" + return 0.10, False, "low" + + f_match = re.search(r"f\s*\([^)]+\)\s*=\s*([0-9.]+)", text) + if f_match: + f_val = float(f_match.group(1)) + if f_val > 4.0: + return 0.025, True, "low" + return 0.10, False, "low" + + r_match = re.search(r"r\s*=\s*([-0-9.]+)", text) + if r_match: + r_val = abs(float(r_match.group(1))) + if r_val > 0.3: + return 0.025, True, "low" + return 0.10, False, "low" + + return None, False, "low" diff --git a/studies/study_013/scripts/study_utils.py b/studies/study_013/scripts/study_utils.py new file mode 100644 index 00000000..8829fb38 --- /dev/null +++ b/studies/study_013/scripts/study_utils.py @@ -0,0 +1,150 @@ +""" +Standalone study utilities: BaseStudyConfig and PromptBuilder. +No dependency on src/; for use within each study's scripts/. +""" +import json +import re +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Dict, Any, List, Optional + + +class PromptBuilder: + """Build prompts from study specification and materials. study_path = source directory.""" + + def __init__(self, study_path: Path): + self.study_path = Path(study_path) + self.materials_path = self.study_path / "materials" + with open(self.study_path / "specification.json", "r", encoding="utf-8", errors="replace") as f: + self.specification = json.load(f) + instructions_file = self.materials_path / "instructions.txt" + self.instructions = instructions_file.read_text(encoding="utf-8", errors="replace") if instructions_file.exists() else None + system_prompt_file = self.materials_path / "system_prompt.txt" + self.system_prompt_template = system_prompt_file.read_text(encoding="utf-8", errors="replace") if system_prompt_file.exists() else None + + def build_system_prompt(self, participant_profile: Dict[str, Any] = None) -> Optional[str]: + return self.system_prompt_template + + def get_system_prompt_template(self) -> Optional[str]: + return self.system_prompt_template + + def build_trial_prompt(self, trial_data: Dict[str, Any]) -> str: + return self._build_generic_trial_prompt(trial_data) + + def get_instructions(self) -> str: + return self.instructions if self.instructions else "No instructions provided." + + def _fill_template(self, template: str, data: Dict[str, Any]) -> str: + result = template + nested_pattern = r"\{\{([\w.]+)\}\}" + def replace_nested(match): + path = match.group(1) + value = data + for part in path.split("."): + if isinstance(value, dict) and part in value: + value = value[part] + else: + return match.group(0) + return str(value) + result = re.sub(nested_pattern, replace_nested, result) + if_pattern = r"\{\{#if\s+(\w+)\}\}(.*?)\{\{/if\}\}" + def replace_if(match): + if match.group(1) in data and data[match.group(1)]: + return match.group(2) + return "" + result = re.sub(if_pattern, replace_if, result, flags=re.DOTALL) + each_pattern = r"\{\{#each\s+(\w+)\}\}(.*?)\{\{/each\}\}" + def replace_each(match): + var_name, content = match.group(1), match.group(2) + if var_name not in data: + return "" + items = data[var_name] + if isinstance(items, dict): + parts = [content.replace("{{@key}}", str(k)).replace("{{this}}", str(v)) for k, v in items.items()] + return "\n".join(parts) + if isinstance(items, list): + parts = [content.replace("{{@index}}", str(i + 1)).replace("{{this}}", str(item)) for i, item in enumerate(items)] + return "\n".join(parts) + return "" + result = re.sub(each_pattern, replace_each, result, flags=re.DOTALL) + result = re.sub(r"\{\{[^}]+\}\}", "", result) + return result + + def _build_generic_trial_prompt(self, trial_data: Dict[str, Any]) -> str: + return f"Trial {trial_data.get('trial_number', '?')}: Please respond to the following stimulus." + + +class BaseStudyConfig(ABC): + """Study config base. study_path = study root (e.g. studies/study_001); data under source/.""" + + prompt_builder_class = PromptBuilder + + def __init__(self, study_path: Path, specification: Dict[str, Any]): + self.study_path = Path(study_path) + self.source_path = self.study_path / "source" + self.specification = specification + self.study_id = specification["study_id"] + self.prompt_builder = self.prompt_builder_class(self.source_path) + + def load_material(self, sub_study_id: str) -> Dict[str, Any]: + file_path = self.source_path / "materials" / f"{sub_study_id}.json" + if not file_path.exists(): + raise FileNotFoundError(f"Material not found: {file_path}") + with open(file_path, "r", encoding="utf-8") as f: + return json.load(f) + + def load_metadata(self) -> Dict[str, Any]: + with open(self.source_path / "metadata.json", "r", encoding="utf-8") as f: + return json.load(f) + + def load_specification(self) -> Dict[str, Any]: + with open(self.source_path / "specification.json", "r", encoding="utf-8") as f: + return json.load(f) + + def load_ground_truth(self) -> Dict[str, Any]: + with open(self.source_path / "ground_truth.json", "r", encoding="utf-8") as f: + return json.load(f) + + def extract_numeric(self, text: str, default: float = 0.0) -> float: + if text is None: + return default + match = re.search(r"(-?\d+\.?\d*)", str(text)) + return float(match.group(1)) if match else default + + def extract_choice(self, text: str, options: List[str] = None) -> Optional[int]: + if text is None: + return None + text_s = str(text).strip() + if options: + for i, opt in enumerate(options): + if opt.lower() in text_s.lower(): + return i + match = re.search(r"\b([A-Z])\b", text_s.upper()) + if match: + return ord(match.group(1)) - ord("A") + return None + + @abstractmethod + def create_trials(self, n_trials: Optional[int] = None) -> List[Dict[str, Any]]: + raise NotImplementedError + + def get_prompt_builder(self) -> PromptBuilder: + return self.prompt_builder + + def get_instructions(self) -> str: + return self.prompt_builder.get_instructions() + + def aggregate_results(self, raw_results: Dict[str, Any]) -> Dict[str, Any]: + return raw_results + + def custom_scoring(self, results: Dict[str, Any], ground_truth: Dict[str, Any]) -> Optional[Dict[str, float]]: + return None + + def get_n_participants(self) -> int: + return self.specification["participants"]["n"] + + def get_study_type(self) -> str: + return self.specification.get("study_type", self.study_id) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(study_id='{self.study_id}')" diff --git a/studies/study_013/source/Keh-Foo-Lim-2002-Opportunity-Evaluation.pdf b/studies/study_013/source/Keh-Foo-Lim-2002-Opportunity-Evaluation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2ed46c23ff882a615a8aa58a0c1982777fe7a830 GIT binary patch literal 110900 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
  • a@;D;QX%oco+pt2QkO#@xdueUQ|rcc>QLNe){A+=QlCrQdxeVJb} zCcai_?96A9+XK2PBbYT&=&ejJ8$yN*W+7fEt$cd00V^?mjKSKNSqz<@&NA2 z&E;ovMn&by!Xnm4znHiF zZ;fMs=)G!8kQ~VJzO#XjZ2s8Ywu>GDOp#n*{?J@aZz zfsMlvchwaV7%25;&`!QiBH1-e(6K>K%0}@2SgU?I3zUY^`*cFWhI~ zTfqLBeko7Qg=@P&+<@r$n+CC-N8`20Ulj~j;;M>f+5=W_91@49=1o=0w01VeA5GSm zI{)Fb-S1=_A_#V|_uSN>~RgQN)(nX`-u%O#%(W~#RWEF>R}hsB9t&Uw_DX-vIQ-VJlWC48!cwN*#EAyGSDng%Qa6dNed0@m#4 z`F&&*6wB&tJ+GNf9b){)je*@C8$1+=uze3A1HHH@r5)``@B8PuL6U*ho>;$B(J*y*8>XG?pxmJSV{o^Bs!pN)vNG)(3Yk2N|@74R4uZ08hvG`u?V zX#K~GD`eHy^vTK;=39hu9^ITg`i>CUeGY)QL$|3Fgj}R)%kL{UOumMpjv41Z!6!{u z$EiwA=gy14j?GfYi+ZDuPF~j5Ue?{8?R^Kx5v)&>8*juij0d{uZvIonJx&N_%w)s3 zeWke(M4+yOv2J0dj&_~Zc2D1hK04OuqoVRZwO=pCD^AU>o5Xo{xK7t|-z;sm-b^#z z#i`Rm|C*^ed4`d&^}*t;E1rOM&zP|@O^`AOv3KYe9OZ;~-%aZs{xxaS7{M3Ha>Yn%^oL=?4Gi$jYTmpnFG{`(;1 zgK14}v=YGd7jScKrjX!8GYY-%Hs%(NzKJb{%eD-EoB8Hnut=QKhcZHI;p2i?S{O+w z9iMl_af5^*N*k|`cOq@amLO}D-^q{Y|E=e0;o=tl+id!u>IE4&7})>Axo-ZC*@Ob9 zDq(#a%HD_4YE15UNfH}+IsgTgr6pPIsVF(w`jILc-TSJ|)kQ*@REpGQaRa`zczr#c z!)zYbhk-)GK!&0d9el5o(Vhm|!9w#DB533jv|Jx?QtrQkf8cn?JsCsE{PJ?K%+YCp zrjS7gBQ-Fn|8=Ah!bsTPz)PgF7Hnyxv6Aj!j?>d=R!s5lfj3p z+ySyRU@|zml(|ow<6s(Ws;iN$5yW*fn5B(rz^2Kw_O?D; z3!CL_Cu4Qf-MdB7#uRP?$fP;8p*9Jmrbu^&P@+(K-@7GSxKCkVHaW(yJ6-Hj5lmsy zoe`VGaIJ@-ddgh}ZnQxzC9Y#AD2|M}O4pmrvID~Sy4EAZt~9a%S!tNQWxN(A3j_Jx z6V;Y)X<|T)v5kINpc> zAd0*_$Uq(TdsjYxRxFfXH24ci<$GkP@)s_3Z3CD@uroB(3RAfgF9mreeB8I{A^A4@MANu zkAH5%@4QIM%TKJT!RZZ>4 zkko68%3R5M>u2O2nGz3O8WYYwz5g5YaU9EO%Heft)o{Bhlrp&gux+-kwcOEH9MH{P;)08kTq#}s5g4%3EhpW`{+q43>|gHRxv|#@py+i(kj@Q z(N66IotUUPc;oC@8F66!zODA|F|)(=-6iebS)lk8mj1{Z9vrj4GmG@H_fm}u*)vtz z0~x}a54E%_j{e%{#as>Hz?%#!Ofi!?$4#l4*^1?^Ycc8GqzbXKPYwtb0qy2YU1PTTNrW+P(`|NLc%rZoWWTnRc2?%l%Jza^HKZFWZO(iwwU)?1ZJ*BJvV1{J zUIXkQ)NP+u1G|4ipw&!&O@@bMwqyXKH^2d2CkMSfgsi0|HuuX$ z`vGUm`p6{;vtvk`LA=HdL{*vrY({0CwzPZ%v4dn9LcelZ0l$N;A@LS@l;S{YHj^x; z|9jnt)%2leu-5t|`2WL6#M5ok|F@a?zggd$%>QY9SF2AsZE>Le+Xe%xQC3O`Ap_*^ zjyU4DbKU+iQh$>fX$qj!5RpNI!gu1<=gi)iZJQnmMv;`Hi#N{^B}oJcbe`pX+r}pc zk#uP!pm@cEO2VKu;ulHfcsM|hS|#@{dK@0}`_p&%8x(TDve>5Ro89Z<=KMGX`hqCP z{zgvuc%UDp5j7ORh!RRE7sMdKeuccJLwtU4oDRQ+QgfLMN^|phZ&0c~Xc1(GC*SL7 zZc8h*@s(37k1-<=V|+KKDdli^ka<_gejcM<;*li^DA&#T5wUsb8JR@ z{Wr(}$p8FQ=Z<~3>jkS~@&hGTQV+Vz46bUbGci-M#g1w>B6WIR$)qu?3*GvMUV`o<66Xq&Xgl=u)Pm;_CemeM|*nAjvDW&p|=@8$~a4@xgcXOznATl zzVrd{2Wd(l=xcyjMEP%IoAWbVG4+_vpUmt~z=SWi)`CPZ{wft+`o`9PBOsJat$|7> z>Uk~N(7=EHqAjfV5h$ua)=c`D(9pqYuDPKk891)k?|2~$M~PxjN!-r z(y?8Vp;dV?Tl-XafNMuE_+~&Q$5a%4SD{%@S#TT?4X{ENrrITF(LvmDKo%6~BJy2y zcxtG6QJ)NPNn7J)8Sfn`3Z%@kwCC;_J7yM5F^Iwloi}jwe?TCK{K_`XbTk0w@xVdA zY0hWM+tP8!4*@3Qu-YaQu!7eN;V{f3c?t^35G#o~U&>2^>erM6D@uq4NdAmv-fN27 zDDIuurk*rXoSqBQyO#aT8*m5Fj99|Nb8)vHt^`}K?Bhzc?B5!v#F*Uf7?38uIeIUDK%caPoA z6{VMC@wy8~atU{<9;_sZN-ji!Y5UD`!u}KY2^e~+GQABCJ_+)74#|`=e6$F++>ZI2 z;bnLlazOENsW2g@5PJrM&+I@j`u+49JuKe>8Gejxh^s4J|LRR4XVwIxJROJK2Psr; z^Q`+8=F|)gyvP2l6n7NT0?l$z6jDa0trw5&`W6n&%ZWCo3Jz8@sGzWrPXK%FT}{ZE zt;M>8a5`m$z(=c`W}x@1{cUz6OnnARU@58FuHe!3 zryXqJJ~rsKUHDVFL=2l)ON?c+D$f7TmYzokcZUv28=h2lM5f=&InSQ$)0x~a=j3g4?^+ctJdiQp@xFW0^-)!B|0S7|KBs_@_UnRyh_|0)?UXoEoq_N~_j9ss35L7WTEWd{6 z`2-I1LJrssz2bFNiM9i1O|uTjr_rS&#Z3Y24l2m}XSjVr^_r6egP3 z?|0xYxUTviAdSL&Q>n|swK>ymM=-+}aF`os#`M6Ve(7-Vx7*lpIy)lTM~IrxXck8# z;kg&TY#VNLBVQLhFOM6o(hmWi2nolS=|!)9@&8sPu(jN3U7o={x0KShG)Rw+$KtrJ zBedd&*HwW&*+uJ^A$?PRP_-)Y%o61Woie;lieVpamlxWpQ!BD-5zeA6D5)vz-5=-i zGwpaL6DrxKYv)BCVYCG`h>38GHz>@RXxN;mhpN3z`_)2i6nigB%V zDw$EC-lHK%wu3bvPy;e+@egG(!d5^j3H&Al1f+oz0g%qthynI56w~9Gn7`H56-zqW z2N4J&$?U)C29O#)Zgvti?9Cwndd|Y*UZxjSy3~D`B%$s}DE=HfyL1Sr#%Zt3U&d5s z>4*dUyT2yE`ctTk+8yc<=#sWK$XhgOTmawNmJW~jox<=?gAi`Xl{qhQ-6?y22}lT& zTWJ^<(_b4uAkEr=rmu;jR&ro=|t$d_^3Rx`PV@dRkVSkt*z=Dxy>bPC(g9s-i zEF#e`Qy{R1SJeCq4hU_Ua%Bj|mI10OWsUbf=9+t_%G-8zP~izIx5CL1Xs;xCU_#^N zPQ`Q2tg%M1baJutgR--H8OzibPzv0;JOzjbP!ga{#hM{YwWQ|NH0pPIgEb^Mzcj_= zj~5l8quC1zdV;=8*<+ktPyhI5i(!;ovM>Mz+1PRoztSidhPHwNzS{wR$Le0Kj-6aj z8^4yO(B99CiLvdYdx1aj^`z?)oym8t!pvRh?FlK>7VEY~{^hx2%V!# zkv+RM&3!OfD6_%)=gGxvCpO7?pVMzd*5gJTMbM^O_xL}M6N?yEvq0{PX zj|P(7SiSWAhVoeLn`$VkqOkE2;bKcba4=EWFp%YUGv$AACl^l#751A)$>fgeP1J;M zU38RcVEA)h+=_%L{of2)3!pC6qj*`}f^;Y|0`8FY0h>vjK%O}x^ZPDAmA+r4`=W^% zsXnw&x#8rB(4fdg4;_o;aJ^g^@w9Z-gnsw$Ofn9s?;|-;3`eb>*s~Iir$t$s{N*(C zP^LY%3h`*3K$Bzciy|P6fTv9I4klke8{aY z&vX+5v&<=wZD7*13M5!OMEPpR^e3%ctiua{mkHLhtm40QC!%CDp>vy(f7kN-90^3PF@2Zi#67g{Gx4!=)j2`tg?xd~qAB4nXRa z@e%f<8nM0xqhlxbKl~Tz_})B_7i^Mk3nx$63tRGwra?Q~@kpnKG$KA_4*v2EOGU5 zL*&=eoTHn6$9p-6B)jd6XGe(!W7(lc9#^<#tV-`TI;UMHR20*#bSs5yCwX+4Uh-RN z*-DH$4XjnotaQ&h%g+OaY&VE+%c|a}a^rq|pFp+qpy=-7cYGMMZP+wU+~1k%@-?)k z*JV^aGuiZGg!9SQvpxUbl+6bX8lxk$H;>mmA$ntZ6V3+YZooJ9StZtC{vY1HGpMPy zYuAbzdoS1$NQ3mAkOY#DLP$s_Js~}$S5&MhqGInA6$^I7N3nP8y<@?SU9k&_}#!cuXU}~rTm=pUUS9p8N8#$)4fm2u5*rWebys3PH;Tq z$=%_{#(%i*ZjYAGP)G+%sN5eZH8Oj<1%B-lXxk_LdsXeieAU9G=O1<%@VRiyxk5#^eV&O=FDRlayQlr8=iy6T z>xMn_EMKwf(xCF2FIzsCkn*tA_ZQ`;pTQZ!T77xpSUmftf4Z+_kBE01Ti@j$xWzdvQ>4s2E9 z-Mcd%{odTIa3~-TJcrZ2AG^mD+wtcg*G_9+6NGiY6?wDbS>~RbTMkuxGp_A8;Y;FI z^n3>5s<wx~{#v9eEQ#MU{wvxDWc5eSl2)K3w_j~)ENuTk?7pmoh zIHuBD!Xw{SksU>MzZ|5pMt#j2b6rXvRmXC1Fxd^+)AqHgIFlm7h} z`<40hE{@26dzc*E@Tmt&f1kd+FyRucpXPUD?}of*Z3aEun0;{IDsT(IWHLctKB-{x z_U!j7KkTjg;w_UsGUrNev(aBhwdndoembzF!>8nBT`n)W_6^lw-97UFRUJ*1%o^H* zf9q{?8%_gfoAE>P_`&wtjLE!dcO`|q$5m}N?iQPuRCc_0af1+j^-ZgBYuDcy8~S>P zMVK*ZMuw1XTNrW^nuKc|yD+zEgVT(zsjmQt+ks@Zk;2WKc+RKrwKRf=hWBo;$6QxENlvQTY(Y*k0sokdf;LoPlvfx zT*{0eCr#VhKSsY4s(OB%Pfi$zg0;W@NqlJ8(-Q+fZuP3>JbM&%-5X$fSeJU^HmfRE zdmr6%=eFao;X9~z&Fx%X{qHNSDO#O=udnaMBX=t|ZNzq2(KO}xAhg*vduz?c7EhkV zk&kK{R=qg=8j=0(uUJK{Ufa~N@B7^JK946iUVJob;>MH`!Z`N2aczLM z8tq%EWB%RrS)1S9_lA#5+>+;;Cmo^G&N0YZ-tcwziKhm#sj~ zsHmN$?`|K!>U`(*NbK36A4Wodc0m_73pU>FyRB}@`@3!TPoUIfm-QLzEo(LZQQ>~k z<1hFrLyp~=v9xf-+(C7hLYAhdD{=R7kJVhhYa}185`Wws1~n|Ha}BM$6`|f5y%V{ko;^mk)Z704ZXke>`f@cP9!fieRR^=RzJ;u~5%ICle%v#qUN;-}%>x z+}>S#mLA2|(ZJKA=wt$uP~Uf%wEKGIduq&wVC+V7*3SCDh3TIMW*BwI46648<^%BMg3VeoW;NScCkH&atm0Mrm(-eQ~ zee+>z=U1D%Ko%j1^e4U*hhB9sqrTKG@|N#L|dU>OfgM?s zpDkJh>F`>9iL|&gczV{X>=9>Vb5|ahl&<1qUXB`de(9HbOR;^}!7-2#h$m{u?LpqU z0@cCA@ekgWf=&shP~Nbnqc^`M-5-m-klAuTJ;o2YKknk0Sr3_PsM> zu7Bh$;9mhi?RncUO+Rsh1KthBE(Ehhs^jXuGcU z;+>m;t8dVdk-5hU-ww>-7rp0qG3`Dm<>G{wcNtG5?y47@L=QYhU$OfPTln!pPg3#* z1d>X;I`z?$WuFTc-$x#u;Fzeu-|B2o13aKNMaEyywYrp_i#MwFvZtY5Z5-qTvUV;q zEWE(3)^VCT9iz|@yLRnevMGK2-qQBaq0{EF#!ffUY74_P7S7q*>&_e7{0b}YwoDZs z+1@I&zRI+^bNl;U`Qr%dJFRlItJj{p*3UHIEv;&!r?AD&Wqpn!k3B_9QdahOHsnT_ z)U8kL%dshf3$4E_s_fg3H?*}FIT?pp~kpVZ3Uu|otC39b#)EXsf3 zel?(f|5yDdl!B5fw~0G_K|Caumy~zdv*p=qcqQHSlHdm1Mz&lz5HIB5NR`*HYm`po{* zN1O(E7Ym!&<2k$65N-@VcYJxNeq&^|W6iK{o!?j+7Cxm8ZHKfj#Lwg>G<>{qdf&$S zxjRpnRtYnC(EW(HRac)pt>Fymzx$DFWFFhnV(5xfJ$K~4x_y2aeP+e7@Tl{B_J=PG zcRn(BOLs4zyuR>*ao|{e->pbyLF+x2{5KyirxD_dCd||h?$Pht0r2~o*i*kw&nZmu z$VyALbI)l8ew{Y4dE1fdX!V-hVZ%|8maj4vUys9gue}~o=We(Ix;4L-V-B)mtY?saMLn{G8cEethtE zSAXlIC4mLYSg2$haymlEMcYo5iRhh}|fU-8JMO z)$jKW+ili!r;PUt{o)O}Gv+4VhO99?_g>x7i?uy}qGL8O1=;2Dd>s6ykyx^_V<~dgTc5PT%IepC5j9-s;UZ}tQ(Q<6hk!#fDhaQiR z)K(0O{X9`|V}1YZ(^FeN`@SeZpLhK7%LhBI9P5NXl{BqyqqDff`Sv!@(UHTqt-bv7 z1-6S-+O-C4ze8#0viel&`$%rD|H!m)w{^^`9ej`mhA0!%JEXw zyIkRz!vj8^epxYTX2p)<3ofm@y;Pp%x$Bm+Cx7J@?C%4F%IHrrCyFepDK$ zU-3M*taRTbT)$TI-LK2!Qxj_i`%7OvKFS(cJYm&l)ts!a($7O=)s^=N{cfgdZzQWX z@+6#0&h=^3&kZ>@vQl>VuD029KS{9fa>IzCrNR;G>IRP+a^_i}CRO%$x=}R%Lv3Rw zn!5S?MLmaRQ$@pu%-~9{{aoDk@ZrWgSKrpHj&P!hMKg+SP6BrPzR9E9o-{!-Ci`LP zWoANipt_=M`SZckH;t<~N1VO6?SKMG{;Tk_(6!wcD0SSok?W|mfsS+ar8|lH4HsSN zPq&}GsUG#=`-K}vdUzNmfajN8>)t_6U->$usAfk)bZ6Vo-wQOj8Kw*78Q6(!Z@&C^ z;pJw@&jpVSN{^xu1@KmXsjE`_3;y_KeLzGzE(v60id%ErskqI^@=S3_*8$!0*{VDSa>M zcTHV67O{8l8OHNb5566G2RQBojvu_D#iQ~uGbu4SUJXk#T+RL?fQAdw>8aKXpbF5>IwP*2* zNvD{>(#*Nrm$xo2-e)oIeYL5f>Bh-=!NRT0-bv3w%GQL!2Cnsr0I}%ue)0y-lX8xy z>G3FozvfBd8_YITN5!`e8>eV0^3F$h7mblEfBDYySEcyXe!LTh527 zkJ1p;vVJAX1VyL~FD&j;utdFcbN==GIZyCi2At1G@BQmyb>@9Q-`bsk1WT)SHnW0sBk^#Il-zd>Amsk|apy!hzuEp?UW0=je4CiS}H##hMpAOEq_d*Nu= zvfi7otF|45e+M+#Gm7D#3Xgt1P_uIQvTJX}Q-;qkOFcsJ3k^H3WIcjR+IqTLdvVZ` zhJ9P7O21tj9M{+M+5AI!JLTfzcPP}(C~rLI{q&5)>()n?G@C*#C0nM%C|!0exHw@`NRlIrj*i4?(jGkhE@>XDyZ!4P>>o6f`nO3N|3fqX zTMfzBf2(237HwL!XxXx5w=AAi#NnhWM)<8kA6xOS&zOx}TQnxNY#i9CabWAlzHQ*0 zS|9Dyrg31WK23tAz29$sFKIh?Wy{}Fr~dD2r*;jbZVk+?4cXnRzEOI#Xw|YMmBk5$ zMnv*m?$}V64L%f0rBa5fwThvN5z&~#KU5U6qlOM;`FunF>vy6?T`NGr zYO_MH*0dsjU9__BLg2uHy-VuWmtS7CzWr+9QupduSz-Bvit>u``F~AYKK*3B5eZYq zlzIyae7^A7qItuYk6t%ne?z;5EB%_BP4&IUdPBNlh4JCB@rBbu)5pw?mq%9@Z7Nw` zR6VJB&apX17VcWJseE18vXh1D$5(`xhTE^TEMUyhw(nASpt043hDlpn-n!A?pSSf> z>jqq9@2bFtQB}n|i>qdAS-5uIrOj*JFWf(=dffKtJ^N14hRTgwDw>B1pR?>MSeAJL zGLLU>?;S4nQV0A@YNr{eEzt~qoG@d}tTk%}lztoCd-vA8TNe*rHE-**ZNbaR!lw2S z?}VbF5hJG$n_*oreB}5E!=jrCmyTaEYx(r`Gv*gBDLkINw5iP~PWy?zQ7&8DHOx56 zyv(<7RN3&d_FW2AHjZ4;KwCQFK*HdaTrT%_rw(O+qaDjCJ9RpGuv6#3Ykzm@+PJq@ zvdVz^tyrSqr+{#Z^3f z_k`F6K9Rp;$Ka7Jtt#EKgnNtiupht@Fj@}u>HHT?xQnhuuUl5A<)=lliQ z$YmZzKiIkA(IwB`+ykt0meD>PAftbDdUG!;CY%}iE<8MT{AI*VW|;l9XhOH4VS(n$ zojbb=j$LM+-#)i~#egY0{3Byq26q=OFKscg#r2P4(Qp!So|MW<^O%&6NtpW*EWq(ja2p=)@M0TG@g{; z7zpTDHf3gSZui>Umht@wQzx$i!E{?bPV3jc4FuT!ET>fmU~!uf8>DR$N334?cz@~L zlwIzT$E)t#S#2Cypx!;Q_HB6ByEW+r`+HuG7F=3hznI!E^TGLp4}KnMy4Qc;r_V=1 z0~@BAdMECnd456S3xs`pmETyyeLa`>O4+a@WSa5eT4>C^c9$kMZdl&5W-vYV3-{gX zH$xhJ^vlF-X_Vx?J_nnB1RNYrditFZnb?*0a8J#n<-f{j&Ej_Cu#c%dQ2-_WJ#f$( zctt<4>V4&jj__+<9t3b73SxMQqPwIHW^S=q*?k)4LWO!Ie1%cUMdDP>sO zGEmN1ML6M6?0{pUZk-_a#ojuCDi^nK!{vJU@%1~ZzK{me4m+L7~LS8N)7X4sF1V>6G09vy=`TtqIpaBMr3(r2=zV+e7pb#pT$8;dyB zaVoHKc&oc57VR+wOL4yE+`My@2XD1&yt}7*!pF*ywLRCCqDCeRA3!gHflQObL-=U8CQPT7qvdra5%4)diZ?$ z?02naUpl>JU@z{`ltu03?MuoCZ2~Q5Z-Sj}Z+yU?*5>8~GkbOae0M2!;fNs@N~h=( zUxSbIsWu$w^sF>cv}}$wYdivO?En1Y=dYcXpLrp+IC7yit;zdVZkZJQ{=U51&K9js zcX}WBCY!LJ{;YD}D$qIQ=~?##q+NSMWjA-;t&?~tdmu$E63-v(H1)-hW3*i)JgLLt z@c#a57?>#ueYiAh|GHkBZiS-R-}f)rhG@U8Cza6kOjZA{UkmRZT~e4(cVIDS@9G(M zy0)tuHUkpiSp*(a?wPZIlE$^)Rx*nkjt6-hp-0IO_ z3N2^&qe+-;Wk2x0+xLK7WDQ-RI*o6e_4I>d(w$d{`vz@!b801M+zV3XyxjS@eJTf4 zj0_pP65T$@)K;D!!SOR*tl#7vJg=JfIs(2Mpmhu%*BoB-qh#(Vk8h{_YSXm-eUc^| zxcBj8s^Z*F>aWtw%Yy=k1J)0lAWMdKUR%|(d(Z{4BoFXs(hwIzF%X<_~M z!)qVSQOuDlE??&CCKcRXy4YJep~aOCwd-r{^~6oQaprg3ar`$T$Q_pJ{UxnO$FiS1 zYzb{`Wo~}Dqo8SA^@Ax}Lvv>T^?jpg-|(?>;sfo$W#xzs>=t|9)ITsDe<aFVsz4h_G3o)Ic|9V^mF@Ie|}KW|Yi)b1ZE|hk<7Y zAp6HQU{^=d@%3A)?g)<>2X>-?J^G5D$wr&M@&-03Z}W~8C4ecf&Q?ql>ddC9?aLmm ztbw1|a^-I6z6185;ig5;%a|kRl4tKF#o<@Q;hgR#7bB)cr&m?ow`_?Hv=lww`|Q!h z?=!u{koq5exqtmm7tEm!{5?A}Az@Q==F#2{Kc5K`=l%>;S50Q?DIaES*#1}mnlqzq z(^}B3>mN;1`nJo@nX(ab8=E=AyH9!dEWO?Gq0yC=H?6J!OSGdd!1D(9IPKcz^@jFe zKac>v{C&>b-U-hBG;w=r+tH|Z%mag*pX7^>k8Ad8UU9!5T7Lu#uwCAGt8DbxZ%=wM z+gopK-+j`$;fRdTdqI&HGa@xPqs_E2eI$~kkmYAeRRFad4E zr{|S!tcCG>}T&O>rWUHQS9Uvg1w(k?o; zQWKkBIeGU-{JCvaw@b|ayOmGJed)Jk?AXmWxAD(QhK;y>lRV^Y@bkjkQ+Y}JN9GB= zzcCZumkjc+De*m0x6InGciCq~B&z*VK9?UHwD0r`HoV9Do@**XbEOaRQH=ep8TMoR zVTpj#?)Ia8y*Rr%dP=J&vc3-3A#OYJC30cujM^V{_iva=uCJ7k6~(~{_UwFzfCb8dG!_bh#%`)F-!7p|ELXzUgd1kO&ou6+U?k{s_VhFsi<)` z-f!Br%dG1=cfmf+1&y!GnX&B}+JDT?yi&OO>Wj9{&x|U2=d;{m_^CTaMyIib;iLPi zX3h4)2S0Kg+|!}r7=2c0UN5IKQ8CO>KhFi-MISh*#3*^yb@9~OplTCxOMQxaNNCrJ z^o3&rRO@Bm&Vg-#S5~jNJN9s7SRFlyFpB)K%a3TcRd>_w%@IQ`y+2$+-hfkhrm+q^ zkiVmh>V7|;a%Rp#*6~Y8zb?e)^N8^ZOTQ&+J&W z;rdlO_Q8I}yC(W2a7iXt=K1`beW;Og$(OPq1)NxCnublU>6Hy+b{Sk+YttR9XHf7X zZ+?%A`l~wMF?>`}&+n_R_3h*H6R^e07j&$6&f1F!C2you5Bah+>+@(S0|6J&7rniHAt|#r@Qhu{|`#?y>yg7;DlQZgw3oh#h zf7rnp7g5(2MD89w{;BfIvp1h>FLoJ%A9V9{)@DWj#4|LTxAi?Y0w<%OD6L5NZB=fs zaQgXPebadz(Z2Crxts|$^2pS4?@rHWOjD`0&6-fofL%zvu=)WX?xaZ~hgmy!X@4HKn z!xmhBI{x#UIssg@dBf(ndt0#+4_xTBdF=hBCB?X9mkQTpFHHHwdWv1M6ZQ4#mPgq; zY=rH-eik8*n9%2X4ZCymM%+4dOBz&}r0I|;^(IQ;Qw z$fl6b$Klx(Q*#9MNf%`040_qMLS!_V#C6gzs}+j*d9ZX8C$O-jjKSc5OF{mM9Q z0`u4W1TLLG_D@+EPskB(+J1?b)Am(1z2NYZ?K4q$LrF%L*^d@Nub^t)o3|`En0J5L z!MvUaX1B_2-vLsg^quedm;IPeXw)gHyY+b8YVslAyW+$(uQ>-7ylXVCpJ#YCj2ID~ z-=X=eozs3NwbfhKo3gBjSE`>szq6s_JKOMMR&7s5ee$psHRKD+4@D21x>%B1FyY4b zPJK9ZL_w>LO|w^4FB|f5f7kf7E;TE>i|Os4M~XI70cN%9G1R=X;EV5;Q8V+z)xPiA zP3f~c+1fiJ+~-#9rAXjb;vUDsmOn-(-`d{uW$shgptt$y?e6L?U7m1Z!fMjl+GTS+ zyL;Lc<9qINmKD!?$DPzl+W#O~vQ<)XJg@S7=F5`7JH9-BWrA$mU%sboeD7Pl;-a*I z?&-YGZBLX;K3M(ouaAe!l;dS(-`Zs#1bn*~9Hc(t&&y?=;=*oK9q+yB==cv~<|lno z)D0>rxc#AigmPqstyH3co_}(Q27g?-9kqSMtNNYG_6^vG{z>VF>>zXrJM}#}lS6nz zn^zI99(r)?D{IXc+VU~<&vSc{Qp4jr)t4XpOYRUBQRm!w3;o>w&9ot1t%Y;$^!Q7V zl~cINIcczA{?0vy8M{J=THAc&)81R&-cGt+H=zi69{u9NB=g+)-*@yh4{n&cxdN%X zIJWEPTe8j0!f!<}M>O-An^yTw!Zr{#sy|ebT zY<-u6?Drey)ijh%8g%gC`PwIU7M>lOuv{}>$H*PV0oX&?7HoIH^+#oq-gVv{6V@oR z${%SiF)+JDcz1X5Tjb(lpZhSo!&GgzX023CoL}+miY=h)8teDeKdQ{N#Ciz|1kQZ?xFI@E*K&ry(H zvhn`ER?D_^-C$d?>qTu$w$^?7Y8RAq$CighV+{{R@|O3ia$S`h_aVTZHJHWc=bbt< zy)g!Fv%oO-(x(n2!D49-`SD>}bB}P_UjF)i=F#rdSmohW&3Sovu1f!>c`fnTj3Zr5ce zeocQM?$Q1D`q}Zmw>)3m;vov;z>NJ&aKpO}-8S|5qMDQsS|yw-Teqr*GHb6jdiKb* zN$EwG(ibn`bvwcuUiL=3yJC&-TJq=R9mQAHVD6_mleRqVa~}3??XfiKI^&dOYmP}T z9O@w&0NdJ?bf;l0DN$)e!5aIgwjTW9bHBkycN-e|)(@;(vQ;=^Rpg86>9i|r-VNQq zrlM2T`;h(3nd=<~E!=dNnmu#O?XN>xWVhV;>;8;|FB^OJYe-4pHI=t5a!ia39}rn! zIeETn$LrIB6RK4(Zn zYGXZYY}-lFCBDQauBG`o0L~$-goamrno<*HZC{!NY+IR1+SrjY+T zJ)}po6r8Lq3h}=)M1RW`8PV!|dvmskgh8|OV^OIi!U_6A!GI$W8%p^0Zd4N1!P;#pF>5f|q$Qi*02PD1gs!7+KV$em3Rag$;OQ%GSAO1Y^B2A>{< z*aS=&Hw6Q*MtE!`kQWqzba7D*nxc!^@S2=3U!}+s*)z!MAe;&%%d=9UA-_qEu;#1z zVV)N)%W`FA=VE}$lmLJoh3JqVM{+oe5TZKCAf`a&Ht-O5PA*=Gu(Bvx0l#_wjEK$= z`J-+KRp)YXgOLmi7^+2t2<&7E5x`>$Na=+1EDuAY5%bZSusNtxtI=qW*c;2$YQbE8 z6vq(7c|wvaY~v@TL@Zb>5{5Nc(o{ab9TGPJ^1*DT)NGZe()^4_YAl^-utWupw7gV2 zM{f_LIS~X6i)b?neGUl3!F99wayJnvu?gh}2AZ0jLPG*r0iq*I05Vfe61Y{3B1Z^p zwcQL11|-xF7$QyA>*Ba5+mm4hXTT${s1T>~<8_oYzR$>!3EWN^1wa!MQ7%i!!GMWP z992FLi)84r>@iG$BVdolA`XlHUw1*P2k^IL+y8*P;Qv;r-7GIgP#V}}bth>&U}myj zk>ST7L69gHCR6&tsi;h>fs*4=xfnLB+hGKQjPA6o9F>}$@1-#PnFbKRjbaLHIcjSr zRAW|H_$gK~M+u?p{1G`gOg2FzU@0Sn;Nd)ofHp%OQF-M_A}c*8l_UXE?Lx4JNCsH^ zxk$7i%PCU8g}8iU*c|oh>0w?tgjbWDa#$LINaLu~QidWo;El43Jh6~zjZ?$?G&3ol zCFAGO0lqZ7jGWn`I?+H9 zMW)WB!}+j`3^yDOzKj4%44N>QWHv`7m~^fH%gD3lD-2RUh7!yJLEM2HA&(~K zBGr6GAX}J2Zj4uj>2oLDwk z0tFdT6l7wiH${NevRSFzdn)#D5BK3E>T=^1~v8U!;H#GqnnfQkI=d!3BsOiG{31W;!KQIELm{6G3W# ziKAd93uO$4lcNPX_&9775)lP?Y_m4g!ovC?ksw!q#4-_Rs4(KkrxQsU4mgu#(2!D~ z2&xoLhyx6qlzdYz!;+Iq;EF}`W=qUUvSl%&1fe6Jip#WM2pFCv4#{-$I9wEs6-Ao( zE_arh$a88mawyaj2LQby223BgeUgXlYwdMFiOe&6P~!gWrF_+JSqRqp*7=ahyxj(Ja}@Lh7V!VSu`+S zl%i$1xKgkkm!35O8FGI%16SGt6mtmN=LZb|O(RIMh$G1NB-2+?^5#N9_u^qsPlua6EA(I!Xwb(=yCx01u;K zx!figJqv^2<%TdIxrW5Wg?UOoo=DHjQ0YY+Ctj09Af(&Xsd@&w*~w#b-C&bEhi7MK zfldd&YPLc}3=s<@^`l5C5yiqz3DIQH9Dinn0M3q>Bv2oa;6p2+e^%+g&6M~D0K}30 z13)8?nko>cCTV=^RFIpk$%LjE#BQ(^#m~cpv}(0IE=A<03H*q#A;u0Wq`_=uo|9~g zgwiAkUoJoskzpxjYKC0{$^<&CbdouT%Hrn{Qk-5If-RD#5ln;t8%R^83#eQR3d@bC z#0FwAGpLC2ttnQw7ywb4h(5FxD`5iTAzHGT&^#PL3(<1j{8W?^sLPW;5FoN4hwqb` zOdK;3=rr5CX$C`BO|>Fm2)qLhz>1(?c0lh=R#ON9NnFTQVmVkNS?A^R(l8;a6peHV zF%(mfA0X(Yp;(qD9FhfzvQRD}kVgo5*$^qu{3p%A|Er zMo%P*ngE2gTO`nZUQX!2gxp_QID#z!~PvOC|_^=^D zAdA#ATLwf1@O!KdLRK)J1~vL^cy8E)MB5->HIIZ=LFX&kgDG z(s>$$PGxf>XBxE`&KMYghK0n4d_|lRRt3FTNohDE3K`UdD^oz0c!Vq0%3Nk3lW$LhQFJnA zRy-Xk^)T$g42R5~=0npE9yS}Aswa7nES>-Wf&}uDl9N&VR46zafT7(;t&7Y>as8A$ zq+gw7#8MPtbW|BoTgVurBG;*e82x5&l;!8@`FUXqI|6{d9(UB_{@+&V#Im#!44OL=Kx}*;XvGI34o(Mh7u_cnw23wz)Oyh2-K)51)9k- zu#({*qnIB`$H?q{8cd=wMU#OMFd{jb;GsZ0Fq(}=&9f4db8+Y_7c5NRCP~5o3|OOc zHhb^{3spoyqP482}d_ z9EIiQ5Z!T9Bmm_Pk z>U4G1A7T85T~_S>fH4j15W$keh%9z9jM`sU(bKX` zSUNPq#pY*v*dTsZHklwLM14+{$qrEK1Om8?k3?gW&ANCVMZ=G3O|ty3KmpXC;OQU} zf~z<97+$+Usu9yHXt#=;CxD95<)IXVyIHPO&AfsVZzP1s85*1v$bo=W96isiKybkf zC5#ysB=cRMq%;FIh{D?ad16yaT&l3i=~4xW6iOon{c<)SkS~sDv-x&RdaeeqV=Abr zqHL5yLqwptMzF*f#oECRn9jfou^ecvI4k{+F#fY{3ZDA!g-ZX5JV;3aUUM9tqR>&i z9x*=M7N=1o3Lq)O%0=X51D!$yo*ZD=uqonj&=`h@Q@PK-@1z!KBxY5@)x zbJ)2!9^WBA3CZ>_0L3;^adZnwgTPy%(mawyBjM(#_-3&mtTt0nL0o2rmm8AusVbj3 z8=V@;;Q2!YGMdVSxwvk*!wLu3Q_{>Ka}tA^>oBI!9e%bGnrSst%@KmZ=frs|z!*i$ zAUpGgLQBvhfCObEI2M=dLS`z>8GjNA;y>#m;Ryepqx~22a3DFEil#q>6ne9}%6_gwRTip^02H^22d18ho ziAO>DQxzJkD}^PZxztdT%nU`V-MMBfxY;$cxRdlbR#=GX1X9@;Je#SF0|g8}f@wqp z=$XzOgD*}&@`WB?D!KWuz%5xiH<}~Mbjy`G6GH`pr>C=_25{yd-~ZoAIRA+w68|3z z{lEMgk{Og7#v+@8@H9A7>etXYlw2A#nrw(GxEQ2}osmjVsKoFr0w*bnK;s&%P9a0- z1&P28fE~@_M0HND*aKn$IRY8Nj$m5?EM?F`FcS?5s}V^S6QB-9O0pakfjdkYs7#VD z6PymgYegE8jKBcs^PsY9lMmBOqOlnn+-!t659pzwKu{Pg!p`Jifhjf@1m_}~+z^SH z=XC0=Rv*`!DN^C{H5glr1_RJ6F@5v@$tPJ+95UGz@aE)mEG~Q!h$R8$WP7ox`8i4z zgHO#zS`0c?x+{(e;ViabDwr>%a|IA%8~}-Ul`Jkj*=olmyMtD2jv)o20OO>QOoLuV z;z!+FVm1oobGRK5JWP&DLBum*Jf0>fNQHr28l&rvu>P$R=bwP}e-P=`f3dITWDhkK zjzl6mK4+6AE2Pq9{ zb_im6Au0%VC45nwKtA1ZPLxOS{sE{my8YD>33e)w?ISnVA zFR-9I?o@p+!xc(p=Gy@dOaSE6G1CwNzcvJQp&33=vR~|j8ncZWg$IR7(5Bc*yLDGbRZ zdb833>G@1SstssE=84j2IXF)?9^9PZfo2-Wa*zU-fBm9R&H4w#mFIk`DHJ}6%sgsUmMc^`@#jFDo(P|=v zB?&srakhoVm-zTZRt)NrB?&P8fQv|pq>F(7tVe81%4ReCAv-sWiNgaphlt^2b5%Tn z+W_Sz2cR^pAWtmtL?Q;M#O?=S)Cj005(tMqc)P?3jstvr7A^$%kzpRVd49VHl$Dl@Ged+p z0N0Y0&$H(syiRm>a|fGCrj!O`rf@bVk7|u&XR*V{Pl%Jd+4vmg|&3lZ!3&1KlZ1rrK}MqrvR-T$r5^BJu%J zce2ZsmztZ$hk*lNWIBoxHZghfh>U3oiD^C@P|Gk8VQele4U7|Kponm>M$9!E@I;!O zXH>!Ma6qm(8UQtb^Xg>C^w z4Ci}{^so*?3#r)vs{(<{aHcX%Zla!!PeGv_a8^L6wZm<6otkEMd3Y&S8kZZ&pg{;E zlbXpSr$_uGJRNWHxxyT=EDK;Yz@;b@Fe6)qRm+e$oUogkYL~P45iKE-nF54*!8w0K z?w^h6am4=!1~bt_zn5c7%1>ftI!$b%CN1a}F#u!Z}=-4_lEcXxMphv4o6cMopCHMj)#;2t1w z`Oe?kfA+a;-`394ew+_;&X-X&s(SC$OO76FBEsUV>LT|cqT@yq1#0ujo2pZoIrD3% z@q$1SJnXD?R<;^qoW?FZ3?JnU0~bhGU*5r3!roQbflr5xLPFF=P(lr4>PqQouV5#S zBx^)#DQ=^$Vqz+TIsZVhN<=Q5G<;qgHm(VP%x!qENCIv*Ofpb0nwWq@z*z zZ+Uv||7l?J|G2Kinfa(hc)30#I`)*-g7y$a30YGYDoJ4mJ#(-m16V|hR*#=UU(`v) zL5)E`!9qlY2FRqwBq}SdXQ1jVjAUcTNJ$Ig0rHwsyT}jexlWwIP_wl9iQ$ z-$2UBK}wZE)83Su6>O@_NG{??$7iIi!)y$)rWH2_scHdS=v7Q*Wm#;5IhiSu#CaKA zO`Ht)>;U2*O@1LwZ9WTaD+hC1I*19a0lOuWh9{`B&4qfdPFoSI*btEWEOcaFal?0`^ z6cn|9w4%apW}MEPE{g1eqGEa$66Rdgf*cg|BD@Yj3KKbis)H82HLHoFA{P?aPD@>k zlHOWPlo?1zWzQn7C1NR~B*`WO(w62_qT}NeB$t$B=OVY$XOfY%P_Q<&5;Ydmkmuud zW1*6i*HDr{q80f7i%ey}v?9jxqAq4aA27SEfQY2485^$!KZTRv2X!f???ep{)03qD zfCP*zI0mz!m7;&2NXbI_SizwPS39?G4)6wuF zNgK+z2=YnWFmN%O7`VC^I*0-JjTpHF)NS~I?0gCq8Y&P?Q*ufZM_x@z1yeJ7Ct-V5 zCM^|tB};B~I|W^^2okS>9V{6Fe*E|F~)Y!w$U^-nTr~fo_Zj5egpFtw`NdqE^knP-R5VJw&QuQc zOiG-R%w~+%A4x@5fR_)XqNS>7F_*QXjEbf+m9l^xlB}SjoShSZ+D4w=fSy&< zREvty5$Iy+Amc5kBO|BiNH58&VQM8UU`S43r6#TT-?reaEdM2<{(qCr|8J=(_(Qhy zzidtP{{LcB(ElzLWf?5=Ea=UcEe*&GEW}(D1z61K07_IQGFBjMQ*#qeYIbV_5P;i) zNf>OXC8sW{ASJ4#>*$~&V8ADCOQS@qhD6IP>foTSugc5KN-M9Rr>(5XOfP2a#$+o; z;mFPLVX>k{<-#PcMMbU4s%9!{>CDN&B+p~y#wEzjW6x!%%*%nKWDHi-Rs%~&(1Ij{ zX@IPD76w2wHG2ghACLyZPX8fLl8`WS)uiGRbpW_Iv$?nc6%3ge$(d}V44k;6#Kmcl zOywNF%`Xp97Sf^QrZ9D)VHIStH|L|J z=2KSZGFBI-p)>jD4R{z$b;U&lOte{)1ubOc0RTP|Q#M6mY9l^P1_gTqBYq(WqY^}d zN=VgQ&&pJqOG8E5Nm|NDPuq^)?Sq=t6GBpTwV>snrJDVZR+g3Rzx?6< zdi);5!t%eu1z`{Q1`I~gp)=0qqEB6Gs~c>!x>j>Ra6ttjwk-zV~K z;=vS==v>gz%BD_qE6xzH>t_(PiA|Ly4m35;hM?ofEr+rSO)}!40@0N2ebB=tE z1TJs$EHDh0AQ{4BWUszUwJCq6Hp^A$-CUM!7NW}^_rmz&u2o@P)#&puZjx)fmh35R zgq3^G-pwecu@U{bGv9>ySk+=fmJs7qOCM!fb;;`K7z7M1&(7FpR=wt&{IDd!cq+9JVx+2jW4s8Xqos$Qc z6E$*R807oHzl4|m!-&g#I}@mhK}QU8A=Ev~Nvy#%`C&Eu($;}5_-Ro_*^E&}qF+WP zgX^k?wZ>}Ls~wEDvpueVE$bnnwIfTj{YhUZ$2_T=0n|EVy#zRCI8>Zlz8lsmv4RhZ` z(yr_Ynm_^L$#GDIN)fr0DHk(!;-b{3QI_JtxJdnFh!)waS0+#FR00{ZM!22caoh@Q zl{|NEtwRusST&SCg_!thB-sJQT7ZLyKfl~-o*H`ox84xR)~4A7MWK^5Ka^2@NAD5s z3p}&^QaqN5Fs~CgS2-`EHy$oNtnPn{NDkOqo;ur91VutFdt;OtE=OQvUtc00jtj?M zf=F7OlsX{@1*Hho}5(q>?x};r)$1{*lEa= zF(|>q7NVBKT3`wq8X68{FO|q2?XT+xliyK1x*Q}9b6v&dL=2&(bdV1##bmjohSuC4u~b$E6gpCOI(2>mW?D4Iop%{HUI+Y+DHXSHdS5`7-9 zwz%c+Z8KtPE}VTxaKJO4hM_1q{%2a=1dp~)A{`xfW>#fmZ2ZV_xLtHfa~YOGDs~Rv zpqll~mXdh`4|Kv0KYJ@^ze6?s>&LuAdwE+~)HfHYs-j%r@>f1|!X`FX924+}+|Mbq zI5RbWS*uuOJ0v6bR6vJv)NUz{79-!u@q%UX>*}gc&>13SkMxDRvZPGAS|9F+Z2ymV z1mED&MDe+I#UzARm$dpH@=EX#p>E&g#RLS??-Q{oZ+6WO+_?X0vbBU=W znWK@!-^8c^LOtmyQhh;;Es|`oY-Bp71_^g$&{_h={Uo+HhQe$RV<2&+m6e>C)v7y% z8g?{43Jsx_zjRJgoNw+m%=KzEwJM38S#*?{R9j@XDEmQX?9jqs{vX`FK6diDpbArC zR3_x8354&;(Fpv8u$xy?^Fc;P)p{2^0fHVxSvBU-zpm1nQU#znR?DdH1CJ)Pm0x2Qxtqz;~}%Q3N*zxmW^3EEpl?ViLwi(H7jj)vV2vLC z3fNyx@Jym*gk_Ydnq@)?>&b;~-ByLp7lN^tnQ2C8fFIyyvk<<4v%I2f6A>woC$4?H zGYP%CO80tp50SF5cd}>F(N%G&j!xSjxe56lT<671-fLxw%LByxd5QG;q=vNVd+jO# zk7A9n#>*S&5o!21>bg;6F0R7Vy}I`sCF_OACsJeuIR#emh?U*)v53=H$`IK#!% z3mnod710zK%EgGX=#j&)PS{^DaEbtXxOnJc^&E?a^H9H5IHpRWrc}t{8XdSIiB1Wm z_C!!HG-4Cyu8DJ_Mj95cA^Gb~U2qm)1^)ZXT<^!t%iotT7d~e-W*SNtdo61dTbMj7 z3AT6o&8*(k6B}Bw*~+s<^&jQRt++e6 z^5-zKZP>#4xUfJvvJuu}!ob1V-=yku=qM8`?Q}#Uw#;-qIKL%mz=@xuiDy(!H ztwVTac?2;eH=Y}wuRpaDvG9kM$Bv>q3m-b;nc7c!YWw*wDP;S~9g$vJC z$B!qLb=Qv8Tle|PbO+4fh3xhWL$6Y5LE2EW8?bmnB7>s`Cin3DeRd(|vNG{MMBKU?qv^YG&s zl<-kY-!|7eNK`tLMM62hCMhPVR@fy@;!*>b4y>bF4Wx=)y=*bV4Axr)I*$J$I$cbcqQ+qtac&c=?_qT^eYHB`vCuj-*E^ifluy8f~kljLBR;+#M=UFYW%h`&y&42<^8sD zx543-l#eMObM`#YMTk25kN2VbeMDdS#mZx9ibCE2^Q3R1WH*~(Xm-1zH`7jm{>F{Q zqM|`q5w=-VmoO+v(DUY=T(YqyNCRo3tkl~rb+t+JHD!}9r5>ToCy*Fd>@)cEFW*R4 zDB84d`!aU{?0 zEAjZ1&Hcbh42owF)~;xto<65(TwKEvy<+vR)h-S$*8tC#vLkb^piq2y3h-H zrXT8kQ7dG#+-&kCZTR6wWM|8NVBTln=C0x9xO82i)__%xVfKkx7O_IJmk1AH@;mps zjTJftm;bg(;1pxZJ6iUT1~9cHSW2cPLAu1!>k~Q z@!T;!7?>jwuMX{>u|%ZJ#JHCG>%1h{lm~4z zm|}D7$? zSyyU&KKkxecd`Gddf%v|-%<$3t^CoAClZ}k(e*BnM}}tgdm+9!@O3zi=*}h!4aK^q z+Cj0hCpk#sxlH0-NSEUv(AcnlGrtbXYh_m{A{N4YGs*_O7gAMyFZH*775^74%mDJwxfM zDPk!8kqlk$+%T%#;xyH(2w@3TWmE!xeeb)z zic!MW@+9ZjU}z|~D3+FsBNkhF$8h5g*5fPhBCCkDgsU1(n5n&?g%$*7mb3t3p)9L8kyAIVwro2uiw(C{YM4} zpK~yNT^AAi(jG<$h<4PKuN!!_LT@}2@%0O6U1rPc@&t2CE$u9LkaEnJ{*t}kBjh>WwCQF&~njgEnnhmY!d@=|fht9ABBv?Zs}58kaZX^8dDE&&9RKlMnK~GqcLQCHJUaPc1X-b!;^nHRef_;u;)X&p6C~JA0bP zWTig2GS`z+05Q(QPNg(?V){qx?PQ8CCPK7i+uXCy0H!~na>oyvveP&i-P{HlJv*)n z#dVVOtP5?%k>j%?!}NouEg7BS@`s`?~`DvhDE3Q_R&m7UDn!(uvsz-f~OlLok zHq%h6zPHVu{Qkn|-86kY<(&wIBTrt>A`+udkwJ7~NHgR*%Ne?T*)MhOC|p}{07!=* zxk7XbNq;s)5o_*8;~5$}uAZFM@Tg*cvliPajqH+KGrue^H!^~nd?o3WsYYb%8FQT! z6f20|ubl~hosvnr66wOR)*Exx^f*_R->i70>qWh%H^sHbKs;AhdT{pxTSK%Vyi&4| zc#8pl8A+Mab96nAl@&&R?_{X2Gdpe+g=3yo^!j0tQ%v(Hm)9H=MwUvsx_Q&Me(*N~ zzr~a-Sx0H|R^-R^uc%09#9pSS*~d(8Oxg(71{KNZnolk%rSXl62g?ur~jzfK@P};t;8%z?3TtpOqFBM;MKt*-p-&(ilGJQHgi)F8r400Pt0{7b4 zfYcTQkDTAN`32$K{`*#Gs4WC7BxMPZ7!OMyq7t&GKsTzXWJ+roPq5#xZ$GDt2e?O# zaNtAA@AK8_yNH}!oZRIU6BnBCw07V#Q;28WN5VwLl-sibs}h1CIyiczts{{7rGMnU z05Mcv8YgQe-|mZxD{iSELbB!;6v$4Sn?uyHU}y=374oZ%8g3@Rn;ZUK%QMGhaD|4q z;^UoUoj{+=o*`;&s+Tp&L2k1nVwA38v@Z0>58R%;=%eCifrd0CxOa0VNl!M^Fe{m_ z-0N%BQL>MvH*T0#8+1Bt_u>^;f2*s|ml4Vrcdpc>jF^55QecWMGnsa!xeef15$hHi zI(JCD^B=Om`Z#ob4q$6e*+`q88Bp`Vh`1ckT{W?hIwx}}8)bj`Bn5-XJZTwP&l^E1 zMZ8nAO*4qqA7#z{h}I}@*z3-EpiXr^#b@1Ss0jULjNHcYOwt3cQ8M>D(Zor)I#w** z$U^4Og|pa?-J9+sjTqQxIbu0GVOjpMpcm75=}!V>zq};l&>@r1Az(meLt9nf*0Ar8 zQ2Of%eB`RSRfSggZ|S0sw0;OmHBss;=g#~%aGShyLwWIeHu|JHYHenjDdGL-E5v&S zrRO}&ty-9FtW=bT)pgH<3RjYq{s?9dF*~a*Kjx@}8;ILMv>@y4Ag^7MmAdJS9J$e& zY`C$;`V5nn3n!y@D$mVM|J6Ux3^qyA#8Dqd&%dN;V+gm|Iwo^o$i2_UkAO=a=Lnn^ zLExEvNkq9VK=Bn<#ZzlrBrdc1+Rzn%N4*_I6jB6TyqRXQ$$Ws%mbcsGK}QlJS;e8% zqqRS0?1^m($#9te7N_9qesw=-Xx2^>5i*Mu#w9JsQ1q>d?{l7~B@5yk%jr$RTyLzj zL6WM}psLMH%Xe`A^!V7V1`O?Ms;b(knu>8F3q+?DEkfP$2b)hwd}@b2wtt%6Q{DjP z?=>YYErWDT9HQ^h)X)82M>vt&qTz?dgubGopprL!51$IMEjje1E&f)8Nzs8LK=$YL zv*32GT{aEx}~>iqZWTbbF7$d{%CF)cVZSUwWL4rzrlX2Q@?%omYrMa1xjtc?sc;B4n=f^ zH6pC;oR8a8e$cE`Y&f{xQ-jafgt@v!1g<~$phzfx?Rn&n`l_AUQFvk}yxywR$a8QM zx4QdyLA%s4{K_6QC``RxLztt;!8Y+H+!7OG3yvabS@-LSULzUWB#7u_90-dYJRtRk zFRQ@9UE)~~`aF^RuB?APBcE#3{yWR1GDh7wviWE-uehlwrh{@@)6Ct`qXBdtkFB)u zONF5s);nZYE{m%yeP~0$+1ZN8&N++24s&fdCHOn`zJf=U1boAn?ON5bl{tw-36F<} z$L$fcm+!FwfxW&$-M2k6k3CzDf-}jm!McT_ciJgYBqEb-ior;E+0YlL)lYj++S6ed zI90Pr=AQr7-b-ivoNpOWeX#%a)OUnVh@gA`1Sw5agCpaA=q&$cW%b6VRRI~YDA?Cg z4_W?J*5V--Et>vbk$zN$Yp1^gZT|KOc(b0OKluK_nX|2=OC^tgc+O_0E;)PTou~`=dp^W&sOqs zMR;WvG}RaF4$OaW4acj0V7DfxzsiMzxPjEIZXEAFql4Vw$G*OCEz=P?K)nX*N>&*Q zbQCr&uDV@XHpSVUL(NoIbhsrC@{sm8y1k`o)(f4BQ9WG?N%(~;rWllzuQIDta=R_n zc=LZM7Ec3N>*mj^ebOG?zh-Am%ZmH^7|-6YE$mzER$tmt+G5B@^my7^A#i-Yo=Ol^rq#$Reuy$yOAO)8y^Ju!&1|5li}sTv4bm8+dcOTHaZvdEeh|-oUsb=B(dRi=g>IZC( zZr9Djh82p;jm}ZFc#FpOU$o(Ggfg<{Q`x<0ch z!D*h=j8{Yfw|nGB7Xa!AGbZ#MfMSu}*787quTpkG(&W3__dfx9aJ0LQyDom#L*ArD>z0W#2%u zgDB4EB-pl}?I+L9YD<+PHvr8z+7}}!?XGVV9BzaFHYSB=nWf;=@ve&2fyQi+D#Ue* zhh)E~v$-CzJ(@Z#ecqWbcM%jv(UbvV33W440W2%x< z`!;s#43De!Wj6UfS>f6B1dQK^Y#2GMvMQ2C85LBI#k706X+s>=JI1ql@vYy4ZC>5X zX|yXPTDWQh120L%vZEYeKQ|tk^BQ!IDz*73q|ZnBDEoWQ%>>>CsjPZGziBdfG7yZz zII3f9eMhsV=X^r*g1&GXcwhWZe;3CXbU3WtQ*=}RRxrXCtpIW5k$~U3&Op)r9bc47 zYzCYBpfPl`q1O|+Z{d$IHp4IZ3#01=jBfQhYf2-0v$-eHNJ-m!9`Uu`wplSHyX&g_ zUw>kRN^fe-#CGlJ`-ktDwFvq4f9HF~_Fu+t{;!#NHkSV~dLbPZtLCMIWrcf5EklDK zDdS*~n&uiy8$q^P*CqZuEt7i#Y z%)Sp3&pVr(u-Q4)a@7`;w^w%!mBaz{^^F;T?{)j+3cdbs%o@Siq@ptDOsFuFRKtlw z9Kn%*C?1$X53*gvfo)*`A38E3MK0Nf_$mS-Ii(~9tT@%2Ja7zrLx_lKhMGY2mgFnb zyFgZx8kb05mThV<+CdjknPi>BH!*m?b2C^mu4cxWVn9Q*%`OAY!FGMM>h{C=EAuDC zyw<)M+^BCzb@&T4Lu7X%Ttqo!gw)GHq?Y}E>f85=`=vccwv+f5_K0;?BKzynaXCa0 z@X6{C*k*_5=xstPdqY%F5Yrhj+e=!%l$NMeIkvwkuEily4vnU!c3s74v}oe#?5ur# z&fliSW}V?~5qeELZ)Lg~G}LX!5nzce_F>1f*Q}SQLyzs6id%F4lO2AD6&-X*cFTaT z8-#EvnH#PkKD~v;!^Z;N4Krev_N0O8Rn;MDOnAghqgH}HT42;5L`ycAKfNSsH^bey4jV~`g5`r z!oAYAgpey`8#(QuFmZdI)2%OrMy>BQjQIk?%Xk;4L`Q5U+$uO4i;3Gb??e#3y~N!c z(!g?|%zbQVJNsDf!cARf>cZmv=r0|J&{}2Xv>+I7FU9O?(YGVYpEMuqe;gW3HFF`v z9q>5+t?QBj@U)Sr`&ErCI9L>-29ASYGD_P;ZNcJr+_o7Ffz(LRZbkJKHuAJrfcV3cMk}z4L@f8&!J1lx=9>{oLng)SSZpnXMxw*?v3u^@5H# z+Xh*=aR1ZV;45PPPQOIwsdwsm6>fgn2_?s9Tgp zOen@9?p`G2Mntea=e}4Kx@{_dXfF%?GCM9NdEp}`K8NVIu1+ZNU{c5|nt(B%QM_bi zh7BHn69HS@0E7Ob?dMH!KGrK)=G)Zwk06T1wC9u9VY{V zQD-8AWd6pfVX&Ayt=Z!ag~NMV=?)q71uq4*@CHfoPkEQWk?$h+Bt?(l7^exT@zWSAch_YAsM2y^g63L#}IxjA@q0m3Dwk4R_bWWe!=Cq*^Uax z`Yjj7Z+qRDDJ{CL2ji0+e;$Fq!v$D-VE(u~wiHfUC;@ck;YxUyaQC&H^OA_!6KZ_ek<53Zf3-P1 zj71rAFY+XV$@fLh#zJo$@j=%!KU-mfXTIRa&$Ez;s~J;BLhqmz13?+E5%?)3*~?BB5Ad9@gV6)qleI6ZX)q~&cGxf0a4Q)rO}{oriTTQncVA>ZU#fND56{ob- z<_EOwp2R$p5&Zt6R>3jWELv;}uRJV%A z#8#MN3RxD?A`3-}o`8pjOR4>Hocrmb@k7y89}u-Q*K%V*ywIn69#oak+y|8YR=^kB zBvbE(p@2IJ5*uBa;?ho6b#()S7Jh@DUHNpk{&>@`_MB1YBcBs5JtRJV)E{JNZZ!X0 z{lWfUrUd@4>klqg(Em1_k&d!eLsY`HAUroW?|}a)Qfie#(&iJqi-8W0mV(0|tUUXf zhaay_8IITp|M+947p?@HV>?BZ^U%HFCuOD2ae-~hu|+Vf`ccwco!Mt;b8FG7z5;Ix z=0wS|S`{@H&y|1FyZzsNw*CyWRzQdEwX^x2jGL{o)TzT2Z}PJbr4S26KO+Lc8KKAl zj_8_E+dv!;4L5e6%I1EL7OhFbwvbLuFPH|CFxRN>;2EG^f|YCz*n2I8+2 zvevMh_pwlhn;EYdv+{zY6Ib-kEPT0YM;M}9ihnHbtmujrR$D!}gP4u6GwL#o>4JJOnt$O#}OJuGsR zarvwEL+M8@ML9?1x?8wS=AW$-%Z@DnbKHX^A)~#}ov5=RSr3oLBn*Qv&q1M^j>1~L zKWzAGRX!;!BnX=G-lW7v>h$;RfxHHW8Ua#mTfr-3>A+%-521_hF`>-zePC#4q~z`pkR$7q-x_12}H z5CRvR{X=fR+ld1<0tSyfZD5Z*bgpGj3;|m|Y6>z_b=0fi=`T!Eli4YpY`mdHV{Hi* zvZXKUoqi{PXmNzQzxCPhv)t$byf0-Eaj-z!&pUuGHtVp+|cD5yxGuA9(l zdHAIHjEEFybdRls{0eop8pxTP)~O+hTecn!!$gK$;NVqEe3(4ct)_v-dSK1)ae9ax zvs5m06wdoOuhd`RcuS%P7&`H5G^@2Wq@@z|k9i(Z;aFsnCxF>xYCy9=W}8X;Q_!G# z1^~lTx@2mIZ9eb!WyLqV&;Hw#SnEMLq@)&oL_GP?!j}?-R;-z}?5w_r5AY*uLJNxQ zg{+puS&^?wEa^;>R5)Jgp)>h(I~-sXs9?f&I^t5IQ-$AzO3DTSa~(Xgdov>k&YjZM z+fIb-$KUw&I=QIg<5+rf>SWnUFK1CpeW?hE;gOVt)^5nQK~jExJr#owp?{BdUGyy{ zDGcnQkMS!LVF03*r8mqLB527K3?k5r&FCH9a>711B$#PQ5@$dNThb|J^6ke;?+j;n z0ATGj{0_!8ghY#{koFb4f{e`s5=`y;QkWf%HAEvkHcPqdcXtzX(C~fh*q`&?+Ozbq z5dUDGwMmaw!4EE+VV}rh|XVxJH7Jbl2>rJ zz7;VvH&*C>_C8k`@=#vHckaXt+*!_9r+J453s;hY)HEQH0dpYKb0K)qH?KI#K%8w!fiCpR?8`WN zHIwU+QBxd8%7}V1`~AH|HfjAgkp=49FA8Svrk64G_5A$gQnCesZ+O`6L^u=JsSu(7 z%;%5wm0@jk27|h@fkMXQk+MMvJFve+l?XiK-qK>I*%SXZC5A9{_Qc?fmyC>$6Eato z=g!1ShIyMGqYoA~Vn`8^V5DGR(qHxxn+IOCbM&S$(p0D(Sqm>AV8U@&%9%05*x!nK zjQ#lKXby;p1q0(5F$K)^>iJrC@yOM#nqHX*NS!CT!H7S?M;F+ISPz)~`lwOB|nCSxGKqo4QDU%U-V-&eXFw`|KR zpKF`H2%_ct+T8eL1(k#>bMEGR) z-;1pu5P>)R3!xgw0yb&*oM&OIJMIcb*FGfK&Vlj{x>u6SR*l-NV{>}0mmp4>DT>ax z0<4cu!AGu7%``3dCzDI8h5ygC7b?Sk)r91}^EaDNhxtfd4u8EYjZ9+aF-25$efUMP z1pfG_c2$5ND0xKo^aU$y$O{j<(s{@9h#*=W0iNBmJr5iQc)fWW5y zHvYsm77s*11Ew%je&NKz|DYNH!AszY{3U~Ni_TA?k^A@bC%Ao!nU=tK^j$F7K(g^VD~f4%y-?-g!r!yG^vt@(3I3 zj}&&QwlSR9P#gyFQQ83V7SJ9mTeZ-Nnz7p|y8{5^h%sbjRl;N()l9ZU5L_F+0@#K; z$Q*`lW&EC~!0qPUR8Hn4MJ{_l@}>XfE&tX_*MynATH@Qo8tZxjaq>AWVz6L%aEM-Mj|TBJ5wkc3XcK4y%9IQ*p2 z1yFDgKBzCc-KZjl$7-b=`&O#-^=FleDkTNXm!B+fJpf9S;R^=uzhWmh?C&59vSOi{USlmw7Dw2KS$k1otVb%7 z*;KW%EYUGsIiVTSnn zT%J@hFOIv8 zur_BuGa+~cAnrYDSFNI9fUA@TCm=3Zj=dVrLgHWcag3Z3ZnzQI8Mjq?19Ty>T~V+3q^7C4flN zF0d`x@7v+l@BiMs-FhvCAo5?ysL&}}MZ6$l4_##~clwG5GFPzIg9jO&S|Dm8W! z#@JT?21gp!+@vh2`8g7o>EPCF5MZ`(;2!Feb5Edea7TvMH0z5?1AOK+HvE*S!Y9Z$ zQp$hL?-dWYFES^)2o)(JyiHFS^kQ!asptyy-9_ZYy{0IF^CK=1HYoSGpl>N47~#*_ ztswf&yU_0fPf^5N5B;5webfI`9HXF)^ex)|)G}5^GxhYoRMqX&Oh_-KASG1{y)UdT zE(bDy?^(2ER?(@OjOW-q_z7eyAdq7op+aq`Mtvn%SB1p9ff;pB<%S#Kn}}`Ihd5P^ z$PYSF4?9kC7N<=g6`zndESuWwTRX;BM91PSk%GIAw`IAG9Wnf39`DKSkXV3P_p*n7 zyl0DRmww!UWUt~*3zqzX72i$VvR`j3wU)gkv^fBYi*D+^Lm^AOIzE|gQQqrSUE z?~OFkkuY5nBc%{~pFlm*Xz=e?bJ)@2N033t_bP!@+mKq;J!C=2{-5c{(@V!TwF3`)4$ki1k+R+ zv4U-9awZu(qeUi_ansg=OKuwEd?B;C%8MC1F8nkTCPNjN@*X~atP$l(lkDcR*hQZZ zy7PFCp^ZK>7$(WK@Pzr={dgma+G8ga)+pk~fa0s4Le$vl|M%8^(tqMAKF*O?0DiBQ z>|yA=L0v(nVeaZf%QSKN3$OYV>G+$gW`Ph4*ub~A>x|2r-4}oSWTrJWs0)uc<+<1< zt-j^6t2JYt?dJ105?W_IiAwKHw(QOGP}(V{B9a?#|BDjGW6FMTtF?za(6+Br0hHb@ zak?b?^Oom)N~$={!*fO25cw{3dC@#oc?r>vs5WZ;lvsW{n0OKf9=*L=w;O+rMoz}4 zS=%mLlB9-tLb=cB<|zb1=yobu7x$;*4%PrKmjOp1>@aUThJGU3A4JlwcSWX)J-r#H z+jr^pcqz(T1=sZQ5_XldArNx&a9HWx1l4vwzKdBz5q$8nm(5T-V@=e(_ z|3SeaU~eP2oXb^DH1QG0Z|eIvoF1c6F5k97V?tVe9OSzUOR=0h2h^QPe@??(e*SHLexhwi6BEgge@OX0 zWP_ixo-mM-A6=;`=6BEM?ach=C0sXKgLz<8-_<*V?S=&0>2=^55E0ry)1l&96;V{8 zJylGLv%$lp-`qUz8{4r)s82iqomisdLNS;yf>OfE);^}wW0^mf8E|WwOq%{09$`K;zO1_vBn_% ziq}7q2Gf>PTWv+GX>>hsPXKZW+P?K-j<5GuUNb}qdzSe6duo$_Rc!R9T1@fZP3JY* zoNamD!ZBzEXGMsk$(V60NXH$c4C_M1*-6-O+Mj1yyUlmCQelgf0-JY0K)-?Sq&HT> zM+wV=gxM^Kv<0SB1gAM=POO*1oTPsNCZ@!l_%jwa#@v?A%Dm+;j-xcHz#=J|SJ5JiBb$ z8acZ4vj?wFTXuktkTh?0=hhn_dJrI%&+Re`vbop--3?y6vR+Zh_dIL|7g{b}K}T2i z^Iki9ZvaAz-C0>sE%M&v_v+Rp-ZbAHe_&qEto1LuejxecQ_`(TfSuUv2*$t9PkC>n zer~T=MnBx!{B9rcC%)U*?#IC3FXHgP)M0dK{Xd+&W0NLf*REOYGP`Wsw(qiSblJ9T z+qP}nwrzHqyJvRH%rg_m1wwV=FGr@JY4}vYd3A50CUAPHW%|j*rZ84>Q}{FngRK#2?{6R zH?D0&ZolF(sd|JS8So>Jg$UQQ%E_&Mkw(MTu11Vj6D(isGuCy7;)4!m!A>8Rc|w)_ z_`mw%y{+@*ecmgvVsfTf68-HC^k=w^fBe^~1m(Z#r2?;cK^?W1(fuuaPS+;1z}m=q~S_@-C zzMRM$fPw}9h)OL z(O{kkw~7o~&_)BneQUv7&ceLGMt#Of5S&G2df6!T=1^C;xJ{BM=j8Ts5t%cZIPHo{ zR~MX-npfHhw`VVfE1Z$w4RS4=BMg~(=P_D|F!}>6CC!P>bS&*ItPxg>Unh6-qxTKN zUF7V*MIXQ}5ggb`nER{v<1+Iwn(@_HI=R}-HTsU0XYc^vc)!&fpEK6~3FVfuWOUPf zdk2%I6@pX(b;&Udfh}5$X*hH>J64Ta$HBsF+_&2F@;L0szQti>T!lNUi<`<$SJ!%n z>5_0b2aiHA zI#R{yVnLI|;&Z}-2Ya>;n~aUu2D^fPb4@*wGyb@b1qfcBH5S@QK2zs(mMzELu9!)8@$K+uz+kQL zd3~{Tif$?ag4_P5Yw1M0RaXaKUE8&)r04l!-{2`Q_UA5+n51?9&@Pu2v!ah6B@+cl zVtYS6yzGVhy-fd7XZIR+bYNLWCx-bI;o{rHb}$D1$+^I-O}&r#^p#`j&G)aV%BN>D z!BZ{e@{qG*ct92GxN|TO_ybrz{sAM_Q0e$Et1f&!GXGU#haB56&Vf7{SKkSN3Cqa| zv2360U5(=vZs@jTSWE8ux@O6_&4ch%r3E0XQ#p;fGmlzT@X3<@Qq{2rDNAFMi z&_{YaNoojHYgKNA4$lZ+OB^1v8QEMJ@Bx?$lsPc^n~15QQXf#^HLq<2kiVq0dx!pb zr-g?W1W2lrb+7SUIY&Iaq9ovv>3}-F7Kx@*o+MX4pF{{t@8ErY#>0{LKG+ubY2zRM z_O7lUWuQwOjMj!O7fcWv%NqA_EnKcD?u!44r*lYFNoLy{)(1>Sz7{hi>RnAaV922=KZA0#@j!KKApk;eEd3r?#&xeJfBKEE zL}sbb9v?kopJ@T(I{-D;wn8rReFk1vJGZ-z)pZ_nyue2$T`KpRvTN8Zp%&M4_+0!zMubTtFvF8V3 zuApoOO$g&7fu#J4@Tv=l8K=$6!d^K>B))>S-=X2bn-E9ESvNZ5`sD~>S*jZ%JaN7V zbJ)~in62s$i#4|m>|>MOE5*48n`Mit`Z6GeYj&91uv!ME8H(o{-<@4K%y;9K6WaVb zUz8ESj3=_F&$?Wy2!Sgi(-Y&Oiv?eywfbI*7V8OwbZ+L-*SMVf>nTKWM%CgZ-CG!~ z)^p4L{PvYLAJKH%0%Ch6l54C$%5VOyo>^p4_y8i9Phu7zK{UP)MpnyVlwX!9nSY*35iaM$%lX-^`$-c_C?4Avg4Ij zXCoZW@nBBZzx!R7V`;zOVDm`YtIV0G6bja*?169Ef%IAgKtqdoRVvO;f(!JT-HPdE2 z8?v}Pj4UKSE6&lUs2C3O6QLL?aSmTIl+UwqX>fUqu_3W8S*a0@cAYIU{Z)_0H+dZdp z?!2s$#Cb4IV?pSIC0t5AcTSUCQMd?aGBrGn-l{vbB9%RrD)tVFw1WI+1wP^oQm$fLK?oD3F=&0j$`k~agoO-joz;qZv$|8rbd|U8 za@n7coeZmaegh@w8h8zb1x|GDa;zbY;TKGyl8E{M6pDCkCBt8r7aUA<$HqUak$0G- z)uul9z<4EV9XA%K;8+}8w~rqZ{ODke5(9j6$iGD>R`mVxFO(iuYGmT;qnLBnkP8M0 zPsS*)rwio5_1ze7-L!24(KGDWYzEZ!LyX40F)UmL{cYUYLfx_B%Qa2<1CsSau=iW) z|LWghR|+pqHr$IS#o@s*4I))UH4K`Zo#fTyPZ;ne5h5_#6-SA+g~@<%L#RPin~8bO zIGZKdqnc_jo(Bs+S_nx~3C3fGU0W+P2k{ZbINtIFZT&QBz!@s2$S zs~@+sN@;g!CYoi(uqUCg&%`^n zKZVrkbABHvP0Zj_$NvEM>Uz#Acr&Y=HF_lefq8WcRuB&JKP9r#S|S)|u@@$>@UzZe zW6!d`?4$i+vF>{`d0jDZ(?<0OqH7C5uJ;t%EG(783Iv%GH0?jqB-yr=a(I7n?vWA- zIoF9b*$>$D#QIKaxeyHoJb)ZAp#F|E#6x-PU3Gp1v^Tpm_jZ9tr|nN$L-P?BJ5byP zQs4YcfynW|RfZTDmZqls%B#!aEEbBKSP1oxh+}J{X76;G7L7d$L}wb!rs^uznd)!t zeXlXxMuzfLbT_nWAGs=n@L6&a&4zX~4^6|ol;`Z1q(6r>Vqs2Rtr6Ge)lDGN{f)0C z^E)PoNp5UfUXS0!V)sH3ioW~~b=SAa*Urp${14P1mG%K4>)Z0d7Tilpl4Pw_^+mRI zdbdxoXXMo)G+xvF$j^C8*+Az{dyZN`KM9Ik?kWrJkf#Z*0b*_v)SJ+9h6nnnLrSBpc z!;6$CtOc7YI9gQNOvQk~n7{74@8?mgqFS1z&sBISHtnciCQ{oZY-#=ustmes(mo&y74FLaT5-URg z$ST0E21#vL2b?8>$mlCi{Xi3yR5ZGmiB1G5It=SKjFhm=A+GDo)9ZN6Q-$8Lr}wP) z>5i)``=l8!Mv8Gaxr}&JE)Kt2fwg%IEj8~lGP0?jg~~3hT2$1*AXN`uM3KU~1*#Ig zElzOztQvprv;^vvZ$zZtOt%}yH~iMs;@;xo#jqVs<)(e!x0AZMo0+=$lKRI3kJ$S` z6OFt61p%j*h?7wrmstBL(ghEZG@fB|>Dm#dd%8wTl(hRogL0=~`?kS&gNCrN`_w}5 zgA=Q83D0(lx#Q8?HoMjFqx3qFDJPApR>*L@NQ*B4c@cf1=`n5VxZ#2EB-15gr?714 z+SFCjl#^x0aJ^~`jJ`To8XnEzc|RDFG{&F^lQhfV(0LkIOnN^vChVbH z=a?Br4Cc5I^Jcp6lzT}g?yOH=&OOGh!ufo;yPi_H`8=8VWK;A8-AtmRU1+;+VtY~4 z>Vt_7oZck=V(__x^QuvImE6Ek)~UU03p@ym9aQxn97v@;$nsy}|A1JS$3zfuiszUS zd1)s71s&M#(C#934#?s@+->-KPn4N_Bqg}CcQKZj0iOk>2Skt7c|Q_R61c!Q$UKgA z43Kpg#3FwLLir&A*e;oGoa6*k>bYsU{oAXqIiOpNM~OPHu617dLVw%6`Y_frIMyRt zJ9^PzVZ?c19Y#ooWWGQ_{Y(QtQTK&xq7Ii{afJ&(ySI5)Il;bC2K95{#|T?G$O$ei z57+<{&}mm#`5}1q+=nxyDt-{$IseO8Fo?r|;d$LM>U9fFf$r zPWcV4Z?5l(Kp+s9P9+XlvV6M53(CqvXMoZ2U^7G^ibSaJxLN9HMjHt8Hcgv~n?u+^ z<)A^+!~9!zJgOvzS$BnC$oU@i5tSt>KGJ)>Z8E0DQ3HcTGMH$C?_f%yTC`sFx0mL~ z!@$+7%vtgz07W|E+7=OO?r>!wGZrfbw=6zr>j|?s*UI5c-ws@(ozZvG9rS$%H8|wu zw_+(xYce|x0l?u_9mnv$kv^5)qxE83DuP^k)A7+)`CxO!GIe9{YnCz(W8&*<=ZAhN4p@ty8bVV?UGGF}EAw7zV&z5J~i+pjk_BpSetot3gF(7fxBBhRTWC}%FCMBxnzZ(%K$twd^< zaE0k{}vYVqqx5)>3EME390?34rMw|ENdHa z-YMd|4X6SxWs>dM#Z(oHNlwa*g9rY%`godBgaJXWIXBp3w&aJl$`R+zYvKe9%Dew* z%jD*PTjKO!R$M(mFPWrB3te3g@YwtLEafQAe8~@&V}m4g|X5ml34%x+U>8zt9i9MdT|H8;X_ zb=UZ9-9jH<7IdgqxD&#fn3o?KE5nI!-@pf_e?D}n~)!ry&rj&K%z6s0K!X&MorON5y|5I5lSUwL{FRC6%n4*15T(58R&5uzr8u9IC}GRfl=2Y-bYdI*XdU zcC-4Ihf6t-X4D-!50L4axmEJMHPzGBe#)0vTUjdA#Pc)6d-DPvB}#JNetDmm(-HLFExk)EEp<13uD4B)&9btye9)Z0Lm z>h%iVqCH#A-wj9%KBpuY`&MRty*8W6pd3A0hdJjMgI5dm`mb;@LA-NWW?L`^r@%bU z=;ObcoEq!5rl6x+$M?n3Q_|2-vcT&luvn&VjD{l2^;ODV6cly&Ts~|-0IxxK`Ewz7 zF4Dx7Jw~7s3C&?$eHHg28J@slm?Puudzp2j7}(WFV^c%Pg>E3Qq%rvA?fyD51(q|! z2D=U>WPv}~i&e74u3%GRU-ZamrIFngr+qd@-#Rz4EqAbU606h;@T&){FaNIWr`|{h#~~k+1{zX*sT!_PcTnMkM#*L969J3zTO?CiXI3FR^A7+Q1W;x zDUn&(+hMo)3(G-2Gm%!Uf@Lp2hbSu88YhN8*j}6icHa)gpJOW|(GDGgcpMbt87S1A zK@|KjH1B$adwqH$73-Kfc|aiGN^0N;b)U1w*TEkAx!EzQ@~5&SCr9;dm*z_6FS_e= z;`a=@>-o!A;~vPs@mKlnpI(jLMi^izwmeW2KPXtuE?~zc5EpT%(O)RW#-o~J-mao3 zaD4&5sx-<|AL%T&t_M@MT#M^H^f}+zmJfRRjbb+bj>WIOcr&-!+PkQ2o^G!`Ug&Rx zRM3d}K*Uu)|22S}`G2AaWaZ%a|59?q!~%pAWf2s6V+F9FJVD4fus>mfH9-PFU`F6jr8v~kkcRG&t8IAlRF{fwQ#VO59TzuK zZI@h6&R$pZz&~>r6}7tEhab4NFIb~n+YC6P?+Y>YDLM;Utk zlMFu4Gjh&{8c4UNGknp}FHVQYIX!1mN#8r4y3%#iuRm2Q_y4qZeDoOUPBsxgocK|F z_7Xay_soKVFeeb;v{2(?OO?r;E|%?mMeADu#!~3sHx*JN7ffn8XhY!SrdP^#nNL{N zL^^}jDx}6`%*;#Snt%td7#LZp!vbww7VRXVLitn3M#Cu1;t;8$ri&pXfJcD`LTda# zwOR#J)4Mb{I?f1bMMCeGyrblP7MW+MXnK{jGBs)jg6ZgTOf-Ld?EXNg``(%edz8bV z5eC~fXlAT|AV*7FpQ?vJCaF4C2rVk?kO+o<^$2vG>=o5Bie41^!R)q4yGn#f!~>vq zi}mI<%;|u(J%|R?GxGOPEGah$JujLk2haDt#)zpcd6D$lU)UF`Ob+VpRi`L`^r0%Uzc==@gy z)TebFlRUhVEHKv;iyj~)I-Tx0`h4Vv3&WnvL%?W5Yv@^Rg9AsR8 zr5R)p)E<0qhz#tj$-oifo&HNk`12XDKThMEACD^$WhdyH^#&q7dAvhdi1z1q-dK#; z`#XLJ#0^vFvRE=8{6vK9+bTUlB3yR<7zz=Q*G~_u5Yl6hAeu@1&;x`?f-)6>s0&o2 zp!Z}kN8M4*`?kL7`O&G_Ber03jwV$T|E_wFnATd zYcf=}e!;vAHq`1qp8;{NF!AFliS*H6SoYCb!93zN7RZHo1v^?b8D66D38y-si?A50 zpJ)s`UXDL3i0~=M;@fzt%0_JWzKTsHgNs^*p%Nf#{fVg?+fG4Kwz;sdoUwFt;~fww zZ|p2E0p$||AG;qP)_a`CzAh8`{9}&Czn2RrSS(C24x?_OfChy{JVzW|f4I7qmNLHH zhkxcmtjV+x@)2pDx1cdhXpq*DQU^^67X!_U30apHPD(UB!c-P+i{skAurIr2;qZDz z>}&Z>#G-o$#!K*kOfXL+TqcF{VZk(gKr-#zaFHGV*ttwJ%E!^SC6rQEkR z#(Oaq-<8`k2rJONvJ=mwNUu#u3#la=k9=u{fRg`kAVd;?xQqpNiS!XAO%@oE1lblL zY+5<58Y6B*cbV9T16t?0uQMj-#IDmXYU*LG0$_CH7mouxwxqiqB(oRK6cY6-1+M}& zr;pG{HK6(Y53LV2>(=bzAhnb81hkAapioCGtl$Fm;|7r%m$4=>XhIUatrFkxt`;|; z8(?10us|CYrGw2B%7Z+dA)-W-jNOlOjqB=(Ol9M{+LJJ57p{Nfmvvd?;cxQ4H9;Hm#4aV#q+X$bCy!z!q{H#!Gsc&C!`jaD^d z96y~v#Fe&=(o!@Rpr-iQ-w~^XQvEVQbR)9uu3u6&!6EKDeAhj5?#sSG&Ym^4J7k4h zqV@+wIl{|)watoRz(jQ%RfXLQGbKf^748yx4=6N2T!iYiX5l311&zJ;!*8N$`GK-x z4XI66qoEqE1*=vxRjC%w#Kz~>KKs28tH1wNC%pO2R6bIpwXJLO13v~W%^UVd=fovC z6%=G^z#3aTfuFPywOvVbvcl1n%;S5Yva)V-?B7u$^lQQ%`Xa>@!W(h*N(f~Nb+b&a zD0trF*1r$sbHJTg4J}O?N)Kvw33ZF~Rs(F~_vg+&*W%kH=~bnOv#N&vMu)sp5*cW0 z;1~nz>^R_9w6LwP`qLj7i?d6yrwMluo9-P%{Uzu-b$-()Q!Dc6lNv?^>fUnHR;Qwt zM0f=J7EJ}2T`pgqR1O2*I_~S6*O6d8X)~^PY_Z6;HPr>;v-|mxT6m?UyTzcc<#Vp@ zmo$rWTI_pE>hL|f?8q6O6N3c>gE@^2)wCj@OKmwdZ2yptv9~C=x=#UyvFMB!pmyf&_j9nUG<7imuhrV+5L8m8M)RE;og}Qx5?yGwF^e zx2`j{o;NQ(x2HRyZQo~n5kkz(44nxcsLw5ha}1mZ5I#;2a3}S@cS^Vh3M_nQ=tv_g zTD32~v7Mtk3l{=@6)0D-y2^Xk{Z>*@f2c`B{6{6XntejO79#vDq)3|emuq>L;_9wW z38HLf#Gc1GD*d96QkAFhh`x%1)6Z5$>mCYCk7V1K0WmjJJw%>+9k{wsS`~v#3uH4p zTpv~UIKf-EA~SjjTAdq*OfnbRBAhe~G+NV}lg4P~awKO3vQJfJfP*uv^9$q`G&y0M zwV6Y8O(>m(`K~jVlmcdU( z-Sa^S?>Y>=py;|!leKV}Nsv@9a>WcUSbS@sD-JM~Ed|uKgV{hwp``rwovr&TvJkqL zvM>18!<@Ur*)E-XqS`X$@>6Gf!y?d3sz9laG51G-A1w;I7{1QE3E zXb;$jdLHg3bv+RWCQrdx`a9KLDt^v5eE5o*_fG20N$5qqI`3zm;sNZPO$s0^-h>-1 zVI$c2w`lY{q9lm%oX~;GBRP?moBPC?Dna|_gzJP8h{>%(l|L%cl08Jh5u(&ASXDyR zPBx~oXf3^SL{HheBXCk{SJvx9C=bCA z7)ut$^O-HAAgh#lOCgI)~}Rp;CG$-we(ynDcQ_n)&a50r2l zNz`i!nx2|1hFg90yi0Zt?#H?KM0p9#XCNq+7vs=HRQr7#-x)_14~(wecENq0B8%NI ze(FghH^!k4DNM+aK}E-=Grg9mJHS2cMC^Pv@m5Pn-lB?-lOz49oT4dJy%v|=6}>v! zgvYzvxwgGgpxJwt{0K{kuz*qdqmUZ+%75$YdzwN#8?Pn$Vt2>LvWq$c0~e{C623FX zTfU^)%BC0`47cpD@ah%2C7U{)NfHm{QMi%eSfxMd=NO3ed(?>80#kcZ3Q@O($)9LpV*OGv<67pQd zdZtcQUn`>R+y3=APS)bSt}}(*LWQ))|KWtt!av&SkASnYvSt(?l|&u=tMM&uMrb#* zpNDC_Rk~k(@+XvLdU6 zYt%@TDxG^pjmzwv;!dNu(Y@>G&-WFgVotW6bf#3(u}J$E)kdMLe5kVt7k(CIP;&K> z+|u|9`~nv$I)$j@`Iz6_1?DR^t?BZu+X4C-ceO69 z=1Nd99`B;=Jf1CKUJ#t*`i@$>Fhd8mnQCd^JH9o|Fc)Jn|DwZL7OVQNr=iRqe=-+A>NeIkdx5WXg3v<}z4fFQG)N@?+;vuBqqTTaF;srpE3CQcu6 zVk^G8*!@mnaAG&29gg~NI9U9k1@;d@Jzm-RA-wvT4@v$m-%gU({ z5TtCyCnL0OMuI(`bUPO}G&;3bR8|9;m$|&>>Z2ZfC?toI*!PpAa{g@?`16Dz3Lz6f zfr*n)Py`6d!#G){Ms#TAUu$mHR61wPz%Qm}?_T4Xx*~Ko{^T$__S}BXxc1!s?uiZ- zZX^G7(_Sud-WRSzUr_WZ+0_CRx@wY{TRpyFV$OI|1))cSnXORNFd1MU_Lo*h8#TfB z_aJp8(#AfM6xObwHLKRW31ryLa60P#)z~$}>A8(qBXTBYD?~79(u6isyPf&|1BT%( z!FTNw>&Wj(Yu9mPrXhT-L+TpZ(=*lN<-vsE(r?%kN{a?QyQ5~3p&Ra~c5is{m9}FO z^M>zH>l&%Tq@K_v)UdwSQ-eZFi}#W^8eI&nPnVGA9OZF!CMPd^rey_{m5K9q=EYU| zeV+TjweN)?w}W$EW^IGM1VUPMwznemy=W325b)tLanP5kR6T-1s`RMSkNDH;QNs~n z?#YI^eU7ntKsg47^6?NmPY+8;>5)JEa5)x4@N!NA_>X|Q-=pR&=6$9( zMfI?*0?;Je|0LJ0lb^sD^BHC;8!K0P8dek>Dv3K)Frgb)h z?&3~jGdpMrgmR}UVR-rDvmg_(C1$5-ZxiR5a$o-J^Nr=kR?Mpw*}(zL=^fBd5XhVDt+3^N`8 zJr7-ll6$K?_{J6uSThNp# zBN{F6E=Hdp8ksg?goRWEbLqV%tJCi%xFe9FmX>pB9?P(F(4v-;G2)oe3Fv) zF4M4S>Bx0`P3-QrxjcK^a$<46BQJvUmQ}4jfj$0M*z3khv`;L4j*?dJNjl`KhRJQC9GW=u8NtXtR`xlp-z1(NO?4726I13gs-V?UN-U*~Yayr1y+LpEOlU)g_sBgF zPIp=an#z>>Ly8%T2+vJ*A^nPLYhvlPeI1Cx@XxMepiX&{o1+Oa0>Z9_Gy6?PIHJsQ zJaLrMa8B+P*|Gx(DK4b*m@b<*k9M6E1O1v&r3wWxLcMFMN>rue(&1#|pt`{&ARKtqf9+`(7u!e0$J#_n#q93jk4`&qyLI z*U({M-vh4aO@kJ8OXO>QL5YY5%gVIFVvFnmGDqVJeNx)w$zqywsthJ)A)2U%KVi6s zAw#TKv#Z1U~F{Rdtb`qV70=%gXy!*JF$78 z-d&fJ5L%F?SLL%gB-u~RZr_e>$MhZ^Rv$KP%hhG}@*}H2t-|~zXr;uKc^=KdBkfdA zrELcAU2=|jH)-$)!h^YcpsQFQXjg~11$+eN$$rnH-{O5w(wlMqWEToe3{u2z#$?mY zYaQyLgEuAGGQi;?T9rwi(6!YnjktAuV{yJewwzMPuhJPOsx20dza-I>P`$Urj|Lt~ z6Qc$MS*Ri&u*?g6Xy)}hmaNe&(E5XJc27{( ze=%6AM7Lw8!{v@$qgrx1)0Ta~t|tJSy5%M=kdMbASyi{A=pOO&;4-)%cbhpYt)pdI zUM}b;9l>Q21FOyhvs1G*Lk}gngRuoakPJX^!q_DLl{5GsiGBW|ZU1kkvUqqsFspmt9 zW%!!hmzM6EmaBYkn0g^eA#@aOvw)By!HH*eBa)A=N6Fg@WME3;k_Pjf+VNFlJkfo3 zkHDAS6BZ|;{~69nO{-xFO-a^bLOF-MN@I||;nL`D zq++8IZTo}S(gB0d7$?6`b}Y+j)s*-NbA$VDTM3!jxL}%cO0SsVq=b$YBaP|IMI#M& zhQ*{rgBh0Uee~K%Nf~C+(gy>2$ML}*sTKH>Ub!!B-hd?hKO}-tSfXvnLtp`S1YzSO z`@+aRVEb~2f?$k+1SiNMU=m%ji1T1bVu<%(`KggY6i}%5SoM({0N4c1BgO~xP?1m^ z2ze3e7K$5csNzs2^|$bbMChV}vTfzxyy0|3+$xePSrzim6DN6i9?^($DT00lQ)3ZM zloG`kh*xS)=ZkiO}tiX6;&Kb}fL{t4P^j(3`wote86y;Ck%YquUhIB07WFelLP z#rM1Do{m}1Gv1${v={KpC_f~Zuw3dm0fHK2bbQ3~4mL zq2vyR(>FL9WXA6TK#(>k!mN$b0r z^ON=U-#J-jS?ILL!WM^z9RYIjk<(#!tZ{(R1_`>U0v=M-f&@R-yh{R;6UmIoM{B6zhuiztF+eO}rp@rGYM;FB5OjB~Op_sSSDp zj=vf3WKV;YdBITPe$Y?zCHz)XD{B4F&{SYvJVoV5`bv22@~0p!f6TNSLHeOv!)qz6G z=xwvjeTu+aDffc-&iLVU>{w!a{bTlg_U6dBpB;+<7y+9U9Hic31%`b%wrawrKm0>t zpbQP+2q#P34R+-~+X%-SH%%F7E!i{HEQs=wg7my$#Y^5;wpxG72{O)WV2t`vJ1MJ* zml?!*EQ!G$qRQ$*29eR6@i-a?WI`9`VMYRh1B@|r_051%;W!?8zJa}|mFT9`wTlLw zUiYvNVgOk*j)pej!%X-aU4WrvPfg>g~-8N3Zc zrV{yt4;`eP4uKZHjfzUsm>*pq_Um)&CSviuwxS~A*8H}ZmA>YHDq&~qx@M3>lcgch z$rE7jlifpk85zW3oyAGW7CFgoj5@n;-^8Vp!sCG2afP8jCo9zS4l1=BrpH!p z^Ku&q1v7oJlw zH@a^_=-ocb)&0?z#O#9h)~tctZ8c}_^GD)tGI#bPg2xr{YQp-=W)G|Coq+M-ev58e+XXUe3snHePool!iD@Ie4bq8UH%{%8VqU$Rw1CGurixkpdi!J(Q$TGr-uJ9L`BcIY(4n^Rcftj} zsNi_wMZq{MKu_I`LatcgQE= zlISJYn}~n-|26~JnPf5iw*w5z|HKT$!o>L>=a)Z5`UZdWjf_y9oc_MtJO8D#F7d_Qxk)V7s4T_kk;B}y^_}-y+9meVdoi=K}-QVp5 ztg1|9GwXS*nruH#O@zFsq);wu9=}tOfz zx=sDPRt!M2G_*7wXyWN?YPuR&1czSl*M=X7IKlqam~+_B02(|IV6IhC-C30ejKK_> z7XE^pW&q!)M*OIYCQ=?~c?nQmxkhC`-#0G*(~&c*KR~19G5pbr#oc!M!;Cuoo01xC z=;3Jpnto0b#tsfO3w{jMLLH!Tf{ukHgi2e06@4O)e~Zu9`H{M!97AbUWDAY~ z6aqFt_1_*n<9{?S|2xH&UewCK$@qT<*Zx1bwM@($|M|5SscpJ!vY~x}e1YaPl+i>I z_IbWDJr!GLoGfUj^9*_WNr;QcAW_jjQ{=AqoNAfi`z4gG%}i;^q@<7{bEHOlKXbl1 zj-;D3f}5HnHc&{d6T$sisnGBv53n}D*I1p5V}` zG2w){<2SWGDkX|g$1rdXQp?oP*RywF_PjqV*1xoA@!Kcpn*^axb#0W}8GR#qCYGB8 ztvy%amQ&(?mOX(XY{T~;f*ksMIi76{`_LdzOw-Dl<)J%xdq5aM?8HF(SXDR^Gp8{_ zDvmoo8tQCQfxDz;uA=@_kY@F+Y^kXx2AIH=k)}W^d@S|;;y^rPTI0}-PK~RkEgslf;o&;q*HveI8T}iihoASkW3j za@oWRpYj-7@;wq|zo4j}FN9NbL948`fN3rk`!}^Z7_Q&+9W00RBh1Z>G(qRa{s$J@fn5!gfgL(SYI%^o@WdzNUQh+7p~Q6S0NeMr%n=My|X`#gZQe+ejxN zMt~)$X&l4bI%Nor%I>*1Sy^f&!E?5bwPs}jKaNT8<2l!gY%WZ4qR&ImuD_$@5K$MQ zlrW5gc+-_4R+xH{1VL4qmp2< z#U&9wIHF5MM3A?Hx7r3BL1Cx@$IjekPrO)X{lNM5P{TQ|M+Qe;2_};*Wn~HV8m+mR zlu72VxSq7mYQV?%&a_gYx2{(>Uu~kP?jv;6!7+0k>~G6B0StJzdlfDo1%`6IbFn&^ zq%^b!(wm4OCG}9g+xOls_FxqnPZ&sC#qdwFhB@BHVR2o;S#@ihR#Jmli=9mJ)732x ztyo()1|9HVW!r3#cWsuW&N8Ju@mQB;QwPlB_b<-XnK2vxCNCH7K^Ro7$_|I-b0#!0tFNiSrX&r59Ard4Civ@vZ#(>LVz~eYY+B1oj$|F}Ey4|NI zny%GlvER;iudU60S9gwglU&%ffAXQZU4Wb<l(OoT)CAJS@_>v;J-ye8OiR=?a|3#6ICwLbTh6*`K-%pLhq~V0_)u>jQK5TOZz^ zJ8xvCPOcZCs_2dg9j``HZ~_@bHE1lcl#xWZjs#R859jIXVSeZVgZ0Ii#3f5M=UpPp zNY3bxHug;)ccc%~aI6&W+92p05dKlJV^P*V@U$`^-W-|$ zVNfoq*C#Kd!YspYe;#*}XgdsGZNh;8qY#7<(ti}!954nc+g%3RvBm+;{Ty$aCgC7L zT!fO784W%)8!dlI^Kw=^5cv}cg0l1fCG_l(SBwd(=O%rN5{$IquWCSxxQbdCs~dw2MD4lq_^ng7++bw|Vfyz6`; z5kaCyXNkJO?qWsnz1I*m>@HSYw&*2-=&TmKMDGzLB!nP(4-tY8qDF}oCFDYqD@5+7Hx&tX#OYUO7YruETy|3H%WfO^vztkH<^bC@l2azEsxpxvR_4!Vda`k#43a&(|^sUyXDc#m$tJL;}@we!6g~B0Uv3ivaB*yA9Dn!Xp&be zR2PzSFh;BxJSZ;sY|n5*u$y~svgJ(8)w(9m9L&nV#Ps%zQ#_Nlah)!jX8jn-B3MeM zW)7Mk1#dWfoOz}$E@`jpJFrcYuret-upqU3&0uDZDt#NffmI2+L>MuLO%Q5I9z1^; zkWmh^D}1j*ZI!Egm*eVarqy%T9J0In!dY;frBs3mV^?3*ax&)XBovuU)s# zrO#dwUrf_Yv}^x=&`kW_pc&Coyebiu38+eof<-03Vqgh~xH!@KyD(Ui9}MOf1gW4A z_E;2JzzAoLcC|1>BQTgsaS@0#K-V6FK%1kHSOgj%39y6+ONu-cf&6y`qNn+PH47Gn zK){j^DX5f~s36D?je_G~#21o=s_Je?2Y{ijfgwOl1Prhi5YbmN1(_o~#6+zHK}s+* z%E2BBP(@;}NH;g45OEPO6yS(L1N7`+NDnLu<17PkN5PSfNCX^!!yrAJ07z4WFP2zP zl-Qnw9{^%1W??D_BEHdcLBOyAY93fL!V`_~K;Y0AXQU^<)ER+7`vL4d-~dCkJq(M4 zApoLau&9XWLurU8R2U*IDF`w*G!Zs5Hc-)3d!(i-KpcS*4(m*u5M@D-DH7|35HRrc zM4_=b4z8A)xrOgtYmDeMHH=Spd|nSi$I701c8c!g(ab)U=c7ehzZKelOsIfCNSZA_~$6{M%i8-<%z5SIl2D{@^@A zx3@D4aC;Xky`pihx!mh2qi6E4LB*I7b?9Bxj$>M>U3?6);)J81f0_?p&GKLse_Hb!xO94|= zIr_3fuJllCPcwUJC1rYkC3;e0%sIQtjW7R1D@OocQ1fD`HI$ely{J?ARY{}C=nYJ; zT!viXd@O}tCM&^(D~c<@S%ucrT6s5EzL=JTYKB>SlqFNq)W+eJiB|WG??$&U^C{5+ z=gslqRb6H;1IeS4K3<5AL%u4S<*JUyA1JyCWEaMpD*A1Zc0z~-l_oeyMOLLL=`Crd zR(Ld3D2tX_Xk3y*WwebMT$sYRd|8T<3b@kx73H{;;k1K_*5MpvlrAhL!b%I>k`Cud z5Cj1HeTsQri{4+AJ)Zk_980v3RdP7E#9BEdiM$2qV#>{^{m+DGar5o>YEj9+xJ{04 zLeEu6#cjFCO_HN^yDGqzi45wuZo=4K3aFd%7->5g@lH&^qkz(-{24mRuEP|ex4GjS z@OVBg?Gdgrh|xG3AJuwl(PkeM_YYmvWEH)yMzYTE9bLKs70S#Hb@$7VYsNPtx)jbo zcn{g9QB`?SJLu=vAIuFbi5lWAFGZaAXZ1$)54@z9ZB}8XlFVu5PJXyf{iCB~7YN~X*|@gCu{rVA+0TzZL!y_iy% zw4K?MimT6`a-i;HUu!bnQ?D|SPz}^DcoVRS;9xsEOYwph%5=y{UF;z7^6Lh(N5${d zl1O^!hkpsmfGUG8d0y4GUWJdn>X{q`bbT!i6X?F97j^5FTacKtdb{X;sos$*vLvYH z)76eSJ-I=qp~ophNn?13*~PgalZOj=q00A%lim_UZB}0xrJ&lKkBx1g#zO#pipYxGidoL8L|CSn8TiBVhsW%kI%nn?iU*W6-1L zye7lDpOupwDW2VI7+ll5Ar=Z}*L_mb+@i%mmru@P7fK%Z{pb8J5P!lW@%UD>P2r)x zxNdTv>xO~NdoNlUgATp&l8epCj?#x6H16lf@{VYk4)vx{zH|m$o;bBz2UC32!kpU; z{+35E(!JjGULK+vXQ%{kgFN>2u+}+;HZ?RqiHReK(=I+n#uH0!Zc+q#ZjN}x^sUaP z$1^}uB&);D>CK&&H#v?f=k_Ct4gCw1AcB>ndY}6FjY*Sf^D@_^Z~iH$lX-}+ku!IC zEV`Pc`CO+|n8)P-=?7l?Iw93spVY3IBnPG{-j=#wWLm#KFMHyv@N zh>K;H0N=^6iO3yG60ECQx14X#@9j3GA1gJJX#5?gY6+VW7bLAP%qJ> zs_m>x&1*bmx-)kf+69rC^ZAo%Ss<)w+BiP#t1PeiD069prMBRY);3h2`l7E3e2QxD z%$&0)t9>p|R0H)zBScsC$}JBLj4Laat)+3-48GNS%2cGc%!}J;`vn(%ob~bib}+%; z=XiGZVyS+6F9+x3GicS2{YF2YJslN!(_=M5drh6_TOcGsgItl79CMhwQ?{uG;}7UL z#3l4F(l063?b~>#HJm4EO*=8SzVB!qiQKMLU~bTv9_w2Xk&mz!?ii)q@vYbWmHWu~VHhI}PrY4i4 zfTmxW<`rKRaXB{3irH$w3Suc|WLzP0G5XPhg?qhphw~4fz${%WlT;V{;1K_dIn@Lp z7C*R7CvQBl_?*{1_lSps1^UPimK7WOOtm z+-k4TVD2_d?yWJ^o^NNq4XxVhP>1)r_494t59qF?c+)Na`k$X93f{9gPM&pxM=XVy zp50mYAtfJww|wH2FIi=BPVKg+pVk6Nkf?ZT#X#qYugT96@;^2@_>9Bzdd|x0c?(I+ zyXrWaAM$tNra9N|`R5w+j3$s==ID6)>O0w%k2%fN{t%SeQqnY9Xnox=%6Abn+Rnsy zdvvaDaKnxA!Y}K1qlFUTv)Ax)h%=55xG~r^c6LE9z{Hd?=XF|CZWkV{69<%4KaV74_=lY*D6!e@R)d1!S9u-I#T@W*gQkx{#m>iu#K z>Pm(VYX3Qf3vPY6DZ_F^81th7{WkGR%jeks@L}U=^5ZLcL)fbrj%kO6GsBX`T_se+rZJCJY$=D)(2!R5asFg)4XbwwwYa=o3yT@$l-_~$l36h zBM4u$DFk*0&aGQMF{Oy>IyHVkn;EUeKQdghYf$aV+e7ZohYLxu46h9+_8q=LUWbrZ*1n~+UTCgxv*3;v>chGEkzK|$#Vp7U-76B`!O`!* zMwuoU<&mW>eVIDK-H^dwB+?z6Gj9X^?eE{_oY7)7Ez+`GR2UtpkhqWNc+OQdw$wHF zlN2_idkIP)*2QN939)0_OgxgTOB0eL z4_n|Nue~mB@9wc0THJr_A^Pgd>FUUNUy$|Q6Y4Lj;dY@6c42F*MOPgHoudG#^)*3NF2Sw~oECx9e{qs}hp!6ipAOEuh0GY+xUQLjS1 zO<8}&vrXlFSM<_c9>}U4LZYuv=``$rFwlIo;QO7E$(omV%qFLWt(>Fj6RE3_n)f|9 zU2W)YyApgAQ|0!viFxm?H~HH^{m>rT_0V^kvi3<7E;80pFpiVe3+W+ax`IT%lzDxn zA2e?Yr0Id}Js`VW_$(hw6jn)|t((RPNwKs`J)M3BOiXhw)AwLyu2r)FQDqtD#6L^`A!Uu~xT%WbhtPii?PT>2)J|PcrX(5L&(pb9jPobK zib~3ZI*Pa4*rOc5N#`E1Y@}!3L>4`$(VM~D+|5=`7D5koniuhJYC`h-YJ-KoZ4;zrdLhE_B6= z*GT)+h3vql5zCl}zVO{nGs;Rf5~EAe3<6Eta=a2l%+H0Vzoyu#Z$uC(#%$uD!da6J zPe}bQuPw~}Q!S-WXo#ja4&3K2lz!sB{^FNufs7Q>;zv@-&WePYvztcU;KSEdcc03# zNzg|J(+6mEmk-%mF4cPw2wToE31a<-5aC}vjXfE>|CmR-y>~{u23LZLaw&+F8YqIZ+9TvmbhvH@#5!U}f#khU&c5d-(az z+Ho?+vanW$taWqI5c=CPWsU^3EpuE2WjR~d`7N;DS4IFV@{W+FI(Dddl{O{#X~IYB zITw0uUg~mOq6J5nWPXd|OQw$c_QVm0=l-<1S)rwbyRP7rYs2RASYHV}N20GP*dSF_ z(2g1w&?ZJdeGKnj5Rl zOfkJl6TvW7JP1<_QBL)?{{4*5L1`8<%a!i`C0oBU#uJGmIju`+(&!&0!Cd@EC3sUIo)h>!Oph?`*Wq}nhy`FcdGRLv@V9)7K|tGJ>; zDAOBHM3pq>oO+6d{i|h(>DNxkZu}}uO}Ksv*RB?%*9y@wvF%B2*L2u&MnjBSC~jYi zEmGJ31ts%5f2EdPEf|6Fvw8j|v@2>*?a1ZN&3!IC&PPgCa$X>I+>gB)wO}* zm6dMM=}h<3*lYP`A>;cmr|>kp7XXzhJ4fzMOMz*9YZgC&}`ml3+>P_)0w;8e=vTRQ@BNgK$N7f7}#6F~*XsURt9_vx# z(x?$I0+L(n<(>k5?$=3S~HHYwF$dt*sG> zXAx=qEbZdl3H@9NtFkf4>S*6;k&@6YJK&In3T^wCz2IcMH<(A&xc*%2qJj?NX)(hI z%}(jwO+4MGd$2Zo_rYHCNp3@TZG>NBFF^5&K_fo&QO^SQsN5LFQHvfEYm3hFArT z@U;R1AW$$dp$f2)l|b0T#J~_K3AiIv0wE?Qi2%c)5PJtW9O?*$LE-YU5|W|_2T4&; zdxV6fIM`lH0%{Kx6Bm<&5;_eG! zbnHBz&p=wT>K0=D;@gkb+uSlVt9^|_TvB$U$qcIU%ud1bgv?phxe9>}+ZI#W+!Uir zYfmj&IjGU)n)SVYDb>Zd8&~pgn+NG3fkJsS%?njgMXw5Z^xp}+_>4}g=2F*K)>UgA zo1!f7z&DOCOWU-s_9-TNZ;xl-Ewbdyo_`&0TU&j7W)^9TXD|fyH{n+5$3r1IO z$SK-hF27H2I~@;D@C*7BV91f$jn+)S_XKa40WWUZjqA++-&Kjh+M}_)XoMp 1", + "reported_statistics": "Mean = 5.17, SD = 2.64, N = 77", + "significance_level": 0.05, + "expected_direction": "positive" + } + ], + "original_data_points": { + "description": "Overconfidence scores from Table 3", + "data": { + "overconfidence": { + "mean": 5.17, + "sd": 2.64, + "n": 77, + "baseline": 1, + "note": "Number of items (out of 10) where correct answer fell outside stated 90% confidence interval. A perfectly calibrated respondent would have a score of 1." + } + } + } + }, + { + "finding_id": "F2", + "main_hypothesis": "Risk perception is negatively associated with opportunity evaluation (H1).", + "statistical_tests": [ + { + "test_name": "Pearson correlation (risk_perception, opportunity_evaluation)", + "statistical_hypothesis": "r(risk_perception, opportunity_evaluation) < 0", + "reported_statistics": "r = -.58, p < .01 (Table 3); beta = -0.50, t = -5.98, p < .001 (Table 4, H1)", + "significance_level": 0.05, + "expected_direction": "negative" + } + ], + "original_data_points": { + "description": "Correlation and regression statistics from Tables 3 and 4", + "data": { + "risk_perception": { + "mean": 19.04, + "sd": 4.92, + "n": 77 + }, + "opportunity_evaluation": { + "mean": 12.97, + "sd": 4.10, + "n": 77 + }, + "correlation": -0.58, + "regression_beta": -0.50, + "regression_t": -5.98, + "regression_R2": 0.36 + } + } + }, + { + "finding_id": "F3", + "main_hypothesis": "Illusion of control is negatively associated with risk perception (H5).", + "statistical_tests": [ + { + "test_name": "Pearson correlation (illusion_of_control, risk_perception)", + "statistical_hypothesis": "r(illusion_of_control, risk_perception) < 0", + "reported_statistics": "r = -.44, p < .01 (Table 3); beta = -0.76, t = -3.34, p < .01 (Table 4, Model 1)", + "significance_level": 0.05, + "expected_direction": "negative" + } + ], + "original_data_points": { + "description": "Correlation and regression statistics from Tables 3 and 4", + "data": { + "illusion_of_control": { + "mean": 12.94, + "sd": 3.29, + "n": 77 + }, + "risk_perception": { + "mean": 19.04, + "sd": 4.92, + "n": 77 + }, + "correlation": -0.44, + "regression_beta": -0.76, + "regression_t": -3.34 + } + } + }, + { + "finding_id": "F4", + "main_hypothesis": "Illusion of control is positively associated with opportunity evaluation.", + "statistical_tests": [ + { + "test_name": "Pearson correlation (illusion_of_control, opportunity_evaluation)", + "statistical_hypothesis": "r(illusion_of_control, opportunity_evaluation) > 0", + "reported_statistics": "r = .34, p < .01 (Table 3); beta = 0.40, t = 2.23, p < .05 (Table 4, Model 2)", + "significance_level": 0.05, + "expected_direction": "positive" + } + ], + "original_data_points": { + "description": "Correlation and regression statistics from Tables 3 and 4", + "data": { + "illusion_of_control": { + "mean": 12.94, + "sd": 3.29, + "n": 77 + }, + "opportunity_evaluation": { + "mean": 12.97, + "sd": 4.10, + "n": 77 + }, + "correlation": 0.34, + "regression_beta": 0.40, + "regression_t": 2.23 + } + } + }, + { + "finding_id": "F5", + "main_hypothesis": "Overconfidence is positively associated with opportunity evaluation.", + "statistical_tests": [ + { + "test_name": "Pearson correlation (overconfidence, opportunity_evaluation)", + "statistical_hypothesis": "r(overconfidence, opportunity_evaluation) > 0", + "reported_statistics": "r = .30, p < .05 (Table 3)", + "significance_level": 0.05, + "expected_direction": "positive" + } + ], + "original_data_points": { + "description": "Correlation statistics from Table 3", + "data": { + "overconfidence": { + "mean": 5.17, + "sd": 2.64, + "n": 77 + }, + "opportunity_evaluation": { + "mean": 12.97, + "sd": 4.10, + "n": 77 + }, + "correlation": 0.30 + } + } + } + ] + } + ] +} diff --git a/studies/study_013/source/materials/section_a_risk_propensity.json b/studies/study_013/source/materials/section_a_risk_propensity.json new file mode 100644 index 00000000..484df9eb --- /dev/null +++ b/studies/study_013/source/materials/section_a_risk_propensity.json @@ -0,0 +1,86 @@ +{ + "sub_study_id": "section_a_risk_propensity", + "instructions": "Please answer the following five items by circling the alternative (\"a\" or \"b\") you would feel most comfortable with.", + "items": [ + { + "id": "A1", + "question": "Which would you prefer?", + "options": [ + "An 80% chance of getting $40,000", + "Receiving $32,000 for sure" + ], + "type": "forced_choice", + "metadata": { + "construct": "risk_propensity", + "risky_option": "a", + "expected_value_a": 32000, + "expected_value_b": 32000, + "note": "Equal expected values; choosing (a) indicates risk-seeking" + } + }, + { + "id": "A2", + "question": "Which would you prefer?", + "options": [ + "Receiving $30,000 for sure", + "A 20% chance of getting $150,000" + ], + "type": "forced_choice", + "metadata": { + "construct": "risk_propensity", + "risky_option": "b", + "expected_value_a": 30000, + "expected_value_b": 30000, + "note": "Equal expected values; choosing (b) indicates risk-seeking" + } + }, + { + "id": "A3", + "question": "Which would you prefer?", + "options": [ + "A 90% chance of winning $200,000", + "Receiving $180,000 for sure" + ], + "type": "forced_choice", + "metadata": { + "construct": "risk_propensity", + "risky_option": "a", + "expected_value_a": 180000, + "expected_value_b": 180000, + "note": "Equal expected values; choosing (a) indicates risk-seeking" + } + }, + { + "id": "A4", + "question": "Which would you prefer?", + "options": [ + "Receiving $16,000 for sure", + "10% chance of getting $160,000" + ], + "type": "forced_choice", + "metadata": { + "construct": "risk_propensity", + "risky_option": "b", + "expected_value_a": 16000, + "expected_value_b": 16000, + "note": "Equal expected values; choosing (b) indicates risk-seeking" + } + }, + { + "id": "A5", + "question": "Which would you prefer?", + "options": [ + "A 50% chance of getting $50,000", + "Receiving $25,000 for sure" + ], + "type": "forced_choice", + "metadata": { + "construct": "risk_propensity", + "risky_option": "a", + "expected_value_a": 25000, + "expected_value_b": 25000, + "note": "Equal expected values; choosing (a) indicates risk-seeking" + } + } + ] +} diff --git a/studies/study_013/source/materials/section_b_cognitive_biases.json b/studies/study_013/source/materials/section_b_cognitive_biases.json new file mode 100644 index 00000000..b833e3e5 --- /dev/null +++ b/studies/study_013/source/materials/section_b_cognitive_biases.json @@ -0,0 +1,91 @@ +{ + "sub_study_id": "section_b_cognitive_biases", + "instructions": "Please answer the following items by deciding how much you agree with the statements. (Circle the numbers that best reflect your opinions)", + "scale": { + "min": 1, + "max": 7, + "labels": { + "1": "Strongly Disagree", + "7": "Strongly Agree" + } + }, + "items": [ + { + "id": "B1", + "question": "I want to earn more than my current income level in the long run.", + "type": "likert_7", + "metadata": { + "construct": "filler_economic_aspiration", + "reverse_scored": false, + "used_in_analysis": false, + "note": "Filler item; not used in any analysis" + } + }, + { + "id": "B2", + "question": "I am looking for businesses or employment with higher income.", + "type": "likert_7", + "metadata": { + "construct": "filler_economic_aspiration", + "reverse_scored": false, + "used_in_analysis": false, + "note": "Filler item; not used in any analysis" + } + }, + { + "id": "B3", + "question": "I believe that past entrepreneurial experience helps in assessing riskiness of a new business.", + "type": "likert_7", + "metadata": { + "construct": "planning_fallacy", + "reverse_scored": false, + "used_in_analysis": true, + "note": "Higher scores indicate greater planning fallacy (belief that past experience predicts future outcomes)" + } + }, + { + "id": "B4", + "question": "I believe that the key issues of running different types of businesses are similar.", + "type": "likert_7", + "metadata": { + "construct": "planning_fallacy", + "reverse_scored": false, + "used_in_analysis": true, + "note": "Higher scores indicate greater planning fallacy (overgeneralizing from past experience)" + } + }, + { + "id": "B5", + "question": "I can accurately forecast the total demand for my business.", + "type": "likert_7", + "metadata": { + "construct": "illusion_of_control", + "reverse_scored": false, + "used_in_analysis": true, + "note": "Higher scores indicate greater illusion of control" + } + }, + { + "id": "B6", + "question": "I can accurately forecast when larger competitors will enter the market.", + "type": "likert_7", + "metadata": { + "construct": "illusion_of_control", + "reverse_scored": false, + "used_in_analysis": true, + "note": "Higher scores indicate greater illusion of control" + } + }, + { + "id": "B7", + "question": "I can make my business a success, even though others may fail.", + "type": "likert_7", + "metadata": { + "construct": "illusion_of_control", + "reverse_scored": false, + "used_in_analysis": true, + "note": "Higher scores indicate greater illusion of control" + } + } + ] +} diff --git a/studies/study_013/source/materials/section_c_overconfidence.json b/studies/study_013/source/materials/section_c_overconfidence.json new file mode 100644 index 00000000..6107e14e --- /dev/null +++ b/studies/study_013/source/materials/section_c_overconfidence.json @@ -0,0 +1,117 @@ +{ + "sub_study_id": "section_c_overconfidence", + "instructions": "Please answer the following items, by deciding the ranges, which the right answers may be in. You should be 90% certain that the correct answers are in these ranges. If you have absolutely no idea where the answer lies, please fill in the maximum range possible for the question (i.e., 0 to 1,000).", + "example": { + "question": "What is the total population of Singapore in 1999?", + "lower_limit": "3 million", + "upper_limit": "4 million" + }, + "items": [ + { + "id": "C1", + "question": "What is the number of tourist arrivals to Singapore in 1999 (excluding Malaysian arrival by land)?", + "unit": "million", + "correct_answer": 6.9582, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 14.1", + "raw_value": 6958200, + "raw_unit": "persons" + } + }, + { + "id": "C2", + "question": "What is the total Gross Domestic Product of Singapore in 1999 (at current market price)?", + "unit": "S$ billion", + "correct_answer": 143.98, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 5.2", + "raw_value": 143981300000, + "raw_unit": "S$" + } + }, + { + "id": "C3", + "question": "How many airlines stop over at Singapore Changi Airport?", + "unit": "airlines", + "correct_answer": 64, + "type": "confidence_interval", + "metadata": { + "source": "Changi Airport Group, Our Story — The 2000s" + } + }, + { + "id": "C4", + "question": "What is the number of private cars (per 1,000 people) here in Singapore in 1999?", + "unit": "per 1000", + "correct_answer": 114, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 1.14" + } + }, + { + "id": "C5", + "question": "What is Singapore's unemployment rate in 1999?", + "unit": "%", + "correct_answer": 3.3, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 1.10" + } + }, + { + "id": "C6", + "question": "What is the daily newspaper circulation (per 1,000 people) here in Singapore in 1999?", + "unit": "per 1000", + "correct_answer": 275, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 1.14 and Table 22.4" + } + }, + { + "id": "C7", + "question": "What is the total vehicle quota (i.e. COE) for the year from May 2000 to April 2001?", + "unit": "thousand", + "correct_answer": 109.353, + "type": "confidence_interval", + "metadata": { + "source": "LTA Vehicle Quota Tender Results 2000-2004", + "raw_value": 109353, + "raw_unit": "COEs" + } + }, + { + "id": "C8", + "question": "What is the literacy rate of Singapore citizens aged 15 years and over in 1999?", + "unit": "%", + "correct_answer": 93.5, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 1.12" + } + }, + { + "id": "C9", + "question": "What percentage of all residential units in Singapore are HDB flats?", + "unit": "%", + "correct_answer": 81.1, + "type": "confidence_interval", + "metadata": { + "source": "SingStat Table TS/M400751, end-June 2000" + } + }, + { + "id": "C10", + "question": "What is the prime lending rate (per annum) in Singapore in 1999?", + "unit": "%", + "correct_answer": 5.80, + "type": "confidence_interval", + "metadata": { + "source": "Yearbook of Statistics Singapore 2000, Table 15.13" + } + } + ] +} diff --git a/studies/study_013/source/materials/section_d_case_vignette.json b/studies/study_013/source/materials/section_d_case_vignette.json new file mode 100644 index 00000000..cfeff144 --- /dev/null +++ b/studies/study_013/source/materials/section_d_case_vignette.json @@ -0,0 +1,81 @@ +{ + "sub_study_id": "section_d_case_vignette", + "instructions": "Please answer the following questions after reading the case study.", + "vignette_text": "Mr. Tan is a successful manager with four years of experience at a multi-national corporation (MNC). Before that he worked in a medium sized local company for five years. The idea of being his own boss, taking calculated risks, and making a fortune all appeal to him. Hence he is thinking of starting his own business.\n\nHe has an idea for a new business and decides to ask around to see if it is a good idea. He has some very positive feedback from some potential customers and some associates who know the industry well. Mr. Tan does not have the resources to do an in-depth market research to find out whether the business is going to work and published data are too general to be useful. However he feels that there is money to be made based on the positive feedback from potential customers and his associates. He is enthusiastic about starting the business even though he has no experience in this industry or starting his own business.\n\nThere are a few MNCs in the same industry but they have not targeted the market segment that Mr. Tan is aiming for. He feels that the MNCs are likely to move into the market as long as the new business is successful and he will not be able to fend off this major threat. He is unsure whether the market is still growing or matured. If the market has reached maturity, it is likely for a new business to be squeezed out of the market. If the market is still growing, the new business will be able to survive the entry of MNCs into this market segment. He finds out that there are only a few small businesses that are still surviving in the industry.\n\nMr. Tan estimates he will need at least S$150,000 to finance the new business. As he has only S$40,000 in savings, he has to borrow from the bank or find partners to get the rest of the investment funds needed.", + "scale": { + "min": 1, + "max": 7, + "labels": { + "1": "Strongly Disagree", + "7": "Strongly Agree" + } + }, + "items": [ + { + "id": "D1", + "question": "The overall risk of the business is high.", + "type": "likert_7", + "metadata": { + "construct": "risk_perception" + } + }, + { + "id": "D2", + "question": "The probability of failure is high.", + "type": "likert_7", + "metadata": { + "construct": "risk_perception" + } + }, + { + "id": "D3", + "question": "The founder stands to lose a lot financially.", + "type": "likert_7", + "metadata": { + "construct": "risk_perception" + } + }, + { + "id": "D4", + "question": "There is a lot uncertainty when predicting how well the business will do.", + "type": "likert_7", + "metadata": { + "construct": "risk_perception" + } + }, + { + "id": "D5", + "question": "I will consider this business an opportunity.", + "type": "likert_7", + "metadata": { + "construct": "opportunity_evaluation" + } + }, + { + "id": "D6", + "question": "This business is worth considering.", + "type": "likert_7", + "metadata": { + "construct": "opportunity_evaluation" + } + }, + { + "id": "D7", + "question": "This business is feasible given the situation.", + "type": "likert_7", + "metadata": { + "construct": "opportunity_evaluation" + } + }, + { + "id": "D8", + "question": "State issues that influenced your view on whether Mr. Tan should start the above business or not. (Include whatever additional information you may need to make a better decision)", + "type": "open_ended", + "metadata": { + "construct": "belief_in_small_numbers", + "coding_scheme": "Responses mentioning need for market research, larger sample, statistical data, or survey indicate statistical reasoning (coded -1). Responses not mentioning these indicate reliance on small numbers (coded +1).", + "note": "Approximately 50% missingness in original data; used for belief in small numbers construct" + } + } + ] +} diff --git a/studies/study_013/source/metadata.json b/studies/study_013/source/metadata.json new file mode 100644 index 00000000..6f1ca520 --- /dev/null +++ b/studies/study_013/source/metadata.json @@ -0,0 +1,85 @@ +{ + "id": "study_013", + "title": "Opportunity Evaluation under Risky Conditions: The Cognitive Processes of Entrepreneurs", + "authors": [ + "Hean Tat Keh", + "Maw Der Foo", + "Boon Chong Lim" + ], + "year": 2002, + "domain": "entrepreneurship", + "subdomain": "entrepreneurial_cognition", + "keywords": [ + "overconfidence", + "illusion_of_control", + "planning_fallacy", + "belief_in_small_numbers", + "opportunity_evaluation", + "risk_perception", + "cognitive_biases", + "entrepreneurship", + "heuristics" + ], + "difficulty": "medium", + "description": "This study examines how cognitive biases (overconfidence, illusion of control, belief in the law of small numbers, planning fallacy) affect entrepreneurs' opportunity evaluation under risky conditions. Using a mediation framework, the study tests whether risk perception mediates the relationship between cognitive biases and opportunity evaluation. Data from 77 Singaporean SME founders show that illusion of control negatively affects risk perception, which in turn negatively affects opportunity evaluation (full mediation). Belief in small numbers directly increases opportunity evaluation. Entrepreneurs are significantly overconfident in their knowledge calibration.", + "scenarios": [ + "keh_foo_lim_opportunity_evaluation" + ], + "findings": [ + { + "finding_id": "F1", + "main_hypothesis": "Entrepreneurs are overconfident: the mean number of confidence-interval items where the correct answer falls outside the stated 90% range is significantly greater than 1 (the calibrated baseline).", + "weight": 1.0, + "tests": [ + { + "test_name": "One-sample t-test (overconfidence score vs. calibrated baseline of 1)", + "weight": 1.0 + } + ] + }, + { + "finding_id": "F2", + "main_hypothesis": "Risk perception is negatively associated with opportunity evaluation (H1).", + "weight": 1.0, + "tests": [ + { + "test_name": "Pearson correlation (risk_perception, opportunity_evaluation)", + "weight": 1.0 + } + ] + }, + { + "finding_id": "F3", + "main_hypothesis": "Illusion of control is negatively associated with risk perception (H5).", + "weight": 1.0, + "tests": [ + { + "test_name": "Pearson correlation (illusion_of_control, risk_perception)", + "weight": 1.0 + } + ] + }, + { + "finding_id": "F4", + "main_hypothesis": "Illusion of control is positively associated with opportunity evaluation.", + "weight": 1.0, + "tests": [ + { + "test_name": "Pearson correlation (illusion_of_control, opportunity_evaluation)", + "weight": 1.0 + } + ] + }, + { + "finding_id": "F5", + "main_hypothesis": "Overconfidence is positively associated with opportunity evaluation.", + "weight": 1.0, + "tests": [ + { + "test_name": "Pearson correlation (overconfidence, opportunity_evaluation)", + "weight": 1.0 + } + ] + } + ] +} diff --git a/studies/study_013/source/specification.json b/studies/study_013/source/specification.json new file mode 100644 index 00000000..2e8031c2 --- /dev/null +++ b/studies/study_013/source/specification.json @@ -0,0 +1,62 @@ +{ + "study_id": "keh_foo_lim_opportunity_evaluation", + "title": "Opportunity Evaluation under Risky Conditions: The Cognitive Processes of Entrepreneurs", + "participants": { + "n": 77, + "population": "Founders and owners of the top 500 small and medium-sized enterprises (SMEs) in Singapore, as identified by a local business publication", + "demographics": { + "sex": {"male": 0.97, "female": 0.03}, + "age": {"less_than_40": 0.222, "40_to_60": 0.715, "more_than_60": 0.063}, + "race": {"chinese": 0.924, "indian": 0.045, "others": 0.031}, + "education": {"secondary": 0.061, "postsecondary": 0.864, "primary_and_others": 0.075}, + "ownership": {"founded": 0.79, "bought_over": 0.21}, + "business_size": {"less_than_1m": 0.028, "1m_to_25m": 0.486, "25m_to_50m": 0.444, "more_than_50m": 0.042} + }, + "by_sub_study": [ + { + "sub_study_id": "keh_foo_lim_opportunity_evaluation", + "n": 77, + "description": "All participants completed the same questionnaire (Sections A-E)" + } + ] + }, + "design": { + "type": "Cross-Sectional Survey", + "factors": [ + { + "name": "Overconfidence", + "type": "measured", + "description": "Calibration-based overconfidence measured by 10 confidence-interval estimation items" + }, + { + "name": "Illusion of Control", + "type": "measured", + "description": "Three Likert items measuring perceived ability to forecast and control business outcomes" + }, + { + "name": "Planning Fallacy", + "type": "measured", + "description": "Two Likert items measuring belief that past experience predicts future outcomes" + }, + { + "name": "Belief in Small Numbers", + "type": "measured", + "description": "Coded from open-ended responses about a business case vignette" + }, + { + "name": "Risk Propensity", + "type": "measured", + "description": "Five forced-choice gamble items (control variable)" + } + ] + }, + "procedure": { + "steps": [ + "Section A: Participants make 5 forced-choice decisions between a risky gamble and a sure payoff (risk propensity measure)", + "Section B: Participants rate 7 statements on a 7-point Likert scale measuring cognitive biases (2 filler items, 2 planning fallacy items, 3 illusion of control items)", + "Section C: Participants provide lower and upper bounds for 10 factual questions about Singapore, with 90% confidence that the correct answer falls within their stated range (overconfidence measure)", + "Section D: Participants read a business case vignette about Mr. Tan considering starting a new business, then rate 4 risk perception items and 3 opportunity evaluation items on 7-point Likert scales, and respond to 1 open-ended question about factors influencing their assessment (belief in small numbers measure)", + "Section E: Participants provide demographic information (15 items)" + ] + } +} From 7fdc741cd28b9e596b3d6c511012893c6e905271 Mon Sep 17 00:00:00 2001 From: Guankai Zhai Date: Fri, 6 Mar 2026 21:44:47 -0800 Subject: [PATCH 2/2] Refactor study_013 evaluator to use OLS regressions and fix D8 coding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Major changes from code review: - Replace Pearson correlations with OLS regressions for F2-F5, matching the paper's Table 4 analysis (simple OLS for F2, multiple OLS with controls for F3-F5) - Fix F5 finding: change from overconfidence→OE to small_numbers→OE (β=1.17, t=1.91, p<.06) matching Model 2 in Table 4 - Move shared scoring logic (parse_question_responses, compute_construct_scores, code_belief_in_small_numbers, iter_response_records) into study_utils.py - Fix D8 open-ended coding: "no additional information needed" now correctly codes as +1 (substantive belief in small numbers), not treated as missing - Make D8 prompt optional with de-biased framing to avoid inflating statistical-reasoning responses - Tighten demographics to Table 2 only (sex, race, education, business_size) - Fix compute_participant_scores → compute_construct_scores naming mismatch - Update ground_truth.json with reported_coefficient and reported_t_value fields for regression findings Co-Authored-By: Claude Opus 4.6 --- studies/study_013/README.md | 12 +- studies/study_013/index.json | 2 +- studies/study_013/scripts/config.py | 206 +++++-------- studies/study_013/scripts/evaluator.py | 291 +++++++++--------- studies/study_013/scripts/study_utils.py | 233 +++++++++++++- studies/study_013/source/ground_truth.json | 83 ++--- .../materials/section_d_case_vignette.json | 4 +- studies/study_013/source/metadata.json | 18 +- studies/study_013/source/specification.json | 13 +- 9 files changed, 514 insertions(+), 348 deletions(-) diff --git a/studies/study_013/README.md b/studies/study_013/README.md index cf88e901..8286b31e 100644 --- a/studies/study_013/README.md +++ b/studies/study_013/README.md @@ -8,7 +8,7 @@ ## Description -This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. Using a survey of 77 founders of top SMEs in Singapore, the study measures four cognitive biases (overconfidence, illusion of control, belief in the law of small numbers, and planning fallacy) and tests how they influence risk perception and opportunity evaluation of a standardized business case vignette. +This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. Using a survey of 77 founders of top SMEs in Singapore, the study measures four cognitive biases (overconfidence, illusion of control, belief in the law of small numbers, and planning fallacy) and tests how they influence risk perception and opportunity evaluation of a standardized business case vignette. The benchmark implementation focuses on the paper's calibration test and its reported regression findings. ## Participants @@ -22,17 +22,17 @@ This study examines how cognitive biases affect entrepreneurs' opportunity evalu | Finding | Hypothesis | Human Result | |---------|-----------|--------------| | F1 | Entrepreneurs are overconfident (mean items outside 90% CI > 1) | Mean = 5.17, SD = 2.64 | -| F2 | Risk perception negatively associated with opportunity evaluation | r = -.58, p < .01 | -| F3 | Illusion of control negatively associated with risk perception | r = -.44, p < .01 | -| F4 | Illusion of control positively associated with opportunity evaluation | r = .34, p < .01 | -| F5 | Overconfidence positively associated with opportunity evaluation | r = .30, p < .05 | +| F2 | Risk perception negatively predicts opportunity evaluation (H1) | beta = -0.50, t = -5.98, p < .001 | +| F3 | Illusion of control negatively predicts risk perception in Model 1 (H5) | beta = -0.76, t = -3.34, p < .01 | +| F4 | Illusion of control positively predicts opportunity evaluation in Model 2 | beta = 0.40, t = 2.23, p < .05 | +| F5 | Belief in the law of small numbers positively predicts opportunity evaluation in Model 2 | beta = 1.17, t = 1.91, p < .06 | ## Questionnaire Structure - **Section A:** 5 forced-choice gamble items (risk propensity) - **Section B:** 7 Likert items (2 filler, 2 planning fallacy, 3 illusion of control) - **Section C:** 10 confidence-interval estimation items (overconfidence) -- **Section D:** Business case vignette + 4 risk perception items + 3 opportunity evaluation items + 1 open-ended item +- **Section D:** Business case vignette + 4 risk perception items + 3 opportunity evaluation items + 1 optional open-ended item coded for belief in the law of small numbers ## File Structure diff --git a/studies/study_013/index.json b/studies/study_013/index.json index 7c85d29a..18c9b046 100644 --- a/studies/study_013/index.json +++ b/studies/study_013/index.json @@ -6,7 +6,7 @@ "Boon Chong Lim" ], "year": 2002, - "description": "This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. Using a survey of 77 founders of top SMEs in Singapore, the study measures overconfidence, illusion of control, belief in the law of small numbers, and planning fallacy, and tests how these biases influence risk perception and opportunity evaluation of a standardized business vignette. Results show that illusion of control reduces risk perception, which in turn increases opportunity evaluation (full mediation), while belief in the law of small numbers directly increases opportunity evaluation. Entrepreneurs are found to be significantly overconfident in their knowledge calibration.", + "description": "This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. Using a survey of 77 founders of top SMEs in Singapore, the study measures overconfidence, illusion of control, belief in the law of small numbers, and planning fallacy, then relates those constructs to risk perception and opportunity evaluation for a standardized business vignette. The benchmark reproduces the paper's calibration test and its reported regression findings: entrepreneurs are overconfident, risk perception negatively predicts opportunity evaluation, illusion of control lowers risk perception and increases opportunity evaluation before mediation, and belief in the law of small numbers increases opportunity evaluation in the pre-mediation model.", "contributors": [ { "name": "Guankai Zhai", diff --git a/studies/study_013/scripts/config.py b/studies/study_013/scripts/config.py index f0ffb84d..6b3db1cf 100644 --- a/studies/study_013/scripts/config.py +++ b/studies/study_013/scripts/config.py @@ -1,29 +1,27 @@ -import json -import re import numpy as np -from scipy import stats -from pathlib import Path -from typing import Dict, Any, List, Optional import sys sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent)) -from study_utils import BaseStudyConfig, PromptBuilder +from study_utils import BaseStudyConfig, PromptBuilder, compute_construct_scores, iter_response_records import random -# Demographics distributions from Table 2 for persona generation -INDUSTRIES = [ - "Retail", "Manufacturing", "Wholesale", "Construction", - "Transportation and Communication", "Financial", "Professional" -] - AGE_DISTRIBUTION = [ (range(30, 40), 0.222), # Less than 40 (range(40, 61), 0.715), # 40 to 60 (range(61, 70), 0.063), # More than 60 ] +SEX_OPTIONS = ["male", "female"] +SEX_WEIGHTS = [0.97, 0.03] + +RACE_OPTIONS = ["Chinese", "Indian", "Other"] +RACE_WEIGHTS = [0.924, 0.045, 0.031] + +EDUCATION_OPTIONS = ["secondary", "postsecondary", "primary/other"] +EDUCATION_WEIGHTS = [0.061, 0.864, 0.075] + BUSINESS_SIZE_OPTIONS = [ "Less than S$1m", "Between S$1m and S$25m", @@ -45,11 +43,16 @@ def weighted_age_sample(): return random.randint(40, 60) +def weighted_choice(options, weights): + """Draw one option according to the reported sample proportions.""" + return random.choices(options, weights=weights, k=1)[0] + + class CustomPromptBuilder(PromptBuilder): """Builds the full Keh, Foo & Lim (2002) questionnaire prompt.""" def build_trial_prompt(self, trial_metadata): - profile = trial_metadata.get("profile", {}) + profile = trial_metadata.get("profile") or trial_metadata.get("participant_profile", {}) items_a = trial_metadata.get("items_a", []) items_b = trial_metadata.get("items_b", []) items_c = trial_metadata.get("items_c", []) @@ -57,17 +60,26 @@ def build_trial_prompt(self, trial_metadata): vignette_text = trial_metadata.get("vignette_text", "") lines = [] + optional_question_numbers = [] # --- Persona Introduction --- - age = profile.get("age", 48) - industry = profile.get("industry", "Manufacturing") + age = profile.get("age", 47) + sex = profile.get("sex", "male") + race = profile.get("race", "Chinese") + education = profile.get("education", "postsecondary") business_size = profile.get("business_size", "Between S$1m and S$25m") - years_exp = profile.get("years_experience", 15) founder = profile.get("is_founder", True) lines.append("You are participating in a research study on entrepreneurial decision-making.") - lines.append(f"Imagine you are a {age}-year-old entrepreneur in Singapore who {'founded' if founder else 'acquired'} a {industry.lower()} business (annual revenue: {business_size}). You have {years_exp} years of business experience.") - lines.append("Please answer all questions honestly based on your perspective as a business owner.\n") + lines.append( + "Answer as one of the Singapore SME founders/owners described in the original paper." + ) + lines.append( + f"Imagine you are a {age}-year-old {sex} entrepreneur in Singapore, " + f"{race}, with {education} education, who {'founded' if founder else 'bought over'} " + f"the business you run (annual revenue: {business_size})." + ) + lines.append("Please answer all questions honestly from that participant's perspective.\n") q_counter = 1 @@ -133,8 +145,11 @@ def build_trial_prompt(self, trial_metadata): q_counter += 1 elif item["type"] == "open_ended": lines.append(f"Q{q_counter}: {item['question']}") - lines.append(f" (Answer Q{q_counter}=)\n") + lines.append(" Focus on the issues that actually drive your judgment from the case as written.") + lines.append(" Mention extra information only if you genuinely need it.") + lines.append(f" (Optional. Answer Q{q_counter}=, write Q{q_counter}=No additional information needed, or omit Q{q_counter} to skip.)\n") item["q_idx"] = q_counter + optional_question_numbers.append(q_counter) q_counter += 1 # --- Response format --- @@ -143,7 +158,17 @@ def build_trial_prompt(self, trial_metadata): lines.append("=" * 60) lines.append("Output ONLY answer lines in the format: Qk=") lines.append("One answer per line. Do not include explanations.") - lines.append(f"Expected number of answer lines: {q_counter - 1}") + if optional_question_numbers: + optional_labels = ", ".join(f"Q{idx}" for idx in optional_question_numbers) + required_answers = (q_counter - 1) - len(optional_question_numbers) + lines.append(f"All numbered items except {optional_labels} are required.") + lines.append( + f"For {optional_labels}, respond with the issues influencing your judgment, " + "or state that no additional information is needed." + ) + lines.append(f"Expected number of answer lines: {required_answers} to {q_counter - 1}") + else: + lines.append(f"Expected number of answer lines: {q_counter - 1}") return "\n".join(lines) @@ -168,18 +193,20 @@ def create_trials(self, n_trials=None): trials = [] for i in range(n): - # Generate randomized entrepreneur profile from Table 2 demographics + # Generate entrepreneur profiles only from demographics reported in Table 2. age = weighted_age_sample() - industry = random.choice(INDUSTRIES) + sex = weighted_choice(SEX_OPTIONS, SEX_WEIGHTS) + race = weighted_choice(RACE_OPTIONS, RACE_WEIGHTS) + education = weighted_choice(EDUCATION_OPTIONS, EDUCATION_WEIGHTS) business_size = random.choices(BUSINESS_SIZE_OPTIONS, weights=BUSINESS_SIZE_WEIGHTS, k=1)[0] - years_exp = max(3, age - random.randint(22, 30)) is_founder = random.random() < 0.79 profile = { "age": age, - "industry": industry, + "sex": sex, + "race": race, + "education": education, "business_size": business_size, - "years_experience": years_exp, "is_founder": is_founder, } @@ -205,124 +232,37 @@ def aggregate_results(self, raw_results): """Parse Qk=value responses and compute per-participant construct scores.""" participants = [] - for record in raw_results.get("individual_data", []): - trial_info = record.get("trial_info", {}) - response_text = record.get("response_text", "") - - # Parse Qk=Value - responses = {} - for line in response_text.split("\n"): - match = re.match(r"Q(\d+)\s*[:=]\s*(.+)", line.strip()) - if match: - q_num = int(match.group(1)) - responses[q_num] = match.group(2).strip() - - items_a = trial_info.get("items_a", []) - items_b = trial_info.get("items_b", []) - items_c = trial_info.get("items_c", []) - items_d = trial_info.get("items_d", []) - - # --- Risk Propensity: count of risky choices (0-5) --- - risk_propensity = 0 - for item in items_a: - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - choice = responses[q_idx].strip().lower() - risky = item.get("metadata", {}).get("risky_option", "a") - if choice == risky: - risk_propensity += 1 - - # --- Planning Fallacy: sum of B3 + B4 --- - planning_fallacy = 0 - planning_count = 0 - for item in items_b: - if item.get("metadata", {}).get("construct") == "planning_fallacy": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = self.extract_numeric(responses[q_idx]) - if 1 <= val <= 7: - planning_fallacy += val - planning_count += 1 - - # --- Illusion of Control: sum of B5 + B6 + B7 --- - illusion_of_control = 0 - ioc_count = 0 - for item in items_b: - if item.get("metadata", {}).get("construct") == "illusion_of_control": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = self.extract_numeric(responses[q_idx]) - if 1 <= val <= 7: - illusion_of_control += val - ioc_count += 1 - - # --- Overconfidence: count of items where correct answer is outside [lower, upper] --- - overconfidence = 0 - oc_count = 0 - for item in items_c: - q_lower = item.get("q_idx_lower") - q_upper = item.get("q_idx_upper") - correct = item.get("correct_answer") - if q_lower and q_upper and correct is not None: - if q_lower in responses and q_upper in responses: - try: - lower = float(responses[q_lower]) - upper = float(responses[q_upper]) - oc_count += 1 - if correct < lower or correct > upper: - overconfidence += 1 - except (ValueError, TypeError): - pass - - # --- Risk Perception: sum of D1 + D2 + D3 + D4 --- - risk_perception = 0 - rp_count = 0 - for item in items_d: - if item.get("metadata", {}).get("construct") == "risk_perception": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = self.extract_numeric(responses[q_idx]) - if 1 <= val <= 7: - risk_perception += val - rp_count += 1 - - # --- Opportunity Evaluation: sum of D5 + D6 + D7 --- - opportunity_evaluation = 0 - oe_count = 0 - for item in items_d: - if item.get("metadata", {}).get("construct") == "opportunity_evaluation": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = self.extract_numeric(responses[q_idx]) - if 1 <= val <= 7: - opportunity_evaluation += val - oe_count += 1 - - # Only include participant if they have sufficient data - if oc_count >= 5 and rp_count >= 3 and oe_count >= 2: - participants.append({ - "risk_propensity": risk_propensity, - "planning_fallacy": planning_fallacy, - "illusion_of_control": illusion_of_control, - "overconfidence": overconfidence, - "risk_perception": risk_perception, - "opportunity_evaluation": opportunity_evaluation, - "profile": trial_info.get("profile", {}), - }) + for record in iter_response_records(raw_results): + participant_scores = compute_construct_scores( + record.get("response_text", ""), + record.get("trial_info", {}), + ) + if participant_scores is not None: + participants.append(participant_scores) # Compute descriptive statistics if not participants: return {"participants": [], "descriptive_statistics": {}, "n_valid": 0} - constructs = ["risk_propensity", "planning_fallacy", "illusion_of_control", - "overconfidence", "risk_perception", "opportunity_evaluation"] + constructs = [ + "risk_propensity", + "planning_fallacy", + "illusion_of_control", + "overconfidence", + "risk_perception", + "opportunity_evaluation", + "small_numbers", + "age", + ] desc_stats = {} for c in constructs: - values = [p[c] for p in participants] + values = [p[c] for p in participants if p.get(c) is not None] + if not values: + continue desc_stats[c] = { "mean": float(np.mean(values)), - "sd": float(np.std(values, ddof=1)), + "sd": float(np.std(values, ddof=1)) if len(values) > 1 else 0.0, "n": len(values), } diff --git a/studies/study_013/scripts/evaluator.py b/studies/study_013/scripts/evaluator.py index d1d74b3e..9d87a542 100644 --- a/studies/study_013/scripts/evaluator.py +++ b/studies/study_013/scripts/evaluator.py @@ -1,31 +1,19 @@ import json -import re import numpy as np from scipy import stats from pathlib import Path -from typing import Dict, Any, List +from typing import Dict, Any, List, Optional, Sequence import sys sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent)) from stats_lib import parse_p_value_from_reported +from study_utils import compute_construct_scores, iter_response_records # Module-level cache for ground truth and metadata _ground_truth_cache = None _metadata_cache = None -def parse_agent_responses(response_text: str) -> Dict[int, str]: - """ - Parse standardized responses: Qk=Value or Qk: Value - Returns dict mapping question number (int) to value string. - """ - parsed = {} - matches = re.findall(r"Q(\d+)\s*[:=]\s*([^,\n]+)", response_text) - for q_num, val in matches: - parsed[int(q_num)] = val.strip() - return parsed - - def _expected_direction_to_int(expected_dir_str: str) -> int: """Convert expected_direction string to int: 1 = positive, -1 = negative, 0 = unknown.""" if not expected_dir_str: @@ -38,112 +26,69 @@ def _expected_direction_to_int(expected_dir_str: str) -> int: return 0 -def extract_numeric(text: str, default: float = None): - """Extract a numeric value from response text.""" - if text is None: - return default - match = re.search(r"(-?\d+\.?\d*)", str(text)) - return float(match.group(1)) if match else default +def _select_complete_cases( + participant_scores: Sequence[Dict[str, Any]], + outcome: str, + predictors: Sequence[str], +) -> Optional[Dict[str, Any]]: + """Build complete-case outcome and predictor matrices for OLS.""" + rows: List[Dict[str, Any]] = [] + for participant in participant_scores: + required_values = [participant.get(outcome)] + required_values.extend(participant.get(name) for name in predictors) + if any(value is None for value in required_values): + continue + rows.append(participant) + + if not rows: + return None + + y = np.array([row[outcome] for row in rows], dtype=float) + x = np.array([[row[name] for name in predictors] for row in rows], dtype=float) + return {"rows": rows, "y": y, "x": x} -def compute_participant_scores(response_text: str, trial_info: Dict) -> Dict[str, Any]: - """ - Parse a single participant's responses and compute all construct scores. - Returns a dict of construct scores, or None if insufficient data. - """ - responses = parse_agent_responses(response_text) - items_a = trial_info.get("items_a", []) - items_b = trial_info.get("items_b", []) - items_c = trial_info.get("items_c", []) - items_d = trial_info.get("items_d", []) - - # --- Risk Propensity: count of risky choices (0-5) --- - risk_propensity = 0 - for item in items_a: - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - choice = responses[q_idx].strip().lower() - risky = item.get("metadata", {}).get("risky_option", "a") - if choice == risky: - risk_propensity += 1 - - # --- Planning Fallacy: sum of planning fallacy items --- - planning_fallacy = 0 - pf_count = 0 - for item in items_b: - if item.get("metadata", {}).get("construct") == "planning_fallacy": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = extract_numeric(responses[q_idx]) - if val is not None and 1 <= val <= 7: - planning_fallacy += val - pf_count += 1 - - # --- Illusion of Control: sum of IoC items --- - illusion_of_control = 0 - ioc_count = 0 - for item in items_b: - if item.get("metadata", {}).get("construct") == "illusion_of_control": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = extract_numeric(responses[q_idx]) - if val is not None and 1 <= val <= 7: - illusion_of_control += val - ioc_count += 1 - - # --- Overconfidence: items where correct answer outside [lower, upper] --- - overconfidence = 0 - oc_count = 0 - for item in items_c: - q_lower = item.get("q_idx_lower") - q_upper = item.get("q_idx_upper") - correct = item.get("correct_answer") - if q_lower and q_upper and correct is not None: - if q_lower in responses and q_upper in responses: - try: - lower = float(responses[q_lower]) - upper = float(responses[q_upper]) - oc_count += 1 - if correct < lower or correct > upper: - overconfidence += 1 - except (ValueError, TypeError): - pass - - # --- Risk Perception: sum of risk perception items --- - risk_perception = 0 - rp_count = 0 - for item in items_d: - if item.get("metadata", {}).get("construct") == "risk_perception": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = extract_numeric(responses[q_idx]) - if val is not None and 1 <= val <= 7: - risk_perception += val - rp_count += 1 - - # --- Opportunity Evaluation: sum of OE items --- - opportunity_evaluation = 0 - oe_count = 0 - for item in items_d: - if item.get("metadata", {}).get("construct") == "opportunity_evaluation": - q_idx = item.get("q_idx") - if q_idx and q_idx in responses: - val = extract_numeric(responses[q_idx]) - if val is not None and 1 <= val <= 7: - opportunity_evaluation += val - oe_count += 1 - - # Require minimum data completeness - if oc_count < 5 or rp_count < 3 or oe_count < 2: +def _fit_ols(y: np.ndarray, x: np.ndarray, predictor_names: Sequence[str]) -> Optional[Dict[str, Any]]: + """Fit an ordinary least squares model and return coefficients and t-tests.""" + if y.ndim != 1 or x.ndim != 2: + return None + + n_obs, n_predictors = x.shape + if n_obs <= n_predictors + 1: return None + design = np.column_stack([np.ones(n_obs), x]) + rank = np.linalg.matrix_rank(design) + if rank < design.shape[1]: + return None + + coefficients, _, _, _ = np.linalg.lstsq(design, y, rcond=None) + residuals = y - design @ coefficients + dof = n_obs - design.shape[1] + if dof <= 0: + return None + + mse = float(np.sum(residuals ** 2) / dof) + covariance = mse * np.linalg.inv(design.T @ design) + standard_errors = np.sqrt(np.diag(covariance)) + with np.errstate(divide="ignore", invalid="ignore"): + t_values = coefficients / standard_errors + p_values = 2 * stats.t.sf(np.abs(t_values), dof) + + names = ["intercept", *predictor_names] + coefficient_map = {} + for index, name in enumerate(names): + coefficient_map[name] = { + "coefficient": float(coefficients[index]), + "standard_error": float(standard_errors[index]), + "t_value": float(t_values[index]), + "p_value": float(p_values[index]), + } + return { - "risk_propensity": risk_propensity, - "planning_fallacy": planning_fallacy, - "illusion_of_control": illusion_of_control, - "overconfidence": overconfidence, - "risk_perception": risk_perception, - "opportunity_evaluation": opportunity_evaluation, + "n_obs": n_obs, + "degrees_of_freedom": dof, + "coefficients": coefficient_map, } @@ -171,19 +116,16 @@ def evaluate_study(results): _metadata_cache = {} ground_truth = _ground_truth_cache - sig_level = 0.05 - # 2. Parse all agent responses into participant score vectors participant_scores = [] - for participant in results.get("individual_data", []): - for response in participant.get("responses", []): - response_text = response.get("response_text", "") - trial_info = response.get("trial_info", {}) - - scores = compute_participant_scores(response_text, trial_info) - if scores is not None: - participant_scores.append(scores) + for response_record in iter_response_records(results): + scores = compute_construct_scores( + response_record.get("response_text", ""), + response_record.get("trial_info", {}), + ) + if scores is not None: + participant_scores.append(scores) # 3. Build test results for each finding test_results = [] @@ -193,21 +135,15 @@ def evaluate_study(results): for study_gt in ground_truth.get("studies", []): for finding in study_gt.get("findings", []): test_results.append({ - "study_id": "keh_foo_lim_opportunity_evaluation", + "study_id": "study_013", + "sub_study_id": "keh_foo_lim_opportunity_evaluation", "finding_id": finding["finding_id"], "n_agent": 0, "error": "No valid participant data", }) return {"test_results": test_results} - # Extract score arrays - overconfidence_scores = np.array([p["overconfidence"] for p in participant_scores]) - risk_perception_scores = np.array([p["risk_perception"] for p in participant_scores]) - opp_eval_scores = np.array([p["opportunity_evaluation"] for p in participant_scores]) - ioc_scores = np.array([p["illusion_of_control"] for p in participant_scores]) - planning_scores = np.array([p["planning_fallacy"] for p in participant_scores]) - risk_prop_scores = np.array([p["risk_propensity"] for p in participant_scores]) - + overconfidence_scores = np.array([p["overconfidence"] for p in participant_scores], dtype=float) n_agent = len(participant_scores) for study_gt in ground_truth.get("studies", []): @@ -218,6 +154,7 @@ def evaluate_study(results): expected_dir_str = test_gt.get("expected_direction", "") h_expected = _expected_direction_to_int(expected_dir_str) reported_stats = test_gt.get("reported_statistics", "") + sig_level = test_gt.get("significance_level") or 0.05 # Parse human p-value human_p_value = None @@ -234,6 +171,12 @@ def evaluate_study(results): direction_match = None mean_agent = None sd_agent = None + coefficient_agent = None + standard_error_agent = None + model_n = n_agent + model_predictors = None + human_coefficient = test_gt.get("reported_coefficient") + human_t_value = test_gt.get("reported_t_value") if finding_id == "F1": # Overconfidence: one-sample t-test against baseline of 1 @@ -258,27 +201,61 @@ def evaluate_study(results): agent_significant = p_value < sig_level direction_match = (mean_agent > baseline) - elif finding_id in ("F2", "F3", "F4", "F5"): - # Correlation-based findings - corr_pairs = { - "F2": (risk_perception_scores, opp_eval_scores), - "F3": (ioc_scores, risk_perception_scores), - "F4": (ioc_scores, opp_eval_scores), - "F5": (overconfidence_scores, opp_eval_scores), + elif finding_id == "F2": + model_predictors = ["risk_perception"] + model_data = _select_complete_cases( + participant_scores, + outcome="opportunity_evaluation", + predictors=model_predictors, + ) + if model_data is not None: + model = _fit_ols(model_data["y"], model_data["x"], model_predictors) + if model is not None: + model_n = model["n_obs"] + coefficient = model["coefficients"]["risk_perception"] + coefficient_agent = coefficient["coefficient"] + standard_error_agent = coefficient["standard_error"] + t_stat = coefficient["t_value"] + p_value = coefficient["p_value"] + agent_significant = p_value < sig_level + direction_match = (coefficient_agent < 0) if h_expected == -1 else (coefficient_agent > 0) + + elif finding_id in ("F3", "F4", "F5"): + model_predictors = [ + "overconfidence", + "small_numbers", + "planning_fallacy", + "illusion_of_control", + "risk_propensity", + "age", + ] + target_variable = { + "F3": ("risk_perception", "illusion_of_control"), + "F4": ("opportunity_evaluation", "illusion_of_control"), + "F5": ("opportunity_evaluation", "small_numbers"), } - x_arr, y_arr = corr_pairs[finding_id] - - # Require sufficient data and non-constant arrays - if (len(x_arr) >= 3 and - np.std(x_arr) > 0 and np.std(y_arr) > 0): - r_val, p_val = stats.pearsonr(x_arr, y_arr) - if not np.isnan(r_val): - r_stat = float(r_val) - p_value = float(p_val) - mean_agent = r_stat + outcome_name, predictor_of_interest = target_variable[finding_id] + model_data = _select_complete_cases( + participant_scores, + outcome=outcome_name, + predictors=model_predictors, + ) + if model_data is not None: + model = _fit_ols(model_data["y"], model_data["x"], model_predictors) + if model is not None: + model_n = model["n_obs"] + coefficient = model["coefficients"][predictor_of_interest] + coefficient_agent = coefficient["coefficient"] + standard_error_agent = coefficient["standard_error"] + t_stat = coefficient["t_value"] + p_value = coefficient["p_value"] agent_significant = p_value < sig_level - agent_dir = 1 if r_stat > 0 else -1 - direction_match = (h_expected == 0) or (agent_dir == h_expected) + if h_expected == -1: + direction_match = coefficient_agent < 0 + elif h_expected == 1: + direction_match = coefficient_agent > 0 + else: + direction_match = True # Compute replication metric replication = None @@ -286,12 +263,18 @@ def evaluate_study(results): replication = human_significant and agent_significant and direction_match test_result = { - "study_id": "keh_foo_lim_opportunity_evaluation", + "study_id": "study_013", "sub_study_id": "keh_foo_lim_opportunity_evaluation", "finding_id": finding_id, "n_agent": n_agent, + "model_n": model_n, + "model_predictors": model_predictors, "mean_agent": mean_agent, "sd_agent": sd_agent, + "coefficient_agent": coefficient_agent, + "standard_error_agent": standard_error_agent, + "human_coefficient": human_coefficient, + "human_t_value": human_t_value, "t_stat": t_stat, "r_stat": r_stat, "p_value": float(p_value) if p_value is not None else None, diff --git a/studies/study_013/scripts/study_utils.py b/studies/study_013/scripts/study_utils.py index 8829fb38..06610ff8 100644 --- a/studies/study_013/scripts/study_utils.py +++ b/studies/study_013/scripts/study_utils.py @@ -6,7 +6,238 @@ import re from abc import ABC, abstractmethod from pathlib import Path -from typing import Dict, Any, List, Optional +from typing import Dict, Any, Iterable, List, Optional + + +RESPONSE_LINE_PATTERN = re.compile(r"Q(\d+)\s*[:=]\s*(.+)") +EXPLICIT_SKIP_RESPONSES = { + "", + "skip", + "n/a", + "na", +} +NO_ADDITIONAL_INFO_RESPONSES = { + "none", + "none needed", + "nothing else", + "nothing additional", + "no additional info", + "no additional information", + "no additional information needed", + "no more information", + "no more information needed", +} +NO_ADDITIONAL_INFO_PATTERNS = [ + re.compile(pattern) + for pattern in ( + r"\bno (?:additional|further|more) info(?:rmation)? (?:is )?needed\b", + r"\bno (?:additional|further|more) (?:data|research) (?:is )?needed\b", + r"\b(?:the|this) information given is enough\b", + r"\bthe case provides enough information\b", + r"\benough information (?:is )?(?:provided|given)\b", + ) +] +STATISTICAL_REASONING_PATTERNS = [ + re.compile(pattern) + for pattern in ( + r"\bmarket research\b", + r"\bmarket study\b", + r"\bsurvey\b", + r"\blarger sample\b", + r"\bsample size\b", + r"\brepresentative sample\b", + r"\bstatistical data\b", + r"\bindustry statistics?\b", + r"\bmarket (?:size|demand|growth) data\b", + r"\bcustomer (?:data|survey|research)\b", + r"\bdemand (?:data|research)\b", + r"\btrend data\b", + r"\bmore (?:data|research|surveys?|samples?)\b", + ) +] + + +def parse_question_responses(response_text: str) -> Dict[int, str]: + """Parse Qk=value or Qk: value lines into a question-number map.""" + responses: Dict[int, str] = {} + for line in str(response_text or "").splitlines(): + match = RESPONSE_LINE_PATTERN.match(line.strip()) + if match: + responses[int(match.group(1))] = match.group(2).strip() + return responses + + +def extract_numeric_value(text: Any, default: Optional[float] = None) -> Optional[float]: + """Extract the first numeric value from text, tolerating commas and units.""" + if text is None: + return default + clean_text = str(text).replace(",", "") + match = re.search(r"(-?\d+(?:\.\d+)?)", clean_text) + return float(match.group(1)) if match else default + + +def code_belief_in_small_numbers(text: Any) -> Optional[int]: + """ + Code the open-ended vignette response. + + -1: respondent asks for broader evidence such as market research / survey / data + +1: respondent relies on the vignette and anecdotal cues without that request, + including statements that no additional information is needed + None: blank / skipped response + """ + if text is None: + return None + + normalized = re.sub(r"\s+", " ", str(text).strip().lower()) + canonical = normalized.strip(" .,!?:;") + if canonical in EXPLICIT_SKIP_RESPONSES: + return None + if canonical in NO_ADDITIONAL_INFO_RESPONSES: + return 1 + + for pattern in STATISTICAL_REASONING_PATTERNS: + if pattern.search(normalized): + return -1 + + for pattern in NO_ADDITIONAL_INFO_PATTERNS: + if pattern.search(normalized): + return 1 + + return 1 + + +def iter_response_records(results: Dict[str, Any]) -> Iterable[Dict[str, Any]]: + """ + Yield flat response records regardless of whether results are already flattened + or grouped under participant summaries. + """ + individual_data = results.get("individual_data") or [] + if individual_data: + first = individual_data[0] + if isinstance(first, dict) and "response_text" in first: + yield from individual_data + return + if isinstance(first, dict) and "responses" in first: + for participant in individual_data: + for response in participant.get("responses", []): + yield response + return + + for participant in results.get("participant_summaries", []) or []: + for response in participant.get("responses", []): + yield response + + +def compute_construct_scores(response_text: str, trial_info: Dict[str, Any]) -> Optional[Dict[str, Any]]: + """Compute participant-level construct scores from one completed questionnaire.""" + responses = parse_question_responses(response_text) + items_a = trial_info.get("items_a", []) + items_b = trial_info.get("items_b", []) + items_c = trial_info.get("items_c", []) + items_d = trial_info.get("items_d", []) + + risk_propensity = 0 + risk_answered = 0 + for item in items_a: + q_idx = item.get("q_idx") + if q_idx and q_idx in responses: + choice_text = responses[q_idx].strip().lower() + choice_match = re.search(r"\b([ab])\b", choice_text) + if choice_match: + choice = choice_match.group(1) + risk_answered += 1 + if choice == item.get("metadata", {}).get("risky_option", "a"): + risk_propensity += 1 + + planning_fallacy = 0 + planning_count = 0 + illusion_of_control = 0 + ioc_count = 0 + for item in items_b: + q_idx = item.get("q_idx") + if not q_idx or q_idx not in responses: + continue + value = extract_numeric_value(responses[q_idx], default=None) + if value is None or not 1 <= value <= 7: + continue + construct = item.get("metadata", {}).get("construct") + if construct == "planning_fallacy": + planning_fallacy += value + planning_count += 1 + elif construct == "illusion_of_control": + illusion_of_control += value + ioc_count += 1 + + overconfidence = 0 + oc_count = 0 + for item in items_c: + q_lower = item.get("q_idx_lower") + q_upper = item.get("q_idx_upper") + correct_answer = item.get("correct_answer") + if not q_lower or not q_upper or correct_answer is None: + continue + if q_lower not in responses or q_upper not in responses: + continue + lower = extract_numeric_value(responses[q_lower], default=None) + upper = extract_numeric_value(responses[q_upper], default=None) + if lower is None or upper is None: + continue + if lower > upper: + lower, upper = upper, lower + oc_count += 1 + if correct_answer < lower or correct_answer > upper: + overconfidence += 1 + + risk_perception = 0 + rp_count = 0 + opportunity_evaluation = 0 + oe_count = 0 + small_numbers = None + for item in items_d: + q_idx = item.get("q_idx") + if not q_idx or q_idx not in responses: + continue + + construct = item.get("metadata", {}).get("construct") + if construct == "belief_in_small_numbers": + small_numbers = code_belief_in_small_numbers(responses[q_idx]) + continue + + value = extract_numeric_value(responses[q_idx], default=None) + if value is None or not 1 <= value <= 7: + continue + if construct == "risk_perception": + risk_perception += value + rp_count += 1 + elif construct == "opportunity_evaluation": + opportunity_evaluation += value + oe_count += 1 + + profile = trial_info.get("profile", {}) or {} + age = extract_numeric_value(profile.get("age"), default=None) + + if ( + risk_answered < 5 + or planning_count < 2 + or ioc_count < 3 + or oc_count < 10 + or rp_count < 4 + or oe_count < 3 + or age is None + ): + return None + + return { + "risk_propensity": risk_propensity, + "planning_fallacy": planning_fallacy, + "illusion_of_control": illusion_of_control, + "overconfidence": overconfidence, + "risk_perception": risk_perception, + "opportunity_evaluation": opportunity_evaluation, + "small_numbers": small_numbers, + "age": age, + "profile": profile, + } class PromptBuilder: diff --git a/studies/study_013/source/ground_truth.json b/studies/study_013/source/ground_truth.json index 475e94c3..434717c5 100644 --- a/studies/study_013/source/ground_truth.json +++ b/studies/study_013/source/ground_truth.json @@ -1,5 +1,5 @@ { - "study_id": "keh_foo_lim_opportunity_evaluation", + "study_id": "study_013", "title": "Opportunity Evaluation under Risky Conditions: The Cognitive Processes of Entrepreneurs", "authors": ["Hean Tat Keh", "Maw Der Foo", "Boon Chong Lim"], "year": 2002, @@ -21,32 +21,34 @@ } ], "original_data_points": { - "description": "Overconfidence scores from Table 3", + "description": "Overconfidence scores from Table 3.", "data": { "overconfidence": { "mean": 5.17, "sd": 2.64, "n": 77, "baseline": 1, - "note": "Number of items (out of 10) where correct answer fell outside stated 90% confidence interval. A perfectly calibrated respondent would have a score of 1." + "note": "Number of items (out of 10) where the correct answer fell outside the respondent's stated 90% confidence interval." } } } }, { "finding_id": "F2", - "main_hypothesis": "Risk perception is negatively associated with opportunity evaluation (H1).", + "main_hypothesis": "Risk perception negatively predicts opportunity evaluation (H1).", "statistical_tests": [ { - "test_name": "Pearson correlation (risk_perception, opportunity_evaluation)", - "statistical_hypothesis": "r(risk_perception, opportunity_evaluation) < 0", - "reported_statistics": "r = -.58, p < .01 (Table 3); beta = -0.50, t = -5.98, p < .001 (Table 4, H1)", + "test_name": "OLS regression (opportunity_evaluation ~ risk_perception)", + "statistical_hypothesis": "The regression coefficient on risk_perception is negative.", + "reported_statistics": "beta = -0.50, t = -5.98, p < .001 (Table 4, H1)", + "reported_coefficient": -0.5, + "reported_t_value": -5.98, "significance_level": 0.05, "expected_direction": "negative" } ], "original_data_points": { - "description": "Correlation and regression statistics from Tables 3 and 4", + "description": "Bivariate regression and descriptive statistics from Tables 3 and 4.", "data": { "risk_perception": { "mean": 19.04, @@ -55,11 +57,11 @@ }, "opportunity_evaluation": { "mean": 12.97, - "sd": 4.10, + "sd": 4.1, "n": 77 }, "correlation": -0.58, - "regression_beta": -0.50, + "regression_beta": -0.5, "regression_t": -5.98, "regression_R2": 0.36 } @@ -67,18 +69,20 @@ }, { "finding_id": "F3", - "main_hypothesis": "Illusion of control is negatively associated with risk perception (H5).", + "main_hypothesis": "Illusion of control negatively predicts risk perception when the other cognitive-bias measures, age, and risk propensity are controlled (H5 / Model 1).", "statistical_tests": [ { - "test_name": "Pearson correlation (illusion_of_control, risk_perception)", - "statistical_hypothesis": "r(illusion_of_control, risk_perception) < 0", - "reported_statistics": "r = -.44, p < .01 (Table 3); beta = -0.76, t = -3.34, p < .01 (Table 4, Model 1)", + "test_name": "OLS regression (risk_perception ~ overconfidence + small_numbers + planning_fallacy + illusion_of_control + risk_propensity + age)", + "statistical_hypothesis": "The regression coefficient on illusion_of_control is negative.", + "reported_statistics": "beta = -0.76, t = -3.34, p < .01 (Table 4, Model 1)", + "reported_coefficient": -0.76, + "reported_t_value": -3.34, "significance_level": 0.05, "expected_direction": "negative" } ], "original_data_points": { - "description": "Correlation and regression statistics from Tables 3 and 4", + "description": "Model 1 coefficient plus Table 3 descriptives.", "data": { "illusion_of_control": { "mean": 12.94, @@ -92,24 +96,27 @@ }, "correlation": -0.44, "regression_beta": -0.76, - "regression_t": -3.34 + "regression_t": -3.34, + "model_controls": ["overconfidence", "small_numbers", "planning_fallacy", "risk_propensity", "age"] } } }, { "finding_id": "F4", - "main_hypothesis": "Illusion of control is positively associated with opportunity evaluation.", + "main_hypothesis": "Illusion of control positively predicts opportunity evaluation before the mediator is added, controlling for the other cognitive-bias measures, age, and risk propensity (Model 2).", "statistical_tests": [ { - "test_name": "Pearson correlation (illusion_of_control, opportunity_evaluation)", - "statistical_hypothesis": "r(illusion_of_control, opportunity_evaluation) > 0", - "reported_statistics": "r = .34, p < .01 (Table 3); beta = 0.40, t = 2.23, p < .05 (Table 4, Model 2)", + "test_name": "OLS regression (opportunity_evaluation ~ overconfidence + small_numbers + planning_fallacy + illusion_of_control + risk_propensity + age)", + "statistical_hypothesis": "The regression coefficient on illusion_of_control is positive.", + "reported_statistics": "beta = 0.40, t = 2.23, p < .05 (Table 4, Model 2)", + "reported_coefficient": 0.4, + "reported_t_value": 2.23, "significance_level": 0.05, "expected_direction": "positive" } ], "original_data_points": { - "description": "Correlation and regression statistics from Tables 3 and 4", + "description": "Model 2 coefficient plus Table 3 descriptives.", "data": { "illusion_of_control": { "mean": 12.94, @@ -118,41 +125,47 @@ }, "opportunity_evaluation": { "mean": 12.97, - "sd": 4.10, + "sd": 4.1, "n": 77 }, "correlation": 0.34, - "regression_beta": 0.40, - "regression_t": 2.23 + "regression_beta": 0.4, + "regression_t": 2.23, + "model_controls": ["overconfidence", "small_numbers", "planning_fallacy", "risk_propensity", "age"] } } }, { "finding_id": "F5", - "main_hypothesis": "Overconfidence is positively associated with opportunity evaluation.", + "main_hypothesis": "Belief in the law of small numbers positively predicts opportunity evaluation before the mediator is added, controlling for the other cognitive-bias measures, age, and risk propensity (Model 2).", "statistical_tests": [ { - "test_name": "Pearson correlation (overconfidence, opportunity_evaluation)", - "statistical_hypothesis": "r(overconfidence, opportunity_evaluation) > 0", - "reported_statistics": "r = .30, p < .05 (Table 3)", - "significance_level": 0.05, + "test_name": "OLS regression (opportunity_evaluation ~ overconfidence + small_numbers + planning_fallacy + illusion_of_control + risk_propensity + age)", + "statistical_hypothesis": "The regression coefficient on small_numbers is positive.", + "reported_statistics": "beta = 1.17, t = 1.91, p < .06 (Table 4, Model 2)", + "reported_coefficient": 1.17, + "reported_t_value": 1.91, + "significance_level": 0.06, "expected_direction": "positive" } ], "original_data_points": { - "description": "Correlation statistics from Table 3", + "description": "Model 2 coefficient plus Table 3 descriptives.", "data": { - "overconfidence": { - "mean": 5.17, - "sd": 2.64, + "small_numbers": { + "mean": -0.08, + "sd": 0.99, "n": 77 }, "opportunity_evaluation": { "mean": 12.97, - "sd": 4.10, + "sd": 4.1, "n": 77 }, - "correlation": 0.30 + "correlation": 0.32, + "regression_beta": 1.17, + "regression_t": 1.91, + "model_controls": ["overconfidence", "planning_fallacy", "illusion_of_control", "risk_propensity", "age"] } } } diff --git a/studies/study_013/source/materials/section_d_case_vignette.json b/studies/study_013/source/materials/section_d_case_vignette.json index cfeff144..4e75013b 100644 --- a/studies/study_013/source/materials/section_d_case_vignette.json +++ b/studies/study_013/source/materials/section_d_case_vignette.json @@ -73,8 +73,8 @@ "type": "open_ended", "metadata": { "construct": "belief_in_small_numbers", - "coding_scheme": "Responses mentioning need for market research, larger sample, statistical data, or survey indicate statistical reasoning (coded -1). Responses not mentioning these indicate reliance on small numbers (coded +1).", - "note": "Approximately 50% missingness in original data; used for belief in small numbers construct" + "coding_scheme": "Responses requesting broader evidence such as market research, larger samples, statistical data, or surveys indicate statistical reasoning (coded -1). Responses that rely on the vignette as sufficient, including statements that no additional information is needed, indicate belief in the law of small numbers (coded +1).", + "note": "This item is optional in the prompt. Blank or explicitly skipped responses are treated as missing during scoring; 'no additional information needed' is a substantive response and should not be treated as missing." } } ] diff --git a/studies/study_013/source/metadata.json b/studies/study_013/source/metadata.json index 6f1ca520..d0ba1514 100644 --- a/studies/study_013/source/metadata.json +++ b/studies/study_013/source/metadata.json @@ -21,7 +21,7 @@ "heuristics" ], "difficulty": "medium", - "description": "This study examines how cognitive biases (overconfidence, illusion of control, belief in the law of small numbers, planning fallacy) affect entrepreneurs' opportunity evaluation under risky conditions. Using a mediation framework, the study tests whether risk perception mediates the relationship between cognitive biases and opportunity evaluation. Data from 77 Singaporean SME founders show that illusion of control negatively affects risk perception, which in turn negatively affects opportunity evaluation (full mediation). Belief in small numbers directly increases opportunity evaluation. Entrepreneurs are significantly overconfident in their knowledge calibration.", + "description": "This study examines how cognitive biases affect entrepreneurs' opportunity evaluation under risky conditions. The benchmark reconstructs the paper's calibration test and its reported regression findings: entrepreneurs are overconfident, risk perception negatively predicts opportunity evaluation, illusion of control lowers risk perception and increases opportunity evaluation before the mediator is introduced, and belief in the law of small numbers increases opportunity evaluation in the pre-mediation model.", "scenarios": [ "keh_foo_lim_opportunity_evaluation" ], @@ -39,44 +39,44 @@ }, { "finding_id": "F2", - "main_hypothesis": "Risk perception is negatively associated with opportunity evaluation (H1).", + "main_hypothesis": "Risk perception negatively predicts opportunity evaluation (H1).", "weight": 1.0, "tests": [ { - "test_name": "Pearson correlation (risk_perception, opportunity_evaluation)", + "test_name": "OLS regression (opportunity_evaluation ~ risk_perception)", "weight": 1.0 } ] }, { "finding_id": "F3", - "main_hypothesis": "Illusion of control is negatively associated with risk perception (H5).", + "main_hypothesis": "Illusion of control negatively predicts risk perception when the other cognitive-bias measures, age, and risk propensity are controlled (H5 / Model 1).", "weight": 1.0, "tests": [ { - "test_name": "Pearson correlation (illusion_of_control, risk_perception)", + "test_name": "OLS regression (risk_perception ~ overconfidence + small_numbers + planning_fallacy + illusion_of_control + risk_propensity + age)", "weight": 1.0 } ] }, { "finding_id": "F4", - "main_hypothesis": "Illusion of control is positively associated with opportunity evaluation.", + "main_hypothesis": "Illusion of control positively predicts opportunity evaluation before the mediator is added, controlling for the other cognitive-bias measures, age, and risk propensity (Model 2).", "weight": 1.0, "tests": [ { - "test_name": "Pearson correlation (illusion_of_control, opportunity_evaluation)", + "test_name": "OLS regression (opportunity_evaluation ~ overconfidence + small_numbers + planning_fallacy + illusion_of_control + risk_propensity + age)", "weight": 1.0 } ] }, { "finding_id": "F5", - "main_hypothesis": "Overconfidence is positively associated with opportunity evaluation.", + "main_hypothesis": "Belief in the law of small numbers positively predicts opportunity evaluation before the mediator is added, controlling for the other cognitive-bias measures, age, and risk propensity (Model 2).", "weight": 1.0, "tests": [ { - "test_name": "Pearson correlation (overconfidence, opportunity_evaluation)", + "test_name": "OLS regression (opportunity_evaluation ~ overconfidence + small_numbers + planning_fallacy + illusion_of_control + risk_propensity + age)", "weight": 1.0 } ] diff --git a/studies/study_013/source/specification.json b/studies/study_013/source/specification.json index 2e8031c2..dd972519 100644 --- a/studies/study_013/source/specification.json +++ b/studies/study_013/source/specification.json @@ -1,5 +1,5 @@ { - "study_id": "keh_foo_lim_opportunity_evaluation", + "study_id": "study_013", "title": "Opportunity Evaluation under Risky Conditions: The Cognitive Processes of Entrepreneurs", "participants": { "n": 77, @@ -12,13 +12,12 @@ "ownership": {"founded": 0.79, "bought_over": 0.21}, "business_size": {"less_than_1m": 0.028, "1m_to_25m": 0.486, "25m_to_50m": 0.444, "more_than_50m": 0.042} }, - "by_sub_study": [ - { - "sub_study_id": "keh_foo_lim_opportunity_evaluation", + "by_sub_study": { + "keh_foo_lim_opportunity_evaluation": { "n": 77, - "description": "All participants completed the same questionnaire (Sections A-E)" + "description": "All participants completed the same questionnaire (Sections A-E)." } - ] + } }, "design": { "type": "Cross-Sectional Survey", @@ -41,7 +40,7 @@ { "name": "Belief in Small Numbers", "type": "measured", - "description": "Coded from open-ended responses about a business case vignette" + "description": "Coded from the open-ended vignette response: asking for broader market evidence indicates statistical reasoning, while relying on the vignette's limited anecdotal cues indicates belief in the law of small numbers" }, { "name": "Risk Propensity",