diff --git a/tools/misc/stratified_block_randomization.py b/tools/misc/stratified_block_randomization.py new file mode 100644 index 000000000..fa9eddd02 --- /dev/null +++ b/tools/misc/stratified_block_randomization.py @@ -0,0 +1,462 @@ +#!/usr/bin/env python3 +"""Hierarchical proportional block assignment. + +Samples are split into blocks of size m (the last block may be smaller). +Balancing is done by levels: +1. Factor 1 is matched proportionally in every block. +2. Within each factor-1 slice, factor 2 is matched proportionally. +3. The same logic is applied recursively for additional factors. + +Integer quotas are computed with largest-remainder rounding while enforcing +exact totals across both dimensions. +""" +import argparse +from dataclasses import dataclass +import sys + +import numpy as np +import pandas as pd + + +class StudyDesignerError(Exception): + """Base exception for recoverable tool errors.""" + + +@dataclass(frozen=True) +class StudyDesignConfig: + """Runtime configuration for the study designer.""" + + input_path: str + output_path: str + block_size: int + factors: list[str] + sample_col: str + columns_mode: str + seed: int + summary_path: str | None + + +def parse_args() -> StudyDesignConfig: + parser = argparse.ArgumentParser( + description="Create balanced random blocks preserving factor proportions." + ) + parser.add_argument("--input", required=True, help="Input TSV file with samples.") + parser.add_argument( + "--block_size", + type=int, + required=True, + help=( + "Target size per block. Blocks are created sequentially from this size; " + "the final block may be smaller." + ), + ) + parser.add_argument( + "--factors", + nargs="+", + required=True, + help="Column names to balance on (e.g. --factors group status).", + ) + parser.add_argument( + "--sample_col", + default="sample", + help="Name of the sample identifier column (default: sample).", + ) + parser.add_argument( + "--columns_mode", + choices=["names", "indices"], + default="names", + help=( + "Interpret --factors/--sample_col as column names (default) or as " + "1-based column indices. In 'indices' mode, --factors may be a " + "comma-separated list (e.g. 2,3) or space-separated values." + ), + ) + parser.add_argument( + "--seed", type=int, default=42, help="Random seed for reproducibility." + ) + parser.add_argument( + "--output", + required=True, + help="Output TSV file: original columns plus a 'block' column.", + ) + parser.add_argument( + "--summary", + default=None, + help="Optional path to write a per-block factor-count summary TSV.", + ) + args = parser.parse_args() + return StudyDesignConfig( + input_path=args.input, + output_path=args.output, + block_size=args.block_size, + factors=args.factors, + sample_col=args.sample_col, + columns_mode=args.columns_mode, + seed=args.seed, + summary_path=args.summary, + ) + + +def load_and_prepare_input(input_path: str) -> pd.DataFrame: + """Load input data as-is from TSV.""" + df = pd.read_csv(input_path, sep="\t").reset_index(drop=True) + return df + + +def add_original_index(df: pd.DataFrame) -> pd.DataFrame: + """Add a persistent original row index column.""" + df = df.copy() + df.insert(0, "original_index", df.index) + return df + + +def _index_token_to_name(columns: list[str], token: str, arg_name: str) -> str: + """Convert one 1-based index token (e.g. '3' or 'c3') to a column name.""" + t = token.strip() + if t.lower().startswith("c"): + t = t[1:] + + if not t.isdigit(): + raise StudyDesignerError( + f"{arg_name}: invalid column index token '{token}'" + ) + + idx = int(t) + if idx < 1 or idx > len(columns): + raise StudyDesignerError( + f"{arg_name}: column index {idx} out of range (1..{len(columns)})" + ) + return columns[idx - 1] + + +def resolve_column_args( + df: pd.DataFrame, + factors: list[str], + sample_col: str, + columns_mode: str, +) -> tuple[list[str], str]: + """Resolve factors/sample column arguments from names or 1-based indices.""" + if columns_mode == "names": + return factors, sample_col + + columns = list(df.columns) + + factor_tokens: list[str] = [] + for token in factors: + factor_tokens.extend([x for x in token.split(",") if x.strip()]) + + resolved_factors = [ + _index_token_to_name(columns, token, "--factors") for token in factor_tokens + ] + resolved_sample_col = _index_token_to_name(columns, sample_col, "--sample_col") + return resolved_factors, resolved_sample_col + + +def validate_inputs( + df: pd.DataFrame, + factors: list[str], + sample_col: str, + block_size: int, +) -> None: + """Validate required columns and basic argument constraints.""" + missing = [f for f in factors + [sample_col] if f not in df.columns] + if missing: + raise StudyDesignerError(f"columns not found in input: {missing}") + + if block_size is not None and block_size < 1: + raise StudyDesignerError("--block_size must be >= 1") + + na_mask = df.isna() + blank_mask = pd.DataFrame(False, index=df.index, columns=df.columns) + object_cols = df.select_dtypes(include=["object", "string"]).columns + for col in object_cols: + blank_mask[col] = df[col].astype("string").str.strip().eq("") + + missing_mask = na_mask | blank_mask + if missing_mask.any().any(): + missing_by_column = missing_mask.sum() + missing_by_column = missing_by_column[missing_by_column > 0] + details = ", ".join( + [f"{col}: {int(count)}" for col, count in missing_by_column.items()] + ) + raise StudyDesignerError( + "input table contains missing values; please clean the input first. " + f"Missing counts by column: {details}" + ) + + +def normalize_factor_columns( + df: pd.DataFrame, + factors: list[str], +) -> tuple[pd.DataFrame, list[str]]: + """Create normalized internal factor columns used for stratification.""" + work = df.copy() + strat_cols = [] + for factor in factors: + col = f"_strat_{factor}" + work[col] = work[factor].astype(str).str.strip().str.lower() + strat_cols.append(col) + return work, strat_cols + + +def compute_block_sizes(total_samples: int, block_size: int) -> dict[int, int]: + """Compute block size map where the final block may be smaller.""" + n_blocks = (total_samples + block_size - 1) // block_size + block_ids = list(range(n_blocks)) + return {b: min(block_size, total_samples - b * block_size) for b in block_ids} + + +def _allocate_matrix( + row_totals: dict[int, int], + col_totals: dict[str, int], + rng: np.random.Generator, + context: str = "", +) -> dict[int, dict[str, int]]: + """Allocate integer matrix matching row/column margins. + + Uses fractional quota target + floor + largest-remainder increments while + respecting both row and column deficits. + """ + row_keys = list(row_totals.keys()) + col_keys = list(col_totals.keys()) + + row = np.array([row_totals[k] for k in row_keys], dtype=int) + col = np.array([col_totals[k] for k in col_keys], dtype=int) + total = int(row.sum()) + + if total == 0: + return {rk: {ck: 0 for ck in col_keys} for rk in row_keys} + + col_total = int(col.sum()) + if total != col_total: + raise StudyDesignerError( + "ERROR: internal allocation mismatch (row/column totals differ) " + f"at {context or 'root'}: row_total={total}, col_total={col_total}." + ) + + quotas = np.outer(row, col) / total + alloc = np.floor(quotas).astype(int) + frac = quotas - alloc + + row_def = row - alloc.sum(axis=1) + col_def = col - alloc.sum(axis=0) + + while int(row_def.sum()) > 0: + best_score = None + best_cell = None + for i in range(len(row_keys)): + if row_def[i] <= 0: + continue + for j in range(len(col_keys)): + if col_def[j] <= 0: + continue + # Tiny random tie-breaker keeps output reproducible with seed. + score = frac[i, j] + float(rng.random()) * 1e-9 + if best_score is None or score > best_score: + best_score = score + best_cell = (i, j) + + if best_cell is None: + raise StudyDesignerError( + "internal allocation failed to resolve deficits" + ) + + i, j = best_cell + alloc[i, j] += 1 + row_def[i] -= 1 + col_def[j] -= 1 + + return { + row_keys[i]: {col_keys[j]: int(alloc[i, j]) for j in range(len(col_keys))} + for i in range(len(row_keys)) + } + + +def _hierarchical_leaf_targets( + df_subset: pd.DataFrame, + factors: list[str], + block_totals: dict[int, int], + rng: np.random.Generator, + prefix: tuple[str, ...] = (), +) -> dict[tuple[str, ...], dict[int, int]]: + """Recursively allocate counts for each factor combination per block.""" + current = factors[0] + level_counts = df_subset[current].value_counts(sort=False, dropna=False).to_dict() + level_alloc = _allocate_matrix( + block_totals, + level_counts, + rng, + context="/".join(prefix) if prefix else factors[0], + ) + + if len(factors) == 1: + leaf_targets = {} + for level in level_counts: + leaf = prefix + (level,) + leaf_targets[leaf] = { + block: level_alloc[block][level] for block in block_totals.keys() + } + return leaf_targets + + leaf_targets = {} + for level in level_counts: + sub_df = df_subset[df_subset[current] == level] + sub_block_totals = { + block: level_alloc[block][level] for block in block_totals.keys() + } + sub_targets = _hierarchical_leaf_targets( + sub_df, + factors[1:], + sub_block_totals, + rng, + prefix=prefix + (level,), + ) + leaf_targets.update(sub_targets) + + return leaf_targets + + +def assign_factor_targets_to_blocks( + work: pd.DataFrame, + strat_cols: list[str], + block_sizes: dict[int, int], + rng: np.random.Generator, +) -> pd.DataFrame: + """Assign block ids by matching hierarchical proportional targets.""" + block_ids = list(block_sizes.keys()) + + work["block"] = -1 + + # Compute exact per-block targets for every factor combination using + # hierarchical proportional allocation. + leaf_targets = _hierarchical_leaf_targets(work, strat_cols, block_sizes, rng) + + # Group sample indices by full factor combination and assign per block. + grouped = work.groupby(strat_cols, sort=False) + for key, group_df in grouped: + leaf = key if isinstance(key, tuple) else (key,) + indices = group_df.index.to_numpy().copy() + rng.shuffle(indices) + + offset = 0 + block_plan = leaf_targets[leaf] + for b in block_ids: + take = block_plan[b] + if take > 0: + chosen = indices[offset : offset + take] + work.loc[chosen, "block"] = b + offset += take + + if offset != len(indices): + raise StudyDesignerError( + "internal assignment mismatch while distributing samples " + f"for factor level {leaf}." + ) + + return work + + +def shuffle_within_blocks(work: pd.DataFrame, rng: np.random.Generator) -> pd.DataFrame: + """Shuffle order inside blocks and add 1-based position within each block.""" + + # Randomize sample order within each block (reproducible with --seed). + # This keeps block composition intact while removing any deterministic + # ordering that comes from allocation steps. + work["_within_block_shuffle"] = rng.random(len(work)) + work = work.sort_values(["block", "_within_block_shuffle"]).copy() + + # Position of each sample inside its block after shuffling (1-based). + work["block_position"] = work.groupby("block").cumcount() + 1 + + return work + + +def assign_blocks( + df: pd.DataFrame, + factors: list[str], + block_size: int, + seed: int, +) -> pd.DataFrame: + """Orchestrate full assignment pipeline.""" + rng = np.random.default_rng(seed) + + work, strat_cols = normalize_factor_columns(df, factors) + block_sizes = compute_block_sizes(len(work), block_size) + work = assign_factor_targets_to_blocks(work, strat_cols, block_sizes, rng) + work = shuffle_within_blocks(work, rng) + + # Drop internal stratification columns + work.drop(columns=strat_cols + ["_within_block_shuffle"], inplace=True) + return work + + +def build_summary_tables( + df: pd.DataFrame, + factors: list[str], +) -> tuple[pd.DataFrame, pd.DataFrame, pd.Series, int, int]: + """Build summary tables for printing and optional export.""" + assigned = df[df["block"] >= 0] + cols = ["block"] + factors + counts = assigned.groupby(cols).size().reset_index(name="n") + + pivot = counts.pivot_table(index=factors, columns="block", values="n", fill_value=0) + pivot = pivot.astype(int) + + sizes = assigned.groupby("block").size() + last_block = df["block"].max() + last_size = int((df["block"] == last_block).sum()) + full_blocks = df[df["block"] < last_block].groupby("block").size() + full_block_size = int(full_blocks.iloc[0]) if len(full_blocks) else 0 + + return counts, pivot, sizes, full_block_size, last_size + + +def print_summary(df: pd.DataFrame, factors: list[str], summary_path: str | None = None) -> None: + counts, pivot, sizes, full_block_size, last_size = build_summary_tables(df, factors) + + print("\n=== Block assignment counts ===") + print(pivot.to_string()) + + print("\n=== Block sizes ===") + print(sizes.to_string()) + + if full_block_size: + print(f"\nFull block size : {full_block_size}") + print(f"Last block size : {last_size}") + + if summary_path: + counts.to_csv(summary_path, sep="\t", index=False) + print(f"\nSummary written to: {summary_path}") + + +def main(): + cfg = parse_args() + try: + df = load_and_prepare_input(cfg.input_path) + factors, sample_col = resolve_column_args( + df, + cfg.factors, + cfg.sample_col, + cfg.columns_mode, + ) + validate_inputs(df, factors, sample_col, cfg.block_size) + + df = add_original_index(df) + + result = assign_blocks( + df, + factors=factors, + block_size=cfg.block_size, + seed=cfg.seed, + ) + + result.to_csv(cfg.output_path, sep="\t", index=False) + print(f"Output written to: {cfg.output_path}") + + print_summary(result, factors, cfg.summary_path) + except StudyDesignerError as exc: + sys.exit(f"ERROR: {exc}") + + +if __name__ == "__main__": + main() diff --git a/tools/misc/stratified_block_randomization.xml b/tools/misc/stratified_block_randomization.xml new file mode 100644 index 000000000..acdb94ade --- /dev/null +++ b/tools/misc/stratified_block_randomization.xml @@ -0,0 +1,124 @@ + + for hierarchical block-based balancing with proportional matching via largest-remainder rounding. + + 0.1.0 + 0 + + + + + + + + + topic_3678 + topic_3391 + + + operation_3802 + operation_2430 + + + numpy + pandas + + + + + + + + + + + + + + + + + write_summary + + + + + + + + + + + + + + + + + + + + + + + 10.5281/zenodo.3509134 + 10.25080/Majora-92bf1922-00a + 10.1007/978-1-4612-1192-1 + 10.1007/978-1-4419-9246-8 + + \ No newline at end of file diff --git a/tools/misc/test-data/samples.tsv b/tools/misc/test-data/samples.tsv new file mode 100644 index 000000000..54abd4c0d --- /dev/null +++ b/tools/misc/test-data/samples.tsv @@ -0,0 +1,510 @@ +sample group status +993fc6dc-120b-42a7-8c42-756e3ff8a03c group_01 status_01 +57916f7b-048c-4eef-a004-750be23ae7bc group_01 status_01 +58453668-a4ad-4afd-b975-787017fe13cb group_01 status_01 +dd31c1a8-d048-4155-94fb-f6d530db865b group_01 status_01 +ff868ab8-c6c5-462b-a6d1-18061ed3f7dc group_01 status_02 +cd1441a7-7d7f-44f4-a824-0d5a74ca2d9a group_01 status_02 +b8386d0c-6316-40e9-a24f-99ce62cdf73d group_01 status_01 +88948ce3-1d4c-4853-9444-72498df2a40f group_01 status_02 +d2a36738-4ec6-481f-9ff2-13b48758c6d9 group_01 status_02 +8270584a-2481-4d1c-a209-660620f9fcc1 group_01 status_01 +e082d6e1-bef4-47e4-accb-8fa662757225 group_01 status_01 +d8d5227d-7cb7-4d9b-9a5c-052d77abe4ac group_01 status_02 +8ce67629-9e19-41dd-bd11-41248f203d09 group_01 status_02 +c421df70-e916-48fa-a27a-703c9e501f63 group_01 status_01 +f7b64a4a-4cd6-4b8a-92a8-aeb2dfa0c9ac group_01 status_02 +97113402-ba71-4491-8cbc-9d1c607fe2c4 group_01 status_01 +b282fd64-24b4-4c6d-b6f8-8435d7873603 group_01 status_01 +158b60e3-38b6-4b39-842b-93ff3503f68a group_01 status_02 +059acc74-a696-4747-bbb2-635b9161b02d group_01 status_01 +1f1fb5cf-7325-4db0-a985-26ece62bbd48 group_01 status_02 +88b19aaa-95dc-4532-ac06-89870fa8eb00 group_01 status_02 +aa819a71-ac46-4528-9516-5cce1cad91c3 group_01 status_02 +6970c4c9-dfdf-40d0-a90e-66e06f208282 group_01 status_01 +bb49a265-4713-42cf-9bb0-8bb08c5fc36d group_01 status_01 +995ea439-748c-45ce-8994-1c5940d880f1 group_01 status_01 +f9a14024-2cf0-4111-b0e0-a0dd508b7824 group_01 status_01 +eecae6c1-8244-4aad-a47d-3a8b69b338af group_01 status_01 +a191b7bd-395e-4a62-b8b6-f5ccc520123f group_01 status_01 +35520563-a526-4524-a6de-6d4b08abee90 group_01 status_02 +5dc1d3b0-1254-4f6a-9d81-036e5985f5af group_01 status_02 +e0bf6ce2-2d32-4472-8016-50ff9e45a05b group_01 status_02 +8e3933dc-c521-4f58-8960-7e57c99ade31 group_01 status_02 +96f2aed2-1c69-4bb5-b858-fe7f26629e18 group_01 status_02 +63cc8ad6-aeb9-431e-84f0-7e1d12dd7e79 group_01 status_01 +86fbd08c-7b93-4bbc-ab15-1fef37ea9945 group_01 status_02 +b6033c1b-0ee7-4320-8888-94c80707095a group_01 status_01 +bf4da50d-8b38-4bf7-ac58-9659a2d58efb group_01 status_01 +2ca5e0e7-fc8f-4314-89e8-318091031930 group_01 status_02 +136c7e2e-abe2-41fc-bd7d-d7756756da51 group_01 status_02 +f84805cb-9d92-4c67-9ba1-33ae6ff7d909 group_01 status_02 +0179eb58-85f0-4ac4-9529-1a78f53dceed group_01 status_02 +cfca4146-2fe3-48b0-af94-674c18a63e47 group_01 status_02 +8a94035c-f5b3-4515-bb3b-e68541194f25 group_01 status_02 +a9f5a114-a641-4da3-b1b9-48a24a259908 group_01 status_02 +9ba33db9-f10c-456f-8c77-c43f27cce81b group_01 status_02 +e6926132-1ef9-4b4f-870a-ffc43ac15f3d group_01 status_02 +24295f19-ce68-48e1-938a-4073dc21421c group_01 status_01 +be5ade81-14c6-40b6-b4b7-e21d87c97c9c group_01 status_01 +db4b7587-be9a-408c-ac6f-ed6cf01b14d5 group_01 status_01 +c69cd6fd-258c-4d5f-8671-d547d8bd43d4 group_01 status_01 +c8cbdcb8-b041-4af7-938c-08deb2af2132 group_01 status_01 +7f242d72-58f0-490d-9d54-8346dbf714e1 group_01 status_01 +40496ef7-189a-4bc6-a74a-b5cf05e59ff8 group_01 status_01 +199ea290-06f3-4ec6-94e1-ff7861ff299b group_01 status_01 +876dc8b4-4da9-4fc9-bc0a-537032fd096f group_02 status_03 +a05955bd-e361-4979-868a-a32ac4287d34 group_02 status_04 +08b79c18-712a-4c61-a2d3-e5011f56bb37 group_02 status_04 +aabd8e40-4d55-43c1-9def-96d31c317f7a group_02 status_03 +e411531d-9382-4401-a354-7293ad9fc207 group_02 status_03 +faf99431-b158-4a8f-bfcf-f0d8c19452b7 group_02 status_03 +dcbe857c-611c-4766-a6e4-951c49a1b1f5 group_02 status_03 +a0a61f91-b0f4-405b-9378-e8fbab86561b group_02 status_03 +0bdc5d12-9aea-48e2-977a-5b9285243aff group_02 status_03 +28cef3c5-1af3-4fb6-be96-b33ed662df3a group_02 status_03 +f0098c6c-4180-41ce-8289-d3e260da5e62 group_02 status_03 +4407f78b-eb0b-4356-92d5-d8e966f1f680 group_02 status_03 +64f1c313-bd1f-4fe7-8d61-318efa59b1dc group_02 status_03 +f22b1bc6-789e-4474-b84a-4d3b09033105 group_02 status_03 +cc379750-1553-4877-955c-406eb0b6ab5a group_02 status_03 +5df83bbd-b844-414a-8a2a-cae3e0ec44eb group_02 status_03 +97d84e71-8036-4040-82c6-e411fac89b13 group_02 status_03 +b3a43cf9-58aa-4721-8458-db22442af5ea group_02 status_03 +17b00257-1724-4911-8c7f-b162f83a668e group_02 status_03 +0217b041-9891-42a4-9f98-0b6fec3d8574 group_02 status_03 +360ea181-b89d-41da-8894-37f38c68a72c group_02 status_03 +65a2cd98-c65d-4837-b9b9-7310bdfb9ac9 group_02 status_03 +ffe00111-f859-4708-b450-2e465f55a7a4 group_02 status_03 +db1f5061-317f-4ef8-bd6b-a1cad386371f group_02 status_03 +69e64c63-7e01-4551-b2d0-48a1021b9db1 group_02 status_03 +01011bef-1a66-47bd-b2a3-4c29cf41e1e4 group_02 status_03 +10a656e4-7ff0-41ff-a051-25f709e6be70 group_02 status_03 +b990f3dd-8194-4f12-8115-b694ad3d5384 group_02 status_04 +69298ea3-1497-46d5-afa0-a9266471fb9c group_02 status_03 +de4e3e77-10e7-4547-ac9e-5bad4923f3ed group_02 status_03 +7b11b141-f282-491f-bbae-faa8158b5bd3 group_02 status_03 +4cdd00c0-8f1a-4d4f-b3fa-53b4b707baa7 group_02 status_03 +d91dc172-72ec-4a69-b800-999268765e27 group_02 status_04 +9cd25df2-f692-4736-9f28-09afe86b0c52 group_02 status_03 +1569cbca-469a-45d9-bbd6-a4d8ce6c794c group_02 status_03 +d66b71e9-c753-4313-bbbf-e73655bfc93c group_02 status_03 +779ae253-2d7e-4d65-8179-c0364b766b03 group_02 status_03 +a4cf4099-6625-417c-b135-8ab7a751591c group_02 status_03 +75d766eb-467e-4e2f-85cf-f846549ec216 group_02 status_03 +5cde2347-5af4-4ac5-a57c-049947cc7e0a group_02 status_03 +57c30303-a906-43e8-a76b-8fb35e0c3b24 group_02 status_03 +5a3cd678-9ef4-476a-a5ef-ea030f6a78cf group_02 status_04 +9f55f6c6-dfd8-4abf-8078-c559cb9be2ee group_02 status_03 +0ee3ee1d-6377-45b5-897f-efb5e1a9cf8b group_02 status_04 +85e0b9fa-9d77-4d8a-9c5d-97a24820b6ec group_02 status_04 +17da2c8c-0b32-4cb2-855c-ea0801f7e47e group_02 status_04 +37d1fa33-b4e7-4388-a5ea-5abc028feb45 group_02 status_04 +87c4ac5a-2e80-4f97-99ae-2bc7815aec6a group_02 status_04 +70c6f448-7e97-4b03-87c9-fe609ef1d133 group_02 status_04 +daa30da2-f0bb-40c7-ad3f-7e06c532860c group_02 status_04 +eaf0992a-f13e-4f3b-af40-db33e17ed74b group_02 status_04 +e1ec7f37-de51-49d8-b2e5-bcad8b8dc639 group_02 status_04 +754b83a1-6058-46cb-bb83-7ab20c417445 group_02 status_03 +827a3f76-12af-4ced-abe4-58d9231bede1 group_02 status_03 +ac693e67-6de0-4417-abc7-7031877b42f6 group_02 status_03 +d923a635-bd71-49be-9eb1-887f6a4f5f0e group_02 status_03 +cb9469b0-9fcd-46f7-be46-ef2f1c9a0934 group_02 status_04 +9603407b-5cb8-43f9-9f99-3d7ab608ba86 group_02 status_04 +f1fd0cd8-5dcb-4586-805f-dd28a72e7c2e group_02 status_03 +65e4ed72-0c9b-4814-bda2-1b5c9aa1c09a group_02 status_03 +4b566e2f-4d19-479a-b49f-5a326f6a3962 group_02 status_04 +30e66b8f-7821-4b3d-80f2-737567564b19 group_02 status_03 +76273a1c-b906-44de-a1ba-29dc33d45f86 group_02 status_03 +6218f291-37e2-4b18-a2d4-ee0f75b7209a group_02 status_03 +35967035-dd1c-489d-9b15-82e615516daf group_02 status_03 +ca68a434-284e-4477-8278-3f8d779af0ac group_02 status_04 +1b46afc6-9405-4a1c-9dd7-25e99733a546 group_02 status_04 +321c033a-6bf7-4a56-8c57-613a6bdc921b group_02 status_04 +c3523dc1-4dc6-46a5-8ac8-55bfc2f40e56 group_02 status_04 +a61ba05b-229d-4be0-91b6-cf606fdf814a group_02 status_04 +39503098-5ba3-4963-9472-3346cf3e6ffb group_03 status_02 +1b755088-3e45-4651-9de6-f3e3edd63664 group_03 status_01 +a37afb18-bb78-468c-8cf0-8a2d25b18c76 group_03 status_01 +dedaf4b7-6329-4ea2-b014-d75f9734763d group_03 status_01 +021340dd-d351-4778-97fb-6d99f9454f5d group_03 status_01 +b2797dd2-0ff5-4127-95c3-614a05318ea5 group_03 status_01 +09619ee2-34e4-474d-8ec5-8cc390c35364 group_03 status_01 +85bc1025-c4fc-42ef-9475-09749f39e4fc group_03 status_01 +9b39a9d3-aff9-4952-a28d-2d6f9c4e0026 group_03 status_01 +3772e870-0c1e-47ea-a76e-32e4896d785d group_03 status_01 +e13ce83e-e2ab-4946-87d6-80974894a5c2 group_03 status_01 +1a91900e-34fe-4bf5-894f-4e44ef20a03c group_03 status_02 +6d30343d-f37a-4ed7-b81b-687e46d3b49c group_03 status_02 +ad7d2d01-5248-4b01-a5b6-4694582332b0 group_03 status_02 +763cb50d-a096-4d9d-88dd-1ea0991ad5fd group_03 status_02 +0129eac3-9223-4f16-9794-ae538a7ac6fe group_03 status_01 +5cca04b1-f504-49b9-82f0-9f351dfaa2d4 group_03 status_01 +8a2d341a-4cca-45f1-aceb-669ea021cba4 group_03 status_01 +72edd8e8-ebfa-46f3-a786-1585d487a195 group_03 status_01 +c584bf16-d2d6-4032-9aec-b0c074b5b8fb group_03 status_01 +2a7afd16-a201-4952-b818-be330c4bb532 group_03 status_01 +85b41639-71aa-4de3-aad2-16c9de5c2d66 group_03 status_02 +b5bcf35a-41d2-4ff4-92f7-ff5df71f1834 group_03 status_01 +546c312e-450b-40da-a151-a9a316494baa group_03 status_01 +164ad750-b65b-40a4-8bce-8d2d364bfb56 group_03 status_01 +6f92247a-b99c-4937-9de3-74a79c790a91 group_03 status_01 +72886913-ab57-4f27-bf1e-4ed335e8f59e group_03 status_02 +3b2cd72a-6068-4402-9ee9-0113751ac5ff group_03 status_02 +550e5412-fd11-44bc-bd83-c78b1c2e3c3d group_03 status_02 +115ff9ca-e40d-4eaf-a06a-1f31a5f28071 group_03 status_01 +02c86ffa-a6a6-4485-b826-1511d517fd4f group_03 status_01 +55d05cbc-ed64-4162-b0a3-8cc17a4cac82 group_03 status_01 +811ab68b-c212-40a6-b12b-0a13243369fc group_03 status_01 +ab5f07af-4718-4c40-9775-212e8b925efa group_03 status_02 +d5d81be9-229a-41f4-818e-a1dffa59e1b5 group_03 status_01 +74bfe980-7fae-431c-8f0d-98d8b5efa677 group_03 status_01 +cbd88703-2a8e-4dd4-a5b7-72d7498cf1e6 group_03 status_01 +3648ce06-b170-407f-bb0f-36c2b4021bd7 group_03 status_01 +0ca13030-5176-4bc6-a01c-78550c5179ef group_03 status_01 +b83329d2-cde1-403c-a932-571aee49ae8d group_03 status_01 +79cbec9f-179f-4562-b237-67c69755d129 group_03 status_02 +4f684d13-949e-414b-9c19-c1a840768daa group_03 status_02 +de20bc32-9096-4813-b07c-d03f312fa307 group_04 status_05 +eab2072b-5901-4b58-a7ba-dcceabfa5304 group_04 status_05 +74b1b821-d883-4a02-b561-f5da58ec6335 group_04 status_05 +5fae6992-422d-4ad7-b388-1b25eb84d2dd group_04 status_05 +a29d3937-759f-4a94-b96a-8240c7d9be1c group_04 status_05 +fe1d0452-588d-4ec0-bcb5-6750100f50ee group_04 status_05 +d07b2d76-b949-45e1-a79b-65e813f6f799 group_04 status_05 +36eb1fbc-3cd8-4327-99d8-770242512d9c group_04 status_05 +ff4e7688-0a94-4ddb-b80c-783065cc69b7 group_04 status_05 +ba912f02-a606-4507-99e4-4a34f7142e5a group_04 status_05 +57c246de-65ca-49ca-af16-1895ce7ea792 group_04 status_05 +f60dfb57-754d-4fec-9c75-714cf0d4d971 group_04 status_05 +329b940e-16ad-4042-acd0-32cf9b35d2c8 group_04 status_05 +979369a7-10d3-4acb-8edf-7afb4979c671 group_04 status_05 +df1aa7fd-0cfe-4f89-8fe0-5ec1f6932d43 group_04 status_05 +cf62ed69-15b3-4465-801b-45437d543f48 group_04 status_05 +001d2f52-00cf-43f6-9adb-06e2fe036ec6 group_04 status_05 +048b2790-42c6-4a65-9d50-893698425cf8 group_04 status_05 +aab77fe8-c0db-4b68-b1c8-1d2fff8f9795 group_04 status_05 +3a3644c0-0258-4578-b48a-fa58b18f08a1 group_04 status_05 +139855cf-036f-409f-b52b-31f48c0bf976 group_04 status_02 +c87cc3b7-8cd0-473b-bba1-2157a4dbfb23 group_04 status_02 +95f62df4-f019-45fc-adc3-6cfb75d1b5cb group_04 status_02 +b1d93dde-a9ad-4704-b8a9-d161fefcaa60 group_04 status_02 +d99e7026-dd8d-4bc8-af58-ad2c3b857cdc group_04 status_02 +3a6e08ab-92ff-4599-909f-c0227637c561 group_04 status_02 +8cb9f524-8b2a-46f3-99be-3823221a8eb2 group_04 status_02 +f61bfd8e-bcc4-4e72-ac78-d2acdb5b1a62 group_04 status_02 +4594e93f-4e9a-402c-9184-ec743bc60511 group_04 status_02 +332f5aba-b026-47b7-be73-09eef343adfb group_04 status_02 +0685992a-1ce7-46ff-acb3-6a0e429a3892 group_04 status_02 +7739b500-38fa-4722-9ab3-e4591a03e16c group_04 status_02 +71c01d35-a4ed-4871-b109-ed5c99c9bc53 group_05 status_01 +d6457d6d-ba20-406f-9f60-6b6afcf19edb group_05 status_01 +09eba1ac-e385-4b11-ab51-b81fe56bd00c group_05 status_02 +1632789c-55be-4b4e-b755-c9350e182461 group_05 status_02 +88948291-660d-4399-a8a1-0e28ab61f846 group_05 status_02 +3391f497-ca25-4539-aee7-42d99d83cf46 group_05 status_01 +57d4056e-76aa-4640-8281-30598adf2d8d group_05 status_01 +e5a381cc-ed25-4cf3-b23d-8487c2c60641 group_05 status_01 +5b8701cc-dbfe-4b96-bdcf-db114e840420 group_05 status_01 +efc6f1a3-1d97-45bb-9c16-e9d0ee1a5c74 group_05 status_01 +4d08cd48-a0c9-4caa-9bd9-a59c8248cb6e group_05 status_01 +8eadab77-a306-4761-9ffd-ce4248ea99de group_05 status_01 +1c758b4d-3cc2-4616-95a9-ef43e1c6383a group_05 status_02 +e9f2ff94-18f5-4323-b46a-ae1f40e3cf6a group_05 status_01 +d5a5ba28-4f2a-4cce-8fd1-e6dba04b9d9f group_05 status_01 +e4928625-e686-4042-b1bb-896880276e61 group_05 status_01 +0ea3b634-afbe-4062-a9f1-8769ebd09dc9 group_05 status_01 +070814b4-9c77-4f3f-8420-12c0afa55859 group_05 status_01 +e04903f3-31e3-4c99-8f11-aafc00c6b72e group_05 status_02 +7d274182-30b2-462f-9d57-df9c94c52a68 group_05 status_02 +ca199670-2d4c-42b0-80a3-b980a57ac663 group_05 status_01 +afd840a8-a4f6-4e04-84fa-b041d2ea37f9 group_05 status_01 +bc55ce2e-6f50-43d4-9d7d-82c886967cc5 group_05 status_01 +5e18426c-b986-43ef-91b2-a6f2a2d6c97f group_05 status_01 +d25fa2e1-eb0c-4f19-81ad-e10d84da8a85 group_05 status_02 +03f9b7b6-3d29-4232-9e4e-c6e91072ed61 group_05 status_01 +19ac82ed-fe0e-41c7-b716-217693c39a7a group_05 status_01 +5f788271-8da1-4287-a49d-52664f4761c8 group_05 status_01 +4171de21-9803-41fd-aeaa-15bc70066230 group_05 status_01 +5c6f8120-a0c7-4d1b-9073-e18af1b3ad05 group_06 status_06 +603411f5-907d-429c-83ed-2329ba55967f group_06 status_06 +5aabcdee-63ec-4c2c-bca7-434fa78b7e96 group_06 status_06 +01c8cbfe-ff21-4be3-8917-5602059f954f group_06 status_06 +70662a3b-27f4-478a-9d30-0e2d84173a3a group_06 status_06 +6b237bbd-a600-4bf9-bdec-44e0b4ba7b65 group_06 status_06 +6c89ef40-f2d3-40c7-ba1e-9764b5e4fde4 group_06 status_06 +deac8467-c829-4a22-b64e-098525eaebab group_06 status_06 +a4117477-af83-4f3a-8089-eabce33b0bef group_06 status_06 +0ffbaf6f-fc3e-4477-acd6-6b1e7941590b group_06 status_06 +642ec173-038a-4e8e-bd19-b07411b51c77 group_06 status_06 +fdeef429-67f1-4661-b3ee-0180815a4e06 group_06 status_06 +54530e34-58d8-474b-9401-9db7b015ac50 group_06 status_06 +202e25db-e9dd-43fd-bfc6-b960e2052b02 group_06 status_06 +c51dbe0e-b745-4765-a6e3-13173eed3fd9 group_06 status_06 +b9163546-730e-44d0-8c67-4d481f914431 group_06 status_06 +abd82314-7ce8-436a-b193-e7c5f2a2e481 group_06 status_06 +f14c8fe6-f4d7-4afa-a3ef-0f859751cc47 group_06 status_06 +93930342-4040-45cd-be63-9f7885c763fe group_06 status_06 +81500fab-a441-4468-807d-e4d6ce15f66e group_06 status_06 +6d5e161e-ba94-44a4-b7f0-12d56b16ab02 group_06 status_06 +3b4c5955-c4c3-43f2-a988-306a2a35027e group_06 status_06 +a0785053-36a7-4dfe-969f-5d15bfdfc79f group_06 status_02 +0d7262ec-70ba-47e8-92eb-88556be32f2f group_06 status_06 +3e29c662-47bb-4ec1-ad2d-04a0052100ec group_06 status_06 +e81cc3ec-24cb-4177-b03b-811621dd7043 group_06 status_06 +77dec4ff-3a02-4d6c-b1b1-46cd9b8a2b07 group_06 status_06 +d2e0b1e5-3127-4499-a70e-ba0e9d9bd5b4 group_06 status_06 +7491181c-2bfd-42f2-8467-e9318a7a8d8b group_06 status_06 +e986f9d3-2655-4ae5-a565-0b2d8c2631cf group_06 status_06 +1c582cff-d1fd-475e-96c4-f6cc3fc48338 group_06 status_06 +397180a1-f6cc-4222-aa34-b7e263b596b9 group_06 status_06 +d67a3eb5-2f2a-4a98-9ac5-c899711ea02a group_06 status_02 +c6010264-0589-4a5e-b31c-0e9c090134c8 group_06 status_02 +8a100da5-d896-4e5f-b34b-1e0feb20c4b8 group_06 status_02 +5e5337d7-a2b7-492f-ae08-6f973188bed8 group_06 status_02 +073e76f7-a7d1-44bd-b18e-e1d86110bcbc group_06 status_02 +746d5420-3267-4a81-8fd3-364eff6cefcb group_06 status_02 +66de07d4-15a2-4d9f-bf08-df2011b2b852 group_06 status_02 +f4dce2b2-3e5f-4f1b-b85c-9301a1042066 group_06 status_02 +a26fa6c9-d8a1-4dc5-8631-fa47a268cf6d group_07 status_06 +d0b944ba-d842-40b1-a8cb-d17e9a0dd01c group_07 status_06 +05d4a0b2-10fc-4d52-88f0-699614590149 group_07 status_06 +ae1066e3-8e3c-490d-919a-98030473a359 group_07 status_06 +7a7c1490-0f2c-4308-884a-0656f5c1e181 group_07 status_06 +931123c8-d98a-4143-97f9-5c03615eb97f group_07 status_06 +e3a7791c-f5e8-475f-a375-d249be6d7cdb group_07 status_06 +88daa839-a6f6-4395-9004-40e6c5f24dca group_07 status_06 +f5d003a9-03e4-49c9-a4e6-3a8b6d18a726 group_07 status_06 +c7bf68e1-ca91-4515-9c08-4c3f518dc920 group_07 status_02 +2f2f67c4-8754-49d4-83f0-b93fed3cfadb group_07 status_06 +98826998-a893-4c4a-8df8-45ae49014787 group_07 status_06 +53c1037f-8017-4f07-9f83-7f8bce1d3b46 group_07 status_06 +5c86fea3-19b3-4428-8f96-1189cf32f00d group_07 status_02 +164b0867-0baf-406e-8f63-27c596242929 group_07 status_02 +a39019e3-453a-4ede-8772-5fe3dab4afef group_07 status_02 +12452a13-0cc5-466a-a976-3194f3b259e2 group_07 status_02 +987350ce-2367-4973-a255-1ac7a47ff61f group_07 status_02 +7ffda8dd-c4fd-40fc-a5f2-63fdd2c1250f group_07 status_02 +ea2d3b8d-9da5-47fc-b315-98a29ff6da9c group_08 status_01 +42c2750d-1ca3-48b8-a9a5-495aa05d22d4 group_08 status_01 +49dbc04f-5d07-4bb8-859a-fd9d2a457011 group_08 status_01 +98c5178d-5bf0-4a04-a8b2-693ecd427c86 group_08 status_01 +db00db4c-6c5f-48d7-ae02-7f7042d027d0 group_08 status_01 +4d124d2f-3d9e-4cb4-9f7e-8c5ee2060bfd group_08 status_01 +9060ed04-32cd-46ff-a5df-226d13ba1cf6 group_08 status_01 +468377ce-4125-4c48-bbdf-61ef250d3385 group_08 status_01 +9eadf0db-4a0b-42d0-b745-73fd63a03b2d group_08 status_01 +ceaf26c5-f94f-405f-b1f2-789e44a1e9d7 group_08 status_01 +40e35453-f8ef-44e1-9bea-37463dc52973 group_08 status_01 +e44c4f85-2eef-4953-9ebe-3c1876583854 group_08 status_01 +425bb61e-e2fd-413c-bb34-98a03ed14ae4 group_08 status_01 +d932caa8-7962-47b1-b782-eff17d9cf97c group_08 status_01 +3bda2f52-253d-4ef3-9820-82af95b6f636 group_08 status_01 +0006630b-0c07-4db1-a900-dfb2bd64db22 group_08 status_01 +2844908c-6a89-4282-ab07-2295a818922e group_08 status_01 +29e88931-f61b-4356-ab90-f268c27c7e6f group_08 status_01 +863d0927-bcbe-42bf-b7bc-1775a7dcdc71 group_08 status_01 +0e7535b3-e7ea-46d9-bd7e-192af91c5440 group_08 status_01 +0c0fda6b-0903-4667-ad3c-712ad24325e5 group_08 status_01 +3ed99046-eced-469b-95f4-42755b3d319f group_08 status_01 +6597ecd1-24a5-4304-83c1-8ec34650b5b7 group_08 status_01 +3a37fac0-864d-4cc7-adfc-9581f585a4a4 group_08 status_01 +f255a01a-74f1-4ee8-996b-fbce138b809e group_08 status_01 +9cd0d341-3a65-439d-84d5-97af8510b353 group_08 status_01 +19b42603-a065-4c41-955e-ef6cac764996 group_08 status_01 +c5c69ca1-2fed-4aa9-9e18-cc56e6518b39 group_08 status_01 +8f875437-fd21-4ffd-a107-2abb96f3dc06 group_08 status_01 +2b13f8a2-deb7-4c52-9bed-05c83bb65939 group_08 status_01 +e57c61a4-fc8f-48ff-b70e-205476cb011e group_08 status_01 +bf105484-280c-4f28-b132-51bb516f47ad group_08 status_01 +54e83db3-7d9a-4a85-94fa-074dd824d142 group_08 status_01 +04a16b75-a338-4777-b7bb-565694c2fd6f group_08 status_01 +9eb19bfd-20b4-43b7-9419-90871e998679 group_08 status_01 +a1eaf6b8-29fe-42c0-9ecd-3fa3f5f3e3e8 group_08 status_01 +6e97792f-3c88-48cc-b2ae-c08f4a176d9c group_08 status_01 +f1cb8bb8-1446-4822-81c8-626160ccf1e3 group_08 status_01 +ebb0e211-a37e-4948-8f32-5cd9bb0cc9c9 group_08 status_01 +b940441f-c63c-49ea-b1f7-63ab365a4263 group_08 status_01 +9586a2a4-7731-41e2-bfd7-7c72c270e699 group_08 status_01 +b6f2be62-aa2e-4684-9281-1ade9484de43 group_08 status_01 +ed8d081b-288b-4928-a1c5-e3d1b14caabc group_08 status_01 +532354b9-d434-4325-9590-e58266ae2a84 group_08 status_01 +5e028707-25e2-4036-a24f-3104dbd3869f group_08 status_01 +7b0535d3-748f-4560-a59f-87f259a05240 group_08 status_01 +cd52ff9b-f2d2-4784-bd83-05fb09cebae6 group_08 status_01 +264322e3-77a4-4cc8-aec2-1497369ade5c group_08 status_01 +255579e0-ebde-470f-8e26-da4cabe51b43 group_08 status_01 +3d40feeb-4bf9-49b1-80bb-45fe20a3b966 group_08 status_01 +ecd911ad-92ee-4451-8144-458a53a287fd group_08 status_01 +9a769263-7911-4ba1-82ae-66fb65d417b5 group_08 status_01 +91f2a161-c457-453e-9e1f-d8fdd5ba0f39 group_08 status_01 +9f5b1d11-d269-436d-a5a6-2afe9cac1172 group_08 status_01 +96097c57-b897-4743-ad7b-0327b0388821 group_08 status_01 +e09adc3b-eb17-4893-bbad-ab101abfef0e group_08 status_01 +2b169d53-0288-4796-a4d1-09180373c03b group_08 status_01 +26a8269d-4394-43b5-9546-438c0b97fd2c group_08 status_01 +b0dc77bc-df40-41d6-a772-ce454f8d72e6 group_08 status_01 +142edf5a-1ff3-4034-a2b6-7a840648f958 group_08 status_02 +8902eebf-43a9-4fbf-8f41-729be9e3980e group_08 status_02 +70c76956-910e-47d0-9f3d-34731e6a3e0a group_08 status_02 +f16d50cf-3dce-4c69-941e-af5a4b72a7f5 group_08 status_02 +6c42ce2c-9e8d-4040-8c45-fc0432f4b1a7 group_08 status_02 +6e518b1a-6335-4256-bbf9-86aaa5a66b65 group_08 status_02 +d63c2029-d9cb-4b40-be14-3673e4dcad89 group_08 status_02 +d09af4e9-a408-451c-9614-33ce3cd0233f group_08 status_02 +e966ce4e-ba5e-46a1-8130-9dedb1e4b950 group_08 status_02 +25d0ef20-66f2-45cb-81b4-2f5b698c49d6 group_08 status_02 +c755cca9-4d54-4378-a824-c0e818df15ef group_08 status_02 +f4eca9ff-a6ab-4b18-923d-abf539f2a65d group_08 status_02 +916efdf5-8d3b-4018-a060-b758c318831d group_08 status_02 +f6169910-c1fa-42a6-a572-189e8efc256a group_08 status_02 +98d9463d-224d-44ba-b367-f3d2dedb719c group_08 status_02 +dee2ae47-7991-4fd1-a329-db6dc8596abc group_08 status_02 +b32eb116-ce7b-43d0-97f7-73c5b84808f2 group_08 status_02 +159570f7-0914-45b2-a689-16bf3e45ae12 group_08 status_02 +53133d79-4c5b-4f78-81c5-7582a1dae9a1 group_08 status_02 +624c2f9a-f162-408e-8022-6da3053cab23 group_08 status_02 +4b762b02-6828-4725-9043-5c83d285f256 group_08 status_02 +4549e6cb-b75d-4e1c-a7da-ee2ebd22f846 group_09 status_01 +45d09a9e-a63c-4211-8bfa-a6cb1200ab87 group_09 status_01 +9bfb6718-5f48-490c-b629-df2cbbc6fb83 group_09 status_01 +f5e8d519-6015-4d32-a508-b792cfcaede4 group_09 status_01 +f829f0dd-ca5b-4150-b2a6-6d8066c05ad3 group_09 status_01 +1b16174f-5817-4b44-85e5-16c654cf8f72 group_09 status_01 +68e8fbfd-3256-4650-bef8-dd7eb5200730 group_09 status_01 +7f33cac0-540b-4a01-910f-c5ad2338118f group_09 status_01 +142e0efa-4ffc-4934-81f7-a48d83a13780 group_09 status_01 +82ae55c2-dcf8-4032-9a9e-1beba8ba9043 group_09 status_01 +1ad4137c-d9e0-4c63-b4c3-40c81c23d30a group_09 status_01 +f7c1a6eb-34cf-477c-9d57-50b98f9f8bb3 group_09 status_01 +af4877ad-8e98-4e82-b299-7acbf9c2d7f9 group_09 status_01 +38e36d5a-19fa-4d04-8ef5-beca6dccd615 group_09 status_01 +68061244-6b72-4642-8cb5-286545b661c9 group_09 status_01 +ca781327-a692-4a7d-9acf-440cd32d8e0e group_09 status_01 +57fcc6a7-61df-42d1-afae-a7095572b950 group_09 status_01 +a87fd8d9-9b89-4622-afaf-1f7d15888ba6 group_09 status_01 +420dd8ec-ac94-4b66-b9c9-20ae6325050c group_09 status_01 +f075a0a6-c2ba-43aa-89e5-b870537b3400 group_09 status_01 +84e5e299-e18c-4fa7-bc77-0d1657e5d621 group_09 status_01 +6f321c25-d48f-4694-abd5-145f7650b999 group_09 status_01 +eafae7dd-549b-4b48-9682-9388088e3db4 group_09 status_02 +dc14f12f-28ce-4858-a93b-d19bd6c5ce21 group_09 status_02 +c11a586b-9e0f-40ae-bc81-8e7df6b07c6a group_09 status_02 +24e5b3e9-dd86-42d9-81a9-cd0e46285a34 group_09 status_02 +8a0fcd3e-eabb-41e7-8283-ea1c649e1744 group_09 status_02 +528f5be5-3b3d-434a-b37d-745e641cce0f group_09 status_02 +e1894b30-8d36-4d46-9d0f-72116e18498a group_09 status_02 +5be0bda7-447b-4223-8954-b13424436afb group_09 status_02 +524b4d44-bcc8-471c-9f5e-720f79b79548 group_09 status_02 +2ebc41d4-4056-4365-945f-346983f72891 group_09 status_02 +a6ef58e8-0e31-4fee-b163-4fc2edbda83e group_09 status_02 +55c7fefe-dccc-4d74-b03e-52c499beb347 group_09 status_02 +969904f5-7ba7-4daa-8e53-975ed55d79f0 group_09 status_02 +3fcf597a-ec1f-43e0-9256-9bfb64a67d64 group_09 status_02 +7c0c731a-3c65-4dbb-a65a-b050255c4960 group_09 status_02 +63596482-755d-4894-a31a-99bba56d1a25 group_09 status_02 +5df1db1a-3db4-44f6-8056-82f7b57b81ce group_10 status_01 +08a29b65-d198-4e41-b0a1-e6a3f24ec8e3 group_10 status_01 +60e71eeb-3e07-4086-ad58-35f4ab0e6795 group_10 status_01 +7139b055-79b3-43c7-8b0f-5e491ad0f3b6 group_10 status_01 +104dbb7f-ad57-4bfb-bc06-70643fc12cf6 group_10 status_01 +a0560181-0ae1-493a-bc3d-9cc05cfcdf2f group_10 status_01 +5c1cab61-6f4f-40e6-bb8f-46c55b330be0 group_10 status_01 +1a7b6f3f-93cd-487d-b021-64cb81114046 group_10 status_01 +fdcbec76-34cf-4015-ac88-b29fbbfc506c group_10 status_01 +dc9e8d0b-f44c-4ae8-a8a1-62f22c4c282e group_10 status_01 +c31a9d00-4863-45d0-a66d-4655e39a7f5a group_10 status_01 +9225004d-4d9a-4248-889e-236950ed53c4 group_10 status_01 +52044455-be6a-4e48-ad32-d78f972277be group_10 status_01 +50c87d44-6cc5-455a-9555-7d829c9bd0bb group_10 status_01 +f741a06a-5f90-4b78-a039-1446130d481a group_10 status_01 +c03f9f1b-0473-4b5a-96b1-695fb0fb9151 group_10 status_02 +b00c2fe6-5442-4973-8d3c-2dec791122d9 group_10 status_02 +cb30f50f-9a20-4421-b897-19cc7736dec9 group_10 status_02 +af421b87-fd7e-49f4-985d-46850920d9fd group_10 status_02 +e530c28e-065b-4150-99ee-918921463737 group_10 status_01 +43e7c381-1047-40da-9996-d4d96c6e7ab7 group_10 status_01 +7a8956a6-3658-4f32-a1d7-861d5a0c6b6f group_10 status_01 +182a02a7-d12f-400d-841e-05d25b16a48f group_10 status_01 +645aa61f-308c-4149-acf4-4b98ce782a5f group_10 status_01 +8798e4bb-f9a2-4077-96dc-7494b59971cb group_10 status_01 +03ac1a92-ffae-45d9-9573-cae82433cf5b group_10 status_01 +95f9b111-1092-4e07-8810-06beffd2a38f group_10 status_01 +8c663adf-6d57-41c4-ba96-e7c2b98626fd group_10 status_01 +000e110b-c363-4703-8f22-4c4aca4c4209 group_10 status_01 +36ffc042-4707-40af-bd4e-8f40ac576bed group_10 status_01 +b2500594-0466-4b8e-a35c-cd344f9038a1 group_10 status_01 +4b8ca4e5-86f4-4a5d-8d9c-4dfc34cbed33 group_10 status_01 +5da77c9e-fb08-41a2-8a41-d0728769256f group_10 status_01 +37a33416-89f9-44d2-b50c-5d68793378a8 group_10 status_01 +1a417fef-625b-4115-8b62-00cc00f3604f group_10 status_01 +97ed5bb9-c00b-4388-822d-98697ea0f868 group_10 status_02 +6ba1aa38-63eb-46c7-abbb-447af08d4142 group_10 status_02 +08e83cd7-9096-40f0-ad6f-229659907be8 group_10 status_02 +87efd652-ef18-437c-bdba-f4702770fa9f group_10 status_02 +a5517cd1-c3f1-4c96-8a00-a4024f520903 group_10 status_02 +2aa0379b-4495-439e-b5a7-f3d0a6966f25 group_10 status_02 +932a9fa6-e403-47e0-92b2-305d5214cb28 group_10 status_02 +6ada0ea6-6a71-4ecf-b4e1-18c3735c7c8c group_10 status_02 +76867738-8532-409a-a01f-3b6958e1f0b5 group_10 status_02 +44f5da87-56e0-4b49-b405-1e6d4c8bed38 group_10 status_02 +806827e2-94d7-4550-aae3-324e2cc58f73 group_10 status_02 +96b1e95b-b8ee-45bb-b461-40fba7971181 group_10 status_02 +6356e6af-c036-4976-aaab-4ed1b74bf1de group_10 status_02 +cf68361a-81d6-4920-8ac7-09dbb1b326fd group_10 status_02 +a650e917-3383-425f-9b70-c47be5c30f16 group_10 status_02 +26e1c52e-0c7b-41a5-bfeb-297aa4d4ad61 group_10 status_02 +f1e0b4e5-67ec-46fc-8fba-76a1271fa65a group_11 status_05 +ad2bb326-2de1-496a-a663-786893e73bf2 group_11 status_05 +38d422f9-25c7-4b91-a078-b3b8bf9afae5 group_11 status_05 +69eb4b3c-76c9-45ce-91ae-5df7811d3fdd group_11 status_07 +5e6228f3-b831-4208-9cc6-5b4489b623ef group_11 status_05 +2f15dfc1-c331-47a4-b7e6-e8a5904fa0ad group_11 status_05 +39c2344b-273f-4bf5-a88b-d797779c7790 group_11 status_05 +3326847c-c38e-4ff8-a373-8bf630d91d75 group_11 status_07 +16e1574f-7e1e-4c17-9eff-22b62e312b28 group_11 status_05 +5af544bf-afce-4b5b-83fd-263776067202 group_11 status_05 +cc5858ed-0661-455e-870f-b4a50e04dc72 group_11 status_05 +eafc10e4-1759-43a6-b81d-a5844ec2b96d group_11 status_05 +d238ac14-2fce-4049-b75c-4fd830a728d6 group_11 status_05 +e41d0241-ce50-4aaf-a3fb-0a3740763e05 group_11 status_05 +41700c8b-55d8-4587-826e-57c4ac3d2d19 group_11 status_05 +548b928d-8046-409d-a4b9-266e72b05544 group_11 status_05 +2b1cd805-ee36-48b9-b542-313343256a1b group_11 status_05 +bd2924b2-cc23-4cd0-9052-c566b879556d group_11 status_05 +c2346d52-10ba-44cd-8975-0fd6bd1b7af1 group_11 status_07 +2ee06a43-e34d-4859-be7c-568dfad82b75 group_11 status_07 +6b884394-cac2-432f-b420-9cdeb508665b group_11 status_07 +9bbf5b3d-9020-4101-9f87-209c37ccae92 group_11 status_07 +c51eb2a2-0029-428b-b3ff-3dd5268fefb3 group_11 status_07 +9d977b0c-33b6-44b1-a67c-9fdb8fc47f36 group_11 status_05 +9a86b1ef-cba2-4a18-9600-be995b0bf016 group_11 status_05 +123bcbc7-4832-4e45-929a-35bc03671dfe group_11 status_05 +d19426a2-3189-48bc-ae5b-2dba042104fc group_11 status_07 +f2c4ace4-fe1a-4a80-a715-91da01f02c72 group_11 status_07 +a7046a09-bf5e-4344-8456-a466a8533446 group_11 status_05 +759f3901-a2f3-4214-8da9-e19262cb23ed group_11 status_05 +587cf85a-c368-46be-8ac1-f9eb28d24f6b group_11 status_05 +7b5e5eec-1f31-4fdd-9147-e81211a42d0e group_11 status_05 +7c8a789c-233e-4f94-8b14-729204568b21 group_11 status_05 +08358086-8895-4122-868b-b936d1bae2ab group_11 status_05 +f96ed967-8f3b-45a8-92ac-1661b57cbdbd group_11 status_05 +47faacab-f00f-441d-bf9a-25828c4689bf group_11 status_05 +97edf58f-459d-40ad-b903-b8c025fd6a25 group_11 status_05 +3d3e8eb7-883f-4605-8709-7a821476f9c1 group_11 status_05 +ff9fd164-7172-40aa-b4d6-723eb86293e9 group_11 status_05 +999ba9b7-93d2-4907-b60b-3ee17d1bd6d3 group_11 status_05 +0d43526f-135c-4528-a711-1ba30a92c30f group_11 status_07 +b1917031-2a8e-465a-9668-b3acf01551dc group_11 status_07 +bd6dbb3c-f6de-4141-85f3-568f2eb8a642 group_11 status_07 +fec08b80-faf7-4451-a66c-a6d57628e105 group_11 status_05 +ede7c93b-4ea9-4659-bb5f-f78f7dc3da22 group_11 status_07 +525c667c-2c39-4428-a6d8-0ea6770363e1 group_11 status_07 +bea1bd03-20cc-4f5f-a64c-42a2c79620cb group_11 status_07 +4173a603-e50c-47b1-92c8-a5c73f290a34 group_11 status_07 +dd8d310d-21a7-4a95-a4f1-d9f2bf7bb0bc group_11 status_07 +87bf3fb9-131c-4836-a987-08c7c4e60e3c group_11 status_07 +ba4783a5-454a-44f0-a800-f9cdb070dcc8 group_11 status_07 +cce310ec-dd95-4f0a-b714-ec8829061c52 group_11 status_05 +be86909b-f98d-45df-9381-fdc1397e1d34 group_11 status_07 +9452ff34-0788-4548-b33f-cd1a31a5ad1b group_11 status_05