@factiii/stack 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +81 -60
  2. package/bin/{factiii → stack} +12 -12
  3. package/dist/cli/check-config.js +1 -1
  4. package/dist/cli/check-config.js.map +1 -1
  5. package/dist/cli/deploy-secrets.d.ts.map +1 -1
  6. package/dist/cli/deploy-secrets.js +11 -11
  7. package/dist/cli/deploy-secrets.js.map +1 -1
  8. package/dist/cli/deploy.d.ts.map +1 -1
  9. package/dist/cli/deploy.js +19 -9
  10. package/dist/cli/deploy.js.map +1 -1
  11. package/dist/cli/dev-sync.d.ts.map +1 -1
  12. package/dist/cli/dev-sync.js +10 -9
  13. package/dist/cli/dev-sync.js.map +1 -1
  14. package/dist/cli/execute-plugin-command.d.ts.map +1 -1
  15. package/dist/cli/execute-plugin-command.js +7 -7
  16. package/dist/cli/execute-plugin-command.js.map +1 -1
  17. package/dist/cli/fix.d.ts.map +1 -1
  18. package/dist/cli/fix.js +24 -4
  19. package/dist/cli/fix.js.map +1 -1
  20. package/dist/cli/init.d.ts +3 -1
  21. package/dist/cli/init.d.ts.map +1 -1
  22. package/dist/cli/init.js +382 -69
  23. package/dist/cli/init.js.map +1 -1
  24. package/dist/cli/pr-check.d.ts.map +1 -1
  25. package/dist/cli/pr-check.js +5 -4
  26. package/dist/cli/pr-check.js.map +1 -1
  27. package/dist/cli/scan.d.ts +6 -6
  28. package/dist/cli/scan.d.ts.map +1 -1
  29. package/dist/cli/scan.js +46 -30
  30. package/dist/cli/scan.js.map +1 -1
  31. package/dist/cli/secrets.d.ts.map +1 -1
  32. package/dist/cli/secrets.js +17 -16
  33. package/dist/cli/secrets.js.map +1 -1
  34. package/dist/cli/undeploy.d.ts.map +1 -1
  35. package/dist/cli/undeploy.js +4 -4
  36. package/dist/cli/undeploy.js.map +1 -1
  37. package/dist/cli/upgrade.d.ts +1 -1
  38. package/dist/cli/upgrade.js +5 -5
  39. package/dist/cli/upgrade.js.map +1 -1
  40. package/dist/cli/validate.js +1 -1
  41. package/dist/cli/validate.js.map +1 -1
  42. package/dist/constants/config-files.d.ts +23 -0
  43. package/dist/constants/config-files.d.ts.map +1 -0
  44. package/dist/constants/config-files.js +88 -0
  45. package/dist/constants/config-files.js.map +1 -0
  46. package/dist/generators/{generate-factiii-auto.d.ts → generate-stack-auto.d.ts} +4 -4
  47. package/dist/generators/generate-stack-auto.d.ts.map +1 -0
  48. package/dist/generators/{generate-factiii-auto.js → generate-stack-auto.js} +15 -13
  49. package/dist/generators/generate-stack-auto.js.map +1 -0
  50. package/dist/generators/{generate-factiii-yml.d.ts → generate-stack-yml.d.ts} +5 -5
  51. package/dist/generators/generate-stack-yml.d.ts.map +1 -0
  52. package/dist/generators/{generate-factiii-yml.js → generate-stack-yml.js} +16 -15
  53. package/dist/generators/generate-stack-yml.js.map +1 -0
  54. package/dist/generators/index.d.ts +2 -2
  55. package/dist/generators/index.d.ts.map +1 -1
  56. package/dist/generators/index.js +5 -5
  57. package/dist/generators/index.js.map +1 -1
  58. package/dist/plugins/pipelines/aws/index.js +3 -3
  59. package/dist/plugins/pipelines/aws/index.js.map +1 -1
  60. package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -1
  61. package/dist/plugins/pipelines/aws/scanfix/credentials.js +36 -44
  62. package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -1
  63. package/dist/plugins/pipelines/aws/scanfix/ec2.js +1 -1
  64. package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -1
  65. package/dist/plugins/pipelines/aws/scanfix/iam.js +2 -2
  66. package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -1
  67. package/dist/plugins/pipelines/aws/scanfix/rds.js +2 -2
  68. package/dist/plugins/pipelines/aws/scanfix/rds.js.map +1 -1
  69. package/dist/plugins/pipelines/factiii/index.d.ts +5 -3
  70. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
  71. package/dist/plugins/pipelines/factiii/index.js +14 -77
  72. package/dist/plugins/pipelines/factiii/index.js.map +1 -1
  73. package/dist/plugins/pipelines/factiii/pr-check.d.ts +1 -1
  74. package/dist/plugins/pipelines/factiii/pr-check.js +1 -1
  75. package/dist/plugins/pipelines/factiii/prod.d.ts.map +1 -1
  76. package/dist/plugins/pipelines/factiii/prod.js +3 -3
  77. package/dist/plugins/pipelines/factiii/prod.js.map +1 -1
  78. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts +1 -1
  79. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts.map +1 -1
  80. package/dist/plugins/pipelines/factiii/scanfix/config.js +10 -11
  81. package/dist/plugins/pipelines/factiii/scanfix/config.js.map +1 -1
  82. package/dist/plugins/pipelines/factiii/scanfix/env-files.d.ts +12 -0
  83. package/dist/plugins/pipelines/factiii/scanfix/env-files.d.ts.map +1 -0
  84. package/dist/plugins/pipelines/factiii/scanfix/env-files.js +310 -0
  85. package/dist/plugins/pipelines/factiii/scanfix/env-files.js.map +1 -0
  86. package/dist/plugins/pipelines/factiii/scanfix/local-config.d.ts +7 -0
  87. package/dist/plugins/pipelines/factiii/scanfix/local-config.d.ts.map +1 -0
  88. package/dist/plugins/pipelines/factiii/scanfix/local-config.js +70 -0
  89. package/dist/plugins/pipelines/factiii/scanfix/local-config.js.map +1 -0
  90. package/dist/plugins/pipelines/factiii/scanfix/secrets.js +6 -6
  91. package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
  92. package/dist/plugins/pipelines/factiii/scanfix/workflows.d.ts.map +1 -1
  93. package/dist/plugins/pipelines/factiii/scanfix/workflows.js +16 -26
  94. package/dist/plugins/pipelines/factiii/scanfix/workflows.js.map +1 -1
  95. package/dist/plugins/pipelines/factiii/staging.d.ts +1 -1
  96. package/dist/plugins/pipelines/factiii/staging.d.ts.map +1 -1
  97. package/dist/plugins/pipelines/factiii/staging.js +3 -2
  98. package/dist/plugins/pipelines/factiii/staging.js.map +1 -1
  99. package/dist/plugins/pipelines/factiii/utils/workflows.d.ts.map +1 -1
  100. package/dist/plugins/pipelines/factiii/utils/workflows.js +6 -21
  101. package/dist/plugins/pipelines/factiii/utils/workflows.js.map +1 -1
  102. package/dist/plugins/pipelines/factiii/workflows/stack-ci.yml +56 -0
  103. package/dist/plugins/pipelines/factiii/workflows/stack-cicd-prod.yml +54 -0
  104. package/dist/plugins/servers/mac/scanfix/containers.js +1 -1
  105. package/dist/plugins/servers/mac/scanfix/containers.js.map +1 -1
  106. package/dist/scanfix/fixes/pnpm.d.ts.map +1 -1
  107. package/dist/scanfix/fixes/pnpm.js +2 -2
  108. package/dist/scanfix/fixes/pnpm.js.map +1 -1
  109. package/dist/scripts/generate-all.d.ts.map +1 -1
  110. package/dist/scripts/generate-all.js +9 -8
  111. package/dist/scripts/generate-all.js.map +1 -1
  112. package/dist/scripts/get-repo-name.d.ts +1 -1
  113. package/dist/scripts/get-repo-name.js +5 -3
  114. package/dist/scripts/get-repo-name.js.map +1 -1
  115. package/dist/scripts/validate-env-files.js +7 -1
  116. package/dist/scripts/validate-env-files.js.map +1 -1
  117. package/dist/scripts/validate-example-values.d.ts +1 -1
  118. package/dist/scripts/validate-example-values.js +3 -2
  119. package/dist/scripts/validate-example-values.js.map +1 -1
  120. package/dist/scripts/validate-stack-yml.d.ts +6 -0
  121. package/dist/scripts/validate-stack-yml.d.ts.map +1 -0
  122. package/dist/scripts/{validate-factiii-yml.js → validate-stack-yml.js} +15 -11
  123. package/dist/scripts/validate-stack-yml.js.map +1 -0
  124. package/dist/utils/config-helpers.d.ts +15 -0
  125. package/dist/utils/config-helpers.d.ts.map +1 -1
  126. package/dist/utils/config-helpers.js +57 -5
  127. package/dist/utils/config-helpers.js.map +1 -1
  128. package/dist/utils/config-validator.d.ts +2 -2
  129. package/dist/utils/config-validator.d.ts.map +1 -1
  130. package/dist/utils/config-validator.js +7 -6
  131. package/dist/utils/config-validator.js.map +1 -1
  132. package/dist/utils/config-writer.d.ts +2 -2
  133. package/dist/utils/config-writer.d.ts.map +1 -1
  134. package/dist/utils/config-writer.js +6 -6
  135. package/dist/utils/config-writer.js.map +1 -1
  136. package/dist/utils/deployment-report.js +4 -4
  137. package/dist/utils/deployment-report.js.map +1 -1
  138. package/dist/utils/ssh-helper.js +6 -6
  139. package/dist/utils/ssh-helper.js.map +1 -1
  140. package/dist/utils/template-generator.js +1 -1
  141. package/dist/utils/version-check.d.ts +1 -1
  142. package/dist/utils/version-check.d.ts.map +1 -1
  143. package/dist/utils/version-check.js +9 -8
  144. package/dist/utils/version-check.js.map +1 -1
  145. package/package.json +8 -2
  146. package/dist/generators/generate-factiii-auto.d.ts.map +0 -1
  147. package/dist/generators/generate-factiii-auto.js.map +0 -1
  148. package/dist/generators/generate-factiii-yml.d.ts.map +0 -1
  149. package/dist/generators/generate-factiii-yml.js.map +0 -1
  150. package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-prod.yml +0 -112
  151. package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-staging.yml +0 -117
  152. package/dist/plugins/pipelines/factiii/workflows/factiii-command.yml +0 -130
  153. package/dist/plugins/pipelines/factiii/workflows/factiii-deploy.yml +0 -198
  154. package/dist/plugins/pipelines/factiii/workflows/factiii-dev-sync.yml +0 -179
  155. package/dist/plugins/pipelines/factiii/workflows/factiii-fix.yml +0 -176
  156. package/dist/plugins/pipelines/factiii/workflows/factiii-pr-check.yml +0 -103
  157. package/dist/plugins/pipelines/factiii/workflows/factiii-scan.yml +0 -176
  158. package/dist/plugins/pipelines/factiii/workflows/factiii-undeploy.yml +0 -95
  159. package/dist/scripts/validate-factiii-yml.d.ts +0 -6
  160. package/dist/scripts/validate-factiii-yml.d.ts.map +0 -1
  161. package/dist/scripts/validate-factiii-yml.js.map +0 -1
@@ -1,176 +0,0 @@
1
- name: Factiii Scan
2
-
3
- # Generated by @factiii/stack v{VERSION}
4
- # INFRASTRUCTURE: Scan servers for issues via CLI
5
- # Run: npx factiii scan (triggers this workflow for remote environments)
6
- # Runs on configured environments in parallel using matrix strategy
7
-
8
- on:
9
- workflow_dispatch:
10
- inputs:
11
- environment:
12
- description: 'Environment to scan'
13
- required: true
14
- type: choice
15
- options:
16
- - all
17
- - staging
18
- - prod
19
- default: all
20
-
21
- jobs:
22
- setup:
23
- runs-on: ubuntu-latest
24
- outputs:
25
- matrix: ${{ steps.set-matrix.outputs.matrix }}
26
- steps:
27
- - name: Checkout code
28
- uses: actions/checkout@v4
29
-
30
- - name: Install yq
31
- run: |
32
- sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
33
- sudo chmod +x /usr/local/bin/yq
34
-
35
- - name: Determine environments
36
- id: set-matrix
37
- run: |
38
- ENVS="[]"
39
-
40
- if [ "${{ inputs.environment }}" == "all" ]; then
41
- # Check which environments are configured
42
- HAS_STAGING=$(yq eval '.environments.staging != null' factiii.yml)
43
- HAS_PROD=$(yq eval '.environments.prod != null' factiii.yml)
44
-
45
- if [ "$HAS_STAGING" == "true" ] && [ "$HAS_PROD" == "true" ]; then
46
- ENVS='["staging", "prod"]'
47
- elif [ "$HAS_STAGING" == "true" ]; then
48
- ENVS='["staging"]'
49
- elif [ "$HAS_PROD" == "true" ]; then
50
- ENVS='["prod"]'
51
- fi
52
- else
53
- ENVS='["${{ inputs.environment }}"]'
54
- fi
55
-
56
- echo "matrix={\"environment\":$ENVS}" >> $GITHUB_OUTPUT
57
-
58
- scan:
59
- needs: setup
60
- runs-on: ubuntu-latest
61
- strategy:
62
- fail-fast: false
63
- matrix: ${{ fromJson(needs.setup.outputs.matrix) }}
64
- steps:
65
- - name: Checkout code
66
- uses: actions/checkout@v4
67
-
68
- - name: Install yq
69
- run: |
70
- sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
71
- sudo chmod +x /usr/local/bin/yq
72
-
73
- - name: Read config
74
- id: config
75
- env:
76
- ENVIRONMENT: ${{ matrix.environment }}
77
- run: |
78
- if [ ! -f "factiii.yml" ]; then
79
- echo "❌ factiii.yml not found"
80
- exit 1
81
- fi
82
-
83
- REPO_NAME=$(yq eval '.name' factiii.yml)
84
- HOST=$(yq eval ".environments.$ENVIRONMENT.domain // \"\"" factiii.yml)
85
- SSH_USER=$(yq eval ".environments.$ENVIRONMENT.ssh_user // \"ubuntu\"" factiii.yml)
86
-
87
- echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
88
- echo "host=$HOST" >> $GITHUB_OUTPUT
89
- echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
90
-
91
- - name: Check if environment configured
92
- id: check_env
93
- env:
94
- ENVIRONMENT: ${{ matrix.environment }}
95
- run: |
96
- HAS_ENV=$(yq eval ".environments.$ENVIRONMENT != null" factiii.yml)
97
- echo "has_env=$HAS_ENV" >> $GITHUB_OUTPUT
98
-
99
- if [ "$HAS_ENV" != "true" ]; then
100
- echo "⏭️ $ENVIRONMENT environment not configured in factiii.yml"
101
- exit 0
102
- fi
103
-
104
- - name: Check SSH secret
105
- if: steps.check_env.outputs.has_env == 'true'
106
- env:
107
- ENVIRONMENT: ${{ matrix.environment }}
108
- SSH_KEY: ${{ matrix.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
109
- run: |
110
- if [ -z "$SSH_KEY" ]; then
111
- SECRET_NAME="${ENVIRONMENT^^}_SSH"
112
- echo "❌ ${SECRET_NAME} secret not found"
113
- echo "Add it at: https://github.com/${{ github.repository }}/settings/secrets/actions"
114
- exit 1
115
- fi
116
- echo "✅ SSH secret exists for $ENVIRONMENT"
117
-
118
- - name: Setup SSH
119
- if: steps.check_env.outputs.has_env == 'true'
120
- env:
121
- SSH_KEY: ${{ matrix.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
122
- run: |
123
- mkdir -p ~/.ssh
124
- echo "$SSH_KEY" > ~/.ssh/deploy_key
125
- chmod 600 ~/.ssh/deploy_key
126
-
127
- - name: Bootstrap Node.js (one-time)
128
- if: steps.check_env.outputs.has_env == 'true'
129
- env:
130
- HOST: ${{ steps.config.outputs.host }}
131
- USER: ${{ steps.config.outputs.ssh_user }}
132
- run: |
133
- echo "🔍 Checking Node.js on server..."
134
- ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
135
- 'if ! command -v node &> /dev/null; then
136
- echo "📦 Installing Node.js...";
137
- if [ -f /opt/homebrew/bin/brew ] || [ -f /usr/local/bin/brew ]; then
138
- export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH";
139
- brew install node;
140
- else
141
- curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs;
142
- fi;
143
- else
144
- echo "✅ Node.js already installed";
145
- fi'
146
-
147
- - name: Scan via SSH
148
- if: steps.check_env.outputs.has_env == 'true'
149
- env:
150
- HOST: ${{ steps.config.outputs.host }}
151
- USER: ${{ steps.config.outputs.ssh_user }}
152
- REPO_NAME: ${{ steps.config.outputs.repo_name }}
153
- ENVIRONMENT: ${{ matrix.environment }}
154
- run: |
155
- if [ -z "$HOST" ]; then
156
- echo "❌ Missing domain in factiii.yml: environments.$ENVIRONMENT.domain"
157
- exit 1
158
- fi
159
-
160
- echo "🔍 Scanning $ENVIRONMENT ($HOST)..."
161
-
162
- ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
163
- "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
164
- REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
165
- if [ -d \"\$REPO_DIR\" ]; then \
166
- cd \"\$REPO_DIR\" && \
167
- export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" && \
168
- GITHUB_ACTIONS=true npx factiii scan --$ENVIRONMENT; \
169
- else \
170
- echo \"❌ Repo directory not found at \$REPO_DIR\"; \
171
- echo \"Run deployment first to clone the repository\"; \
172
- exit 1; \
173
- fi"
174
-
175
- rm -f ~/.ssh/deploy_key
176
- echo "✅ $ENVIRONMENT scan complete!"
@@ -1,95 +0,0 @@
1
- name: Factiii Undeploy
2
-
3
- # Generated by @factiii/stack v{VERSION}
4
- # Manual workflow to remove deployment from a server
5
- # Thin workflow - just SSH and call CLI
6
-
7
- on:
8
- workflow_dispatch:
9
- inputs:
10
- environment:
11
- description: 'Environment to undeploy'
12
- required: true
13
- type: choice
14
- options:
15
- - staging
16
- - prod
17
-
18
- jobs:
19
- undeploy:
20
- runs-on: ubuntu-latest
21
- steps:
22
- - name: Checkout code
23
- uses: actions/checkout@v4
24
-
25
- - name: Install yq
26
- run: |
27
- sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
28
- sudo chmod +x /usr/local/bin/yq
29
-
30
- - name: Read config
31
- id: config
32
- run: |
33
- if [ ! -f "factiii.yml" ]; then
34
- echo "❌ factiii.yml not found"
35
- exit 1
36
- fi
37
-
38
- REPO_NAME=$(yq eval '.name' factiii.yml)
39
-
40
- if [ "${{ inputs.environment }}" == "staging" ]; then
41
- HOST=$(yq eval '.environments.staging.domain // ""' factiii.yml)
42
- SSH_USER=$(yq eval '.environments.staging.ssh_user // "ubuntu"' factiii.yml)
43
- else
44
- HOST=$(yq eval '.environments.prod.domain // ""' factiii.yml)
45
- SSH_USER=$(yq eval '.environments.prod.ssh_user // "ubuntu"' factiii.yml)
46
- fi
47
-
48
- echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
49
- echo "host=$HOST" >> $GITHUB_OUTPUT
50
- echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
51
-
52
- - name: Setup SSH
53
- env:
54
- SSH_KEY: ${{ inputs.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
55
- run: |
56
- if [ -z "$SSH_KEY" ]; then
57
- echo "❌ Missing ${{ inputs.environment == 'staging' && 'STAGING_SSH' || 'PROD_SSH' }} secret"
58
- exit 1
59
- fi
60
-
61
- mkdir -p ~/.ssh
62
- echo "$SSH_KEY" > ~/.ssh/deploy_key
63
- chmod 600 ~/.ssh/deploy_key
64
-
65
- - name: Undeploy via CLI
66
- env:
67
- HOST: ${{ steps.config.outputs.host }}
68
- USER: ${{ steps.config.outputs.ssh_user }}
69
- REPO_NAME: ${{ steps.config.outputs.repo_name }}
70
- ENVIRONMENT: ${{ inputs.environment }}
71
- run: |
72
- if [ -z "$HOST" ]; then
73
- echo "❌ Missing domain in factiii.yml: environments.$ENVIRONMENT.domain"
74
- exit 1
75
- fi
76
-
77
- echo "🗑️ Undeploying from $ENVIRONMENT ($HOST)..."
78
-
79
- ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" bash -s << EOF
80
- set -e
81
- REPO_DIR=~/.factiii/$REPO_NAME
82
-
83
- if [ -d "\$REPO_DIR" ]; then
84
- cd \$REPO_DIR
85
- echo "🚀 Running undeploy..."
86
- export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" && \
87
- GITHUB_ACTIONS=true npx factiii undeploy --$ENVIRONMENT || true
88
- else
89
- echo "⚠️ Repo directory not found, nothing to undeploy"
90
- fi
91
- EOF
92
-
93
- rm -f ~/.ssh/deploy_key
94
- echo "✅ Undeploy complete!"
95
-
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Validates factiii.yml configuration file
4
- */
5
- export {};
6
- //# sourceMappingURL=validate-factiii-yml.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-factiii-yml.d.ts","sourceRoot":"","sources":["../../src/scripts/validate-factiii-yml.ts"],"names":[],"mappings":";AAEA;;GAEG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-factiii-yml.js","sourceRoot":"","sources":["../../src/scripts/validate-factiii-yml.ts"],"names":[],"mappings":";;AAEA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,sDAA2B;AAO3B,IAAI,CAAC;IACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,iBAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAyB,CAAC;IACzF,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC/C,IAAI,YAAY,EAAE,CAAC;QACjB,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}