{"version":3,"file":"index.cjs","sources":["../src/core/prefecture-codes.ts","../src/core/dynamic-data-loader.ts","../src/core/data-loader.ts","../src/core/map-renderer.ts","../src/core/tokyo-islands.ts","../src/core/themes.ts","../src/core/grid-deformer.ts","../src/core/japan-map-selector.ts","../src/core/attribution.ts"],"sourcesContent":["// 都道府県名と都道府県コードのマッピング\nexport const PREFECTURE_CODES: { [key: string]: string } = {\n  '北海道': '01',\n  '青森県': '02',\n  '岩手県': '03',\n  '宮城県': '04',\n  '秋田県': '05',\n  '山形県': '06',\n  '福島県': '07',\n  '茨城県': '08',\n  '栃木県': '09',\n  '群馬県': '10',\n  '埼玉県': '11',\n  '千葉県': '12',\n  '東京都': '13',\n  '神奈川県': '14',\n  '新潟県': '15',\n  '富山県': '16',\n  '石川県': '17',\n  '福井県': '18',\n  '山梨県': '19',\n  '長野県': '20',\n  '岐阜県': '21',\n  '静岡県': '22',\n  '愛知県': '23',\n  '三重県': '24',\n  '滋賀県': '25',\n  '京都府': '26',\n  '大阪府': '27',\n  '兵庫県': '28',\n  '奈良県': '29',\n  '和歌山県': '30',\n  '鳥取県': '31',\n  '島根県': '32',\n  '岡山県': '33',\n  '広島県': '34',\n  '山口県': '35',\n  '徳島県': '36',\n  '香川県': '37',\n  '愛媛県': '38',\n  '高知県': '39',\n  '福岡県': '40',\n  '佐賀県': '41',\n  '長崎県': '42',\n  '熊本県': '43',\n  '大分県': '44',\n  '宮崎県': '45',\n  '鹿児島県': '46',\n  '沖縄県': '47'\n};","// 都道府県別データの動的読み込み\nimport type { GeoJSONFeature } from '../types';\n\nexport interface PrefectureDataIndex {\n  prefectures: {\n    [code: string]: {\n      name: string;\n      municipalityCount: number;\n      files: {\n        [precision: string]: {\n          path: string;\n          size: number;\n          features: number;\n        }\n      }\n    }\n  };\n  generated: string;\n  totalSize: {\n    original: number;\n    compressed: number;\n  };\n}\n\n// キャッシュの型定義\ninterface DataCache {\n  [key: string]: GeoJSONFeature[];\n}\n\nexport class DynamicDataLoader {\n  private baseUrl: string;\n  private cache: DataCache = {};\n  private index?: PrefectureDataIndex;\n  private currentPrecision: string = 'medium';\n  \n  constructor(baseUrl: string = './src/data') {\n    this.baseUrl = baseUrl;\n  }\n  \n  // インデックスファイルを読み込む\n  async loadIndex(): Promise<void> {\n    if (this.index) return;\n    \n    const indexUrl = `${this.baseUrl}/prefecture-index.json`;\n    const response = await fetch(indexUrl);\n    \n    if (!response.ok) {\n      throw new Error(`Failed to load index file: ${response.statusText}`);\n    }\n    \n    this.index = await response.json();\n  }\n  \n  // 精度レベルを設定\n  setPrecision(precision: string): void {\n    this.currentPrecision = precision;\n  }\n  \n  // 都道府県のデータが利用可能かチェック\n  async isPrefectureAvailable(prefectureCode: string): Promise<boolean> {\n    await this.loadIndex();\n    return this.index?.prefectures[prefectureCode] !== undefined;\n  }\n  \n  // 都道府県の市区町村データを読み込む\n  async loadMunicipalitiesForPrefecture(prefectureCode: string): Promise<GeoJSONFeature[]> {\n    await this.loadIndex();\n    \n    // キャッシュキー\n    const cacheKey = `${prefectureCode}-${this.currentPrecision}`;\n    \n    // キャッシュをチェック\n    if (this.cache[cacheKey]) {\n      return this.cache[cacheKey];\n    }\n    \n    // インデックスから情報を取得\n    const prefInfo = this.index?.prefectures[prefectureCode];\n    if (!prefInfo) {\n      throw new Error(`Prefecture ${prefectureCode} not found in index`);\n    }\n    \n    const fileInfo = prefInfo.files[this.currentPrecision];\n    if (!fileInfo) {\n      throw new Error(`Precision level ${this.currentPrecision} not available for prefecture ${prefectureCode}`);\n    }\n    \n    // データファイルを読み込む\n    const dataUrl = `${this.baseUrl}/${fileInfo.path}`;\n    const response = await fetch(dataUrl);\n    \n    if (!response.ok) {\n      throw new Error(`Failed to load municipality data: ${response.statusText}`);\n    }\n    \n    const geoJson = await response.json();\n    const features = geoJson.features as GeoJSONFeature[];\n    \n    // キャッシュに保存\n    this.cache[cacheKey] = features;\n    \n    return features;\n  }\n  \n  // 複数の都道府県のデータを並列で読み込む\n  async loadMunicipalitiesForPrefectures(prefectureCodes: string[]): Promise<GeoJSONFeature[]> {\n    const promises = prefectureCodes.map(code => \n      this.loadMunicipalitiesForPrefecture(code)\n    );\n    \n    const results = await Promise.all(promises);\n    return results.flat();\n  }\n  \n  // キャッシュをクリア\n  clearCache(prefectureCode?: string): void {\n    if (prefectureCode) {\n      // 特定の都道府県のキャッシュをクリア\n      Object.keys(this.cache).forEach(key => {\n        if (key.startsWith(prefectureCode)) {\n          delete this.cache[key];\n        }\n      });\n    } else {\n      // 全キャッシュをクリア\n      this.cache = {};\n    }\n  }\n  \n  // 現在のキャッシュサイズを取得（デバッグ用）\n  getCacheInfo(): { count: number; prefectures: string[] } {\n    const prefectures = new Set<string>();\n    Object.keys(this.cache).forEach(key => {\n      const [prefCode] = key.split('-');\n      prefectures.add(prefCode);\n    });\n    \n    return {\n      count: Object.keys(this.cache).length,\n      prefectures: Array.from(prefectures)\n    };\n  }\n  \n  // データサイズ情報を取得\n  async getDataSizeInfo(prefectureCode: string): Promise<{\n    name: string;\n    sizes: { [precision: string]: number };\n  } | null> {\n    await this.loadIndex();\n    \n    const prefInfo = this.index?.prefectures[prefectureCode];\n    if (!prefInfo) return null;\n    \n    const sizes: { [precision: string]: number } = {};\n    Object.entries(prefInfo.files).forEach(([precision, info]) => {\n      sizes[precision] = info.size;\n    });\n    \n    return {\n      name: prefInfo.name,\n      sizes\n    };\n  }\n}","// データローダー - GeoJSONデータの読み込みと解析\n\nimport { \n  GeoJSONFeatureCollection, \n  Prefecture, \n  Municipality \n} from '../types';\nimport { PREFECTURE_CODES } from './prefecture-codes';\nimport { DynamicDataLoader } from './dynamic-data-loader';\n\n// 都道府県データの読み込み\nexport async function loadPrefectureData(url: string): Promise<Prefecture[]> {\n  const response = await fetch(url);\n  const data: GeoJSONFeatureCollection = await response.json();\n  \n  return data.features.map((feature) => {\n    const bounds = calculateBounds(feature.geometry.coordinates);\n    const prefectureName = feature.properties.N03_001;\n    // 都道府県名からコードを取得\n    const prefectureCode = PREFECTURE_CODES[prefectureName] || '00';\n    \n    return {\n      code: prefectureCode,\n      name: prefectureName,\n      bounds,\n      feature: {\n        ...feature,\n        properties: {\n          ...feature.properties,\n          N03_007: prefectureCode\n        }\n      }\n    };\n  });\n}\n\n// 市区町村データの読み込み\nexport async function loadMunicipalityData(url: string): Promise<Municipality[]> {\n  const response = await fetch(url);\n  const data: GeoJSONFeatureCollection = await response.json();\n  \n  return data.features.map(feature => {\n    // N03_007がない場合は都道府県名から推定\n    let prefectureCode = '00';\n    if (feature.properties.N03_007) {\n      prefectureCode = feature.properties.N03_007.substring(0, 2);\n    } else if (feature.properties.N03_001) {\n      // 都道府県名からコードを取得\n      prefectureCode = PREFECTURE_CODES[feature.properties.N03_001] || '00';\n    }\n    \n    const municipalityName = feature.properties.N03_004 || \n                            feature.properties.N03_003 || \n                            feature.properties.N03_002 || '';\n    \n    // コードがない場合は生成\n    const code = feature.properties.N03_007 || `${prefectureCode}999`;\n    \n    return {\n      code,\n      name: municipalityName,\n      prefectureCode,\n      feature\n    };\n  }).filter(m => m.prefectureCode !== '00'); // 都道府県コードが不明なものは除外\n}\n\n// ジオメトリの境界ボックスを計算\nfunction calculateBounds(\n  coordinates: number[][][] | number[][][][]\n): [[number, number], [number, number]] {\n  let minLng = Infinity;\n  let minLat = Infinity;\n  let maxLng = -Infinity;\n  let maxLat = -Infinity;\n\n  const processCoordinate = (coord: number[]) => {\n    minLng = Math.min(minLng, coord[0]);\n    maxLng = Math.max(maxLng, coord[0]);\n    minLat = Math.min(minLat, coord[1]);\n    maxLat = Math.max(maxLat, coord[1]);\n  };\n\n  const processPolygon = (polygon: number[][]) => {\n    polygon.forEach(processCoordinate);\n  };\n\n  // MultiPolygonの場合\n  if (Array.isArray(coordinates[0][0][0])) {\n    (coordinates as number[][][][]).forEach(polygon => {\n      polygon.forEach(processPolygon);\n    });\n  } else {\n    // Polygonの場合\n    (coordinates as number[][][]).forEach(processPolygon);\n  }\n\n  return [[minLng, minLat], [maxLng, maxLat]];\n}\n\n// 都道府県コードから市区町村をフィルタリング\nexport function filterMunicipalitiesByPrefecture(\n  municipalities: Municipality[],\n  prefectureCode: string\n): Municipality[] {\n  return municipalities.filter(m => m.prefectureCode === prefectureCode);\n}\n\n// 動的データローダーのインスタンス\nlet dynamicLoader: DynamicDataLoader | null = null;\n\n// 動的データローダーを初期化\nexport function initializeDynamicLoader(baseUrl?: string): DynamicDataLoader {\n  dynamicLoader = new DynamicDataLoader(baseUrl);\n  return dynamicLoader;\n}\n\n// 都道府県別の市区町村データを動的に読み込む\nexport async function loadMunicipalitiesForPrefecture(prefectureCode: string): Promise<Municipality[]> {\n  if (!dynamicLoader) {\n    throw new Error('Dynamic loader not initialized. Call initializeDynamicLoader first.');\n  }\n  \n  const features = await dynamicLoader.loadMunicipalitiesForPrefecture(prefectureCode);\n  \n  return features.map(feature => {\n    const municipalityName = feature.properties.N03_004 || \n                            feature.properties.N03_003 || \n                            feature.properties.N03_002 || '';\n    \n    const code = feature.properties.N03_007 || `${prefectureCode}999`;\n    \n    return {\n      code,\n      name: municipalityName,\n      prefectureCode,\n      feature\n    };\n  });\n}\n\n// 動的ローダーの精度を設定\nexport function setDynamicLoaderPrecision(precision: string): void {\n  if (dynamicLoader) {\n    dynamicLoader.setPrecision(precision);\n  }\n}\n\n// 動的ローダーのキャッシュをクリア\nexport function clearDynamicLoaderCache(prefectureCode?: string): void {\n  if (dynamicLoader) {\n    dynamicLoader.clearCache(prefectureCode);\n  }\n}","// 地図レンダリング用のユーティリティ関数\n\nimport { GeoJSONFeature } from '../types';\n\n// SVGパス生成用の投影設定\nexport interface ProjectionConfig {\n  scale: number;\n  translateX: number;\n  translateY: number;\n  center: [number, number];\n}\n\n// メルカトル投影の簡易実装\nexport function mercatorProjection(\n  longitude: number, \n  latitude: number, \n  config: ProjectionConfig\n): [number, number] {\n  // 数値のバリデーション\n  if (!isFinite(longitude) || !isFinite(latitude)) {\n    console.warn('Invalid coordinates for projection:', { longitude, latitude });\n    return [0, 0];\n  }\n  \n  const x = (longitude - config.center[0]) * config.scale + config.translateX;\n  const y = (-latitude + config.center[1]) * config.scale + config.translateY;\n  \n  // 結果のバリデーション\n  if (!isFinite(x) || !isFinite(y)) {\n    console.warn('Projection resulted in non-finite values:', { x, y, longitude, latitude, config });\n    return [0, 0];\n  }\n  \n  return [x, y];\n}\n\n// GeoJSONジオメトリからSVGパスデータを生成\nexport function geometryToPath(\n  geometry: GeoJSONFeature['geometry'],\n  projection: ProjectionConfig,\n  transform?: { scale: number; translateX: number; translateY: number }\n): string {\n  const pathData: string[] = [];\n\n  const processRing = (ring: number[][]) => {\n    // 空のリングをスキップ\n    if (!ring || ring.length === 0) {\n      return;\n    }\n    \n    let validCoords = 0;\n    ring.forEach((coord, index) => {\n      // 座標が正しい形式か確認\n      if (!Array.isArray(coord) || coord.length < 2) {\n        console.warn('Invalid coordinate:', coord);\n        return;\n      }\n      const [lng, lat] = coord;\n      // 数値であることを確認\n      if (typeof lng !== 'number' || typeof lat !== 'number') {\n        console.warn('Non-numeric coordinate:', coord);\n        return;\n      }\n      let [x, y] = mercatorProjection(lng, lat, projection);\n      \n      // 追加の変換を適用（沖縄県用など）\n      if (transform) {\n        x = x * transform.scale + transform.translateX;\n        y = y * transform.scale + transform.translateY;\n      }\n      \n      if (validCoords === 0) {\n        pathData.push(`M${x},${y}`);\n      } else {\n        pathData.push(`L${x},${y}`);\n      }\n      validCoords++;\n    });\n    \n    // 有効な座標がある場合のみパスを閉じる\n    if (validCoords > 0) {\n      pathData.push('Z');\n    }\n  };\n\n  const processPolygon = (polygon: number[][][]) => {\n    polygon.forEach(ring => processRing(ring));\n  };\n\n  if (geometry.type === 'Polygon') {\n    processPolygon(geometry.coordinates as number[][][]);\n  } else if (geometry.type === 'MultiPolygon') {\n    (geometry.coordinates as number[][][][]).forEach(polygon => {\n      processPolygon(polygon);\n    });\n  }\n\n  return pathData.join(' ');\n}\n\n// 境界ボックスから適切なビューボックスを計算\nexport function calculateViewBox(\n  bounds: [[number, number], [number, number]],\n  padding: number = 20\n): { viewBox: string; projection: ProjectionConfig } {\n  const [[west, south], [east, north]] = bounds;\n  const centerLng = (west + east) / 2;\n  const centerLat = (south + north) / 2;\n  \n  const width = east - west;\n  const height = north - south;\n  \n  // アスペクト比を考慮したスケール計算\n  const scale = Math.min(\n    (800 - 2 * padding) / width,\n    (600 - 2 * padding) / height\n  );\n  \n  const projection: ProjectionConfig = {\n    scale,\n    translateX: 400,\n    translateY: 300,\n    center: [centerLng, centerLat]\n  };\n  \n  return {\n    viewBox: `0 0 800 600`,\n    projection\n  };\n}\n\n// 日本全体の標準的な境界ボックス\nexport const JAPAN_BOUNDS: [[number, number], [number, number]] = [\n  [122.0, 24.0],  // 南西（沖縄）\n  [146.0, 46.0]   // 北東（北海道）\n];\n\n// デフォルトの投影設定（日本全体用）\nexport function getDefaultProjection(): ProjectionConfig {\n  return {\n    scale: 30,  // スケールを小さくして全体が入るように\n    translateX: 400,\n    translateY: 300,\n    center: [138.0, 38.0]  // 中心を北に移動\n  };\n}","// 東京都の離島市区町村リスト\nexport const TOKYO_ISLANDS = [\n  \"小笠原村\",\n  \"大島町\",\n  \"利島村\",\n  \"新島村\",\n  \"神津島村\",\n  \"三宅村\",\n  \"御蔵島村\",\n  \"八丈町\",\n  \"青ヶ島村\"\n];\n\n// 市区町村が東京都の離島かどうかを判定\nexport function isTokyoIsland(municipalityName: string): boolean {\n  return TOKYO_ISLANDS.includes(municipalityName);\n}\n\n// 東京都の離島の市区町村コード\nexport const TOKYO_ISLAND_CODES = [\n  \"13361\", // 大島町\n  \"13362\", // 利島村\n  \"13363\", // 新島村\n  \"13364\", // 神津島村\n  \"13381\", // 三宅村\n  \"13382\", // 御蔵島村\n  \"13401\", // 八丈町\n  \"13402\", // 青ヶ島村\n  \"13421\"  // 小笠原村\n];\n\n// 市区町村コードから離島かどうかを判定\nexport function isTokyoIslandByCode(municipalityCode: string): boolean {\n  return TOKYO_ISLAND_CODES.includes(municipalityCode);\n}","// カラーテーマの定義\n\nimport { ColorTheme } from '../types';\n\nexport const themes: Record<string, ColorTheme> = {\n  default: {\n    name: 'デフォルト',\n    prefectureFill: '#e0e0e0',\n    prefectureStroke: '#999',\n    prefectureHoverFill: '#b0d0f0',\n    prefectureSelectedFill: '#90c0ff',\n    municipalityFill: '#f0f0f0',\n    municipalityStroke: '#666',\n    municipalityHoverFill: '#b0d0f0',\n    municipalitySelectedFill: '#90c0ff',\n    backgroundColor: '#f8f8f8',\n    strokeWidth: 0.5\n  },\n  \n  dark: {\n    name: 'ダーク',\n    prefectureFill: '#2a2a2a',\n    prefectureStroke: '#555',\n    prefectureHoverFill: '#404040',\n    prefectureSelectedFill: '#505050',\n    municipalityFill: '#333333',\n    municipalityStroke: '#555',\n    municipalityHoverFill: '#404040',\n    municipalitySelectedFill: '#505050',\n    backgroundColor: '#1a1a1a',\n    strokeWidth: 0.5\n  },\n  \n  warm: {\n    name: 'ウォーム',\n    prefectureFill: '#ffe0cc',\n    prefectureStroke: '#cc9966',\n    prefectureHoverFill: '#ffcc99',\n    prefectureSelectedFill: '#ff9966',\n    municipalityFill: '#fff0e6',\n    municipalityStroke: '#cc9966',\n    municipalityHoverFill: '#ffcc99',\n    municipalitySelectedFill: '#ff9966',\n    backgroundColor: '#fff5f0',\n    strokeWidth: 0.5\n  },\n  \n  cool: {\n    name: 'クール',\n    prefectureFill: '#d0e8f2',\n    prefectureStroke: '#6699cc',\n    prefectureHoverFill: '#a0d0f0',\n    prefectureSelectedFill: '#6699ff',\n    municipalityFill: '#e8f4f8',\n    municipalityStroke: '#6699cc',\n    municipalityHoverFill: '#a0d0f0',\n    municipalitySelectedFill: '#6699ff',\n    backgroundColor: '#f0f8ff',\n    strokeWidth: 0.5\n  },\n  \n  monochrome: {\n    name: 'モノクローム',\n    prefectureFill: '#f0f0f0',\n    prefectureStroke: '#333',\n    prefectureHoverFill: '#ddd',\n    prefectureSelectedFill: '#ccc',\n    municipalityFill: '#f8f8f8',\n    municipalityStroke: '#333',\n    municipalityHoverFill: '#ddd',\n    municipalitySelectedFill: '#ccc',\n    backgroundColor: '#fff',\n    strokeWidth: 0.8\n  },\n  \n  colorful: {\n    name: 'カラフル',\n    prefectureFill: '#ff6b6b',  // この値は実際には使われない（getPrefectureFillで上書き）\n    prefectureStroke: '#fff',\n    prefectureHoverFill: '#4ecdc4',\n    prefectureSelectedFill: '#45b7d1',\n    municipalityFill: '#fff3e0',\n    municipalityStroke: '#ff6b6b',\n    municipalityHoverFill: '#ffe0b2',\n    municipalitySelectedFill: '#ffcc80',\n    backgroundColor: '#fafafa',\n    strokeWidth: 1.0\n  },\n  \n  random: {\n    name: 'ランダム',\n    prefectureFill: '#808080',  // この値は実際には使われない（getPrefectureFillで上書き）\n    prefectureStroke: '#333',\n    prefectureHoverFill: '#666',\n    prefectureSelectedFill: '#444',\n    municipalityFill: '#f0f0f0',\n    municipalityStroke: '#666',\n    municipalityHoverFill: '#e0e0e0',\n    municipalitySelectedFill: '#d0d0d0',\n    backgroundColor: '#f8f8f8',\n    strokeWidth: 0.8\n  }\n};\n\n// テーマを取得する関数\nexport function getTheme(themeNameOrObject: ColorTheme | string | undefined): ColorTheme {\n  if (!themeNameOrObject) {\n    return themes.default;\n  }\n  \n  if (typeof themeNameOrObject === 'string') {\n    return themes[themeNameOrObject] || themes.default;\n  }\n  \n  // カスタムテーマの場合はそのまま返す\n  return themeNameOrObject;\n}\n\n// 個別の色設定を適用する関数\nexport function applyColorOverrides(theme: ColorTheme, props: any): ColorTheme {\n  return {\n    ...theme,\n    prefectureFill: props.prefectureColor || theme.prefectureFill,\n    prefectureHoverFill: props.prefectureHoverColor || theme.prefectureHoverFill,\n    municipalityFill: props.municipalityColor || theme.municipalityFill,\n    municipalityHoverFill: props.municipalityHoverColor || theme.municipalityHoverFill\n  };\n}\n\n// カラフルな色のパレット\nconst colorfulPalette = [\n  '#FF6B6B', '#4ECDC4', '#45B7D1', '#F7DC6F', '#BB8FCE',\n  '#85C1E2', '#F8B500', '#6C5CE7', '#FD79A8', '#FDCB6E',\n  '#6AB04C', '#EB4D4B', '#22A6B3', '#F0932B', '#EB4D4B',\n  '#686DE0', '#30336B', '#F9CA24', '#F0932B', '#EB4D4B',\n  '#6AB04C', '#BAD7E9', '#2BCBBA', '#FEA47F', '#25CCF7',\n  '#FD7272', '#54A0FF', '#00D2D3', '#1ABC9C', '#2ECC71',\n  '#3498DB', '#9B59B6', '#34495E', '#16A085', '#27AE60',\n  '#2980B9', '#8E44AD', '#2C3E50', '#F39C12', '#E67E22',\n  '#E74C3C', '#ECF0F1', '#95A5A6', '#D0B41A', '#A29BFE'\n];\n\n// 都道府県コードから色を生成する関数\nexport function getPrefectureFillColor(prefectureCode: string, themeName: string): string {\n  if (themeName === 'colorful') {\n    // 都道府県コードを数値に変換してインデックスとして使用\n    const index = parseInt(prefectureCode, 10) - 1;\n    return colorfulPalette[index % colorfulPalette.length];\n  } else if (themeName === 'random') {\n    // 都道府県コードを基にした疑似ランダム色を生成\n    const seed = parseInt(prefectureCode, 10);\n    const hue = (seed * 137.5) % 360; // 黄金角を使用して均等に分布\n    const saturation = 65 + (seed % 20); // 65-85%\n    const lightness = 45 + (seed % 20);  // 45-65%\n    return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n  }\n  \n  // その他のテーマはデフォルトの色を返す\n  return themes[themeName]?.prefectureFill || themes.default.prefectureFill;\n}\n\n// 16進数カラーをRGBに変換\nfunction hexToRgb(hex: string): { r: number, g: number, b: number } | null {\n  const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result ? {\n    r: parseInt(result[1], 16),\n    g: parseInt(result[2], 16),\n    b: parseInt(result[3], 16)\n  } : null;\n}\n\n// 色を明るくする関数\nfunction lightenColor(hex: string, percent: number): string {\n  const rgb = hexToRgb(hex);\n  if (!rgb) return hex;\n  \n  const r = Math.min(255, Math.floor(rgb.r + (255 - rgb.r) * percent));\n  const g = Math.min(255, Math.floor(rgb.g + (255 - rgb.g) * percent));\n  const b = Math.min(255, Math.floor(rgb.b + (255 - rgb.b) * percent));\n  \n  return `rgb(${r}, ${g}, ${b})`;\n}\n\n// 市区町村の色を生成する関数\nexport function getMunicipalityFillColor(municipalityCode: string, prefectureCode: string, themeName: string): string {\n  if (themeName === 'colorful') {\n    // 都道府県の色を基準に、明るい色を生成\n    const prefectureColor = getPrefectureFillColor(prefectureCode, themeName);\n    return lightenColor(prefectureColor, 0.7); // 70%明るくする\n  } else if (themeName === 'random') {\n    // 市区町村コードを基にした色を生成\n    const seed = parseInt(municipalityCode.slice(-3), 10); // 下3桁を使用\n    const prefSeed = parseInt(prefectureCode, 10);\n    const baseHue = (prefSeed * 137.5) % 360;\n    const hue = (baseHue + seed * 15) % 360; // 都道府県の色相から少しずらす\n    const saturation = 50 + (seed % 20); // 50-70% (都道府県より薄め)\n    const lightness = 65 + (seed % 15);  // 65-80% (都道府県より明るめ)\n    return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n  }\n  \n  // その他のテーマはデフォルトの色を返す\n  return themes[themeName]?.municipalityFill || themes.default.municipalityFill;\n}\n\n// 市区町村のホバー色を生成する関数\nexport function getMunicipalityHoverFillColor(municipalityCode: string, prefectureCode: string, themeName: string): string {\n  if (themeName === 'colorful') {\n    // 市区町村の通常色を少し暗くする\n    const baseColor = getMunicipalityFillColor(municipalityCode, prefectureCode, themeName);\n    // RGBカラーから少し暗くする\n    const match = baseColor.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n    if (match) {\n      const r = Math.max(0, parseInt(match[1]) - 30);\n      const g = Math.max(0, parseInt(match[2]) - 30);\n      const b = Math.max(0, parseInt(match[3]) - 30);\n      return `rgb(${r}, ${g}, ${b})`;\n    }\n    return themes.colorful.municipalityHoverFill;\n  } else if (themeName === 'random') {\n    // ランダムテーマの場合もHSLで少し暗くする\n    const baseColor = getMunicipalityFillColor(municipalityCode, prefectureCode, themeName);\n    const match = baseColor.match(/hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/);\n    if (match) {\n      const h = parseInt(match[1]);\n      const s = parseInt(match[2]);\n      const l = Math.max(30, parseInt(match[3]) - 15); // 明度を15%下げる\n      return `hsl(${h}, ${s}%, ${l}%)`;\n    }\n    return themes.random.municipalityHoverFill;\n  }\n  \n  // その他のテーマはデフォルトのホバー色を返す\n  return themes[themeName]?.municipalityHoverFill || themes.default.municipalityHoverFill;\n}","// グリッドベースのディフォルメ処理\n\nimport { Prefecture, Municipality } from '../types';\n\nexport interface GridDeformerOptions {\n  gridSize: number; // グリッドサイズ（度単位）\n  preserveTopology: boolean; // トポロジーを保持するか\n}\n\nexport class GridDeformer {\n  protected gridSize: number;\n  protected preserveTopology: boolean;\n\n  constructor(options: GridDeformerOptions = { gridSize: 0.1, preserveTopology: true }) {\n    this.gridSize = options.gridSize;\n    this.preserveTopology = options.preserveTopology;\n  }\n\n  // 座標をグリッドにスナップ\n  protected snapToGrid(coord: number[]): number[] {\n    const [lng, lat] = coord;\n    const snappedLng = Math.round(lng / this.gridSize) * this.gridSize;\n    const snappedLat = Math.round(lat / this.gridSize) * this.gridSize;\n    return [snappedLng, snappedLat];\n  }\n\n  // ポリゴンの面積を計算（簡易版）\n  protected calculatePolygonArea(polygon: number[][]): number {\n    let area = 0;\n    for (let i = 0; i < polygon.length - 1; i++) {\n      area += polygon[i][0] * polygon[i + 1][1];\n      area -= polygon[i + 1][0] * polygon[i][1];\n    }\n    return Math.abs(area / 2);\n  }\n\n  // ポリゴンの中心点を計算\n  protected calculatePolygonCenter(polygon: number[][]): number[] {\n    let sumX = 0, sumY = 0;\n    const count = polygon.length - 1; // 最後の点は最初の点と同じなので除外\n    for (let i = 0; i < count; i++) {\n      sumX += polygon[i][0];\n      sumY += polygon[i][1];\n    }\n    return [sumX / count, sumY / count];\n  }\n\n  // ポリゴンをディフォルメ\n  protected deformPolygon(polygon: number[][]): number[][] {\n    // 元のポリゴンの面積を計算\n    const originalArea = this.calculatePolygonArea(polygon);\n    \n    const deformed = polygon.map(coord => this.snapToGrid(coord));\n    \n    // 重複点を削除（トポロジー保持のため）\n    if (this.preserveTopology) {\n      const unique: number[][] = [];\n      const seen = new Set<string>();\n      \n      for (let i = 0; i < deformed.length; i++) {\n        const key = `${deformed[i][0]},${deformed[i][1]}`;\n        if (!seen.has(key)) {\n          seen.add(key);\n          unique.push(deformed[i]);\n        }\n      }\n      \n      // 最低3点必要（三角形）\n      if (unique.length < 3) {\n        // ポリゴンが小さすぎる場合、中心点を基準に最小の三角形または四角形を作成\n        const center = this.calculatePolygonCenter(polygon);\n        const snappedCenter = this.snapToGrid(center);\n        \n        // グリッドサイズの半分のオフセット\n        const offset = this.gridSize / 2;\n        \n        // 小さな四角形を作成\n        if (originalArea > this.gridSize * this.gridSize * 0.1) {\n          return [\n            [snappedCenter[0] - offset, snappedCenter[1] - offset],\n            [snappedCenter[0] + offset, snappedCenter[1] - offset],\n            [snappedCenter[0] + offset, snappedCenter[1] + offset],\n            [snappedCenter[0] - offset, snappedCenter[1] + offset],\n            [snappedCenter[0] - offset, snappedCenter[1] - offset]\n          ];\n        } else {\n          // 非常に小さい場合は元の形状を保持\n          return polygon;\n        }\n      }\n      \n      // 閉じたポリゴンにする\n      if (unique[0][0] !== unique[unique.length - 1][0] || \n          unique[0][1] !== unique[unique.length - 1][1]) {\n        unique.push([...unique[0]]);\n      }\n      \n      return unique;\n    }\n    \n    return deformed;\n  }\n\n  // ジオメトリをディフォルメ\n  deformGeometry(geometry: any): any {\n    if (geometry.type === 'Polygon') {\n      const deformedRings = geometry.coordinates.map((ring: number[][]) => \n        this.deformPolygon(ring)\n      );\n      \n      return {\n        type: 'Polygon',\n        coordinates: deformedRings\n      };\n    } else if (geometry.type === 'MultiPolygon') {\n      // 各ポリゴンをディフォルメし、有効なものだけを保持\n      const deformedPolygons = geometry.coordinates\n        .map((polygon: number[][][]) => {\n          const deformedRings = polygon.map((ring: number[][]) => this.deformPolygon(ring));\n          \n          // 外側のリング（最初のリング）の面積をチェック\n          if (deformedRings.length > 0) {\n            const area = this.calculatePolygonArea(deformedRings[0]);\n            // 非常に小さいポリゴンは除外\n            if (area < this.gridSize * this.gridSize * 0.01) {\n              return null;\n            }\n          }\n          \n          return deformedRings;\n        })\n        .filter((polygon: number[][][] | null): polygon is number[][][] => polygon !== null);\n      \n      // 有効なポリゴンがない場合、最大のポリゴンを中心に四角形を作成\n      if (deformedPolygons.length === 0) {\n        // 元のジオメトリから最大のポリゴンを見つける\n        let maxArea = 0;\n        let maxPolygon = null;\n        \n        geometry.coordinates.forEach((polygon: number[][][]) => {\n          if (polygon.length > 0) {\n            const area = this.calculatePolygonArea(polygon[0]);\n            if (area > maxArea) {\n              maxArea = area;\n              maxPolygon = polygon[0];\n            }\n          }\n        });\n        \n        if (maxPolygon) {\n          const center = this.calculatePolygonCenter(maxPolygon);\n          const snappedCenter = this.snapToGrid(center);\n          const offset = this.gridSize;\n          \n          // グリッドサイズの四角形を作成\n          const square = [\n            [snappedCenter[0] - offset, snappedCenter[1] - offset],\n            [snappedCenter[0] + offset, snappedCenter[1] - offset],\n            [snappedCenter[0] + offset, snappedCenter[1] + offset],\n            [snappedCenter[0] - offset, snappedCenter[1] + offset],\n            [snappedCenter[0] - offset, snappedCenter[1] - offset]\n          ];\n          \n          return {\n            type: 'Polygon',\n            coordinates: [square]\n          };\n        }\n      }\n      \n      // 単一のポリゴンになった場合\n      if (deformedPolygons.length === 1) {\n        return {\n          type: 'Polygon',\n          coordinates: deformedPolygons[0]\n        };\n      }\n      \n      return {\n        type: 'MultiPolygon',\n        coordinates: deformedPolygons\n      };\n    }\n    \n    return geometry;\n  }\n\n  // 都道府県をディフォルメ\n  deformPrefecture(prefecture: Prefecture): Prefecture {\n    return {\n      ...prefecture,\n      feature: {\n        ...prefecture.feature,\n        geometry: this.deformGeometry(prefecture.feature.geometry)\n      }\n    };\n  }\n\n  // 市区町村をディフォルメ\n  deformMunicipality(municipality: Municipality): Municipality {\n    return {\n      ...municipality,\n      feature: {\n        ...municipality.feature,\n        geometry: this.deformGeometry(municipality.feature.geometry)\n      }\n    };\n  }\n\n  // グリッドサイズを変更\n  setGridSize(size: number) {\n    this.gridSize = size;\n  }\n\n  // 特定地域用の調整（北海道、沖縄など）\n  adjustForRegion(prefectureCode: string): void {\n    switch (prefectureCode) {\n      case '01': // 北海道\n        this.gridSize = 0.2; // より大きなグリッド\n        break;\n      case '47': // 沖縄\n        this.gridSize = 0.05; // より細かいグリッド\n        break;\n      case '13': // 東京\n        this.gridSize = 0.02; // 都市部は細かく\n        break;\n      default:\n        this.gridSize = 0.1; // デフォルト\n    }\n  }\n}\n\n// より高度なディフォルメ（六角形グリッド）\nexport class HexagonalGridDeformer extends GridDeformer {\n  // 六角形グリッドにスナップ\n  private snapToHexGrid(coord: number[]): number[] {\n    const [lng, lat] = coord;\n    const size = this.gridSize;\n    \n    // 六角形グリッドの計算\n    const a = size * 2;\n    const b = size * Math.sqrt(3);\n    const c = size;\n    \n    // 最も近い六角形の中心を見つける\n    const i = Math.round(lng / a);\n    const j = Math.round(lat / b);\n    \n    // 偶数行と奇数行でオフセット\n    const xOffset = (j % 2) * c;\n    const hexX = i * a + xOffset;\n    const hexY = j * b;\n    \n    return [hexX, hexY];\n  }\n  \n  // ポリゴンをディフォルメ（オーバーライド）\n  protected deformPolygon(polygon: number[][]): number[][] {\n    const deformed = polygon.map(coord => this.snapToHexGrid(coord));\n    \n    if (this.preserveTopology) {\n      const unique: number[][] = [];\n      for (let i = 0; i < deformed.length; i++) {\n        if (i === 0 || \n            deformed[i][0] !== deformed[i-1][0] || \n            deformed[i][1] !== deformed[i-1][1]) {\n          unique.push(deformed[i]);\n        }\n      }\n      \n      if (unique.length < 3) {\n        return polygon;\n      }\n      \n      if (unique[0][0] !== unique[unique.length - 1][0] || \n          unique[0][1] !== unique[unique.length - 1][1]) {\n        unique.push([...unique[0]]);\n      }\n      \n      return unique;\n    }\n    \n    return deformed;\n  }\n}","// フレームワーク非依存のコアロジック\n\nimport {\n  JapanMapSelectorProps,\n  MapState,\n  Prefecture,\n  Municipality,\n  ColorTheme\n} from '../types';\nimport {\n  loadPrefectureData,\n  loadMunicipalityData,\n  filterMunicipalitiesByPrefecture,\n  initializeDynamicLoader,\n  loadMunicipalitiesForPrefecture,\n  setDynamicLoaderPrecision,\n  clearDynamicLoaderCache\n} from './data-loader';\nimport {\n  geometryToPath,\n  calculateViewBox,\n  getDefaultProjection,\n  ProjectionConfig\n} from './map-renderer';\nimport { isTokyoIsland } from './tokyo-islands';\nimport { getTheme, applyColorOverrides, getPrefectureFillColor, getMunicipalityFillColor, getMunicipalityHoverFillColor } from './themes';\nimport { GridDeformer, HexagonalGridDeformer } from './grid-deformer';\n\nexport class JapanMapSelector {\n  private prefectures: Prefecture[] = [];\n  private municipalities: Municipality[] = [];\n  private municipalitiesCache: Map<string, Municipality[]> = new Map();\n  private state: MapState;\n  private listeners: Map<string, Function[]> = new Map();\n  private props: JapanMapSelectorProps;\n  private currentProjection: ProjectionConfig;\n  private theme: ColorTheme;\n  private currentThemeName: string = 'default';\n  private deformer: GridDeformer | null = null;\n  private deformMode: 'none' | 'grid' | 'hexagon' = 'none';\n  private isDynamicLoadingEnabled: boolean = false;\n\n  constructor(props: JapanMapSelectorProps = {}) {\n    this.props = {\n      width: 800,\n      height: 600,\n      ...props\n    };\n    \n    // テーマの設定\n    this.theme = applyColorOverrides(\n      getTheme(props.theme),\n      props\n    );\n    if (typeof props.theme === 'string') {\n      this.currentThemeName = props.theme;\n    }\n\n    this.currentProjection = getDefaultProjection();\n    this.state = {\n      selectedPrefecture: null,\n      hoveredPrefecture: null,\n      hoveredMunicipality: null,\n      viewBox: '0 0 800 600',\n      scale: 1,\n      translateX: 0,\n      translateY: 0,\n      showTokyoIslands: false\n    };\n  }\n\n  // データの初期化\n  async initialize(prefectureDataUrl: string, municipalityDataUrl: string) {\n    // 動的読み込みが有効な場合\n    if (this.props.enableDynamicLoading) {\n      this.isDynamicLoadingEnabled = true;\n      // 動的ローダーを初期化\n      const loader = initializeDynamicLoader(this.props.dynamicDataBaseUrl);\n      // 精度レベルを設定\n      if (this.props.simplificationLevel) {\n        setDynamicLoaderPrecision(this.props.simplificationLevel);\n      }\n      // 都道府県データのみ読み込む\n      this.prefectures = await loadPrefectureData(prefectureDataUrl);\n      // 市区町村データは空の配列に\n      this.municipalities = [];\n    } else {\n      // 従来の一括読み込み\n      this.prefectures = await loadPrefectureData(prefectureDataUrl);\n      this.municipalities = await loadMunicipalityData(municipalityDataUrl);\n    }\n    \n    // 全都道府県の境界から最適な投影を計算\n    this.currentProjection = this.calculateOptimalProjection();\n    \n    this.emit('initialized');\n  }\n  \n  // 全都道府県が収まる最適な投影を計算\n  private calculateOptimalProjection(): ProjectionConfig {\n    if (this.prefectures.length === 0) {\n      return getDefaultProjection();\n    }\n    \n    let minLng = Infinity, maxLng = -Infinity;\n    let minLat = Infinity, maxLat = -Infinity;\n    \n    // 沖縄県と離島を除外して本州の境界を計算\n    this.prefectures.forEach(pref => {\n      if (pref.name !== '沖縄県') {\n        const [[west, south], [east, north]] = pref.bounds;\n        \n        // 東京都の離島（小笠原諸島など）を除外\n        if (pref.name === '東京都') {\n          // 本州部分のみ（東経142度以西）\n          minLng = Math.min(minLng, west);\n          maxLng = Math.max(maxLng, Math.min(east, 142.0));\n          minLat = Math.min(minLat, Math.max(south, 34.5)); // 伊豆諸島の一部も除外\n          maxLat = Math.max(maxLat, north);\n        } else if (pref.name === '北海道') {\n          // 北海道の場合、北方領土を除外した実際の範囲を使用\n          // 北海道本土は概ね東経139.5度〜145.5度の範囲\n          minLng = Math.min(minLng, Math.max(west, 139.5)); // 西側の実際の境界\n          maxLng = Math.max(maxLng, Math.min(east, 145.5)); // 東経145.5度以西（北方領土除外）\n          minLat = Math.min(minLat, south);\n          maxLat = Math.max(maxLat, north);\n        } else {\n          minLng = Math.min(minLng, west);\n          maxLng = Math.max(maxLng, east);\n          minLat = Math.min(minLat, south);\n          maxLat = Math.max(maxLat, north);\n        }\n      }\n    });\n    \n    const centerLng = (minLng + maxLng) / 2;\n    const centerLat = (minLat + maxLat) / 2 + 2.0; // 中心を北に移動して地図全体を下に表示\n    const width = maxLng - minLng;\n    const height = maxLat - minLat;\n    \n    // パディングを考慮してスケールを計算\n    const padding = 40; // パディングを調整\n    const scaleX = (this.props.width! - 2 * padding) / width;\n    const scaleY = (this.props.height! - 2 * padding) / height;\n    const scale = Math.min(scaleX, scaleY) * 1.0; // 通常のスケール\n    \n    return {\n      scale,\n      translateX: this.props.width! / 2, // 中央に配置\n      translateY: this.props.height! / 2 - 20, // 少し上にずらして沖縄枠のスペースを作る\n      center: [centerLng, centerLat]\n    };\n  }\n\n  // イベントリスナーの登録\n  on(event: string, listener: Function) {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, []);\n    }\n    this.listeners.get(event)!.push(listener);\n  }\n\n  // イベントリスナーの削除\n  off(event: string, listener: Function) {\n    const listeners = this.listeners.get(event);\n    if (listeners) {\n      const index = listeners.indexOf(listener);\n      if (index > -1) {\n        listeners.splice(index, 1);\n      }\n    }\n  }\n\n  // イベントの発火\n  emit(event: string, data?: any) {\n    const listeners = this.listeners.get(event);\n    if (listeners) {\n      listeners.forEach(listener => listener(data));\n    }\n  }\n\n  // 都道府県が選択可能かチェック\n  isPrefectureSelectable(prefectureCode: string): boolean {\n    if (!this.props.selectablePrefectures || this.props.selectablePrefectures.length === 0) {\n      return true; // 未指定の場合は全て選択可能\n    }\n    return this.props.selectablePrefectures.includes(prefectureCode);\n  }\n  \n  // 都道府県の選択\n  async selectPrefecture(prefectureCode: string) {\n    // 選択可能かチェック\n    if (!this.isPrefectureSelectable(prefectureCode)) {\n      return;\n    }\n    \n    const prefecture = this.prefectures.find(p => p.code === prefectureCode);\n    if (prefecture) {\n      this.state.selectedPrefecture = prefecture;\n      this.state.showTokyoIslands = false; // 離島表示をリセット\n      \n      // 動的読み込みが有効な場合\n      if (this.isDynamicLoadingEnabled) {\n        // 都道府県を切り替えた時点で市区町村データをクリア\n        this.municipalities = [];\n        \n        // キャッシュをチェック\n        if (!this.municipalitiesCache.has(prefectureCode)) {\n          // 読み込み開始を通知\n          if (this.props.onMunicipalityLoadStart) {\n            this.props.onMunicipalityLoadStart(prefecture);\n          }\n          \n          try {\n            // 市区町村データを動的に読み込む\n            const municipalitiesForPrefecture = await loadMunicipalitiesForPrefecture(prefectureCode);\n            this.municipalitiesCache.set(prefectureCode, municipalitiesForPrefecture);\n            \n            // キャッシュから市区町村データを設定（読み込み終了通知の前に設定）\n            this.municipalities = municipalitiesForPrefecture;\n            \n            // 読み込み終了を通知（データ設定後）\n            if (this.props.onMunicipalityLoadEnd) {\n              this.props.onMunicipalityLoadEnd(prefecture);\n            }\n          } catch (error) {\n            console.error(`Failed to load municipalities for prefecture ${prefectureCode}:`, error);\n            // エラー時は空の配列を設定\n            this.municipalities = [];\n            // 読み込みエラー時も終了を通知\n            if (this.props.onMunicipalityLoadEnd) {\n              this.props.onMunicipalityLoadEnd(prefecture);\n            }\n            return;\n          }\n        } else {\n          // キャッシュから市区町村データを設定\n          this.municipalities = this.municipalitiesCache.get(prefectureCode) || [];\n        }\n      }\n      \n      // 東京都・北海道の場合は本土の境界を使用\n      let bounds = prefecture.bounds;\n      if (prefectureCode === '13') {\n        // 東京都本土の境界（23区周辺）\n        bounds = [[138.5, 35.3], [140.0, 36.0]];\n      } else if (prefectureCode === '01') {\n        // 北海道本土の境界（北方領土を除外）\n        // 北海道の実際の市区町村データから正確な境界を計算\n        const hokkaidoMunicipalities = this.municipalities.filter(m => m.prefectureCode === '01');\n        let actualMinLng = Infinity, actualMaxLng = -Infinity;\n        let actualMinLat = Infinity, actualMaxLat = -Infinity;\n        \n        hokkaidoMunicipalities.forEach(municipality => {\n          const geometry = municipality.feature.geometry;\n          const updateBounds = (coord: number[]) => {\n            const [lng, lat] = coord;\n            // 北方領土の座標を除外\n            if (lng < 145.5) {\n              actualMinLng = Math.min(actualMinLng, lng);\n              actualMaxLng = Math.max(actualMaxLng, lng);\n              actualMinLat = Math.min(actualMinLat, lat);\n              actualMaxLat = Math.max(actualMaxLat, lat);\n            }\n          };\n          \n          if (geometry.type === 'Polygon') {\n            (geometry.coordinates as number[][][]).forEach(ring => \n              ring.forEach(updateBounds)\n            );\n          } else if (geometry.type === 'MultiPolygon') {\n            (geometry.coordinates as number[][][][]).forEach(polygon =>\n              polygon.forEach(ring => ring.forEach(updateBounds))\n            );\n          }\n        });\n        \n        // 計算された実際の境界を使用\n        if (actualMinLng !== Infinity) {\n          bounds = [[actualMinLng, actualMinLat], [actualMaxLng, actualMaxLat]];\n        }\n      }\n      \n      // ビューボックスを都道府県に合わせて調整\n      const { viewBox, projection } = calculateViewBox(bounds);\n      this.state.viewBox = viewBox;\n      this.currentProjection = projection;\n      \n      this.emit('prefectureSelected', prefecture);\n      this.emit('stateChanged', this.state);\n      \n      if (this.props.onPrefectureSelect) {\n        this.props.onPrefectureSelect(prefecture);\n      }\n    }\n  }\n\n  // 市区町村の選択\n  selectMunicipality(municipalityCode: string) {\n    const municipality = this.municipalities.find(m => m.code === municipalityCode);\n    if (municipality) {\n      this.emit('municipalitySelected', municipality);\n      \n      if (this.props.onMunicipalitySelect) {\n        this.props.onMunicipalitySelect(municipality);\n      }\n    }\n  }\n\n  // 都道府県一覧の取得\n  getPrefectures(): Prefecture[] {\n    return this.prefectures;\n  }\n\n  // 選択された都道府県の市区町村を取得\n  getSelectedMunicipalities(): Municipality[] {\n    if (!this.state.selectedPrefecture) {\n      return [];\n    }\n    \n    // 動的読み込みが有効な場合は、現在の municipalities 配列を使用\n    let allMunicipalities: Municipality[];\n    if (this.isDynamicLoadingEnabled) {\n      allMunicipalities = this.municipalities;\n    } else {\n      allMunicipalities = filterMunicipalitiesByPrefecture(\n        this.municipalities,\n        this.state.selectedPrefecture.code\n      );\n    }\n    \n    // 東京都の場合、離島表示の設定に応じてフィルタリング\n    if (this.state.selectedPrefecture.code === '13') {\n      return allMunicipalities.filter(m => {\n        const isIsland = isTokyoIsland(m.name);\n        return this.state.showTokyoIslands ? isIsland : !isIsland;\n      });\n    }\n    \n    // 北海道の場合、北方領土の市区町村を除外\n    if (this.state.selectedPrefecture.code === '01') {\n      return allMunicipalities.filter(m => {\n        // 市区町村の座標から北方領土かどうか判定\n        if (m.feature.geometry.type === 'MultiPolygon') {\n          const coordinates = m.feature.geometry.coordinates as number[][][][];\n          // 最初のポリゴンの中心点をチェック\n          if (coordinates.length > 0 && coordinates[0].length > 0) {\n            const ring = coordinates[0][0];\n            let sumLng = 0, sumLat = 0;\n            ring.forEach(coord => {\n              sumLng += coord[0];\n              sumLat += coord[1];\n            });\n            const centerLng = sumLng / ring.length;\n            const centerLat = sumLat / ring.length;\n            // 北方領土の市区町村を除外\n            return !(centerLat > 43.5 && centerLng > 145.5);\n          }\n        } else if (m.feature.geometry.type === 'Polygon') {\n          const coordinates = m.feature.geometry.coordinates as number[][][];\n          if (coordinates.length > 0) {\n            const ring = coordinates[0];\n            let sumLng = 0, sumLat = 0;\n            ring.forEach(coord => {\n              sumLng += coord[0];\n              sumLat += coord[1];\n            });\n            const centerLng = sumLng / ring.length;\n            const centerLat = sumLat / ring.length;\n            // 北方領土の市区町村を除外\n            return !(centerLat > 43.5 && centerLng > 145.5);\n          }\n        }\n        return true;\n      });\n    }\n    \n    return allMunicipalities;\n  }\n\n  // 都道府県のSVGパスを生成\n  getPrefecturePath(prefecture: Prefecture): string {\n    // ディフォルメを適用\n    const deformed = this.getDeformedPrefecture(prefecture);\n    \n    // 全国表示の時\n    if (!this.state.selectedPrefecture) {\n      let geometry = deformed.feature.geometry;\n      \n      // 離島を含む都道府県の本土部分のみを表示\n      switch (prefecture.name) {\n        case '北海道':\n          // 北方領土を除外\n          geometry = this.filterHokkaidoMainland(geometry);\n          break;\n        case '東京都':\n          // 東京都の離島を除外（特定の離島のみを除外する）\n          geometry = this.filterTokyoMainlandOnly(geometry);\n          break;\n        case '鹿児島県':\n          // 鹿児島県の離島を除外（主に南方の離島）\n          geometry = this.filterGeometryByLatitude(geometry, 30.0, 'north');\n          break;\n        case '長崎県':\n          // 長崎県の離島を簡易的にフィルタリング（五島列島などを除妖）\n          geometry = this.filterGeometryByBounds(geometry, [[129.0, 32.5], [130.0, 34.0]]);\n          break;\n        // case '新潟県':\n        //   // 佐渡島を除外 - 一旦コメントアウト\n        //   geometry = this.filterGeometryByLongitude(geometry, 138.3, 'east');\n        //   break;\n        case '島根県':\n          // 隠岐諸島を除外\n          geometry = this.filterGeometryByLongitude(geometry, 133.0, 'west');\n          break;\n        case '沖縄県':\n          // 沖縄県は特別な投影設定で表示\n          // 沖縄県の実際の境界を使用して中心を計算\n          const [[west, south], [east, north]] = prefecture.bounds;\n          const okinawaCenterLng = (west + east) / 2;\n          const okinawaCenterLat = (south + north) / 2;\n          \n          const okinawaProjection: ProjectionConfig = {\n            scale: this.currentProjection.scale * 0.7, // 適度に小さくして枠内に収める\n            translateX: 210, // 枠の中央に配置（枠x:120 + 幅180/2）\n            translateY: 120,  // 枠の中央に配置（枠y:50 + 高さ140/2）\n            center: [okinawaCenterLng, okinawaCenterLat] // 動的に計算した中心\n          };\n          return geometryToPath(geometry, okinawaProjection);\n      }\n      \n      return geometryToPath(geometry, this.currentProjection);\n    }\n    \n    return geometryToPath(deformed.feature.geometry, this.currentProjection);\n  }\n  \n  // 東京都の本土のみを残すフィルタリング\n  private filterTokyoMainlandOnly(\n    geometry: Prefecture['feature']['geometry']\n  ): Prefecture['feature']['geometry'] {\n    if (geometry.type === 'MultiPolygon') {\n      const filteredCoordinates = (geometry.coordinates as number[][][][]).filter(polygon => {\n        // ポリゴンの中心点を計算\n        const ring = polygon[0];\n        let sumLng = 0, sumLat = 0;\n        ring.forEach((coord: number[]) => {\n          sumLng += coord[0];\n          sumLat += coord[1];\n        });\n        const centerLng = sumLng / ring.length;\n        const centerLat = sumLat / ring.length;\n        \n        // 離島を除外する条件\n        // 伊豆諸島（南方）: 緯度34度以南\n        // 小笠原諸島（東方）: 経度141度以東\n        const isMainland = !(\n          (centerLat < 34.0) || // 伊豆諸島など\n          (centerLng > 141.0)    // 小笠原諸島\n        );\n        \n        return isMainland;\n      });\n      \n      \n      return {\n        type: 'MultiPolygon',\n        coordinates: filteredCoordinates\n      };\n    }\n    return geometry;\n  }\n  \n  // 経度でジオメトリをフィルタリング\n  private filterGeometryByLongitude(\n    geometry: Prefecture['feature']['geometry'], \n    threshold: number, \n    direction: 'east' | 'west'\n  ): Prefecture['feature']['geometry'] {\n    if (geometry.type === 'MultiPolygon') {\n      const originalCount = (geometry.coordinates as number[][][][]).length;\n      const filteredCoordinates = (geometry.coordinates as number[][][][]).filter(polygon => {\n        // ポリゴンの全ての点をチェックして、すべてが閾値の条件を満たすか確認\n        const ring = polygon[0];\n        const allPointsMatch = ring.every((coord: number[]) => {\n          return direction === 'west' ? coord[0] < threshold : coord[0] > threshold;\n        });\n        return allPointsMatch;\n      });\n      \n      \n      return {\n        type: 'MultiPolygon',\n        coordinates: filteredCoordinates\n      };\n    }\n    return geometry;\n  }\n  \n  // 緯度でジオメトリをフィルタリング\n  private filterGeometryByLatitude(\n    geometry: Prefecture['feature']['geometry'], \n    threshold: number, \n    direction: 'north' | 'south'\n  ): Prefecture['feature']['geometry'] {\n    if (geometry.type === 'MultiPolygon') {\n      const filteredCoordinates = (geometry.coordinates as number[][][][]).filter(polygon => {\n        const ring = polygon[0];\n        const allPointsMatch = ring.every((coord: number[]) => {\n          return direction === 'north' ? coord[1] > threshold : coord[1] < threshold;\n        });\n        return allPointsMatch;\n      });\n      \n      return {\n        type: 'MultiPolygon',\n        coordinates: filteredCoordinates\n      };\n    }\n    return geometry;\n  }\n  \n  // 境界ボックスでジオメトリをフィルタリング\n  private filterGeometryByBounds(\n    geometry: Prefecture['feature']['geometry'],\n    bounds: [[number, number], [number, number]]\n  ): Prefecture['feature']['geometry'] {\n    if (geometry.type === 'MultiPolygon') {\n      const [[west, south], [east, north]] = bounds;\n      const filteredCoordinates = (geometry.coordinates as number[][][][]).filter(polygon => {\n        const ring = polygon[0];\n        const allPointsMatch = ring.every((coord: number[]) => {\n          return coord[0] >= west && coord[0] <= east &&\n                 coord[1] >= south && coord[1] <= north;\n        });\n        return allPointsMatch;\n      });\n      \n      return {\n        type: 'MultiPolygon',\n        coordinates: filteredCoordinates\n      };\n    }\n    return geometry;\n  }\n  \n  // 北海道の本土のみを残すフィルタリング（北方領土を除外）\n  private filterHokkaidoMainland(\n    geometry: Prefecture['feature']['geometry']\n  ): Prefecture['feature']['geometry'] {\n    if (geometry.type === 'MultiPolygon') {\n      const filteredCoordinates = (geometry.coordinates as number[][][][]).filter(polygon => {\n        // ポリゴンの中心点を計算\n        const ring = polygon[0];\n        let sumLng = 0, sumLat = 0;\n        ring.forEach((coord: number[]) => {\n          sumLng += coord[0];\n          sumLat += coord[1];\n        });\n        const centerLng = sumLng / ring.length;\n        const centerLat = sumLat / ring.length;\n        \n        // 北方領土を除外する条件\n        // 緯度43.5度以北かつ東経145.5度以東の領域を除外\n        const isMainland = !(centerLat > 43.5 && centerLng > 145.5);\n        \n        return isMainland;\n      });\n      \n      \n      return {\n        type: 'MultiPolygon',\n        coordinates: filteredCoordinates\n      };\n    }\n    return geometry;\n  }\n  \n  // 沖縄県の枠を取得\n  getOkinawaFrame(): { x: number; y: number; width: number; height: number } | null {\n    const okinawa = this.prefectures.find(p => p.name === '沖縄県');\n    if (!okinawa) return null;\n    \n    // 固定サイズの枠を返す\n    return {\n      x: 120,  // 九州の左端と同じ位置に配置\n      y: 50,  // 北海道の上端と同じくらいの高さに配置\n      width: 180,  // 幅を調整\n      height: 140  // 高さを調整\n    };\n  }\n  \n  // 座標を投影\n  private projectPoint(lng: number, lat: number, projection: ProjectionConfig): [number, number] {\n    const x = (lng - projection.center[0]) * projection.scale + projection.translateX;\n    const y = (-lat + projection.center[1]) * projection.scale + projection.translateY;\n    return [x, y];\n  }\n\n  // 市区町村のSVGパスを生成\n  getMunicipalityPath(municipality: Municipality): string {\n    // ディフォルメを適用\n    const deformed = this.getDeformedMunicipality(municipality);\n    // 選択された都道府県のビューで市区町村を表示\n    return geometryToPath(deformed.feature.geometry, this.currentProjection);\n  }\n\n  // 都道府県のホバー\n  hoverPrefecture(prefectureCode: string | null) {\n    const previousHovered = this.state.hoveredPrefecture;\n    \n    if (prefectureCode) {\n      // 選択不可の場合はホバーしない\n      if (!this.isPrefectureSelectable(prefectureCode)) {\n        this.state.hoveredPrefecture = null;\n      } else {\n        const prefecture = this.prefectures.find(p => p.code === prefectureCode);\n        this.state.hoveredPrefecture = prefecture || null;\n      }\n    } else {\n      this.state.hoveredPrefecture = null;\n    }\n    \n    // 状態が実際に変更された場合のみイベントを発火\n    if (previousHovered?.code !== this.state.hoveredPrefecture?.code) {\n      this.emit('stateChanged', this.state);\n    }\n  }\n\n  // 市区町村のホバー\n  hoverMunicipality(municipalityCode: string | null) {\n    const previousHovered = this.state.hoveredMunicipality;\n    \n    if (municipalityCode) {\n      const municipality = this.municipalities.find(m => m.code === municipalityCode);\n      this.state.hoveredMunicipality = municipality || null;\n    } else {\n      this.state.hoveredMunicipality = null;\n    }\n    \n    // 状態が実際に変更された場合のみイベントを発火\n    if (previousHovered?.code !== this.state.hoveredMunicipality?.code) {\n      this.emit('stateChanged', this.state);\n    }\n  }\n\n  // 日本全体ビューに戻る\n  resetView() {\n    this.state.selectedPrefecture = null;\n    this.state.viewBox = '0 0 800 600';\n    this.state.showTokyoIslands = false;\n    this.currentProjection = this.calculateOptimalProjection();\n    this.emit('stateChanged', this.state);\n  }\n  \n  // 東京都の離島表示を切り替え\n  toggleTokyoIslands() {\n    if (this.state.selectedPrefecture?.code === '13') {\n      this.state.showTokyoIslands = !this.state.showTokyoIslands;\n      \n      // 離島表示の場合はビューを調整\n      if (this.state.showTokyoIslands) {\n        // 離島の市区町村から実際の境界を計算\n        const islandMunicipalities = this.getSelectedMunicipalities();\n        if (islandMunicipalities.length > 0) {\n          let minLng = Infinity, maxLng = -Infinity;\n          let minLat = Infinity, maxLat = -Infinity;\n          \n          islandMunicipalities.forEach(municipality => {\n            const geometry = municipality.feature.geometry;\n            const updateBounds = (coord: number[]) => {\n              const [lng, lat] = coord;\n              minLng = Math.min(minLng, lng);\n              maxLng = Math.max(maxLng, lng);\n              minLat = Math.min(minLat, lat);\n              maxLat = Math.max(maxLat, lat);\n            };\n            \n            if (geometry.type === 'Polygon') {\n              (geometry.coordinates as number[][][]).forEach(ring => \n                ring.forEach(updateBounds)\n              );\n            } else if (geometry.type === 'MultiPolygon') {\n              (geometry.coordinates as number[][][][]).forEach(polygon =>\n                polygon.forEach(ring => ring.forEach(updateBounds))\n              );\n            }\n          });\n          \n          // パディングを追加\n          const padding = 1.0; // パディングを増やしてより余裕を持たせる\n          const islandBounds: [[number, number], [number, number]] = [\n            [minLng - padding, minLat - padding], \n            [maxLng + padding, maxLat + padding]\n          ];\n          \n          // 離島用の特別な投影設定\n          const width = (maxLng + padding) - (minLng - padding);\n          const height = (maxLat + padding) - (minLat - padding);\n          const centerLng = (minLng + maxLng) / 2;\n          const centerLat = (minLat + maxLat) / 2;\n          \n          // スケールを計算（画面中央に配置）\n          const scale = Math.min(\n            (this.props.width! - 100) / width,\n            (this.props.height! - 100) / height\n          ) * 0.8; // 少し小さめにして見やすくする\n          \n          this.currentProjection = {\n            scale,\n            translateX: this.props.width! / 2,\n            translateY: this.props.height! / 2,\n            center: [centerLng, centerLat]\n          };\n          \n          this.state.viewBox = `0 0 ${this.props.width} ${this.props.height}`;\n        }\n      } else {\n        // 本土エリアに戻す\n        const mainlandBounds: [[number, number], [number, number]] = [[138.5, 35.3], [140.0, 36.0]];\n        const { viewBox, projection } = calculateViewBox(mainlandBounds);\n        this.state.viewBox = viewBox;\n        this.currentProjection = projection;\n      }\n      \n      this.emit('stateChanged', this.state);\n    }\n  }\n\n  // 現在の状態を取得\n  getState(): MapState {\n    return { ...this.state };\n  }\n\n  // プロパティを取得\n  getProps(): JapanMapSelectorProps {\n    return { ...this.props };\n  }\n  \n  // 現在のテーマを取得\n  getTheme(): ColorTheme {\n    return { ...this.theme };\n  }\n  \n  // テーマを変更\n  setTheme(themeNameOrObject: ColorTheme | string) {\n    this.theme = applyColorOverrides(\n      getTheme(themeNameOrObject),\n      this.props\n    );\n    // テーマ名を保存（カラフル/ランダムテーマ用）\n    if (typeof themeNameOrObject === 'string') {\n      this.currentThemeName = themeNameOrObject;\n    }\n    this.emit('themeChanged', this.theme);\n    this.emit('stateChanged', this.state);\n  }\n\n  // ディフォルメモードの設定\n  setDeformMode(mode: 'none' | 'grid' | 'hexagon', gridSize: number = 0.1) {\n    this.deformMode = mode;\n    \n    if (mode === 'none') {\n      this.deformer = null;\n    } else if (mode === 'grid') {\n      this.deformer = new GridDeformer({ gridSize, preserveTopology: true });\n    } else if (mode === 'hexagon') {\n      this.deformer = new HexagonalGridDeformer({ gridSize, preserveTopology: true });\n    }\n    \n    this.emit('stateChanged', this.state);\n  }\n\n  // ディフォルメされた都道府県データを取得\n  private getDeformedPrefecture(prefecture: Prefecture): Prefecture {\n    if (!this.deformer) return prefecture;\n    return this.deformer.deformPrefecture(prefecture);\n  }\n\n  // ディフォルメされた市区町村データを取得\n  private getDeformedMunicipality(municipality: Municipality): Municipality {\n    if (!this.deformer) return municipality;\n    return this.deformer.deformMunicipality(municipality);\n  }\n  \n  // 都道府県の塗りつぶし色を取得（テーマによって異なる）\n  getPrefectureFillColor(prefecture: Prefecture): string {\n    // 選択不可の場合\n    if (!this.isPrefectureSelectable(prefecture.code)) {\n      return this.props.disabledPrefectureFill || '#cccccc';\n    }\n    \n    if (this.currentThemeName === 'colorful' || this.currentThemeName === 'random') {\n      return getPrefectureFillColor(prefecture.code, this.currentThemeName);\n    }\n    return this.theme.prefectureFill;\n  }\n  \n  // 都道府県の枠線色を取得\n  getPrefectureStrokeColor(prefecture: Prefecture): string {\n    // 選択不可の場合\n    if (!this.isPrefectureSelectable(prefecture.code)) {\n      return this.props.disabledPrefectureStroke || '#999999';\n    }\n    return this.theme.prefectureStroke;\n  }\n  \n  // 市区町村の塗りつぶし色を取得（テーマによって異なる）\n  getMunicipalityFillColor(municipality: Municipality): string {\n    if (this.currentThemeName === 'colorful' || this.currentThemeName === 'random') {\n      return getMunicipalityFillColor(municipality.code, municipality.prefectureCode, this.currentThemeName);\n    }\n    return this.theme.municipalityFill;\n  }\n  \n  // 市区町村のホバー色を取得（テーマによって異なる）\n  getMunicipalityHoverFillColor(municipality: Municipality): string {\n    if (this.currentThemeName === 'colorful' || this.currentThemeName === 'random') {\n      return getMunicipalityHoverFillColor(municipality.code, municipality.prefectureCode, this.currentThemeName);\n    }\n    return this.theme.municipalityHoverFill;\n  }\n}","// 国土数値情報の出典表示用ユーティリティ\n\nexport interface AttributionOptions {\n  showLink?: boolean;\n  className?: string;\n  style?: Partial<CSSStyleDeclaration>;\n}\n\n/**\n * 国土数値情報の出典表示テキストを取得\n */\nexport function getAttributionText(): string {\n  return '地図データ：「国土数値情報（行政区域データ）」（国土交通省）を加工して作成';\n}\n\n/**\n * 国土数値情報の出典表示HTMLを取得\n */\nexport function getAttributionHTML(options: AttributionOptions = {}): string {\n  const { showLink = true, className = 'japan-map-attribution' } = options;\n  \n  if (showLink) {\n    return `<div class=\"${className}\">地図データ：<a href=\"https://nlftp.mlit.go.jp/ksj/index.html\" target=\"_blank\" rel=\"noopener\">国土数値情報（行政区域データ）</a>（国土交通省）を加工して作成</div>`;\n  } else {\n    return `<div class=\"${className}\">地図データ：「国土数値情報（行政区域データ）」（国土交通省）を加工して作成</div>`;\n  }\n}\n\n/**\n * 出典表示用のDOM要素を作成\n */\nexport function createAttributionElement(options: AttributionOptions = {}): HTMLElement {\n  const { showLink = true, className = 'japan-map-attribution', style = {} } = options;\n  \n  const div = document.createElement('div');\n  div.className = className;\n  \n  // デフォルトスタイル\n  const defaultStyle: Partial<CSSStyleDeclaration> = {\n    fontSize: '12px',\n    color: '#666',\n    padding: '4px 8px',\n    backgroundColor: 'rgba(255, 255, 255, 0.8)',\n    borderRadius: '4px',\n    margin: '4px',\n    ...style\n  };\n  \n  // スタイルを適用\n  Object.assign(div.style, defaultStyle);\n  \n  if (showLink) {\n    div.innerHTML = '地図データ：<a href=\"https://nlftp.mlit.go.jp/ksj/index.html\" target=\"_blank\" rel=\"noopener\" style=\"color: #0066cc; text-decoration: none;\">国土数値情報（行政区域データ）</a>（国土交通省）を加工して作成';\n  } else {\n    div.textContent = getAttributionText();\n  }\n  \n  return div;\n}\n\n/**\n * SVG要素に出典表示を追加\n */\nexport function addAttributionToSVG(svg: SVGSVGElement, options: {\n  x?: number;\n  y?: number;\n  fontSize?: number;\n  fill?: string;\n} = {}): void {\n  const svgElement = svg as SVGSVGElement;\n  const defaultY = svgElement.viewBox?.baseVal?.height ? svgElement.viewBox.baseVal.height - 10 : 590;\n  \n  const {\n    x = 10,\n    y = defaultY,\n    fontSize = 10,\n    fill = '#666'\n  } = options;\n  \n  const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n  text.setAttribute('x', x.toString());\n  text.setAttribute('y', y.toString());\n  text.setAttribute('font-size', fontSize.toString());\n  text.setAttribute('fill', fill);\n  text.setAttribute('font-family', 'sans-serif');\n  text.textContent = getAttributionText();\n  \n  svg.appendChild(text);\n}\n\n/**\n * React用の出典表示コンポーネントのプロパティ\n */\nexport interface AttributionProps {\n  showLink?: boolean;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\n/**\n * 出典表示用のデフォルトCSS\n */\nexport const attributionCSS = `\n.japan-map-attribution {\n  font-size: 12px;\n  color: #666;\n  padding: 4px 8px;\n  background-color: rgba(255, 255, 255, 0.8);\n  border-radius: 4px;\n  margin: 4px;\n  position: absolute;\n  bottom: 0;\n  right: 0;\n  z-index: 1000;\n}\n\n.japan-map-attribution a {\n  color: #0066cc;\n  text-decoration: none;\n}\n\n.japan-map-attribution a:hover {\n  text-decoration: underline;\n}\n\n/* ダークテーマ用 */\n.japan-map-attribution.dark {\n  background-color: rgba(0, 0, 0, 0.8);\n  color: #ccc;\n}\n\n.japan-map-attribution.dark a {\n  color: #66b3ff;\n}\n`;"],"names":[],"mappings":";;AAAA;AACO,MAAM,gBAAgB,GAA8B;AACzD,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,KAAK,EAAE,IAAI;CACZ;;MCpBY,iBAAiB,CAAA;AAM5B,IAAA,WAAA,CAAY,UAAkB,YAAY,EAAA;QAJlC,IAAK,CAAA,KAAA,GAAc,EAAE,CAAC;QAEtB,IAAgB,CAAA,gBAAA,GAAW,QAAQ,CAAC;AAG1C,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;;AAGD,IAAA,MAAM,SAAS,GAAA;QACb,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;AAEvB,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,wBAAwB,CAAC;AACzD,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;AAEvC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,2BAAA,EAA8B,QAAQ,CAAC,UAAU,CAAE,CAAA,CAAC,CAAC;SACtE;QAED,IAAI,CAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;KACpC;;AAGD,IAAA,YAAY,CAAC,SAAiB,EAAA;AAC5B,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;KACnC;;IAGD,MAAM,qBAAqB,CAAC,cAAsB,EAAA;AAChD,QAAA,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC;KAC9D;;IAGD,MAAM,+BAA+B,CAAC,cAAsB,EAAA;AAC1D,QAAA,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;;QAGvB,MAAM,QAAQ,GAAG,CAAG,EAAA,cAAc,IAAI,IAAI,CAAC,gBAAgB,CAAA,CAAE,CAAC;;AAG9D,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC7B;;QAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,cAAc,cAAc,CAAA,mBAAA,CAAqB,CAAC,CAAC;SACpE;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,CAAmB,gBAAA,EAAA,IAAI,CAAC,gBAAgB,CAAiC,8BAAA,EAAA,cAAc,CAAE,CAAA,CAAC,CAAC;SAC5G;;QAGD,MAAM,OAAO,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAC,IAAI,CAAA,CAAE,CAAC;AACnD,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;AAEtC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,kCAAA,EAAqC,QAAQ,CAAC,UAAU,CAAE,CAAA,CAAC,CAAC;SAC7E;AAED,QAAA,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AACtC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAA4B,CAAC;;AAGtD,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AAEhC,QAAA,OAAO,QAAQ,CAAC;KACjB;;IAGD,MAAM,gCAAgC,CAAC,eAAyB,EAAA;AAC9D,QAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,IACvC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAC3C,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC5C,QAAA,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;KACvB;;AAGD,IAAA,UAAU,CAAC,cAAuB,EAAA;QAChC,IAAI,cAAc,EAAE;;AAElB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACpC,gBAAA,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAClC,oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACxB;AACH,aAAC,CAAC,CAAC;SACJ;aAAM;;AAEL,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SACjB;KACF;;IAGD,YAAY,GAAA;AACV,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;AACtC,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;YACpC,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,YAAA,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC5B,SAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;AACrC,YAAA,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;SACrC,CAAC;KACH;;IAGD,MAAM,eAAe,CAAC,cAAsB,EAAA;AAI1C,QAAA,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC;QAE3B,MAAM,KAAK,GAAoC,EAAE,CAAC;AAClD,QAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAI;AAC3D,YAAA,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;AAC/B,SAAC,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK;SACN,CAAC;KACH;AACF;;ACnKD;AAUA;AACO,eAAe,kBAAkB,CAAC,GAAW,EAAA;AAClD,IAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,IAAA,MAAM,IAAI,GAA6B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE7D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;QACnC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7D,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;;QAElD,MAAM,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;QAEhE,OAAO;AACL,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,IAAI,EAAE,cAAc;YACpB,MAAM;AACN,YAAA,OAAO,EAAE;AACP,gBAAA,GAAG,OAAO;AACV,gBAAA,UAAU,EAAE;oBACV,GAAG,OAAO,CAAC,UAAU;AACrB,oBAAA,OAAO,EAAE,cAAc;AACxB,iBAAA;AACF,aAAA;SACF,CAAC;AACJ,KAAC,CAAC,CAAC;AACL,CAAC;AAED;AACO,eAAe,oBAAoB,CAAC,GAAW,EAAA;AACpD,IAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,IAAA,MAAM,IAAI,GAA6B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE7D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAG;;QAEjC,IAAI,cAAc,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;AAC9B,YAAA,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAC7D;AAAM,aAAA,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;;YAErC,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;SACvE;AAED,QAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO;YAC3B,OAAO,CAAC,UAAU,CAAC,OAAO;AAC1B,YAAA,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;;QAGzD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAA,EAAG,cAAc,CAAA,GAAA,CAAK,CAAC;QAElE,OAAO;YACL,IAAI;AACJ,YAAA,IAAI,EAAE,gBAAgB;YACtB,cAAc;YACd,OAAO;SACR,CAAC;AACJ,KAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED;AACA,SAAS,eAAe,CACtB,WAA0C,EAAA;IAE1C,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,IAAI,MAAM,GAAG,QAAQ,CAAC;AACtB,IAAA,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC;AACvB,IAAA,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC;AAEvB,IAAA,MAAM,iBAAiB,GAAG,CAAC,KAAe,KAAI;AAC5C,QAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,KAAC,CAAC;AAEF,IAAA,MAAM,cAAc,GAAG,CAAC,OAAmB,KAAI;AAC7C,QAAA,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACrC,KAAC,CAAC;;AAGF,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACtC,QAAA,WAA8B,CAAC,OAAO,CAAC,OAAO,IAAG;AAChD,YAAA,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAClC,SAAC,CAAC,CAAC;KACJ;SAAM;;AAEJ,QAAA,WAA4B,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;KACvD;AAED,IAAA,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;AACgB,SAAA,gCAAgC,CAC9C,cAA8B,EAC9B,cAAsB,EAAA;AAEtB,IAAA,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;AACzE,CAAC;AAED;AACA,IAAI,aAAa,GAA6B,IAAI,CAAC;AAEnD;AACM,SAAU,uBAAuB,CAAC,OAAgB,EAAA;AACtD,IAAA,aAAa,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC/C,IAAA,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;AACO,eAAe,+BAA+B,CAAC,cAAsB,EAAA;IAC1E,IAAI,CAAC,aAAa,EAAE;AAClB,QAAA,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;KACxF;IAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,+BAA+B,CAAC,cAAc,CAAC,CAAC;AAErF,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAG;AAC5B,QAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO;YAC3B,OAAO,CAAC,UAAU,CAAC,OAAO;AAC1B,YAAA,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;QAEzD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAA,EAAG,cAAc,CAAA,GAAA,CAAK,CAAC;QAElE,OAAO;YACL,IAAI;AACJ,YAAA,IAAI,EAAE,gBAAgB;YACtB,cAAc;YACd,OAAO;SACR,CAAC;AACJ,KAAC,CAAC,CAAC;AACL,CAAC;AAED;AACM,SAAU,yBAAyB,CAAC,SAAiB,EAAA;IACzD,IAAI,aAAa,EAAE;AACjB,QAAA,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;KACvC;AACH,CAAC;AAED;AACM,SAAU,uBAAuB,CAAC,cAAuB,EAAA;IAC7D,IAAI,aAAa,EAAE;AACjB,QAAA,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;KAC1C;AACH;;ACzJA;AAYA;SACgB,kBAAkB,CAChC,SAAiB,EACjB,QAAgB,EAChB,MAAwB,EAAA;;AAGxB,IAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC/C,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7E,QAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACf;IAED,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAC5E,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;;AAG5E,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;AAChC,QAAA,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACjG,QAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACf;AAED,IAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,CAAC;AAED;SACgB,cAAc,CAC5B,QAAoC,EACpC,UAA4B,EAC5B,SAAqE,EAAA;IAErE,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,IAAA,MAAM,WAAW,GAAG,CAAC,IAAgB,KAAI;;QAEvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO;SACR;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;;AAE5B,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,gBAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;gBAC3C,OAAO;aACR;AACD,YAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;;YAEzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACtD,gBAAA,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;gBAC/C,OAAO;aACR;AACD,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;;YAGtD,IAAI,SAAS,EAAE;gBACb,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC;gBAC/C,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC;aAChD;AAED,YAAA,IAAI,WAAW,KAAK,CAAC,EAAE;gBACrB,QAAQ,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAC,CAAC;aAC7B;iBAAM;gBACL,QAAQ,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAC,CAAC;aAC7B;AACD,YAAA,WAAW,EAAE,CAAC;AAChB,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,WAAW,GAAG,CAAC,EAAE;AACnB,YAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACpB;AACH,KAAC,CAAC;AAEF,IAAA,MAAM,cAAc,GAAG,CAAC,OAAqB,KAAI;AAC/C,QAAA,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,KAAC,CAAC;AAEF,IAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AAC/B,QAAA,cAAc,CAAC,QAAQ,CAAC,WAA2B,CAAC,CAAC;KACtD;AAAM,SAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;AAC1C,QAAA,QAAQ,CAAC,WAA8B,CAAC,OAAO,CAAC,OAAO,IAAG;YACzD,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1B,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;SACgB,gBAAgB,CAC9B,MAA4C,EAC5C,UAAkB,EAAE,EAAA;AAEpB,IAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC;IAC9C,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;AAEtC,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1B,IAAA,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;;IAG7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,EAC3B,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,IAAI,MAAM,CAC7B,CAAC;AAEF,IAAA,MAAM,UAAU,GAAqB;QACnC,KAAK;AACL,QAAA,UAAU,EAAE,GAAG;AACf,QAAA,UAAU,EAAE,GAAG;AACf,QAAA,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KAC/B,CAAC;IAEF,OAAO;AACL,QAAA,OAAO,EAAE,CAAa,WAAA,CAAA;QACtB,UAAU;KACX,CAAC;AACJ,CAAC;AAED;AACa,MAAA,YAAY,GAAyC;AAChE,IAAA,CAAC,KAAK,EAAE,IAAI,CAAC;AACb,IAAA,CAAC,KAAK,EAAE,IAAI,CAAC;EACb;AAEF;SACgB,oBAAoB,GAAA;IAClC,OAAO;QACL,KAAK,EAAE,EAAE;AACT,QAAA,UAAU,EAAE,GAAG;AACf,QAAA,UAAU,EAAE,GAAG;AACf,QAAA,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;KACtB,CAAC;AACJ;;ACjJA;AACO,MAAM,aAAa,GAAG;IAC3B,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;CACP,CAAC;AAEF;AACM,SAAU,aAAa,CAAC,gBAAwB,EAAA;AACpD,IAAA,OAAO,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAClD;;AChBA;AAIa,MAAA,MAAM,GAA+B;AAChD,IAAA,OAAO,EAAE;AACP,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,MAAM;AACxB,QAAA,mBAAmB,EAAE,SAAS;AAC9B,QAAA,sBAAsB,EAAE,SAAS;AACjC,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,MAAM;AAC1B,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;AAED,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,MAAM;AACxB,QAAA,mBAAmB,EAAE,SAAS;AAC9B,QAAA,sBAAsB,EAAE,SAAS;AACjC,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,MAAM;AAC1B,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;AAED,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,mBAAmB,EAAE,SAAS;AAC9B,QAAA,sBAAsB,EAAE,SAAS;AACjC,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;AAED,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,mBAAmB,EAAE,SAAS;AAC9B,QAAA,sBAAsB,EAAE,SAAS;AACjC,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;AAED,IAAA,UAAU,EAAE;AACV,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,MAAM;AACxB,QAAA,mBAAmB,EAAE,MAAM;AAC3B,QAAA,sBAAsB,EAAE,MAAM;AAC9B,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,MAAM;AAC1B,QAAA,qBAAqB,EAAE,MAAM;AAC7B,QAAA,wBAAwB,EAAE,MAAM;AAChC,QAAA,eAAe,EAAE,MAAM;AACvB,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;AAED,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,MAAM;AACxB,QAAA,mBAAmB,EAAE,SAAS;AAC9B,QAAA,sBAAsB,EAAE,SAAS;AACjC,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;AAED,IAAA,MAAM,EAAE;AACN,QAAA,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,SAAS;AACzB,QAAA,gBAAgB,EAAE,MAAM;AACxB,QAAA,mBAAmB,EAAE,MAAM;AAC3B,QAAA,sBAAsB,EAAE,MAAM;AAC9B,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,kBAAkB,EAAE,MAAM;AAC1B,QAAA,qBAAqB,EAAE,SAAS;AAChC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,WAAW,EAAE,GAAG;AACjB,KAAA;EACD;AAEF;AACM,SAAU,QAAQ,CAAC,iBAAkD,EAAA;IACzE,IAAI,CAAC,iBAAiB,EAAE;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC;KACvB;AAED,IAAA,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE;QACzC,OAAO,MAAM,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;KACpD;;AAGD,IAAA,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;AACgB,SAAA,mBAAmB,CAAC,KAAiB,EAAE,KAAU,EAAA;IAC/D,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,cAAc,EAAE,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,cAAc;AAC7D,QAAA,mBAAmB,EAAE,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,mBAAmB;AAC5E,QAAA,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,gBAAgB;AACnE,QAAA,qBAAqB,EAAE,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,qBAAqB;KACnF,CAAC;AACJ,CAAC;AAED;AACA,MAAM,eAAe,GAAG;AACtB,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AACrD,IAAA,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;CACtD,CAAC;AAEF;AACgB,SAAA,sBAAsB,CAAC,cAAsB,EAAE,SAAiB,EAAA;AAC9E,IAAA,IAAI,SAAS,KAAK,UAAU,EAAE;;QAE5B,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,eAAe,CAAC,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;KACxD;AAAM,SAAA,IAAI,SAAS,KAAK,QAAQ,EAAE;;QAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC;QACjC,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;AACnC,QAAA,OAAO,OAAO,GAAG,CAAA,EAAA,EAAK,UAAU,CAAM,GAAA,EAAA,SAAS,IAAI,CAAC;KACrD;;AAGD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,EAAE,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;AAC5E,CAAC;AAED;AACA,SAAS,QAAQ,CAAC,GAAW,EAAA;IAC3B,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrE,OAAO,MAAM,GAAG;QACd,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;KAC3B,GAAG,IAAI,CAAC;AACX,CAAC;AAED;AACA,SAAS,YAAY,CAAC,GAAW,EAAE,OAAe,EAAA;AAChD,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1B,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG,CAAC;IAErB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;AAErE,IAAA,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAK,EAAA,EAAA,CAAC,GAAG,CAAC;AACjC,CAAC;AAED;SACgB,wBAAwB,CAAC,gBAAwB,EAAE,cAAsB,EAAE,SAAiB,EAAA;AAC1G,IAAA,IAAI,SAAS,KAAK,UAAU,EAAE;;QAE5B,MAAM,eAAe,GAAG,sBAAsB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC1E,OAAO,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;KAC3C;AAAM,SAAA,IAAI,SAAS,KAAK,QAAQ,EAAE;;AAEjC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,CAAC,QAAQ,GAAG,KAAK,IAAI,GAAG,CAAC;AACzC,QAAA,MAAM,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC;QACxC,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;AACnC,QAAA,OAAO,OAAO,GAAG,CAAA,EAAA,EAAK,UAAU,CAAM,GAAA,EAAA,SAAS,IAAI,CAAC;KACrD;;AAGD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,EAAE,gBAAgB,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAChF,CAAC;AAED;SACgB,6BAA6B,CAAC,gBAAwB,EAAE,cAAsB,EAAE,SAAiB,EAAA;AAC/G,IAAA,IAAI,SAAS,KAAK,UAAU,EAAE;;QAE5B,MAAM,SAAS,GAAG,wBAAwB,CAAC,gBAAgB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;;QAExF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChE,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/C,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/C,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/C,YAAA,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAK,EAAA,EAAA,CAAC,GAAG,CAAC;SAChC;AACD,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KAC9C;AAAM,SAAA,IAAI,SAAS,KAAK,QAAQ,EAAE;;QAEjC,MAAM,SAAS,GAAG,wBAAwB,CAAC,gBAAgB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE;YACT,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAChD,YAAA,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAM,GAAA,EAAA,CAAC,IAAI,CAAC;SAClC;AACD,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;KAC5C;;AAGD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,EAAE,qBAAqB,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAC1F;;ACzOA;MASa,YAAY,CAAA;IAIvB,WAAY,CAAA,OAAA,GAA+B,EAAE,QAAQ,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAA;AAClF,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;KAClD;;AAGS,IAAA,UAAU,CAAC,KAAe,EAAA;AAClC,QAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AACzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AACnE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AACnE,QAAA,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;KACjC;;AAGS,IAAA,oBAAoB,CAAC,OAAmB,EAAA;QAChD,IAAI,IAAI,GAAG,CAAC,CAAC;AACb,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAA,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,YAAA,IAAI,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3C;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;KAC3B;;AAGS,IAAA,sBAAsB,CAAC,OAAmB,EAAA;AAClD,QAAA,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AACjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvB;QACD,OAAO,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;KACrC;;AAGS,IAAA,aAAa,CAAC,OAAmB,EAAA;;QAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAExD,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;;AAG9D,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,MAAM,MAAM,GAAe,EAAE,CAAC;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;AAE/B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,gBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAClB,oBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1B;aACF;;AAGD,YAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;;gBAErB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;;AAG9C,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;;AAGjC,gBAAA,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;oBACtD,OAAO;AACL,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;qBACvD,CAAC;iBACH;qBAAM;;AAEL,oBAAA,OAAO,OAAO,CAAC;iBAChB;aACF;;AAGD,YAAA,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,gBAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACjD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B;AAED,YAAA,OAAO,MAAM,CAAC;SACf;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;;AAGD,IAAA,cAAc,CAAC,QAAa,EAAA;AAC1B,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;YAC/B,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAgB,KAC9D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CACzB,CAAC;YAEF,OAAO;AACL,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,WAAW,EAAE,aAAa;aAC3B,CAAC;SACH;AAAM,aAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;;AAE3C,YAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,WAAW;AAC1C,iBAAA,GAAG,CAAC,CAAC,OAAqB,KAAI;AAC7B,gBAAA,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAgB,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;;AAGlF,gBAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;;AAEzD,oBAAA,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE;AAC/C,wBAAA,OAAO,IAAI,CAAC;qBACb;iBACF;AAED,gBAAA,OAAO,aAAa,CAAC;AACvB,aAAC,CAAC;iBACD,MAAM,CAAC,CAAC,OAA4B,KAA8B,OAAO,KAAK,IAAI,CAAC,CAAC;;AAGvF,YAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;;gBAEjC,IAAI,OAAO,GAAG,CAAC,CAAC;gBAChB,IAAI,UAAU,GAAG,IAAI,CAAC;gBAEtB,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAqB,KAAI;AACrD,oBAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;wBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,wBAAA,IAAI,IAAI,GAAG,OAAO,EAAE;4BAClB,OAAO,GAAG,IAAI,CAAC;AACf,4BAAA,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;yBACzB;qBACF;AACH,iBAAC,CAAC,CAAC;gBAEH,IAAI,UAAU,EAAE;oBACd,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;oBACvD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9C,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAG7B,oBAAA,MAAM,MAAM,GAAG;AACb,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACtD,wBAAA,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;qBACvD,CAAC;oBAEF,OAAO;AACL,wBAAA,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,CAAC,MAAM,CAAC;qBACtB,CAAC;iBACH;aACF;;AAGD,YAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACjC,OAAO;AACL,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;iBACjC,CAAC;aACH;YAED,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,WAAW,EAAE,gBAAgB;aAC9B,CAAC;SACH;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;;AAGD,IAAA,gBAAgB,CAAC,UAAsB,EAAA;QACrC,OAAO;AACL,YAAA,GAAG,UAAU;AACb,YAAA,OAAO,EAAE;gBACP,GAAG,UAAU,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC3D,aAAA;SACF,CAAC;KACH;;AAGD,IAAA,kBAAkB,CAAC,YAA0B,EAAA;QAC3C,OAAO;AACL,YAAA,GAAG,YAAY;AACf,YAAA,OAAO,EAAE;gBACP,GAAG,YAAY,CAAC,OAAO;gBACvB,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC7D,aAAA;SACF,CAAC;KACH;;AAGD,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;KACtB;;AAGD,IAAA,eAAe,CAAC,cAAsB,EAAA;QACpC,QAAQ,cAAc;YACpB,KAAK,IAAI;AACP,gBAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACpB,MAAM;YACR,KAAK,IAAI;AACP,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,IAAI;AACP,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,MAAM;AACR,YAAA;AACE,gBAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;SACvB;KACF;AACF,CAAA;AAED;AACM,MAAO,qBAAsB,SAAQ,YAAY,CAAA;;AAE7C,IAAA,aAAa,CAAC,KAAe,EAAA;AACnC,QAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAG3B,QAAA,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;;QAGf,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;;QAG9B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;AAC7B,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAEnB,QAAA,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACrB;;AAGS,IAAA,aAAa,CAAC,OAAmB,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjE,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,MAAM,MAAM,GAAe,EAAE,CAAC;AAC9B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxC,IAAI,CAAC,KAAK,CAAC;AACP,oBAAA,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,oBAAA,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;oBACvC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1B;aACF;AAED,YAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,gBAAA,OAAO,OAAO,CAAC;aAChB;AAED,YAAA,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,gBAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACjD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B;AAED,YAAA,OAAO,MAAM,CAAC;SACf;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;AACF;;AC5RD;MA4Ba,gBAAgB,CAAA;AAc3B,IAAA,WAAA,CAAY,QAA+B,EAAE,EAAA;QAbrC,IAAW,CAAA,WAAA,GAAiB,EAAE,CAAC;QAC/B,IAAc,CAAA,cAAA,GAAmB,EAAE,CAAC;AACpC,QAAA,IAAA,CAAA,mBAAmB,GAAgC,IAAI,GAAG,EAAE,CAAC;AAE7D,QAAA,IAAA,CAAA,SAAS,GAA4B,IAAI,GAAG,EAAE,CAAC;QAI/C,IAAgB,CAAA,gBAAA,GAAW,SAAS,CAAC;QACrC,IAAQ,CAAA,QAAA,GAAwB,IAAI,CAAC;QACrC,IAAU,CAAA,UAAA,GAAgC,MAAM,CAAC;QACjD,IAAuB,CAAA,uBAAA,GAAY,KAAK,CAAC;QAG/C,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,GAAG,KAAK;SACT,CAAC;;AAGF,QAAA,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAC9B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EACrB,KAAK,CACN,CAAC;AACF,QAAA,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;AACnC,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;SACrC;AAED,QAAA,IAAI,CAAC,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,gBAAgB,EAAE,KAAK;SACxB,CAAC;KACH;;AAGD,IAAA,MAAM,UAAU,CAAC,iBAAyB,EAAE,mBAA2B,EAAA;;AAErE,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;AACnC,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;;YAErB,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;;AAEtE,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAClC,gBAAA,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;aAC3D;;YAED,IAAI,CAAC,WAAW,GAAG,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;;AAE/D,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;SAC1B;aAAM;;YAEL,IAAI,CAAC,WAAW,GAAG,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YAC/D,IAAI,CAAC,cAAc,GAAG,MAAM,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;SACvE;;AAGD,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;AAE3D,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KAC1B;;IAGO,0BAA0B,GAAA;QAChC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;YACjC,OAAO,oBAAoB,EAAE,CAAC;SAC/B;QAED,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,QAAQ,CAAC;QAC1C,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,QAAQ,CAAC;;AAG1C,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,IAAG;AAC9B,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;AACvB,gBAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;;AAGnD,gBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;;oBAEvB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChC,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACjD,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;oBACjD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;iBAClC;AAAM,qBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;;;AAG9B,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACjD,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;oBACjD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACjC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;iBAClC;qBAAM;oBACL,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAChC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAChC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACjC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;iBAClC;aACF;AACH,SAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;AACxC,QAAA,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG,CAAC;AAC9C,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9B,QAAA,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;;AAG/B,QAAA,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAM,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC;AACzD,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAO,GAAG,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC;AAC3D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;QAE7C,OAAO;YACL,KAAK;YACL,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM,GAAG,CAAC;YACjC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO,GAAG,CAAC,GAAG,EAAE;AACvC,YAAA,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;SAC/B,CAAC;KACH;;IAGD,EAAE,CAAC,KAAa,EAAE,QAAkB,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SAC/B;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC3C;;IAGD,GAAG,CAAC,KAAa,EAAE,QAAkB,EAAA;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE;YACb,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1C,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;AACd,gBAAA,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC5B;SACF;KACF;;IAGD,IAAI,CAAC,KAAa,EAAE,IAAU,EAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;SAC/C;KACF;;AAGD,IAAA,sBAAsB,CAAC,cAAsB,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE;YACtF,OAAO,IAAI,CAAC;SACb;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;KAClE;;IAGD,MAAM,gBAAgB,CAAC,cAAsB,EAAA;;QAE3C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE;YAChD,OAAO;SACR;AAED,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACzE,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,UAAU,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;;AAGpC,YAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;;AAEhC,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;;gBAGzB,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;;AAEjD,oBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE;AACtC,wBAAA,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;qBAChD;AAED,oBAAA,IAAI;;AAEF,wBAAA,MAAM,2BAA2B,GAAG,MAAM,+BAA+B,CAAC,cAAc,CAAC,CAAC;wBAC1F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;;AAG1E,wBAAA,IAAI,CAAC,cAAc,GAAG,2BAA2B,CAAC;;AAGlD,wBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AACpC,4BAAA,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;yBAC9C;qBACF;oBAAC,OAAO,KAAK,EAAE;wBACd,OAAO,CAAC,KAAK,CAAC,CAAA,6CAAA,EAAgD,cAAc,CAAG,CAAA,CAAA,EAAE,KAAK,CAAC,CAAC;;AAExF,wBAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;;AAEzB,wBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AACpC,4BAAA,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;yBAC9C;wBACD,OAAO;qBACR;iBACF;qBAAM;;AAEL,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;iBAC1E;aACF;;AAGD,YAAA,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AAC/B,YAAA,IAAI,cAAc,KAAK,IAAI,EAAE;;AAE3B,gBAAA,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;aACzC;AAAM,iBAAA,IAAI,cAAc,KAAK,IAAI,EAAE;;;AAGlC,gBAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;gBAC1F,IAAI,YAAY,GAAG,QAAQ,EAAE,YAAY,GAAG,CAAC,QAAQ,CAAC;gBACtD,IAAI,YAAY,GAAG,QAAQ,EAAE,YAAY,GAAG,CAAC,QAAQ,CAAC;AAEtD,gBAAA,sBAAsB,CAAC,OAAO,CAAC,YAAY,IAAG;AAC5C,oBAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC/C,oBAAA,MAAM,YAAY,GAAG,CAAC,KAAe,KAAI;AACvC,wBAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;;AAEzB,wBAAA,IAAI,GAAG,GAAG,KAAK,EAAE;4BACf,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;4BAC3C,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;4BAC3C,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;4BAC3C,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;yBAC5C;AACH,qBAAC,CAAC;AAEF,oBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AAC9B,wBAAA,QAAQ,CAAC,WAA4B,CAAC,OAAO,CAAC,IAAI,IACjD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAC3B,CAAC;qBACH;AAAM,yBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;wBAC1C,QAAQ,CAAC,WAA8B,CAAC,OAAO,CAAC,OAAO,IACtD,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CACpD,CAAC;qBACH;AACH,iBAAC,CAAC,CAAC;;AAGH,gBAAA,IAAI,YAAY,KAAK,QAAQ,EAAE;AAC7B,oBAAA,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;iBACvE;aACF;;YAGD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7B,YAAA,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;AAEpC,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAEtC,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;AACjC,gBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;aAC3C;SACF;KACF;;AAGD,IAAA,kBAAkB,CAAC,gBAAwB,EAAA;AACzC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAChF,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;AAEhD,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;AACnC,gBAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;aAC/C;SACF;KACF;;IAGD,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;;IAGD,yBAAyB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;AAClC,YAAA,OAAO,EAAE,CAAC;SACX;;AAGD,QAAA,IAAI,iBAAiC,CAAC;AACtC,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;AAChC,YAAA,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC;SACzC;aAAM;AACL,YAAA,iBAAiB,GAAG,gCAAgC,CAClD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CACnC,CAAC;SACH;;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,KAAK,IAAI,EAAE;AAC/C,YAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAG;gBAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvC,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAC5D,aAAC,CAAC,CAAC;SACJ;;QAGD,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,KAAK,IAAI,EAAE;AAC/C,YAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAG;;gBAElC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;oBAC9C,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAA6B,CAAC;;AAErE,oBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;wBACvD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,wBAAA,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC3B,wBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAG;AACnB,4BAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACnB,4BAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACrB,yBAAC,CAAC,CAAC;AACH,wBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,wBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;wBAEvC,OAAO,EAAE,SAAS,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;qBACjD;iBACF;qBAAM,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;oBAChD,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAA2B,CAAC;AACnE,oBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1B,wBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAC5B,wBAAA,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC3B,wBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAG;AACnB,4BAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACnB,4BAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACrB,yBAAC,CAAC,CAAC;AACH,wBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,wBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;wBAEvC,OAAO,EAAE,SAAS,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;qBACjD;iBACF;AACD,gBAAA,OAAO,IAAI,CAAC;AACd,aAAC,CAAC,CAAC;SACJ;AAED,QAAA,OAAO,iBAAiB,CAAC;KAC1B;;AAGD,IAAA,iBAAiB,CAAC,UAAsB,EAAA;;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;;AAGxD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;AAClC,YAAA,IAAI,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;;AAGzC,YAAA,QAAQ,UAAU,CAAC,IAAI;AACrB,gBAAA,KAAK,KAAK;;AAER,oBAAA,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;oBACjD,MAAM;AACR,gBAAA,KAAK,KAAK;;AAER,oBAAA,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;oBAClD,MAAM;AACR,gBAAA,KAAK,MAAM;;oBAET,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBAClE,MAAM;AACR,gBAAA,KAAK,KAAK;;oBAER,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjF,MAAM;;;;;AAKR,gBAAA,KAAK,KAAK;;oBAER,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;oBACnE,MAAM;AACR,gBAAA,KAAK,KAAK;;;AAGR,oBAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;oBACzD,MAAM,gBAAgB,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;oBAC3C,MAAM,gBAAgB,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;AAE7C,oBAAA,MAAM,iBAAiB,GAAqB;wBAC1C,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,GAAG;wBACzC,UAAU,EAAE,GAAG;wBACf,UAAU,EAAE,GAAG;AACf,wBAAA,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;qBAC7C,CAAC;AACF,oBAAA,OAAO,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;aACtD;YAED,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;SACzD;AAED,QAAA,OAAO,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;KAC1E;;AAGO,IAAA,uBAAuB,CAC7B,QAA2C,EAAA;AAE3C,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;YACpC,MAAM,mBAAmB,GAAI,QAAQ,CAAC,WAA8B,CAAC,MAAM,CAAC,OAAO,IAAG;;AAEpF,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,gBAAA,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,KAAe,KAAI;AAC/B,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACnB,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACrB,iBAAC,CAAC,CAAC;AACH,gBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,gBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;;;gBAKvC,MAAM,UAAU,GAAG,EACjB,CAAC,SAAS,GAAG,IAAI;AACjB,qBAAC,SAAS,GAAG,KAAK,CAAC;iBACpB,CAAC;AAEF,gBAAA,OAAO,UAAU,CAAC;AACpB,aAAC,CAAC,CAAC;YAGH,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,WAAW,EAAE,mBAAmB;aACjC,CAAC;SACH;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;;AAGO,IAAA,yBAAyB,CAC/B,QAA2C,EAC3C,SAAiB,EACjB,SAA0B,EAAA;AAE1B,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;AACpC,YAAuB,QAAQ,CAAC,WAA8B,CAAC,OAAO;YACtE,MAAM,mBAAmB,GAAI,QAAQ,CAAC,WAA8B,CAAC,MAAM,CAAC,OAAO,IAAG;;AAEpF,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAe,KAAI;oBACpD,OAAO,SAAS,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAC5E,iBAAC,CAAC,CAAC;AACH,gBAAA,OAAO,cAAc,CAAC;AACxB,aAAC,CAAC,CAAC;YAGH,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,WAAW,EAAE,mBAAmB;aACjC,CAAC;SACH;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;;AAGO,IAAA,wBAAwB,CAC9B,QAA2C,EAC3C,SAAiB,EACjB,SAA4B,EAAA;AAE5B,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;YACpC,MAAM,mBAAmB,GAAI,QAAQ,CAAC,WAA8B,CAAC,MAAM,CAAC,OAAO,IAAG;AACpF,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAe,KAAI;oBACpD,OAAO,SAAS,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAC7E,iBAAC,CAAC,CAAC;AACH,gBAAA,OAAO,cAAc,CAAC;AACxB,aAAC,CAAC,CAAC;YAEH,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,WAAW,EAAE,mBAAmB;aACjC,CAAC;SACH;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;;IAGO,sBAAsB,CAC5B,QAA2C,EAC3C,MAA4C,EAAA;AAE5C,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;AACpC,YAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC;YAC9C,MAAM,mBAAmB,GAAI,QAAQ,CAAC,WAA8B,CAAC,MAAM,CAAC,OAAO,IAAG;AACpF,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAe,KAAI;AACpD,oBAAA,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;AACpC,wBAAA,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAChD,iBAAC,CAAC,CAAC;AACH,gBAAA,OAAO,cAAc,CAAC;AACxB,aAAC,CAAC,CAAC;YAEH,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,WAAW,EAAE,mBAAmB;aACjC,CAAC;SACH;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;;AAGO,IAAA,sBAAsB,CAC5B,QAA2C,EAAA;AAE3C,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;YACpC,MAAM,mBAAmB,GAAI,QAAQ,CAAC,WAA8B,CAAC,MAAM,CAAC,OAAO,IAAG;;AAEpF,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,gBAAA,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,KAAe,KAAI;AAC/B,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACnB,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACrB,iBAAC,CAAC,CAAC;AACH,gBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,gBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;;AAIvC,gBAAA,MAAM,UAAU,GAAG,EAAE,SAAS,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;AAE5D,gBAAA,OAAO,UAAU,CAAC;AACpB,aAAC,CAAC,CAAC;YAGH,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,WAAW,EAAE,mBAAmB;aACjC,CAAC;SACH;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;;IAGD,eAAe,GAAA;AACb,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC;;QAG1B,OAAO;YACL,CAAC,EAAE,GAAG;YACN,CAAC,EAAE,EAAE;YACL,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;SACZ,CAAC;KACH;;AAGO,IAAA,YAAY,CAAC,GAAW,EAAE,GAAW,EAAE,UAA4B,EAAA;QACzE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC;QAClF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC;AACnF,QAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACf;;AAGD,IAAA,mBAAmB,CAAC,YAA0B,EAAA;;QAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;;AAE5D,QAAA,OAAO,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;KAC1E;;AAGD,IAAA,eAAe,CAAC,cAA6B,EAAA;AAC3C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAErD,IAAI,cAAc,EAAE;;YAElB,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE;AAChD,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;aACrC;iBAAM;AACL,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;gBACzE,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,UAAU,IAAI,IAAI,CAAC;aACnD;SACF;aAAM;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;SACrC;;AAGD,QAAA,IAAI,eAAe,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE;YAChE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;SACvC;KACF;;AAGD,IAAA,iBAAiB,CAAC,gBAA+B,EAAA;AAC/C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAEvD,IAAI,gBAAgB,EAAE;AACpB,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;YAChF,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,YAAY,IAAI,IAAI,CAAC;SACvD;aAAM;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACvC;;AAGD,QAAA,IAAI,eAAe,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE;YAClE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;SACvC;KACF;;IAGD,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KACvC;;IAGD,kBAAkB,GAAA;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;;AAG3D,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;;AAE/B,gBAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAC9D,gBAAA,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnC,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,QAAQ,CAAC;oBAC1C,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,QAAQ,CAAC;AAE1C,oBAAA,oBAAoB,CAAC,OAAO,CAAC,YAAY,IAAG;AAC1C,wBAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC/C,wBAAA,MAAM,YAAY,GAAG,CAAC,KAAe,KAAI;AACvC,4BAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;4BACzB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;4BAC/B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;4BAC/B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;4BAC/B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACjC,yBAAC,CAAC;AAEF,wBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AAC9B,4BAAA,QAAQ,CAAC,WAA4B,CAAC,OAAO,CAAC,IAAI,IACjD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAC3B,CAAC;yBACH;AAAM,6BAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE;4BAC1C,QAAQ,CAAC,WAA8B,CAAC,OAAO,CAAC,OAAO,IACtD,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CACpD,CAAC;yBACH;AACH,qBAAC,CAAC,CAAC;;AAGH,oBAAA,MAAM,OAAO,GAAG,GAAG,CAAC;;AAOpB,oBAAA,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,CAAC;AACtD,oBAAA,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,CAAC;oBACvD,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;oBACxC,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;;AAGxC,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAM,GAAG,GAAG,IAAI,KAAK,EACjC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAO,GAAG,GAAG,IAAI,MAAM,CACpC,GAAG,GAAG,CAAC;oBAER,IAAI,CAAC,iBAAiB,GAAG;wBACvB,KAAK;AACL,wBAAA,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM,GAAG,CAAC;AACjC,wBAAA,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO,GAAG,CAAC;AAClC,wBAAA,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;qBAC/B,CAAC;AAEF,oBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA,IAAA,EAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;iBACrE;aACF;iBAAM;;AAEL,gBAAA,MAAM,cAAc,GAAyC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5F,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AACjE,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;aACrC;YAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;SACvC;KACF;;IAGD,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;KAC1B;;IAGD,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;KAC1B;;IAGD,QAAQ,GAAA;AACN,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;KAC1B;;AAGD,IAAA,QAAQ,CAAC,iBAAsC,EAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAC3B,IAAI,CAAC,KAAK,CACX,CAAC;;AAEF,QAAA,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE;AACzC,YAAA,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;SAC3C;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KACvC;;AAGD,IAAA,aAAa,CAAC,IAAiC,EAAE,QAAA,GAAmB,GAAG,EAAA;AACrE,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AAEvB,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AACnB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACtB;AAAM,aAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;SACxE;AAAM,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAqB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;SACjF;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;KACvC;;AAGO,IAAA,qBAAqB,CAAC,UAAsB,EAAA;QAClD,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,UAAU,CAAC;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;KACnD;;AAGO,IAAA,uBAAuB,CAAC,YAA0B,EAAA;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,YAAY,CAAC;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;KACvD;;AAGD,IAAA,sBAAsB,CAAC,UAAsB,EAAA;;QAE3C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACjD,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,SAAS,CAAC;SACvD;AAED,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;YAC9E,OAAO,sBAAsB,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACvE;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;KAClC;;AAGD,IAAA,wBAAwB,CAAC,UAAsB,EAAA;;QAE7C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACjD,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,IAAI,SAAS,CAAC;SACzD;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;KACpC;;AAGD,IAAA,wBAAwB,CAAC,YAA0B,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;AAC9E,YAAA,OAAO,wBAAwB,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACxG;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;KACpC;;AAGD,IAAA,6BAA6B,CAAC,YAA0B,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;AAC9E,YAAA,OAAO,6BAA6B,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SAC7G;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC;KACzC;AACF;;ACtzBD;AAQA;;AAEG;SACa,kBAAkB,GAAA;AAChC,IAAA,OAAO,uCAAuC,CAAC;AACjD,CAAC;AAED;;AAEG;AACa,SAAA,kBAAkB,CAAC,OAAA,GAA8B,EAAE,EAAA;IACjE,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,SAAS,GAAG,uBAAuB,EAAE,GAAG,OAAO,CAAC;IAEzE,IAAI,QAAQ,EAAE;QACZ,OAAO,CAAA,YAAA,EAAe,SAAS,CAAA,gIAAA,CAAkI,CAAC;KACnK;SAAM;QACL,OAAO,CAAA,YAAA,EAAe,SAAS,CAAA,6CAAA,CAA+C,CAAC;KAChF;AACH,CAAC;AAED;;AAEG;AACa,SAAA,wBAAwB,CAAC,OAAA,GAA8B,EAAE,EAAA;AACvE,IAAA,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,SAAS,GAAG,uBAAuB,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAErF,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC1C,IAAA,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;;AAG1B,IAAA,MAAM,YAAY,GAAiC;AACjD,QAAA,QAAQ,EAAE,MAAM;AAChB,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,eAAe,EAAE,0BAA0B;AAC3C,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,GAAG,KAAK;KACT,CAAC;;IAGF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAEvC,IAAI,QAAQ,EAAE;AACZ,QAAA,GAAG,CAAC,SAAS,GAAG,yKAAyK,CAAC;KAC3L;SAAM;AACL,QAAA,GAAG,CAAC,WAAW,GAAG,kBAAkB,EAAE,CAAC;KACxC;AAED,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;AAEG;SACa,mBAAmB,CAAC,GAAkB,EAAE,UAKpD,EAAE,EAAA;IACJ,MAAM,UAAU,GAAG,GAAoB,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC;AAEpG,IAAA,MAAM,EACJ,CAAC,GAAG,EAAE,EACN,CAAC,GAAG,QAAQ,EACZ,QAAQ,GAAG,EAAE,EACb,IAAI,GAAG,MAAM,EACd,GAAG,OAAO,CAAC;IAEZ,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;IAC5E,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpD,IAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChC,IAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AAC/C,IAAA,IAAI,CAAC,WAAW,GAAG,kBAAkB,EAAE,CAAC;AAExC,IAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAWD;;AAEG;AACU,MAAA,cAAc,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}