```ts
export function flagStates(mask: number, catalog: string[]): Record<string, boolean> {
  if (typeof mask !== 'number' || mask < 0) {
    throw new Error('Invalid mask');
  }
  if (!Array.isArray(catalog) || catalog.length === 0) {
    throw new Error('Invalid catalog');
  }

  const flagMap: Record<string, boolean> = {};
  for (const flag of catalog) {
    if (typeof flag !== 'string' || flag.trim() === '') {
      throw new Error('Invalid flag name');
    }
    if (flagMap[flag]) {
      throw new Error('Repeated flag name');
    }
    flagMap[flag] = mask & 1;
    mask >>= 1;
  }

  return flagMap;
}
```