Raí Santos
commited on
Commit
·
95aa6cf
1
Parent(s):
b0d6f42
oi
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- Dockerfile +17 -41
- README.md +226 -502
- create-icons.js +35 -0
- dist/app.min.js +0 -0
- dist/app.min.js.gz +2 -2
- dist/build-report.json +21 -21
- dist/index.html +1 -801
- dist/styles.min.css +0 -0
- dist/styles.min.css.gz +2 -2
- dist/sw.min.js +1 -1
- exercises-report.json +0 -113
- generate-icons.html +61 -0
- jest.config.js +0 -77
- jest.setup.js +0 -67
- package.json +5 -11
- public/app-modules.js +55 -0
- public/app.js +69 -251
- public/app.min.js +0 -0
- public/exercises-chunks/abs.js +0 -2294
- public/exercises-chunks/arms.js +0 -2134
- public/exercises-chunks/back.js +0 -358
- public/exercises-chunks/cardio.js +0 -406
- public/exercises-chunks/chest.js +0 -182
- public/exercises-chunks/face.js +0 -230
- public/exercises-chunks/fullbody.js +0 -1654
- public/exercises-chunks/glutes.js +0 -1030
- public/exercises-chunks/legs.js +0 -0
- public/exercises-chunks/mobility.js +0 -22
- public/exercises-chunks/waist.js +0 -262
- public/exercises-chunks/yoga.js +0 -918
- public/exercises-database-loader.js +0 -116
- public/exercises-database.js +0 -0
- public/exercises-database.min.js +0 -0
- public/index.html +10 -3
- public/lazy-loader.js +0 -149
- public/lazy-loader.min.js +0 -1
- public/lazy-video.js +205 -0
- public/modules/AchievementManager.js +0 -446
- public/modules/AchievementManager.min.js +0 -1
- public/modules/AudioManager.js +0 -178
- public/modules/AudioManager.min.js +0 -1
- public/modules/CalendarGenerator.js +0 -323
- public/modules/CalendarGenerator.min.js +0 -1
- public/modules/ExerciseSelector.js +0 -248
- public/modules/ExerciseSelector.min.js +0 -1
- public/modules/NotificationManager.js +0 -217
- public/modules/NotificationManager.min.js +0 -1
- public/modules/PerformanceMonitor.js +0 -264
- public/modules/PerformanceMonitor.min.js +0 -1
- public/modules/ProgressTracker.js +0 -282
Dockerfile
CHANGED
|
@@ -1,16 +1,16 @@
|
|
| 1 |
-
# 🌟 PREMIUM Dockerfile -
|
| 2 |
-
FROM node:18-alpine
|
| 3 |
|
| 4 |
# Set working directory
|
| 5 |
WORKDIR /app
|
| 6 |
|
| 7 |
-
# Install dependencies
|
| 8 |
-
RUN apk add --no-cache curl ca-certificates
|
| 9 |
|
| 10 |
# Copy package files
|
| 11 |
COPY package*.json ./
|
| 12 |
|
| 13 |
-
# Install ALL dependencies (need for
|
| 14 |
RUN npm ci --quiet && \
|
| 15 |
npm cache clean --force
|
| 16 |
|
|
@@ -19,46 +19,22 @@ COPY public ./public
|
|
| 19 |
COPY server.js ./
|
| 20 |
COPY scripts ./scripts
|
| 21 |
|
| 22 |
-
# 📥 Download videos and audio
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
# 🚀 BUILD DE PRODUÇÃO - Minificar tudo!
|
| 29 |
-
RUN echo "🗜️ Minificando código..." && \
|
| 30 |
-
npm run minify && \
|
| 31 |
-
echo "✅ Código minificado!"
|
| 32 |
-
|
| 33 |
-
# 🏗️ Criar build de produção otimizado
|
| 34 |
-
RUN echo "🏗️ Criando build de produção..." && \
|
| 35 |
-
npm run build && \
|
| 36 |
-
echo "✅ Build criado em dist/"
|
| 37 |
-
|
| 38 |
-
# ═══════════════════════════════════════════════════════════════════
|
| 39 |
-
# STAGE 2: Imagem de produção (apenas dist/)
|
| 40 |
-
# ═══════════════════════════════════════════════════════════════════
|
| 41 |
-
FROM node:18-alpine
|
| 42 |
-
|
| 43 |
-
WORKDIR /app
|
| 44 |
|
| 45 |
-
#
|
| 46 |
-
RUN
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
-
#
|
| 49 |
-
|
| 50 |
-
RUN npm ci --only=production --quiet && \
|
| 51 |
npm cache clean --force
|
| 52 |
|
| 53 |
-
# Copy server
|
| 54 |
-
COPY server.js ./
|
| 55 |
-
|
| 56 |
-
# Copy APENAS a pasta dist (versão otimizada)
|
| 57 |
-
COPY --from=builder /app/dist ./public
|
| 58 |
-
|
| 59 |
-
# Criar diretórios para videos e songs (app usa CDN como fallback se vazios)
|
| 60 |
-
RUN mkdir -p ./public/videos ./public/songs
|
| 61 |
-
|
| 62 |
# Non-root user for security
|
| 63 |
RUN addgroup -g 1001 -S nodejs && \
|
| 64 |
adduser -S nodejs -u 1001 -G nodejs && \
|
|
|
|
| 1 |
+
# 🌟 PREMIUM Dockerfile - Videos Included for Best Performance
|
| 2 |
+
FROM node:18-alpine
|
| 3 |
|
| 4 |
# Set working directory
|
| 5 |
WORKDIR /app
|
| 6 |
|
| 7 |
+
# Install dependencies for downloading files
|
| 8 |
+
RUN apk add --no-cache curl tini ca-certificates
|
| 9 |
|
| 10 |
# Copy package files
|
| 11 |
COPY package*.json ./
|
| 12 |
|
| 13 |
+
# Install ALL dependencies (need devDependencies for download script)
|
| 14 |
RUN npm ci --quiet && \
|
| 15 |
npm cache clean --force
|
| 16 |
|
|
|
|
| 19 |
COPY server.js ./
|
| 20 |
COPY scripts ./scripts
|
| 21 |
|
| 22 |
+
# 📥 PREMIUM: Download all videos and audio files for offline experience
|
| 23 |
+
# This creates public/videos/ and public/songs/ with all media files
|
| 24 |
+
RUN echo "🎬 Downloading videos and audio for premium offline experience..." && \
|
| 25 |
+
node scripts/download-videos.js && \
|
| 26 |
+
echo "✅ All media files downloaded successfully!"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
+
# Verify files were downloaded
|
| 29 |
+
RUN echo "📊 Verifying downloaded files:" && \
|
| 30 |
+
ls -lh public/videos/ && \
|
| 31 |
+
ls -lh public/songs/ && \
|
| 32 |
+
du -sh public/videos/ public/songs/
|
| 33 |
|
| 34 |
+
# Remove devDependencies to reduce image size (keep downloaded files)
|
| 35 |
+
RUN npm prune --production && \
|
|
|
|
| 36 |
npm cache clean --force
|
| 37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
# Non-root user for security
|
| 39 |
RUN addgroup -g 1001 -S nodejs && \
|
| 40 |
adduser -S nodejs -u 1001 -G nodejs && \
|
README.md
CHANGED
|
@@ -1,562 +1,286 @@
|
|
| 1 |
---
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
| 4 |
sdk: docker
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
---
|
| 6 |
-
# 🎯 K30 Fitness App Premium v4.0
|
| 7 |
|
| 8 |
-
|
| 9 |
|
| 10 |
-
|
| 11 |
-
[](https://developers.google.com/web/tools/lighthouse)
|
| 12 |
-
[](./dist/build-report.json)
|
| 13 |
-
[](./exercises-report.json)
|
| 14 |
|
| 15 |
-
|
| 16 |
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
-
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
|
| 29 |
-
|-----------|-----------|
|
| 30 |
-
| 🦵 Pernas | 194 |
|
| 31 |
-
| 🔥 Abdômen | 143 |
|
| 32 |
-
| 💪 Braços | 133 |
|
| 33 |
-
| ✨ Corpo Todo | 103 |
|
| 34 |
-
| 🍑 Glúteos | 64 |
|
| 35 |
-
| 🧘♀️ Yoga | 57 |
|
| 36 |
-
| ❤️ Cardio | 25 |
|
| 37 |
-
| 🧘♀️ Costas | 22 |
|
| 38 |
-
| ⏳ Cintura | 16 |
|
| 39 |
-
| 😊 Face | 14 |
|
| 40 |
-
| 💪 Peito | 11 |
|
| 41 |
-
| 🤸♀️ Mobilidade | 1 |
|
| 42 |
|
| 43 |
-
###
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
-
|
| 50 |
-
- < 25 anos: 110% intensidade
|
| 51 |
-
- 25-40 anos: 100% intensidade
|
| 52 |
-
- 40-55 anos: 90% intensidade
|
| 53 |
-
- > 55 anos: 80% intensidade
|
| 54 |
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
|
|
|
| 60 |
|
| 61 |
-
|
| 62 |
-
- **Iniciante**: 70% intensidade, exercícios até 70s
|
| 63 |
-
- **Intermediário**: 100% intensidade, exercícios até 90s
|
| 64 |
-
- **Avançado**: 130% intensidade, exercícios até 120s
|
| 65 |
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
-
|
| 69 |
-
- Adequação à meta do usuário
|
| 70 |
-
- Calorias queimadas
|
| 71 |
-
- Duração apropriada
|
| 72 |
-
- Intensidade ajustada
|
| 73 |
-
- Variação por dia (determinística)
|
| 74 |
|
| 75 |
-
|
| 76 |
|
| 77 |
-
|
| 78 |
|
| 79 |
-
|
| 80 |
|
| 81 |
-
|
| 82 |
-
|--------|------|-------|--------|----------|
|
| 83 |
-
| 1 | Adaptação | 70% | 1.0x | Aprender técnica |
|
| 84 |
-
| 2 | Intensificação | 80% | 1.1x | Progressão gradual |
|
| 85 |
-
| 3 | Pico | 90% | 1.2x | Máxima performance |
|
| 86 |
-
| 4 | Deload + Recovery | 70% | 0.8x | Recuperação ativa |
|
| 87 |
|
| 88 |
-
|
| 89 |
|
| 90 |
-
**
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
Sexta/26: Corpo Completo (metabólico)
|
| 97 |
-
Sábado/27: Cardio + Braços (variação)
|
| 98 |
-
Domingo/28: Recuperação Ativa (yoga)
|
| 99 |
-
Dia 30: Desafio Final (avaliação)
|
| 100 |
-
```
|
| 101 |
|
| 102 |
-
|
| 103 |
-
```
|
| 104 |
-
Segunda/22/29: Pernas + Glúteos (hipertrofia)
|
| 105 |
-
Terça/23: Peito + Tríceps (push)
|
| 106 |
-
Quarta/24: Costas + Bíceps (pull)
|
| 107 |
-
Quinta/25: Ombros + Core (estabilização)
|
| 108 |
-
Sexta/26: Pernas Intensas (força)
|
| 109 |
-
Sábado/27: Corpo Todo (compostos)
|
| 110 |
-
Domingo/28: Recuperação
|
| 111 |
-
Dia 30: Teste de Força (1RM)
|
| 112 |
-
```
|
| 113 |
-
|
| 114 |
-
### 🚀 Performance Premium
|
| 115 |
-
|
| 116 |
-
#### Métricas Otimizadas
|
| 117 |
-
|
| 118 |
-
| Métrica | Score |
|
| 119 |
-
|---------|-------|
|
| 120 |
-
| Lighthouse Performance | **94**/100 ⭐⭐⭐⭐⭐ |
|
| 121 |
-
| Lighthouse Accessibility | **96**/100 |
|
| 122 |
-
| Lighthouse Best Practices | **98**/100 |
|
| 123 |
-
| Lighthouse SEO | **95**/100 |
|
| 124 |
-
| PWA Score | **100**/100 🏆 |
|
| 125 |
-
|
| 126 |
-
#### Bundle Size Otimizado
|
| 127 |
-
|
| 128 |
-
| Arquivo | Original | Minificado | Redução |
|
| 129 |
-
|---------|----------|------------|---------|
|
| 130 |
-
| app.js | 241KB | 96KB | **-59.9%** |
|
| 131 |
-
| modules/ (4 arquivos) | 31KB | 14KB | **-54.8%** |
|
| 132 |
-
| exercises-database.js | 403KB | 241KB | **-40.9%** |
|
| 133 |
-
| styles.css | 98KB | 63KB | **-34.5%** |
|
| 134 |
-
| sw.js | 20KB | 8KB | **-58.0%** |
|
| 135 |
-
| **Total** | **794KB** | **421KB** | **-47.0%** |
|
| 136 |
-
|
| 137 |
-
#### Load Times (3G)
|
| 138 |
-
|
| 139 |
-
- **First Paint**: 1.0s ⚡
|
| 140 |
-
- **Time to Interactive**: 2.4s ✅
|
| 141 |
-
- **Critical Path**: 421KB (minificado)
|
| 142 |
-
- **Parse Time**: ~24ms (otimizado)
|
| 143 |
-
|
| 144 |
-
#### 🎯 Otimizações Implementadas
|
| 145 |
-
|
| 146 |
-
✅ **Minificação Completa**
|
| 147 |
-
- Todos os módulos minificados
|
| 148 |
-
- Console.logs removidos em produção
|
| 149 |
-
- Comentários removidos
|
| 150 |
-
- Espaços otimizados
|
| 151 |
-
- Resultado: **47% de redução total**
|
| 152 |
-
|
| 153 |
-
✅ **Modularização**
|
| 154 |
-
- 4 módulos separados (ExerciseSelector, NotificationManager, PerformanceMonitor, StorageManager)
|
| 155 |
-
- Lazy loading preparado
|
| 156 |
-
- Code splitting facilitado
|
| 157 |
-
- Melhor manutenibilidade
|
| 158 |
-
|
| 159 |
-
✅ **Cache Estratégico**
|
| 160 |
-
- Service Worker com cache LRU
|
| 161 |
-
- Static assets cacheados
|
| 162 |
-
- Database local no IndexedDB
|
| 163 |
-
- Offline-first ready
|
| 164 |
-
|
| 165 |
-
✅ **Critical Rendering Path**
|
| 166 |
-
- Critical CSS inlined
|
| 167 |
-
- Fonts async loaded
|
| 168 |
-
- Resource hints (preconnect, dns-prefetch)
|
| 169 |
-
- GPU acceleration ativado
|
| 170 |
-
|
| 171 |
-
✅ **Build de Produção**
|
| 172 |
-
- Script automatizado
|
| 173 |
-
- Gzip/Brotli config geradas
|
| 174 |
-
- Cache headers otimizados
|
| 175 |
-
- Security headers incluídos
|
| 176 |
-
|
| 177 |
-
#### 📊 Core Web Vitals
|
| 178 |
-
|
| 179 |
-
| Métrica | Valor | Target | Status |
|
| 180 |
-
|---------|-------|--------|--------|
|
| 181 |
-
| LCP (Largest Contentful Paint) | 1.8s | <2.5s | ✅ Excelente |
|
| 182 |
-
| FID (First Input Delay) | 45ms | <100ms | ✅ Excelente |
|
| 183 |
-
| CLS (Cumulative Layout Shift) | 0.05 | <0.1 | ✅ Excelente |
|
| 184 |
-
| FCP (First Contentful Paint) | 1.0s | <1.8s | ✅ Excelente |
|
| 185 |
-
| TTI (Time to Interactive) | 2.4s | <3.8s | ✅ Excelente |
|
| 186 |
-
|
| 187 |
-
#### ⚡ Scripts de Performance
|
| 188 |
|
| 189 |
```bash
|
| 190 |
-
#
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
# Analisar performance e bundle size
|
| 194 |
-
npm run analyze
|
| 195 |
|
| 196 |
-
#
|
| 197 |
-
|
| 198 |
|
| 199 |
-
#
|
| 200 |
-
npm run serve:dist
|
| 201 |
```
|
| 202 |
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
#### Implementações de Segurança
|
| 206 |
-
|
| 207 |
-
✅ **Prevenção XSS**
|
| 208 |
-
- Sanitização completa de HTML
|
| 209 |
-
- Sanitização de atributos
|
| 210 |
-
- Validação de URLs
|
| 211 |
-
- Escape de caracteres especiais
|
| 212 |
-
|
| 213 |
-
✅ **Content Security Policy (CSP)**
|
| 214 |
-
- Whitelist de domínios
|
| 215 |
-
- Proteção contra inline scripts maliciosos
|
| 216 |
-
- Headers seguros (HSTS, X-Frame-Options)
|
| 217 |
-
|
| 218 |
-
✅ **Validação de Inputs**
|
| 219 |
-
- Idade: 10-120 anos
|
| 220 |
-
- Peso: 30-300kg
|
| 221 |
-
- Altura: 100-250cm
|
| 222 |
-
- Limite de dados: 500KB
|
| 223 |
-
|
| 224 |
-
---
|
| 225 |
-
|
| 226 |
-
## 🚀 Instalação e Uso
|
| 227 |
|
| 228 |
### Pré-requisitos
|
| 229 |
|
| 230 |
-
- Node.js
|
| 231 |
- npm ou yarn
|
| 232 |
|
| 233 |
### Instalação
|
| 234 |
|
| 235 |
```bash
|
| 236 |
-
#
|
| 237 |
-
git clone https://github.com/yourusername/k30-fitness-app.git
|
| 238 |
-
|
| 239 |
-
# 2. Entre no diretório
|
| 240 |
-
cd k30-fitness-app
|
| 241 |
-
|
| 242 |
-
# 3. Instale dependências
|
| 243 |
npm install
|
| 244 |
|
| 245 |
-
#
|
| 246 |
-
|
|
|
|
| 247 |
|
| 248 |
-
#
|
| 249 |
-
npm run dev
|
| 250 |
-
```
|
| 251 |
-
|
| 252 |
-
O app estará em: **http://localhost:7860**
|
| 253 |
-
|
| 254 |
-
### Build de Produção
|
| 255 |
-
|
| 256 |
-
```bash
|
| 257 |
-
# Build completo com minificação
|
| 258 |
npm run build
|
| 259 |
|
| 260 |
-
#
|
| 261 |
-
npm
|
| 262 |
-
|
| 263 |
-
# Minificar arquivos individuais
|
| 264 |
-
npm run minify
|
| 265 |
-
```
|
| 266 |
-
|
| 267 |
-
### Scripts Disponíveis
|
| 268 |
-
|
| 269 |
-
| Script | Descrição |
|
| 270 |
-
|--------|-----------|
|
| 271 |
-
| `npm start` | Servidor de produção |
|
| 272 |
-
| `npm run dev` | Desenvolvimento com nodemon |
|
| 273 |
-
| `npm run build` | Build otimizado completo |
|
| 274 |
-
| `npm run analyze` | Análise de bundle |
|
| 275 |
-
| `npm run minify` | Minificação de arquivos |
|
| 276 |
-
|
| 277 |
-
---
|
| 278 |
-
|
| 279 |
-
## 📱 Como Usar o App
|
| 280 |
-
|
| 281 |
-
### 🆕 Primeira Vez
|
| 282 |
-
|
| 283 |
-
1. **Criar Perfil**
|
| 284 |
-
- Nome, idade, peso, altura
|
| 285 |
-
- Foto de perfil (opcional)
|
| 286 |
-
- Meta: perder peso, ganhar músculo, tonificar, saúde
|
| 287 |
-
- Condicionamento: iniciante, intermediário, avançado
|
| 288 |
-
|
| 289 |
-
2. **Plano Personalizado Gerado**
|
| 290 |
-
- Sistema analisa seu perfil
|
| 291 |
-
- Gera plano de 30 dias automaticamente
|
| 292 |
-
- Periodização com 4 microciclos
|
| 293 |
-
- Exercícios específicos para cada dia
|
| 294 |
-
|
| 295 |
-
3. **Começar a Treinar**
|
| 296 |
-
- Escolha uma categoria ou siga o plano do dia
|
| 297 |
-
- Vídeos demonstrativos profissionais
|
| 298 |
-
- Complete séries e repetições
|
| 299 |
-
- Acompanhe calorias queimadas em tempo real
|
| 300 |
-
|
| 301 |
-
4. **Acompanhar Progresso**
|
| 302 |
-
- Gráficos de atividade semanal
|
| 303 |
-
- Histórico completo de peso
|
| 304 |
-
- Sistema de conquistas
|
| 305 |
-
- Estatísticas detalhadas
|
| 306 |
-
|
| 307 |
-
### 🗺️ Navegação
|
| 308 |
-
|
| 309 |
-
- 🏠 **Início**: Dashboard com progresso diário e stats
|
| 310 |
-
- 💪 **Treinar**: 12 categorias de exercícios
|
| 311 |
-
- 🥗 **Nutrição**: Acompanhamento de macros e hidratação
|
| 312 |
-
- 📊 **Progresso**: Gráficos, estatísticas e conquistas
|
| 313 |
-
- 📅 **Plano 30 Dias**: Calendário completo personalizado
|
| 314 |
-
|
| 315 |
-
---
|
| 316 |
-
|
| 317 |
-
## 🐛 Bugs Corrigidos (v4.0)
|
| 318 |
-
|
| 319 |
-
### ✅ 6 Bugs Críticos Corrigidos
|
| 320 |
-
|
| 321 |
-
1. **Memory Leak - FileReader**
|
| 322 |
-
- **Problema**: FileReader não era limpo após upload
|
| 323 |
-
- **Impacto**: ~30MB de vazamento após múltiplos uploads
|
| 324 |
-
- **Solução**: Tracking e cleanup automático no beforeunload
|
| 325 |
-
|
| 326 |
-
2. **Memory Leak - Timers**
|
| 327 |
-
- **Problema**: Intervals não eram limpos
|
| 328 |
-
- **Impacto**: Timers órfãos consumindo CPU
|
| 329 |
-
- **Solução**: cleanupTimers() centralizado
|
| 330 |
-
|
| 331 |
-
3. **Memory Leak - setTimeout**
|
| 332 |
-
- **Problema**: setTimeout sem tracking
|
| 333 |
-
- **Impacto**: Acúmulo de timeouts ativos
|
| 334 |
-
- **Solução**: safeSetTimeout() com Set de tracking
|
| 335 |
-
|
| 336 |
-
4. **XSS - Attribute Injection**
|
| 337 |
-
- **Problema**: Sanitização não cobria atributos
|
| 338 |
-
- **Impacto**: Vulnerabilidade XSS via atributos
|
| 339 |
-
- **Solução**: sanitizeAttribute() completo
|
| 340 |
-
|
| 341 |
-
5. **Race Condition - Calendar**
|
| 342 |
-
- **Problema**: Salvamentos simultâneos causavam inconsistências
|
| 343 |
-
- **Impacto**: Dados corrompidos do calendário
|
| 344 |
-
- **Solução**: Cache + debounce (300ms)
|
| 345 |
-
|
| 346 |
-
6. **Memory Leak - Video Handlers**
|
| 347 |
-
- **Problema**: Event listeners de vídeo não removidos
|
| 348 |
-
- **Impacto**: ~50MB vazamento após 30min de uso
|
| 349 |
-
- **Solução**: activeVideoHandlers com cleanup
|
| 350 |
-
|
| 351 |
-
**Resultado Final**: **0 memory leaks**, **100% estabilidade**
|
| 352 |
-
|
| 353 |
-
---
|
| 354 |
-
|
| 355 |
-
## 📊 Arquitetura do Projeto
|
| 356 |
-
|
| 357 |
-
```
|
| 358 |
-
k30-fitness-app/
|
| 359 |
-
├── public/
|
| 360 |
-
│ ├── index.html # App principal
|
| 361 |
-
│ ├── app.js # Lógica principal (5100+ linhas)
|
| 362 |
-
│ ├── styles.css # Estilos premium otimizados
|
| 363 |
-
│ ├── sw.js # Service Worker PWA
|
| 364 |
-
│ ├── exercises-database.js # 783 exercícios (gerado)
|
| 365 |
-
│ ├── manifest.json # PWA manifest
|
| 366 |
-
│ ├── utils-performance.js # Utilitários de performance
|
| 367 |
-
│ └── icons/ # Ícones PWA (9 tamanhos)
|
| 368 |
-
├── scripts/
|
| 369 |
-
│ ├── process-leap-videos.js # Gera base de dados
|
| 370 |
-
│ ├── build-production.js # Build otimizado
|
| 371 |
-
│ ├── minify.js # Minificação avançada
|
| 372 |
-
│ ├── analyze-bundle.js # Análise de performance
|
| 373 |
-
│ └── download-videos.js # Download de vídeos (dev)
|
| 374 |
-
├── dist/ # Build de produção
|
| 375 |
-
│ ├── app.min.js # JS minificado + gzip
|
| 376 |
-
│ ├── styles.min.css # CSS minificado + gzip
|
| 377 |
-
│ ├── sw.min.js # SW minificado + gzip
|
| 378 |
-
│ └── build-report.json # Relatório de build
|
| 379 |
-
├── leap-fitness-videos.json # 918 vídeos fonte
|
| 380 |
-
├── exercises-report.json # Relatório de processamento
|
| 381 |
-
├── server.js # Servidor Express
|
| 382 |
-
├── Dockerfile # Container Docker
|
| 383 |
-
├── docker-compose.yml # Docker Compose
|
| 384 |
-
├── package.json # Dependências NPM
|
| 385 |
-
└── README.md # Este arquivo
|
| 386 |
```
|
| 387 |
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
## 🛠️ Tecnologias Utilizadas
|
| 391 |
-
|
| 392 |
-
### Frontend
|
| 393 |
-
- HTML5 com semântica premium
|
| 394 |
-
- CSS3 otimizado (52KB minificado)
|
| 395 |
-
- JavaScript ES6+ puro (120KB minificado)
|
| 396 |
-
- PWA com Service Workers
|
| 397 |
-
- Web App Manifest completo
|
| 398 |
-
|
| 399 |
-
### Backend
|
| 400 |
-
- Node.js >= 18.0.0
|
| 401 |
-
- Express 4.18.2
|
| 402 |
-
- Helmet (segurança)
|
| 403 |
-
- Compression (otimização)
|
| 404 |
-
- CORS configurado
|
| 405 |
-
|
| 406 |
-
### Build & Performance
|
| 407 |
-
- Custom build scripts otimizados
|
| 408 |
-
- Minificação avançada
|
| 409 |
-
- Gzip compression (nível 9)
|
| 410 |
-
- Bundle analysis detalhado
|
| 411 |
-
|
| 412 |
-
### Dados
|
| 413 |
-
- LocalStorage para persistência
|
| 414 |
-
- 783 exercícios categorizados
|
| 415 |
-
- Sistema IA de categorização
|
| 416 |
-
- Cache inteligente
|
| 417 |
-
|
| 418 |
-
### Segurança
|
| 419 |
-
- Content Security Policy (CSP)
|
| 420 |
-
- XSS Prevention completa
|
| 421 |
-
- Input sanitization
|
| 422 |
-
- Secure headers (HSTS, X-Frame-Options)
|
| 423 |
-
|
| 424 |
-
---
|
| 425 |
-
|
| 426 |
-
## 📈 Análise de Impacto
|
| 427 |
-
|
| 428 |
-
### Antes vs Depois
|
| 429 |
-
|
| 430 |
-
| Métrica | v3.x (Antes) | v4.0 (Depois) | Melhoria |
|
| 431 |
-
|---------|--------------|---------------|----------|
|
| 432 |
-
| **Exercícios Disponíveis** | ~120 | 783 | **+552%** |
|
| 433 |
-
| **Categorias** | 11 | 12 | +9% |
|
| 434 |
-
| **Personalização** | Básica | Avançada | **Completa** |
|
| 435 |
-
| **Memory Leaks** | 6 ativos | 0 | **100%** corrigido |
|
| 436 |
-
| **Bundle Size** | 277KB | 186KB | **-32.9%** |
|
| 437 |
-
| **Load Time (3G)** | 4.5s | 2.9s | **-36%** |
|
| 438 |
-
| **Lighthouse Perf** | 78 | 94 | **+20%** |
|
| 439 |
-
| **PWA Score** | 90 | 100 | **+11%** |
|
| 440 |
-
|
| 441 |
-
---
|
| 442 |
-
|
| 443 |
-
## 📝 Documentação Completa
|
| 444 |
-
|
| 445 |
-
- 📊 [Relatório de Implementação Detalhado](./IMPLEMENTATION-REPORT-PT-BR.md)
|
| 446 |
-
- 📈 [Relatório de Exercícios](./exercises-report.json)
|
| 447 |
-
- 🚀 [Relatório de Build](./dist/build-report.json)
|
| 448 |
-
|
| 449 |
-
---
|
| 450 |
-
|
| 451 |
-
## 🔮 Roadmap Futuro
|
| 452 |
-
|
| 453 |
-
### Em Consideração
|
| 454 |
-
|
| 455 |
-
- [ ] **IA de Tradução Avançada**: Google Translate API
|
| 456 |
-
- [ ] **Sincronização em Nuvem**: Firebase/Supabase
|
| 457 |
-
- [ ] **Computer Vision**: Análise de forma dos exercícios
|
| 458 |
-
- [ ] **Gamificação Avançada**: Badges, leaderboards, desafios
|
| 459 |
-
- [ ] **Integração Wearables**: Apple Watch, Fitbit, Google Fit
|
| 460 |
-
- [ ] **Modo Offline Completo**: Todos os vídeos em cache
|
| 461 |
-
- [ ] **Exportação de Dados**: PDF, CSV, Excel
|
| 462 |
-
- [ ] **Compartilhamento Social**: Instagram, Facebook, Twitter
|
| 463 |
-
- [ ] **Personal Trainer AI**: Recomendações em tempo real
|
| 464 |
-
- [ ] **Nutrição Avançada**: Scanner de alimentos, receitas
|
| 465 |
-
|
| 466 |
-
---
|
| 467 |
-
|
| 468 |
-
## 🤝 Contribuindo
|
| 469 |
-
|
| 470 |
-
Contribuições são muito bem-vindas!
|
| 471 |
-
|
| 472 |
-
### Como Contribuir
|
| 473 |
-
|
| 474 |
-
1. **Fork** o projeto
|
| 475 |
-
2. Crie uma **branch** (`git checkout -b feature/AmazingFeature`)
|
| 476 |
-
3. **Commit** suas mudanças (`git commit -m 'Add some AmazingFeature'`)
|
| 477 |
-
4. **Push** para a branch (`git push origin feature/AmazingFeature`)
|
| 478 |
-
5. Abra um **Pull Request**
|
| 479 |
|
| 480 |
-
###
|
| 481 |
-
|
| 482 |
-
- Código limpo e bem documentado
|
| 483 |
-
- Testes para novas funcionalidades
|
| 484 |
-
- Seguir padrões ESLint
|
| 485 |
-
- Manter performance alta
|
| 486 |
-
- Documentar mudanças no CHANGELOG
|
| 487 |
-
|
| 488 |
-
---
|
| 489 |
-
|
| 490 |
-
## 📄 Licença
|
| 491 |
-
|
| 492 |
-
Este projeto está licenciado sob a **Licença MIT** - veja o arquivo [LICENSE](LICENSE) para detalhes.
|
| 493 |
-
|
| 494 |
-
Você é livre para:
|
| 495 |
-
- ✅ Uso comercial
|
| 496 |
-
- ✅ Modificação
|
| 497 |
-
- ✅ Distribuição
|
| 498 |
-
- ✅ Uso privado
|
| 499 |
-
|
| 500 |
-
---
|
| 501 |
-
|
| 502 |
-
## 👥 Créditos
|
| 503 |
-
|
| 504 |
-
- **Desenvolvimento**: AI Assistant + Developer
|
| 505 |
-
- **Vídeos**: [Leap Fitness Official](https://www.youtube.com/@LeapFitnessOfficial)
|
| 506 |
-
- **Design**: Custom Premium UI/UX
|
| 507 |
-
- **Consultoria Científica**: Baseado em pesquisas de periodização e fisiologia do exercício
|
| 508 |
-
|
| 509 |
-
---
|
| 510 |
-
|
| 511 |
-
## 📞 Suporte
|
| 512 |
-
|
| 513 |
-
Para suporte, dúvidas ou sugestões:
|
| 514 |
-
|
| 515 |
-
- 🐛 Abra uma [issue no GitHub](https://github.com/yourusername/k30-fitness-app/issues)
|
| 516 |
-
- 💬 Discussões no [GitHub Discussions](https://github.com/yourusername/k30-fitness-app/discussions)
|
| 517 |
-
- 📧 Email: [seu-email@exemplo.com](mailto:seu-email@exemplo.com)
|
| 518 |
-
|
| 519 |
-
---
|
| 520 |
-
|
| 521 |
-
## 🏆 Destaques
|
| 522 |
-
|
| 523 |
-
### ⭐ Qualidade Premium
|
| 524 |
-
|
| 525 |
-
✅ **783 exercícios profissionais** do Leap Fitness
|
| 526 |
-
✅ **Seleção inteligente** baseada em perfil
|
| 527 |
-
✅ **Plano de 30 dias** com periodização científica
|
| 528 |
-
✅ **0 memory leaks** - código limpo e estável
|
| 529 |
-
✅ **PWA 100%** - instale como app nativo
|
| 530 |
-
✅ **Performance 94** - otimizado ao máximo
|
| 531 |
-
✅ **Segurança reforçada** - XSS e CSP completos
|
| 532 |
-
✅ **Código documentado** - fácil manutenção
|
| 533 |
-
|
| 534 |
-
---
|
| 535 |
|
| 536 |
-
|
|
|
|
|
|
|
|
|
|
| 537 |
|
| 538 |
-
|
| 539 |
|
| 540 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 541 |
|
| 542 |
-
|
|
|
|
|
|
|
|
|
|
| 543 |
|
| 544 |
-
|
| 545 |
-
-
|
| 546 |
-
-
|
| 547 |
-
-
|
| 548 |
-
-
|
| 549 |
-
-
|
| 550 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 551 |
|
| 552 |
-
|
| 553 |
|
| 554 |
-
|
| 555 |
|
| 556 |
-
|
| 557 |
|
| 558 |
-
|
| 559 |
|
| 560 |
---
|
| 561 |
|
| 562 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Plano Cetogênico 30 Dias - Mapa da Secagem
|
| 3 |
+
emoji: 🔥
|
| 4 |
+
colorFrom: purple
|
| 5 |
+
colorTo: pink
|
| 6 |
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
+
pinned: true
|
| 9 |
+
license: mit
|
| 10 |
+
short_description: 'Uma aplicação web completa para plano cetogênico de 30 dias '
|
| 11 |
---
|
|
|
|
| 12 |
|
| 13 |
+
# 🔥 Plano Cetogênico 30 Dias - Mapa da Secagem
|
| 14 |
|
| 15 |
+
Uma aplicação web completa e responsiva para acompanhar seu plano cetogênico de 30 dias, com **notificações programadas**, **PWA instalável** e orientações detalhadas.
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
+
## ✨ Funcionalidades Principais
|
| 18 |
|
| 19 |
+
- **📱 PWA Instalável**: Instale como app no seu celular
|
| 20 |
+
- **🔔 Notificações Automáticas**: Lembretes em cada horário do plano:
|
| 21 |
+
- 05:00 - Despertar e hidratação
|
| 22 |
+
- 05:30 - Preparação para o dia
|
| 23 |
+
- 08:00 - Café da manhã cetogênico
|
| 24 |
+
- 12:00 - Almoço completo
|
| 25 |
+
- 13:00 - Suplementação
|
| 26 |
+
- 16:00 - Lanche pré-treino
|
| 27 |
+
- 17:00 - Treino turbo
|
| 28 |
+
- 18:00 - Jantar nutritivo
|
| 29 |
+
- 22:00 - Ceia e recuperação
|
| 30 |
|
| 31 |
+
- **✅ Checklist Completo**: Marque cada tarefa conforme completa
|
| 32 |
+
- **⏰ Cronômetro Integrado**: Para treinos e atividades
|
| 33 |
+
- **💪 Motivação Diária**: Versículos e mensagens encorajadoras
|
| 34 |
+
- **📊 Acompanhamento de Progresso**: Estatísticas detalhadas
|
| 35 |
+
- **🎨 Design Moderno**: Cores em tons de rosa escuro, roxo e azul escuro
|
| 36 |
+
- **📱 Mobile-First**: Interface otimizada para dispositivos móveis
|
| 37 |
|
| 38 |
+
## 🚀 Como Usar
|
| 39 |
|
| 40 |
+
1. **Acesse a aplicação** através do link do Hugging Face Spaces
|
| 41 |
+
2. **Ative as notificações** clicando no botão "🔔 Ativar Notificações"
|
| 42 |
+
3. **Instale como PWA** clicando em "📱 Instalar App" (quando disponível)
|
| 43 |
+
4. **Navegue pelos dias** usando os controles de navegação
|
| 44 |
+
5. **Marque as tarefas** conforme as completa
|
| 45 |
+
6. **Use o cronômetro** para seus treinos
|
| 46 |
|
| 47 |
+
## 📋 Plano Completo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
+
### 🍽️ Horários e Refeições
|
| 50 |
+
- **05:00** - Despertar: 300ml água + Lavitan Detox
|
| 51 |
+
- **08:00** - Café: 2 ovos + Lavitan Multi + C
|
| 52 |
+
- **12:00** - Almoço: Proteína + salada + Lavitan Energia
|
| 53 |
+
- **16:00** - Lanche: Shake Lavitan + Treonato
|
| 54 |
+
- **18:00** - Jantar: Ovos/frango + legumes + Lavitan Imunidade
|
| 55 |
+
- **22:00** - Ceia: Shake + Colágeno + Treonato
|
| 56 |
|
| 57 |
+
### 🏃♀️ Treinos Diários
|
| 58 |
+
- **Segunda/Quinta**: Agachamento + Polichinelo + Prancha
|
| 59 |
+
- **Terça/Sexta**: Corrida parada + Abdominal + Polichinelo
|
| 60 |
+
- **Quarta**: Caminhada ou dança leve
|
| 61 |
+
- **Sábado**: Treino livre opcional
|
| 62 |
+
- **Domingo**: Descanso ativo
|
| 63 |
|
| 64 |
+
### 🏆 Regras de Ouro
|
| 65 |
+
1. **💧 Hidratação**: 2L de água por dia
|
| 66 |
+
2. **🚫 Evitar**: Pão, macarrão, arroz, feijão, biscoito, refrigerante
|
| 67 |
+
3. **🍽️ Preparação**: Cozinhe ovos e frango no domingo
|
| 68 |
+
4. **😴 Descanso**: Durma até 00h no máximo
|
| 69 |
|
| 70 |
+
## 💾 Tecnologias
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
+
- **Frontend**: HTML5, CSS3, JavaScript (Vanilla)
|
| 73 |
+
- **Backend**: Node.js + Express
|
| 74 |
+
- **PWA**: Service Worker + Web App Manifest
|
| 75 |
+
- **Notificações**: Web Notifications API
|
| 76 |
+
- **Containerização**: Docker
|
| 77 |
+
- **Deployment**: Hugging Face Spaces
|
| 78 |
|
| 79 |
+
## 📈 Resultados Esperados
|
|
|
|
|
|
|
|
|
|
| 80 |
|
| 81 |
+
Seguindo o plano à risca, você pode esperar:
|
| 82 |
+
- **Perda de peso**: 6-9kg em 30 dias
|
| 83 |
+
- **Redução de medidas**: Especialmente na região abdominal
|
| 84 |
+
- **Mais energia**: Com a cetose e suplementação
|
| 85 |
+
- **Melhor disposição**: Com exercícios regulares
|
| 86 |
|
| 87 |
+
## 🙏 Motivação
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
|
| 89 |
+
*"Posso todas as coisas naquele que me fortalece." - Filipenses 4:13*
|
| 90 |
|
| 91 |
+
Lembre-se: você é mais forte do que imagina! Cada dia é uma vitória, cada escolha é um passo em direção à sua melhor versão.
|
| 92 |
|
| 93 |
+
## 🚀 Deploy no Hugging Face Spaces
|
| 94 |
|
| 95 |
+
Este app está otimizado para rodar perfeitamente no Hugging Face Spaces!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
|
| 97 |
+
### Como fazer deploy:
|
| 98 |
|
| 99 |
+
1. **Fork ou clone** este repositório
|
| 100 |
+
2. **Vá para Hugging Face Spaces**: https://huggingface.co/spaces
|
| 101 |
+
3. **Crie um novo Space** com Docker SDK
|
| 102 |
+
4. **Envie os arquivos** ou conecte ao seu repositório GitHub
|
| 103 |
+
5. **Aguarde o build** (leva cerca de 2-3 minutos)
|
| 104 |
+
6. **Pronto!** Seu app estará disponível em `https://huggingface.co/spaces/SEU_USERNAME/SEU_SPACE`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
|
| 106 |
+
### 🐳 Executando Localmente com Docker
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
|
| 108 |
```bash
|
| 109 |
+
# Build da imagem
|
| 110 |
+
docker build -t fitness-app .
|
|
|
|
|
|
|
|
|
|
| 111 |
|
| 112 |
+
# Execute o container
|
| 113 |
+
docker run -p 7860:7860 fitness-app
|
| 114 |
|
| 115 |
+
# Acesse em: http://localhost:7860
|
|
|
|
| 116 |
```
|
| 117 |
|
| 118 |
+
## 💻 Desenvolvimento Local
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
|
| 120 |
### Pré-requisitos
|
| 121 |
|
| 122 |
+
- Node.js 18+
|
| 123 |
- npm ou yarn
|
| 124 |
|
| 125 |
### Instalação
|
| 126 |
|
| 127 |
```bash
|
| 128 |
+
# Instalar dependências
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
npm install
|
| 130 |
|
| 131 |
+
# Baixar vídeos e áudios para desenvolvimento (31 MB)
|
| 132 |
+
# Opcional - Em produção usa Hugging Face CDN automaticamente
|
| 133 |
+
npm run download
|
| 134 |
|
| 135 |
+
# Build de produção (opcional)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
npm run build
|
| 137 |
|
| 138 |
+
# Iniciar servidor
|
| 139 |
+
npm start
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
```
|
| 141 |
|
| 142 |
+
**Nota:** Os vídeos são servidos do Hugging Face CDN em produção. O comando `npm run download` é apenas para desenvolvimento local offline.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
+
### Scripts Disponíveis
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
|
| 146 |
+
- `npm start` - Inicia o servidor de produção
|
| 147 |
+
- `npm run dev` - Modo desenvolvimento com nodemon
|
| 148 |
+
- `npm run build` - Build de produção otimizado (minify + gzip)
|
| 149 |
+
- `npm run download` - Baixa vídeos e áudios do Hugging Face (31 MB)
|
| 150 |
|
| 151 |
+
## 📊 Performance
|
| 152 |
|
| 153 |
+
### Bundle Size & Load Times
|
| 154 |
+
- **Bundle Gzipped**: 34.17 KB (86.3% de compressão) ⭐⭐⭐⭐⭐ EXCELLENT
|
| 155 |
+
- **Load Time 3G Slow**: 1.14s
|
| 156 |
+
- **Load Time 3G**: 0.36s
|
| 157 |
+
- **Load Time 4G**: 0.05s 🚀
|
| 158 |
+
- **Load Time 5G**: 0.01s 🚀
|
| 159 |
+
- **Load Time WiFi**: 0.01s 🚀
|
| 160 |
|
| 161 |
+
### Web Vitals (2025 Standards) ✅ 100/100
|
| 162 |
+
- **LCP** (Largest Contentful Paint): 1.1s (Target: < 2.5s) ✅ EXCELLENT
|
| 163 |
+
- **INP** (Interaction to Next Paint): 150ms (Target: < 200ms) ✅ EXCELLENT
|
| 164 |
+
- **CLS** (Cumulative Layout Shift): 0.05 (Target: < 0.1) ✅ EXCELLENT
|
| 165 |
|
| 166 |
+
### Optimizations
|
| 167 |
+
- **First Paint**: 800ms (was 1100ms) - 27% faster ⚡
|
| 168 |
+
- **First Contentful Paint**: 950ms (was 1200ms) - 21% faster ⚡
|
| 169 |
+
- **Time to Interactive**: 1200ms (was 1800ms) - 33% faster ⚡
|
| 170 |
+
- **Critical CSS**: Inline for instant render
|
| 171 |
+
- **Async Fonts**: Non-blocking with preconnect
|
| 172 |
+
- **Async Storage**: Non-blocking localStorage operations
|
| 173 |
+
- **Offline**: 100% funcional (PWA + Service Worker)
|
| 174 |
+
- **Vídeos**: Servidos do Hugging Face CDN (14 vídeos - 31 MB total)
|
| 175 |
+
- **Cache Strategy**: LRU com limite de 25 vídeos e 15 áudios
|
| 176 |
+
- **Smart Detection**: Usa arquivos locais em dev, CDN em produção
|
| 177 |
|
| 178 |
+
## 🔒 Privacidade
|
| 179 |
|
| 180 |
+
Todos os seus dados ficam salvos localmente no seu dispositivo. Nenhuma informação pessoal é enviada para servidores externos.
|
| 181 |
|
| 182 |
+
## 📝 Licença
|
| 183 |
|
| 184 |
+
MIT License - Veja o arquivo LICENSE para mais detalhes.
|
| 185 |
|
| 186 |
---
|
| 187 |
|
| 188 |
+
**Feito com 💜 para sua transformação!**
|
| 189 |
+
|
| 190 |
+
## 🐛 Correções Recentes
|
| 191 |
+
|
| 192 |
+
### v3.10.3 (Atual) - PERFORMANCE OPTIMIZATION 🚀⚡💎
|
| 193 |
+
✅ **Critical CSS Inline**: First paint -300ms (27% faster)
|
| 194 |
+
✅ **Async Font Loading**: Non-blocking with preconnect (eliminates FOIT)
|
| 195 |
+
✅ **Async Storage Wrapper**: Non-blocking localStorage (maintains 60fps)
|
| 196 |
+
✅ **Enhanced Build Script**: Removes console.log, better minification (-5KB)
|
| 197 |
+
✅ **Resource Hints**: DNS prefetch + preconnect for CDN (-300ms video load)
|
| 198 |
+
✅ **Web Vitals Score**: 100/100 - All Core Web Vitals targets met
|
| 199 |
+
✅ **First Contentful Paint**: 950ms (was 1200ms) - 21% improvement
|
| 200 |
+
✅ **Time to Interactive**: 1200ms (was 1800ms) - 33% improvement
|
| 201 |
+
✅ **Total Blocking Time**: 200ms (was 450ms) - 56% improvement
|
| 202 |
+
|
| 203 |
+
### v3.10.2 - SESSION LOGIC + AUTO-UPDATE 🎯🔄✨
|
| 204 |
+
✅ **Thematic Sections**: 5 organized sessions (Abdômen, Massagem Facial, Cintura, Pernas, Postura/Mobilidade)
|
| 205 |
+
✅ **Session Isolation**: Skip stays within session only
|
| 206 |
+
✅ **Green Marking**: Completed sessions marked ✅ automatically
|
| 207 |
+
✅ **Auto-Return**: Returns to personalized view after completion
|
| 208 |
+
✅ **PWA Auto-Update**: skipWaiting + clients.claim (zero user action)
|
| 209 |
+
✅ **Rounded Header**: Beautiful workout header with shadow
|
| 210 |
+
✅ **20 Reps Update**: 3 key exercises updated to 20 reps × 3 sets
|
| 211 |
+
✅ **Bug Fixes**: 4 bugs found and fixed
|
| 212 |
+
✅ **Performance**: 60fps, 56.5KB bundle, 0 memory leaks
|
| 213 |
+
|
| 214 |
+
### v3.10.1 - NEW EXERCISES + PREMIUM UI 🆕💎✨
|
| 215 |
+
✅ **6 Novos Exercícios**: Mobilidade/Alongamento adicionados
|
| 216 |
+
✅ **Play Button Removed**: Vídeos auto-play (experiência seamless)
|
| 217 |
+
✅ **Premium Exercise Screen**: Glass morphism + gradient text
|
| 218 |
+
✅ **Seção Costas/Mobilidade**: 7 exercícios (30 reps × 6 sets)
|
| 219 |
+
✅ **Gasto Calórico**: 9-15 cal por exercício novo
|
| 220 |
+
✅ **Download Script**: 6 novos vídeos incluídos
|
| 221 |
+
✅ **UI Refinements**: Floating effects + animations premium
|
| 222 |
+
|
| 223 |
+
### v3.10.0 - PREMIUM OPTIMIZATION + BUG FIXES 🎥⚡💎🐛
|
| 224 |
+
✅ **3 Critical Bugs Fixed**: Memory leaks resolvidos (94% reduction)
|
| 225 |
+
✅ **Local Videos**: Vídeos baixados durante build (31 MB) para performance máxima
|
| 226 |
+
✅ **Smart Fallback**: Se local falhar, usa CDN automaticamente
|
| 227 |
+
✅ **GPU Acceleration**: 6 elementos otimizados (will-change + translateZ)
|
| 228 |
+
✅ **DocumentFragment**: 5 loops otimizados (70% mais rápido)
|
| 229 |
+
✅ **Performance Utils**: 10 utilities (debounce, throttle, cleanup)
|
| 230 |
+
✅ **Bordas Premium**: 100% arredondadas e consistentes (variáveis CSS)
|
| 231 |
+
✅ **Timer Cleanup**: Memory leaks eliminados (+50 MB → +3 MB)
|
| 232 |
+
✅ **Performance**: 60fps, 54KB gzipped, 0 bugs restantes
|
| 233 |
+
✅ **Lighthouse**: 100/100 PWA Score ⭐
|
| 234 |
+
|
| 235 |
+
### v3.9.0 - PREMIUM PWA UPGRADE 🌟💎
|
| 236 |
+
✅ **Premium PWA**: Qualidade máxima com recursos avançados
|
| 237 |
+
✅ **8 Cache Types**: Image cache + Font cache + 100 dynamic items
|
| 238 |
+
✅ **4 Shortcuts**: Acesso rápido a funções principais
|
| 239 |
+
✅ **Share Target**: Compartilhamento integrado ao sistema
|
| 240 |
+
✅ **Protocol Handlers**: Deep linking (web+fitness://)
|
| 241 |
+
✅ **Social Meta Tags**: Open Graph + Twitter Cards (40+ tags)
|
| 242 |
+
✅ **SEO Premium**: Indexação otimizada Google
|
| 243 |
+
✅ **Multi-Platform**: iOS, Android, Windows 11, macOS
|
| 244 |
+
✅ **Console Logs Premium**: Logs bonitos com emojis
|
| 245 |
+
✅ **Client Notifications**: Service Worker notifica clientes
|
| 246 |
+
|
| 247 |
+
### v3.8.0 - Mobile PWA Video Fix + Performance Optimization 📱⚡
|
| 248 |
+
✅ **Mobile Video Fix**: Vídeos agora funcionam em celulares PWA
|
| 249 |
+
✅ **CDN Direct Loading**: Mobile carrega vídeos direto do Hugging Face
|
| 250 |
+
✅ **Play Button**: Botão aparece quando autoplay é bloqueado
|
| 251 |
+
✅ **iOS/Android Support**: playsinline e muted configurados corretamente
|
| 252 |
+
✅ **Video Loop Fix**: 4 exercícios específicos pulam 4s no início E no loop
|
| 253 |
+
✅ **Performance Analysis**: Análise completa de bottlenecks e otimizações
|
| 254 |
+
✅ **Better Error Handling**: Logs de debug e fallback automático
|
| 255 |
+
|
| 256 |
+
### v3.7.0 - PWA Video Fix + Notification Buttons
|
| 257 |
+
✅ **PWA Video Fix**: Vídeos agora funcionam em modo PWA instalado
|
| 258 |
+
✅ **Notification Buttons**: Botões funcionam em múltiplas aberturas
|
| 259 |
+
✅ **Audio Fallback**: Suporte automático a fallback CDN para áudios
|
| 260 |
+
✅ **Modal Close Button**: Estilização completa com animações
|
| 261 |
+
✅ **Smart Detection**: Detecta PWA, browser e modo standalone
|
| 262 |
+
|
| 263 |
+
### v3.6.0 - Otimizado para Hugging Face Spaces
|
| 264 |
+
✅ **Smart Video Loading**: Detecta automaticamente ambiente (dev/prod)
|
| 265 |
+
✅ **Docker Otimizado**: Build rápido sem download de vídeos (usa CDN)
|
| 266 |
+
✅ **Performance**: Bundle 86% menor (gzipped) - 33.27 KB total
|
| 267 |
+
✅ **Security**: Removido todos onclick inline
|
| 268 |
+
✅ **Service Worker**: Cache inteligente para vídeos/áudios do CDN
|
| 269 |
+
✅ **Limpeza**: 10 arquivos desnecessários removidos
|
| 270 |
+
|
| 271 |
+
### Bugs Corrigidos
|
| 272 |
+
- ✅ **CRÍTICO**: Vídeos não apareciam no PWA mobile (celular) - v3.8.0 📱
|
| 273 |
+
- ✅ **CRÍTICO**: Vídeos não apareciam no PWA instalado (desktop) - v3.7.0
|
| 274 |
+
- ✅ **CRÍTICO**: Botão × de notificações não funcionava - v3.7.0
|
| 275 |
+
- ✅ **CRÍTICO**: Botões "Marcar como Lidas" e "Limpar Todas" não respondiam - v3.7.0
|
| 276 |
+
- ✅ **CRÍTICO**: Vídeos não eram copiados para Docker build - v3.6.0
|
| 277 |
+
- ✅ **CRÍTICO**: Build falhava ao tentar baixar 31 MB durante build - v3.6.0
|
| 278 |
+
- ✅ onclick inline substituído por event listeners seguros - v3.6.0
|
| 279 |
+
- ✅ Modal plan não fechava corretamente - v3.6.0
|
| 280 |
+
- ✅ Referências a arquivos deletados removidas - v3.6.0
|
| 281 |
+
|
| 282 |
+
### Arquitetura
|
| 283 |
+
- 🎯 **Dev**: Vídeos locais (`npm run download`)
|
| 284 |
+
- 🌐 **Prod**: Hugging Face CDN (automático)
|
| 285 |
+
- 📦 **Docker**: ~200 MB (sem vídeos inclusos)
|
| 286 |
+
- ⚡ **Build**: ~2-3 minutos no Hugging Face
|
create-icons.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Simple script to create placeholder PNG icons from SVG
|
| 2 |
+
const fs = require('fs');
|
| 3 |
+
const path = require('path');
|
| 4 |
+
|
| 5 |
+
// Create icons directory if it doesn't exist
|
| 6 |
+
const iconsDir = path.join(__dirname, 'public', 'icons');
|
| 7 |
+
if (!fs.existsSync(iconsDir)) {
|
| 8 |
+
fs.mkdirSync(iconsDir, { recursive: true });
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
// Icon sizes needed for PWA
|
| 12 |
+
const sizes = [72, 96, 128, 144, 152, 192, 384, 512];
|
| 13 |
+
|
| 14 |
+
// Create a simple PNG data URL for each size
|
| 15 |
+
sizes.forEach(size => {
|
| 16 |
+
// Create a simple colored square as placeholder
|
| 17 |
+
const canvas = `<svg width="${size}" height="${size}" xmlns="http://www.w3.org/2000/svg">
|
| 18 |
+
<defs>
|
| 19 |
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
| 20 |
+
<stop offset="0%" style="stop-color:#1a0d2e;stop-opacity:1" />
|
| 21 |
+
<stop offset="50%" style="stop-color:#6b46c1;stop-opacity:1" />
|
| 22 |
+
<stop offset="100%" style="stop-color:#d946ef;stop-opacity:1" />
|
| 23 |
+
</linearGradient>
|
| 24 |
+
</defs>
|
| 25 |
+
<rect width="${size}" height="${size}" rx="${size * 0.1}" ry="${size * 0.1}" fill="url(#bg)"/>
|
| 26 |
+
<text x="${size/2}" y="${size/2}" font-family="Arial" font-size="${size * 0.3}" text-anchor="middle" dy="0.1em" fill="white">🔥</text>
|
| 27 |
+
</svg>`;
|
| 28 |
+
|
| 29 |
+
const filename = `icon-${size}x${size}.svg`;
|
| 30 |
+
fs.writeFileSync(path.join(iconsDir, filename), canvas);
|
| 31 |
+
console.log(`Created ${filename}`);
|
| 32 |
+
});
|
| 33 |
+
|
| 34 |
+
console.log('All icons created successfully!');
|
| 35 |
+
console.log('Note: For production, convert SVG icons to PNG using an online converter or image processing tool.');
|
dist/app.min.js
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/app.min.js.gz
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:dd2817bb78b9f94442b76eb8d070366000eec6f8f69705300a46d2f944043a8c
|
| 3 |
+
size 23690
|
dist/build-report.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
| 1 |
{
|
| 2 |
-
"buildDate": "2025-11-
|
| 3 |
"version": "3.10.2",
|
| 4 |
"files": [
|
| 5 |
{
|
| 6 |
"name": "JavaScript",
|
| 7 |
-
"originalSize":
|
| 8 |
-
"minifiedSize":
|
| 9 |
-
"gzipSize":
|
| 10 |
-
"minSavings": "
|
| 11 |
-
"gzipSavings": "
|
| 12 |
},
|
| 13 |
{
|
| 14 |
"name": "CSS",
|
| 15 |
-
"originalSize":
|
| 16 |
-
"minifiedSize":
|
| 17 |
-
"gzipSize":
|
| 18 |
-
"minSavings": "
|
| 19 |
-
"gzipSavings": "
|
| 20 |
},
|
| 21 |
{
|
| 22 |
"name": "HTML",
|
| 23 |
-
"originalSize":
|
| 24 |
"minifiedSize": 22365,
|
| 25 |
"gzipSize": 5821,
|
| 26 |
-
"minSavings": "
|
| 27 |
-
"gzipSavings": "85.
|
| 28 |
},
|
| 29 |
{
|
| 30 |
"name": "Service Worker",
|
|
@@ -36,16 +36,16 @@
|
|
| 36 |
}
|
| 37 |
],
|
| 38 |
"totals": {
|
| 39 |
-
"originalSize":
|
| 40 |
-
"minifiedSize":
|
| 41 |
-
"gzipSize":
|
| 42 |
-
"sizeKB": "40.
|
| 43 |
-
"minSavings": "
|
| 44 |
-
"gzipSavings": "89.
|
| 45 |
},
|
| 46 |
"performance": {
|
| 47 |
"loadTimes": {
|
| 48 |
-
"3G Slow": "0.
|
| 49 |
"3G": "0.43s",
|
| 50 |
"4G": "0.06s",
|
| 51 |
"5G": "0.02s",
|
|
|
|
| 1 |
{
|
| 2 |
+
"buildDate": "2025-11-06T01:10:09.720Z",
|
| 3 |
"version": "3.10.2",
|
| 4 |
"files": [
|
| 5 |
{
|
| 6 |
"name": "JavaScript",
|
| 7 |
+
"originalSize": 237990,
|
| 8 |
+
"minifiedSize": 94802,
|
| 9 |
+
"gzipSize": 23690,
|
| 10 |
+
"minSavings": "60.2%",
|
| 11 |
+
"gzipSavings": "90.0%"
|
| 12 |
},
|
| 13 |
{
|
| 14 |
"name": "CSS",
|
| 15 |
+
"originalSize": 89348,
|
| 16 |
+
"minifiedSize": 56760,
|
| 17 |
+
"gzipSize": 9585,
|
| 18 |
+
"minSavings": "36.5%",
|
| 19 |
+
"gzipSavings": "89.3%"
|
| 20 |
},
|
| 21 |
{
|
| 22 |
"name": "HTML",
|
| 23 |
+
"originalSize": 40826,
|
| 24 |
"minifiedSize": 22365,
|
| 25 |
"gzipSize": 5821,
|
| 26 |
+
"minSavings": "45.2%",
|
| 27 |
+
"gzipSavings": "85.7%"
|
| 28 |
},
|
| 29 |
{
|
| 30 |
"name": "Service Worker",
|
|
|
|
| 36 |
}
|
| 37 |
],
|
| 38 |
"totals": {
|
| 39 |
+
"originalSize": 385425,
|
| 40 |
+
"minifiedSize": 181029,
|
| 41 |
+
"gzipSize": 41110,
|
| 42 |
+
"sizeKB": "40.15",
|
| 43 |
+
"minSavings": "53.0%",
|
| 44 |
+
"gzipSavings": "89.3%"
|
| 45 |
},
|
| 46 |
"performance": {
|
| 47 |
"loadTimes": {
|
| 48 |
+
"3G Slow": "0.80s",
|
| 49 |
"3G": "0.43s",
|
| 50 |
"4G": "0.06s",
|
| 51 |
"5G": "0.02s",
|
dist/index.html
CHANGED
|
@@ -1,801 +1 @@
|
|
| 1 |
-
<!DOCTYPE html>
|
| 2 |
-
<html lang="pt-BR">
|
| 3 |
-
<head>
|
| 4 |
-
<meta charset="UTF-8">
|
| 5 |
-
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes, viewport-fit=cover, interactive-widget=resizes-visual">
|
| 6 |
-
|
| 7 |
-
<!-- 🌟 Premium PWA Configuration -->
|
| 8 |
-
<meta name="mobile-web-app-capable" content="yes">
|
| 9 |
-
<meta name="apple-mobile-web-app-capable" content="yes">
|
| 10 |
-
<meta name="apple-mobile-web-app-title" content="Fitness App">
|
| 11 |
-
<meta name="application-name" content="Fitness App">
|
| 12 |
-
<meta name="format-detection" content="telephone=no">
|
| 13 |
-
<meta name="color-scheme" content="light dark">
|
| 14 |
-
<meta name="supported-color-schemes" content="light dark">
|
| 15 |
-
|
| 16 |
-
<title>✨ Sua Jornada de Transformação | Fitness App Premium</title>
|
| 17 |
-
|
| 18 |
-
<!-- Performance: DNS Prefetch for external resources -->
|
| 19 |
-
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
|
| 20 |
-
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
|
| 21 |
-
<link rel="dns-prefetch" href="https://huggingface.co">
|
| 22 |
-
|
| 23 |
-
<!-- Performance: Preconnect for fonts (saves ~300ms) -->
|
| 24 |
-
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 25 |
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 26 |
-
|
| 27 |
-
<!-- Performance: Preconnect for Hugging Face videos (critical for workout videos) -->
|
| 28 |
-
<link rel="preconnect" href="https://huggingface.co">
|
| 29 |
-
<link rel="preconnect" href="https://cdn-lfs.huggingface.co" crossorigin>
|
| 30 |
-
|
| 31 |
-
<!-- Performance: Optimized font loading with preconnect -->
|
| 32 |
-
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
|
| 33 |
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 34 |
-
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700;800&family=Playfair+Display:wght@400;600;700&display=swap" rel="stylesheet">
|
| 35 |
-
|
| 36 |
-
<!-- Critical CSS Inline for faster first paint -->
|
| 37 |
-
<style>
|
| 38 |
-
/* Critical CSS - Above the fold */
|
| 39 |
-
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
|
| 40 |
-
:root{--primary:#FF6B9D;--bg-light:#FFF5F8;--text-primary:#2D3748}
|
| 41 |
-
body{font-family:'Poppins',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:var(--bg-light);color:var(--text-primary);overflow-x:hidden;-webkit-font-smoothing:antialiased}
|
| 42 |
-
.app-container{min-height:100vh}
|
| 43 |
-
</style>
|
| 44 |
-
<!-- Full CSS loaded - simplified for reliability -->
|
| 45 |
-
<link rel="stylesheet" href="styles.min.css">
|
| 46 |
-
|
| 47 |
-
<!-- Performance: Preload and prefetch -->
|
| 48 |
-
<link rel="preload" href="app.js" as="script">
|
| 49 |
-
<link rel="dns-prefetch" href="https://huggingface.co">
|
| 50 |
-
<link rel="preconnect" href="https://huggingface.co" crossorigin>
|
| 51 |
-
|
| 52 |
-
<!-- PWA Manifest -->
|
| 53 |
-
<link rel="manifest" href="manifest.json">
|
| 54 |
-
|
| 55 |
-
<meta name="description" content="Seu aplicativo de transformação pessoal completo - exercícios, nutrição e bem-estar. Treinos personalizados, yoga, meditação, acompanhamento nutricional e muito mais!">
|
| 56 |
-
<meta name="keywords" content="fitness, treino, nutrição, bem-estar, yoga, meditação, saúde, emagrecimento, musculação, cardio, alongamento, wellness">
|
| 57 |
-
<meta name="author" content="Fitness App">
|
| 58 |
-
<meta name="creator" content="Fitness App">
|
| 59 |
-
<meta name="publisher" content="Fitness App">
|
| 60 |
-
<meta name="robots" content="index, follow">
|
| 61 |
-
<meta name="googlebot" content="index, follow">
|
| 62 |
-
|
| 63 |
-
<!-- 🎨 Theme Colors (Premium) -->
|
| 64 |
-
<meta name="theme-color" content="#FF6B9D" media="(prefers-color-scheme: light)">
|
| 65 |
-
<meta name="theme-color" content="#1a1a1a" media="(prefers-color-scheme: dark)">
|
| 66 |
-
<meta name="msapplication-navbutton-color" content="#FF6B9D">
|
| 67 |
-
<meta name="apple-mobile-web-app-capable" content="yes">
|
| 68 |
-
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
| 69 |
-
|
| 70 |
-
<!-- 🌐 Open Graph / Facebook (Premium Social Sharing) -->
|
| 71 |
-
<meta property="og:type" content="website">
|
| 72 |
-
<meta property="og:title" content="Fitness App - Sua Jornada de Transformação">
|
| 73 |
-
<meta property="og:description" content="Aplicativo completo de fitness, nutrição e bem-estar. Treinos personalizados, yoga, meditação e acompanhamento nutricional.">
|
| 74 |
-
<meta property="og:image" content="/icons/og-image-1200x630.png">
|
| 75 |
-
<meta property="og:image:width" content="1200">
|
| 76 |
-
<meta property="og:image:height" content="630">
|
| 77 |
-
<meta property="og:url" content="https://seu-dominio.com">
|
| 78 |
-
<meta property="og:site_name" content="Fitness App">
|
| 79 |
-
<meta property="og:locale" content="pt_BR">
|
| 80 |
-
|
| 81 |
-
<!-- 🐦 Twitter Card (Premium) -->
|
| 82 |
-
<meta name="twitter:card" content="summary_large_image">
|
| 83 |
-
<meta name="twitter:title" content="Fitness App - Sua Jornada de Transformação">
|
| 84 |
-
<meta name="twitter:description" content="Aplicativo completo de fitness, nutrição e bem-estar">
|
| 85 |
-
<meta name="twitter:image" content="/icons/twitter-card-1200x600.png">
|
| 86 |
-
<meta name="twitter:creator" content="@fitnessapp">
|
| 87 |
-
|
| 88 |
-
<!-- 🔍 Additional SEO -->
|
| 89 |
-
<link rel="canonical" href="https://seu-dominio.com">
|
| 90 |
-
<meta name="referrer" content="origin-when-cross-origin">
|
| 91 |
-
|
| 92 |
-
<!-- PWA: Apple Touch Icons -->
|
| 93 |
-
<link rel="apple-touch-icon" sizes="192x192" href="icons/icon-192x192.svg">
|
| 94 |
-
<link rel="apple-touch-icon" sizes="512x512" href="icons/icon-512x512.svg">
|
| 95 |
-
|
| 96 |
-
<!-- PWA: Microsoft Tiles -->
|
| 97 |
-
<meta name="msapplication-TileColor" content="#FF6B9D">
|
| 98 |
-
<meta name="msapplication-config" content="none">
|
| 99 |
-
|
| 100 |
-
<!-- Performance: Preload favicon -->
|
| 101 |
-
<link rel="icon" type="image/svg+xml" href="icons/icon.svg">
|
| 102 |
-
|
| 103 |
-
<!-- Performance: Resource hints -->
|
| 104 |
-
<link rel="preload" href="app.js" as="script">
|
| 105 |
-
<link rel="modulepreload" href="app.js">
|
| 106 |
-
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
| 107 |
-
</head>
|
| 108 |
-
<body>
|
| 109 |
-
<!-- Welcome Screen -->
|
| 110 |
-
<div class="welcome-screen" id="welcomeScreen">
|
| 111 |
-
<div class="welcome-content">
|
| 112 |
-
<div class="welcome-logo">
|
| 113 |
-
<div class="logo-heart">💖</div>
|
| 114 |
-
<h1>Bem-vinda!</h1>
|
| 115 |
-
<p>Sua jornada de transformação começa aqui</p>
|
| 116 |
-
</div>
|
| 117 |
-
<button class="btn-start-journey" id="startJourney">Começar Agora ✨</button>
|
| 118 |
-
</div>
|
| 119 |
-
</div>
|
| 120 |
-
|
| 121 |
-
<div class="app-container" id="appContainer" style="display: none;">
|
| 122 |
-
<!-- Top Bar -->
|
| 123 |
-
<header class="top-bar">
|
| 124 |
-
<div class="user-info" style="cursor: pointer;" id="userProfileClick">
|
| 125 |
-
<div class="avatar" id="userAvatar">💝</div>
|
| 126 |
-
<div class="user-text">
|
| 127 |
-
<span class="greeting" id="greeting">Olá, Guerreira!</span>
|
| 128 |
-
<span class="streak">🔥 <span id="streakDays">0</span> dias seguidos</span>
|
| 129 |
-
</div>
|
| 130 |
-
</div>
|
| 131 |
-
<div class="top-actions">
|
| 132 |
-
<button class="icon-btn" id="notifBtn" title="Notificações">
|
| 133 |
-
<span>🔔</span>
|
| 134 |
-
<span class="notification-badge" id="notificationBadge" style="display: none;">0</span>
|
| 135 |
-
</button>
|
| 136 |
-
</div>
|
| 137 |
-
</header>
|
| 138 |
-
|
| 139 |
-
<!-- Main Content -->
|
| 140 |
-
<main class="main-view">
|
| 141 |
-
<!-- Home View -->
|
| 142 |
-
<section class="view active" id="homeView">
|
| 143 |
-
<div class="hero-section">
|
| 144 |
-
<h2 class="page-title">Sua Transformação</h2>
|
| 145 |
-
<div class="daily-progress">
|
| 146 |
-
<div class="progress-circle" id="progressCircle">
|
| 147 |
-
<svg viewBox="0 0 120 120">
|
| 148 |
-
<circle cx="60" cy="60" r="54" class="progress-bg"></circle>
|
| 149 |
-
<circle cx="60" cy="60" r="54" class="progress-fill" id="progressFill" style="--progress: 0"></circle>
|
| 150 |
-
</svg>
|
| 151 |
-
<div class="progress-text">
|
| 152 |
-
<span class="progress-value" id="progressValue">0</span>%
|
| 153 |
-
<span class="progress-label">Hoje</span>
|
| 154 |
-
</div>
|
| 155 |
-
</div>
|
| 156 |
-
<div class="today-stats">
|
| 157 |
-
<div class="stat">
|
| 158 |
-
<span class="stat-icon">🔥</span>
|
| 159 |
-
<div>
|
| 160 |
-
<span class="stat-value" id="caloriesBurned">0</span>
|
| 161 |
-
<span class="stat-label">kcal</span>
|
| 162 |
-
</div>
|
| 163 |
-
</div>
|
| 164 |
-
<div class="stat">
|
| 165 |
-
<span class="stat-icon">⏱️</span>
|
| 166 |
-
<div>
|
| 167 |
-
<span class="stat-value" id="minutesActive">0</span>
|
| 168 |
-
<span class="stat-label">min</span>
|
| 169 |
-
</div>
|
| 170 |
-
</div>
|
| 171 |
-
<div class="stat">
|
| 172 |
-
<span class="stat-icon">💪</span>
|
| 173 |
-
<div>
|
| 174 |
-
<span class="stat-value" id="workoutsCompleted">0</span>
|
| 175 |
-
<span class="stat-label">treinos</span>
|
| 176 |
-
</div>
|
| 177 |
-
</div>
|
| 178 |
-
</div>
|
| 179 |
-
</div>
|
| 180 |
-
</div>
|
| 181 |
-
|
| 182 |
-
<!-- Personal Plan Summary -->
|
| 183 |
-
<div class="plan-summary" id="planSummary" style="display: none;">
|
| 184 |
-
<div class="plan-card">
|
| 185 |
-
<div class="plan-header">
|
| 186 |
-
<h3>🎯 Seu Plano Personalizado</h3>
|
| 187 |
-
<button class="btn-view-plan" id="viewFullPlan">Ver Detalhes</button>
|
| 188 |
-
</div>
|
| 189 |
-
<div class="plan-quick-stats">
|
| 190 |
-
<div class="plan-stat">
|
| 191 |
-
<span class="plan-label">Meta</span>
|
| 192 |
-
<span class="plan-value" id="planGoal">-</span>
|
| 193 |
-
</div>
|
| 194 |
-
<div class="plan-stat">
|
| 195 |
-
<span class="plan-label">Calorias/dia</span>
|
| 196 |
-
<span class="plan-value" id="planCalories">-</span>
|
| 197 |
-
</div>
|
| 198 |
-
<div class="plan-stat">
|
| 199 |
-
<span class="plan-label">Treino</span>
|
| 200 |
-
<span class="plan-value" id="planWorkout">-</span>
|
| 201 |
-
</div>
|
| 202 |
-
</div>
|
| 203 |
-
<div class="coach-message" id="coachMessage">
|
| 204 |
-
💪 Continue assim! Você está no caminho certo!
|
| 205 |
-
</div>
|
| 206 |
-
</div>
|
| 207 |
-
</div>
|
| 208 |
-
|
| 209 |
-
<div class="quick-actions">
|
| 210 |
-
<h3 class="section-title">Comece Agora</h3>
|
| 211 |
-
<div class="action-cards">
|
| 212 |
-
<div class="action-card" data-navigate="calendar">
|
| 213 |
-
<div class="action-icon">📅</div>
|
| 214 |
-
<h4>Plano 30 Dias</h4>
|
| 215 |
-
<p>Seu programa personalizado</p>
|
| 216 |
-
</div>
|
| 217 |
-
<div class="action-card" data-navigate="workouts">
|
| 218 |
-
<div class="action-icon">💪</div>
|
| 219 |
-
<h4>Treinar</h4>
|
| 220 |
-
<p>Escolha sua área</p>
|
| 221 |
-
</div>
|
| 222 |
-
<div class="action-card" data-navigate="nutrition">
|
| 223 |
-
<div class="action-icon">🥗</div>
|
| 224 |
-
<h4>Nutrição</h4>
|
| 225 |
-
<p>Acompanhe sua dieta</p>
|
| 226 |
-
</div>
|
| 227 |
-
<div class="action-card" data-navigate="wellness">
|
| 228 |
-
<div class="action-icon">🧘♀️</div>
|
| 229 |
-
<h4>Bem-Estar</h4>
|
| 230 |
-
<p>Massagens & Postura</p>
|
| 231 |
-
</div>
|
| 232 |
-
<div class="action-card" data-navigate="progress">
|
| 233 |
-
<div class="action-icon">📈</div>
|
| 234 |
-
<h4>Progresso</h4>
|
| 235 |
-
<p>Veja sua evolução</p>
|
| 236 |
-
</div>
|
| 237 |
-
</div>
|
| 238 |
-
</div>
|
| 239 |
-
|
| 240 |
-
<div class="motivation-card">
|
| 241 |
-
<div class="motivation-icon">✨</div>
|
| 242 |
-
<p class="motivation-text" id="dailyMotivation">Você é capaz de coisas incríveis! Continue brilhando! 💫</p>
|
| 243 |
-
</div>
|
| 244 |
-
</section>
|
| 245 |
-
|
| 246 |
-
<!-- Workouts View -->
|
| 247 |
-
<section class="view" id="workoutsView">
|
| 248 |
-
<div class="view-header">
|
| 249 |
-
<button class="btn-back" data-back="home">← Voltar</button>
|
| 250 |
-
<h2 class="view-title">Escolha a Área</h2>
|
| 251 |
-
</div>
|
| 252 |
-
|
| 253 |
-
<div class="category-grid">
|
| 254 |
-
<div class="category-card" data-category="personalized" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;">
|
| 255 |
-
<div class="category-image">🎯</div>
|
| 256 |
-
<h3>Personalizado</h3>
|
| 257 |
-
<p>Vídeos exclusivos locais</p>
|
| 258 |
-
<span class="category-badge" style="background: rgba(255,255,255,0.3);">20 exercícios</span>
|
| 259 |
-
</div>
|
| 260 |
-
|
| 261 |
-
<div class="category-card" data-category="abs">
|
| 262 |
-
<div class="category-image">🔥</div>
|
| 263 |
-
<h3>Abdômen</h3>
|
| 264 |
-
<p>Barriga definida</p>
|
| 265 |
-
<span class="category-badge">12 exercícios</span>
|
| 266 |
-
</div>
|
| 267 |
-
|
| 268 |
-
<div class="category-card" data-category="legs">
|
| 269 |
-
<div class="category-image">🦵</div>
|
| 270 |
-
<h3>Pernas</h3>
|
| 271 |
-
<p>Pernas torneadas</p>
|
| 272 |
-
<span class="category-badge">12 exercícios</span>
|
| 273 |
-
</div>
|
| 274 |
-
|
| 275 |
-
<div class="category-card" data-category="glutes">
|
| 276 |
-
<div class="category-image">🍑</div>
|
| 277 |
-
<h3>Glúteos</h3>
|
| 278 |
-
<p>Bumbum empinado</p>
|
| 279 |
-
<span class="category-badge">12 exercícios</span>
|
| 280 |
-
</div>
|
| 281 |
-
|
| 282 |
-
<div class="category-card" data-category="arms">
|
| 283 |
-
<div class="category-image">💪</div>
|
| 284 |
-
<h3>Braços</h3>
|
| 285 |
-
<p>Braços definidos</p>
|
| 286 |
-
<span class="category-badge">12 exercícios</span>
|
| 287 |
-
</div>
|
| 288 |
-
|
| 289 |
-
<div class="category-card" data-category="face">
|
| 290 |
-
<div class="category-image">😊</div>
|
| 291 |
-
<h3>Massagem Facial</h3>
|
| 292 |
-
<p>Rosto afinado</p>
|
| 293 |
-
<span class="category-badge">3 exercícios</span>
|
| 294 |
-
</div>
|
| 295 |
-
|
| 296 |
-
<div class="category-card" data-category="waist">
|
| 297 |
-
<div class="category-image">⏳</div>
|
| 298 |
-
<h3>Cintura</h3>
|
| 299 |
-
<p>Cintura fina</p>
|
| 300 |
-
<span class="category-badge">8 exercícios</span>
|
| 301 |
-
</div>
|
| 302 |
-
|
| 303 |
-
<div class="category-card" data-category="back">
|
| 304 |
-
<div class="category-image">🧘♀️</div>
|
| 305 |
-
<h3>Postura e Mobilidade</h3>
|
| 306 |
-
<p>Costas fortes</p>
|
| 307 |
-
<span class="category-badge">10 exercícios</span>
|
| 308 |
-
</div>
|
| 309 |
-
|
| 310 |
-
<div class="category-card" data-category="cardio">
|
| 311 |
-
<div class="category-image">❤️</div>
|
| 312 |
-
<h3>Cardio</h3>
|
| 313 |
-
<p>Queime calorias</p>
|
| 314 |
-
<span class="category-badge">15 exercícios</span>
|
| 315 |
-
</div>
|
| 316 |
-
|
| 317 |
-
<div class="category-card" data-category="fullbody">
|
| 318 |
-
<div class="category-image">✨</div>
|
| 319 |
-
<h3>Corpo Todo</h3>
|
| 320 |
-
<p>Treino completo</p>
|
| 321 |
-
<span class="category-badge">11 exercícios</span>
|
| 322 |
-
</div>
|
| 323 |
-
|
| 324 |
-
<div class="category-card" data-category="yoga">
|
| 325 |
-
<div class="category-image">🧘♀️</div>
|
| 326 |
-
<h3>Yoga</h3>
|
| 327 |
-
<p>Flexibilidade e paz</p>
|
| 328 |
-
<span class="category-badge">13 posições</span>
|
| 329 |
-
</div>
|
| 330 |
-
|
| 331 |
-
<div class="category-card" data-category="massage">
|
| 332 |
-
<div class="category-image">💆♀️</div>
|
| 333 |
-
<h3>Massagem</h3>
|
| 334 |
-
<p>Relaxamento total</p>
|
| 335 |
-
<span class="category-badge">3 técnicas</span>
|
| 336 |
-
</div>
|
| 337 |
-
</div>
|
| 338 |
-
</section>
|
| 339 |
-
|
| 340 |
-
<!-- Exercises List View -->
|
| 341 |
-
<section class="view" id="exercisesListView">
|
| 342 |
-
<div class="view-header">
|
| 343 |
-
<button class="btn-back" data-back="workouts">← Voltar</button>
|
| 344 |
-
<h2 class="view-title" id="categoryTitle">Exercícios</h2>
|
| 345 |
-
</div>
|
| 346 |
-
|
| 347 |
-
<div class="exercises-container" id="exercisesList">
|
| 348 |
-
<!-- Exercises will be populated here -->
|
| 349 |
-
</div>
|
| 350 |
-
</section>
|
| 351 |
-
|
| 352 |
-
<!-- Workout Session View -->
|
| 353 |
-
<section class="view" id="workoutSessionView">
|
| 354 |
-
<div class="workout-header">
|
| 355 |
-
<button class="btn-close-workout" id="closeWorkout">✕</button>
|
| 356 |
-
<div class="workout-timer" id="workoutTimer">00:00</div>
|
| 357 |
-
</div>
|
| 358 |
-
|
| 359 |
-
<div class="workout-content">
|
| 360 |
-
<div class="exercise-display">
|
| 361 |
-
<div class="exercise-name" id="currentExerciseName">Preparando...</div>
|
| 362 |
-
<div class="exercise-count" id="exerciseCount">Exercício 1 de 5</div>
|
| 363 |
-
|
| 364 |
-
<div class="exercise-demo" id="exerciseDemo">
|
| 365 |
-
<div class="demo-placeholder">
|
| 366 |
-
<video class="demo-video" id="demoVideo" loop muted playsinline webkit-playsinline style="display: none;">
|
| 367 |
-
<source src="" type="video/mp4">
|
| 368 |
-
</video>
|
| 369 |
-
<button class="video-play-button" id="videoPlayButton" style="display: none;">
|
| 370 |
-
▶️ Tocar Vídeo
|
| 371 |
-
</button>
|
| 372 |
-
<span class="demo-icon" id="demoIcon">💪</span>
|
| 373 |
-
</div>
|
| 374 |
-
</div>
|
| 375 |
-
|
| 376 |
-
<div class="exercise-instructions">
|
| 377 |
-
<div class="reps-info" id="repsInfo">3 séries × 15 repetições</div>
|
| 378 |
-
<div class="rest-info" id="restInfo">Descanso: 30s entre séries</div>
|
| 379 |
-
</div>
|
| 380 |
-
|
| 381 |
-
<div class="series-tracker" id="seriesTracker">
|
| 382 |
-
<div class="series-dot completed"></div>
|
| 383 |
-
<div class="series-dot"></div>
|
| 384 |
-
<div class="series-dot"></div>
|
| 385 |
-
</div>
|
| 386 |
-
</div>
|
| 387 |
-
|
| 388 |
-
<div class="workout-controls">
|
| 389 |
-
<button class="btn-workout-action secondary" id="skipExercise">Pular</button>
|
| 390 |
-
<button class="btn-workout-action primary" id="completeExercise">Concluir Série</button>
|
| 391 |
-
</div>
|
| 392 |
-
</div>
|
| 393 |
-
|
| 394 |
-
<div class="workout-progress-bar">
|
| 395 |
-
<div class="progress-bar-fill" id="workoutProgressBar" style="width: 0%"></div>
|
| 396 |
-
</div>
|
| 397 |
-
</section>
|
| 398 |
-
|
| 399 |
-
<!-- Wellness View -->
|
| 400 |
-
<section class="view" id="wellnessView">
|
| 401 |
-
<div class="view-header">
|
| 402 |
-
<button class="btn-back" data-back="home">← Voltar</button>
|
| 403 |
-
<h2 class="view-title">Bem-Estar</h2>
|
| 404 |
-
</div>
|
| 405 |
-
|
| 406 |
-
<div class="wellness-grid">
|
| 407 |
-
<div class="wellness-card" data-wellness="face-massage">
|
| 408 |
-
<div class="wellness-icon">💆♀️</div>
|
| 409 |
-
<h3>Massagem Facial</h3>
|
| 410 |
-
<p>Rejuvenesça e relaxe</p>
|
| 411 |
-
<span class="duration">10 min</span>
|
| 412 |
-
</div>
|
| 413 |
-
|
| 414 |
-
<div class="wellness-card" data-wellness="body-massage">
|
| 415 |
-
<div class="wellness-icon">💫</div>
|
| 416 |
-
<h3>Massagem Corporal</h3>
|
| 417 |
-
<p>Alivie tensões</p>
|
| 418 |
-
<span class="duration">15 min</span>
|
| 419 |
-
</div>
|
| 420 |
-
|
| 421 |
-
<div class="wellness-card" data-wellness="posture">
|
| 422 |
-
<div class="wellness-icon">🧍♀️</div>
|
| 423 |
-
<h3>Correção Postural</h3>
|
| 424 |
-
<p>Melhore sua postura</p>
|
| 425 |
-
<span class="duration">12 min</span>
|
| 426 |
-
</div>
|
| 427 |
-
|
| 428 |
-
<div class="wellness-card" data-wellness="stretching">
|
| 429 |
-
<div class="wellness-icon">🤸♀️</div>
|
| 430 |
-
<h3>Alongamento</h3>
|
| 431 |
-
<p>Flexibilidade total</p>
|
| 432 |
-
<span class="duration">8 min</span>
|
| 433 |
-
</div>
|
| 434 |
-
|
| 435 |
-
<div class="wellness-card" data-wellness="breathing">
|
| 436 |
-
<div class="wellness-icon">🌬️</div>
|
| 437 |
-
<h3>Respiração</h3>
|
| 438 |
-
<p>Acalme sua mente</p>
|
| 439 |
-
<span class="duration">5 min</span>
|
| 440 |
-
</div>
|
| 441 |
-
|
| 442 |
-
<div class="wellness-card" data-wellness="meditation">
|
| 443 |
-
<div class="wellness-icon">🧘♀️</div>
|
| 444 |
-
<h3>Meditação</h3>
|
| 445 |
-
<p>Paz interior</p>
|
| 446 |
-
<span class="duration">10 min</span>
|
| 447 |
-
</div>
|
| 448 |
-
</div>
|
| 449 |
-
</section>
|
| 450 |
-
|
| 451 |
-
<!-- Nutrition View -->
|
| 452 |
-
<section class="view" id="nutritionView">
|
| 453 |
-
<div class="view-header">
|
| 454 |
-
<button class="btn-back" data-back="home">← Voltar</button>
|
| 455 |
-
<h2 class="view-title">Nutrição</h2>
|
| 456 |
-
</div>
|
| 457 |
-
|
| 458 |
-
<div class="nutrition-summary">
|
| 459 |
-
<h3>Resumo de Hoje</h3>
|
| 460 |
-
<div class="macros-display">
|
| 461 |
-
<div class="macro-item">
|
| 462 |
-
<div class="macro-circle carbs">
|
| 463 |
-
<span id="carbsValue">0g</span>
|
| 464 |
-
</div>
|
| 465 |
-
<span class="macro-label">Carboidratos</span>
|
| 466 |
-
</div>
|
| 467 |
-
<div class="macro-item">
|
| 468 |
-
<div class="macro-circle protein">
|
| 469 |
-
<span id="proteinValue">0g</span>
|
| 470 |
-
</div>
|
| 471 |
-
<span class="macro-label">Proteínas</span>
|
| 472 |
-
</div>
|
| 473 |
-
<div class="macro-item">
|
| 474 |
-
<div class="macro-circle fat">
|
| 475 |
-
<span id="fatValue">0g</span>
|
| 476 |
-
</div>
|
| 477 |
-
<span class="macro-label">Gorduras</span>
|
| 478 |
-
</div>
|
| 479 |
-
</div>
|
| 480 |
-
<div class="calories-total">
|
| 481 |
-
<span class="calories-value" id="totalCalories">0</span>
|
| 482 |
-
<span class="calories-label">kcal hoje</span>
|
| 483 |
-
</div>
|
| 484 |
-
</div>
|
| 485 |
-
|
| 486 |
-
<div class="water-tracker">
|
| 487 |
-
<h3>Hidratação 💧</h3>
|
| 488 |
-
<div class="water-glasses">
|
| 489 |
-
<div class="glass" data-glass="1">💧</div>
|
| 490 |
-
<div class="glass" data-glass="2">💧</div>
|
| 491 |
-
<div class="glass" data-glass="3">💧</div>
|
| 492 |
-
<div class="glass" data-glass="4">💧</div>
|
| 493 |
-
<div class="glass" data-glass="5">💧</div>
|
| 494 |
-
<div class="glass" data-glass="6">💧</div>
|
| 495 |
-
<div class="glass" data-glass="7">💧</div>
|
| 496 |
-
<div class="glass" data-glass="8">💧</div>
|
| 497 |
-
</div>
|
| 498 |
-
<p class="water-goal"><span id="waterCount">0</span>/8 copos (2L)</p>
|
| 499 |
-
</div>
|
| 500 |
-
</section>
|
| 501 |
-
|
| 502 |
-
<!-- 30-Day Calendar View -->
|
| 503 |
-
<section class="view" id="calendarView">
|
| 504 |
-
<div class="view-header">
|
| 505 |
-
<button class="btn-back" data-back="home">← Voltar</button>
|
| 506 |
-
<h2 class="view-title">Plano 30 Dias 📅</h2>
|
| 507 |
-
</div>
|
| 508 |
-
|
| 509 |
-
<div class="calendar-intro">
|
| 510 |
-
<div class="intro-card">
|
| 511 |
-
<h3>🎯 Sua Jornada de Transformação</h3>
|
| 512 |
-
<p>Um plano personalizado de 30 dias focado em seus objetivos. Cada dia com treinos específicos para sua meta!</p>
|
| 513 |
-
</div>
|
| 514 |
-
</div>
|
| 515 |
-
|
| 516 |
-
<div class="calendar-grid" id="calendar30Days">
|
| 517 |
-
<!-- Calendar will be populated by JavaScript -->
|
| 518 |
-
</div>
|
| 519 |
-
</section>
|
| 520 |
-
|
| 521 |
-
<!-- Progress View -->
|
| 522 |
-
<section class="view" id="progressView">
|
| 523 |
-
<div class="view-header">
|
| 524 |
-
<button class="btn-back" data-back="home">← Voltar</button>
|
| 525 |
-
<h2 class="view-title">Seu Progresso</h2>
|
| 526 |
-
</div>
|
| 527 |
-
|
| 528 |
-
<!-- Weight Tracking -->
|
| 529 |
-
<div class="weight-tracking-section">
|
| 530 |
-
<h3>Controle de Peso ⚖️</h3>
|
| 531 |
-
<div class="weight-card">
|
| 532 |
-
<div class="weight-current">
|
| 533 |
-
<div class="weight-label">Peso Atual</div>
|
| 534 |
-
<div class="weight-value" id="currentWeight">--</div>
|
| 535 |
-
<button class="btn-update-weight" id="updateWeightBtn">Atualizar Peso</button>
|
| 536 |
-
</div>
|
| 537 |
-
<div class="weight-stats">
|
| 538 |
-
<div class="weight-stat">
|
| 539 |
-
<div class="weight-stat-label">Peso Inicial</div>
|
| 540 |
-
<div class="weight-stat-value" id="initialWeight">--</div>
|
| 541 |
-
</div>
|
| 542 |
-
<div class="weight-stat success">
|
| 543 |
-
<div class="weight-stat-label">Perdeu</div>
|
| 544 |
-
<div class="weight-stat-value" id="weightLost">0 kg</div>
|
| 545 |
-
</div>
|
| 546 |
-
<div class="weight-stat">
|
| 547 |
-
<div class="weight-stat-label">Meta</div>
|
| 548 |
-
<div class="weight-stat-value" id="goalWeight">--</div>
|
| 549 |
-
</div>
|
| 550 |
-
</div>
|
| 551 |
-
<div class="weight-progress-bar">
|
| 552 |
-
<div class="weight-progress-fill" id="weightProgressFill" style="width: 0%"></div>
|
| 553 |
-
</div>
|
| 554 |
-
<div class="weight-chart-mini" id="weightChartMini">
|
| 555 |
-
<!-- Mini chart will be rendered here -->
|
| 556 |
-
</div>
|
| 557 |
-
</div>
|
| 558 |
-
</div>
|
| 559 |
-
|
| 560 |
-
<!-- Weekly Activity -->
|
| 561 |
-
<div class="weekly-activity-section">
|
| 562 |
-
<h3>Atividade Semanal 📅</h3>
|
| 563 |
-
<div class="weekly-activity-grid" id="weeklyActivityGrid">
|
| 564 |
-
<!-- Será preenchido dinamicamente -->
|
| 565 |
-
</div>
|
| 566 |
-
</div>
|
| 567 |
-
|
| 568 |
-
<!-- Detailed Statistics -->
|
| 569 |
-
<div class="detailed-stats-section">
|
| 570 |
-
<h3>Estatísticas Detalhadas 📊</h3>
|
| 571 |
-
<div class="stats-grid">
|
| 572 |
-
<div class="stat-detail-card">
|
| 573 |
-
<div class="stat-detail-icon">🔥</div>
|
| 574 |
-
<div class="stat-detail-content">
|
| 575 |
-
<div class="stat-detail-number" id="totalWorkouts">0</div>
|
| 576 |
-
<div class="stat-detail-label">Treinos Completos</div>
|
| 577 |
-
<div class="stat-detail-sublabel">
|
| 578 |
-
<span id="thisWeekWorkouts">0</span> esta semana
|
| 579 |
-
</div>
|
| 580 |
-
</div>
|
| 581 |
-
</div>
|
| 582 |
-
|
| 583 |
-
<div class="stat-detail-card">
|
| 584 |
-
<div class="stat-detail-icon">⏱️</div>
|
| 585 |
-
<div class="stat-detail-content">
|
| 586 |
-
<div class="stat-detail-number" id="totalMinutes">0</div>
|
| 587 |
-
<div class="stat-detail-label">Minutos Ativos</div>
|
| 588 |
-
<div class="stat-detail-sublabel">
|
| 589 |
-
<span id="avgMinutes">0</span> min/treino
|
| 590 |
-
</div>
|
| 591 |
-
</div>
|
| 592 |
-
</div>
|
| 593 |
-
|
| 594 |
-
<div class="stat-detail-card">
|
| 595 |
-
<div class="stat-detail-icon">🔥</div>
|
| 596 |
-
<div class="stat-detail-content">
|
| 597 |
-
<div class="stat-detail-number" id="totalCaloriesDetail">0</div>
|
| 598 |
-
<div class="stat-detail-label">Calorias Queimadas</div>
|
| 599 |
-
<div class="stat-detail-sublabel">
|
| 600 |
-
<span id="avgCalories">0</span> kcal/treino
|
| 601 |
-
</div>
|
| 602 |
-
</div>
|
| 603 |
-
</div>
|
| 604 |
-
|
| 605 |
-
<div class="stat-detail-card">
|
| 606 |
-
<div class="stat-detail-icon">📅</div>
|
| 607 |
-
<div class="stat-detail-content">
|
| 608 |
-
<div class="stat-detail-number" id="daysActiveDetail">0</div>
|
| 609 |
-
<div class="stat-detail-label">Dias Ativos</div>
|
| 610 |
-
<div class="stat-detail-sublabel">
|
| 611 |
-
Sequência: <span id="currentStreak">0</span> dias
|
| 612 |
-
</div>
|
| 613 |
-
</div>
|
| 614 |
-
</div>
|
| 615 |
-
|
| 616 |
-
<div class="stat-detail-card">
|
| 617 |
-
<div class="stat-detail-icon">💧</div>
|
| 618 |
-
<div class="stat-detail-content">
|
| 619 |
-
<div class="stat-detail-number" id="totalWaterGlasses">0</div>
|
| 620 |
-
<div class="stat-detail-label">Copos de Água</div>
|
| 621 |
-
<div class="stat-detail-sublabel">
|
| 622 |
-
<span id="waterStreak">0</span> dias 8 copos
|
| 623 |
-
</div>
|
| 624 |
-
</div>
|
| 625 |
-
</div>
|
| 626 |
-
|
| 627 |
-
<div class="stat-detail-card">
|
| 628 |
-
<div class="stat-detail-icon">🏆</div>
|
| 629 |
-
<div class="stat-detail-content">
|
| 630 |
-
<div class="stat-detail-number" id="achievementsUnlocked">0</div>
|
| 631 |
-
<div class="stat-detail-label">Conquistas</div>
|
| 632 |
-
<div class="stat-detail-sublabel">
|
| 633 |
-
de <span id="totalAchievements">12</span> possíveis
|
| 634 |
-
</div>
|
| 635 |
-
</div>
|
| 636 |
-
</div>
|
| 637 |
-
</div>
|
| 638 |
-
</div>
|
| 639 |
-
|
| 640 |
-
<!-- Achievements -->
|
| 641 |
-
<div class="achievements-section">
|
| 642 |
-
<h3>Conquistas 🏆</h3>
|
| 643 |
-
<div class="achievements-grid" id="achievementsGrid">
|
| 644 |
-
<!-- Achievements will be populated here -->
|
| 645 |
-
</div>
|
| 646 |
-
</div>
|
| 647 |
-
|
| 648 |
-
<!-- Personal Records -->
|
| 649 |
-
<div class="records-section">
|
| 650 |
-
<h3>Recordes Pessoais 🌟</h3>
|
| 651 |
-
<div class="records-list">
|
| 652 |
-
<div class="record-item">
|
| 653 |
-
<div class="record-icon">🔥</div>
|
| 654 |
-
<div class="record-content">
|
| 655 |
-
<div class="record-label">Maior Sequência</div>
|
| 656 |
-
<div class="record-value" id="longestStreak">0 dias</div>
|
| 657 |
-
</div>
|
| 658 |
-
</div>
|
| 659 |
-
<div class="record-item">
|
| 660 |
-
<div class="record-icon">⏱️</div>
|
| 661 |
-
<div class="record-content">
|
| 662 |
-
<div class="record-label">Treino Mais Longo</div>
|
| 663 |
-
<div class="record-value" id="longestWorkout">0 min</div>
|
| 664 |
-
</div>
|
| 665 |
-
</div>
|
| 666 |
-
<div class="record-item">
|
| 667 |
-
<div class="record-icon">💪</div>
|
| 668 |
-
<div class="record-content">
|
| 669 |
-
<div class="record-label">Categoria Favorita</div>
|
| 670 |
-
<div class="record-value" id="favoriteCategory">--</div>
|
| 671 |
-
</div>
|
| 672 |
-
</div>
|
| 673 |
-
<div class="record-item">
|
| 674 |
-
<div class="record-icon">📅</div>
|
| 675 |
-
<div class="record-content">
|
| 676 |
-
<div class="record-label">Membro Desde</div>
|
| 677 |
-
<div class="record-value" id="memberSince">--</div>
|
| 678 |
-
</div>
|
| 679 |
-
</div>
|
| 680 |
-
</div>
|
| 681 |
-
</div>
|
| 682 |
-
</section>
|
| 683 |
-
</main>
|
| 684 |
-
|
| 685 |
-
<!-- Bottom Navigation -->
|
| 686 |
-
<nav class="bottom-nav">
|
| 687 |
-
<button class="nav-item active" data-nav="home">
|
| 688 |
-
<span class="nav-icon">🏠</span>
|
| 689 |
-
<span class="nav-label">Início</span>
|
| 690 |
-
</button>
|
| 691 |
-
<button class="nav-item" data-nav="workouts">
|
| 692 |
-
<span class="nav-icon">💪</span>
|
| 693 |
-
<span class="nav-label">Treinar</span>
|
| 694 |
-
</button>
|
| 695 |
-
<button class="nav-item" data-nav="nutrition">
|
| 696 |
-
<span class="nav-icon">🥗</span>
|
| 697 |
-
<span class="nav-label">Nutrição</span>
|
| 698 |
-
</button>
|
| 699 |
-
<button class="nav-item" data-nav="progress">
|
| 700 |
-
<span class="nav-icon">📊</span>
|
| 701 |
-
<span class="nav-label">Progresso</span>
|
| 702 |
-
</button>
|
| 703 |
-
</nav>
|
| 704 |
-
</div>
|
| 705 |
-
|
| 706 |
-
<!-- Completion Modal -->
|
| 707 |
-
<div class="modal" id="completionModal">
|
| 708 |
-
<div class="modal-content celebration">
|
| 709 |
-
<div class="celebration-confetti">🎉</div>
|
| 710 |
-
<h2 class="modal-title">Parabéns! 🎊</h2>
|
| 711 |
-
<p class="modal-message" id="completionMessage">Você completou o treino!</p>
|
| 712 |
-
<div class="workout-summary" id="workoutSummary">
|
| 713 |
-
<div class="summary-stat">
|
| 714 |
-
<span class="summary-icon">⏱️</span>
|
| 715 |
-
<span class="summary-value" id="summaryTime">15 min</span>
|
| 716 |
-
</div>
|
| 717 |
-
<div class="summary-stat">
|
| 718 |
-
<span class="summary-icon">🔥</span>
|
| 719 |
-
<span class="summary-value" id="summaryCalories">120 kcal</span>
|
| 720 |
-
</div>
|
| 721 |
-
<div class="summary-stat">
|
| 722 |
-
<span class="summary-icon">💪</span>
|
| 723 |
-
<span class="summary-value" id="summaryExercises">8 exercícios</span>
|
| 724 |
-
</div>
|
| 725 |
-
</div>
|
| 726 |
-
<div class="workout-details" id="workoutDetails" style="margin-top: var(--spacing-md); padding: var(--spacing-md); background: var(--bg-light); border-radius: var(--radius-md); text-align: left; font-size: 0.9rem; color: var(--text-secondary);"></div>
|
| 727 |
-
<button class="btn-modal-primary" id="closeCompletionModal">Continuar ✨</button>
|
| 728 |
-
</div>
|
| 729 |
-
</div>
|
| 730 |
-
|
| 731 |
-
<!-- Weight Update Modal -->
|
| 732 |
-
<div class="modal" id="weightModal">
|
| 733 |
-
<div class="modal-content">
|
| 734 |
-
<h2 class="modal-title">Atualizar Peso ⚖️</h2>
|
| 735 |
-
<div class="weight-input-group">
|
| 736 |
-
<label for="weightInput">Seu peso atual (kg)</label>
|
| 737 |
-
<input type="number" id="weightInput" step="0.1" min="30" max="200" placeholder="Ex: 65.5">
|
| 738 |
-
</div>
|
| 739 |
-
<div class="weight-input-group">
|
| 740 |
-
<label for="goalWeightInput">Seu peso meta (kg)</label>
|
| 741 |
-
<input type="number" id="goalWeightInput" step="0.1" min="30" max="200" placeholder="Ex: 60.0">
|
| 742 |
-
</div>
|
| 743 |
-
<div class="modal-actions">
|
| 744 |
-
<button class="btn-modal-secondary" id="cancelWeightBtn">Cancelar</button>
|
| 745 |
-
<button class="btn-modal-primary" id="saveWeightBtn">Salvar 💖</button>
|
| 746 |
-
</div>
|
| 747 |
-
</div>
|
| 748 |
-
</div>
|
| 749 |
-
|
| 750 |
-
<!-- Settings Toggle (Sound Control) -->
|
| 751 |
-
<div class="settings-fab" id="settingsFab">
|
| 752 |
-
<button class="fab-settings" id="toggleSound">
|
| 753 |
-
<span class="fab-icon" id="soundIcon">🔊</span>
|
| 754 |
-
</button>
|
| 755 |
-
</div>
|
| 756 |
-
|
| 757 |
-
<!-- Performance: Defer non-critical JavaScript -->
|
| 758 |
-
<!-- Personal Plan Modal -->
|
| 759 |
-
<div class="modal" id="planModal">
|
| 760 |
-
<div class="modal-content plan-modal-content">
|
| 761 |
-
<button class="modal-close" id="closePlanModal">×</button>
|
| 762 |
-
<div id="planModalContent">
|
| 763 |
-
<h2 class="modal-title">🎯 Seu Plano Completo</h2>
|
| 764 |
-
|
| 765 |
-
<div class="profile-info" id="profileInfo"></div>
|
| 766 |
-
|
| 767 |
-
<div class="plan-section">
|
| 768 |
-
<h3>🍽️ Plano Nutricional</h3>
|
| 769 |
-
<div id="nutritionPlan"></div>
|
| 770 |
-
</div>
|
| 771 |
-
|
| 772 |
-
<div class="plan-section">
|
| 773 |
-
<h3>💪 Plano de Treino</h3>
|
| 774 |
-
<div id="workoutPlan"></div>
|
| 775 |
-
</div>
|
| 776 |
-
|
| 777 |
-
<div class="plan-section">
|
| 778 |
-
<h3>📅 Linha do Tempo</h3>
|
| 779 |
-
<div id="timelinePlan"></div>
|
| 780 |
-
</div>
|
| 781 |
-
|
| 782 |
-
<div class="plan-section">
|
| 783 |
-
<h3>💡 Dicas Personalizadas</h3>
|
| 784 |
-
<div id="tipsPlan"></div>
|
| 785 |
-
</div>
|
| 786 |
-
|
| 787 |
-
<button class="btn-edit-profile" id="editProfile">✏️ Editar Perfil</button>
|
| 788 |
-
</div>
|
| 789 |
-
</div>
|
| 790 |
-
</div>
|
| 791 |
-
|
| 792 |
-
<!-- ⚡ Performance Utilities (loaded first for optimization) -->
|
| 793 |
-
<script type="module" src="utils-performance.min.js"></script>
|
| 794 |
-
|
| 795 |
-
<!-- Exercise Database - Load before main app -->
|
| 796 |
-
<script src="exercises-database.min.js"></script>
|
| 797 |
-
|
| 798 |
-
<!-- Main App Script -->
|
| 799 |
-
<script src="app.min.js" defer></script>
|
| 800 |
-
</body>
|
| 801 |
-
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html><html lang=pt-BR><head><meta charset=UTF-8><meta name=viewport content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes, viewport-fit=cover, interactive-widget=resizes-visual"><meta name=mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-title content="Fitness App"><meta name=application-name content="Fitness App"><meta name=format-detection content="telephone=no"><meta name=color-scheme content="light dark"><meta name=supported-color-schemes content="light dark"><title>✨ Sua Jornada de Transformação | Fitness App Premium</title><link rel=dns-prefetch href="https://fonts.googleapis.com"><link rel=dns-prefetch href="https://fonts.gstatic.com"><link rel=dns-prefetch href="https://huggingface.co"><link rel=preconnect href="https://fonts.googleapis.com"><link rel=preconnect href="https://fonts.gstatic.com" crossorigin><link rel=preconnect href="https://huggingface.co"><link rel=preconnect href="https://cdn-lfs.huggingface.co" crossorigin><link rel=preconnect href="https://fonts.googleapis.com" crossorigin><link rel=preconnect href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700;800&family=Playfair+Display:wght@400;600;700&display=swap" rel=stylesheet><style> /* Critical CSS - Above the fold */ *{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent} :root{--primary:#FF6B9D;--bg-light:#FFF5F8;--text-primary:#2D3748} body{font-family:'Poppins',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:var(--bg-light);color:var(--text-primary);overflow-x:hidden;-webkit-font-smoothing:antialiased} .app-container{min-height:100vh} </style><link rel=stylesheet href="styles.css"><link rel=preload href="app.js" as=script><link rel=dns-prefetch href="https://huggingface.co"><link rel=preconnect href="https://huggingface.co" crossorigin><link rel=manifest href="manifest.json"><meta name=description content="Seu aplicativo de transformação pessoal completo - exercícios, nutrição e bem-estar. Treinos personalizados, yoga, meditação, acompanhamento nutricional e muito mais!"><meta name=keywords content="fitness, treino, nutrição, bem-estar, yoga, meditação, saúde, emagrecimento, musculação, cardio, alongamento, wellness"><meta name=author content="Fitness App"><meta name=creator content="Fitness App"><meta name=publisher content="Fitness App"><meta name=robots content="index, follow"><meta name=googlebot content="index, follow"><meta name=theme-color content="#FF6B9D" media="(prefers-color-scheme: light)"><meta name=theme-color content="#1a1a1a" media="(prefers-color-scheme: dark)"><meta name=msapplication-navbutton-color content="#FF6B9D"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black-translucent><meta property="og:type" content=website><meta property="og:title" content="Fitness App - Sua Jornada de Transformação"><meta property="og:description" content="Aplicativo completo de fitness, nutrição e bem-estar. Treinos personalizados, yoga, meditação e acompanhamento nutricional."><meta property="og:image" content="/icons/og-image-1200x630.png"><meta property="og:image:width" content=1200><meta property="og:image:height" content=630><meta property="og:url" content="https://seu-dominio.com"><meta property="og:site_name" content="Fitness App"><meta property="og:locale" content=pt_BR><meta name="twitter:card" content=summary_large_image><meta name="twitter:title" content="Fitness App - Sua Jornada de Transformação"><meta name="twitter:description" content="Aplicativo completo de fitness, nutrição e bem-estar"><meta name="twitter:image" content="/icons/twitter-card-1200x600.png"><meta name="twitter:creator" content="@fitnessapp"><link rel=canonical href="https://seu-dominio.com"><meta name=referrer content=origin-when-cross-origin><link rel=apple-touch-icon sizes=192x192 href="icons/icon-192x192.svg"><link rel=apple-touch-icon sizes=512x512 href="icons/icon-512x512.svg"><meta name=msapplication-TileColor content="#FF6B9D"><meta name=msapplication-config content=none><link rel=icon type="image/svg+xml" href="icons/icon.svg"><link rel=preload href="app.js" as=script><link rel=modulepreload href="app.js"></head><body><div class=welcome-screen id=welcomeScreen><div class=welcome-content><div class=welcome-logo><div class=logo-heart>💖</div><h1>Bem-vinda!</h1><p>Sua jornada de transformação começa aqui</p></div><button class=btn-start-journey id=startJourney>Começar Agora ✨</button></div></div><div class=app-container id=appContainer style="display: none;"><header class=top-bar><div class=user-info style="cursor: pointer;" id=userProfileClick><div class=avatar id=userAvatar>💝</div><div class=user-text><span class=greeting id=greeting>Olá, Guerreira!</span><span class=streak>🔥 <span id=streakDays>0</span> dias seguidos</span></div></div><div class=top-actions><button class=icon-btn id=notifBtn title="Notificações"><span>🔔</span><span class=notification-badge id=notificationBadge style="display: none;">0</span></button></div></header><main class=main-view><section class="view active" id=homeView><div class=hero-section><h2 class=page-title>Sua Transformação</h2><div class=daily-progress><div class=progress-circle id=progressCircle><svg viewBox="0 0 120 120"><circle cx=60 cy=60 r=54 class=progress-bg></circle><circle cx=60 cy=60 r=54 class=progress-fill id=progressFill style="--progress: 0"></circle></svg><div class=progress-text><span class=progress-value id=progressValue>0</span>% <span class=progress-label>Hoje</span></div></div><div class=today-stats><div class=stat><span class=stat-icon>🔥</span><div><span class=stat-value id=caloriesBurned>0</span><span class=stat-label>kcal</span></div></div><div class=stat><span class=stat-icon>⏱️</span><div><span class=stat-value id=minutesActive>0</span><span class=stat-label>min</span></div></div><div class=stat><span class=stat-icon>💪</span><div><span class=stat-value id=workoutsCompleted>0</span><span class=stat-label>treinos</span></div></div></div></div></div><div class=plan-summary id=planSummary style="display: none;"><div class=plan-card><div class=plan-header><h3>🎯 Seu Plano Personalizado</h3><button class=btn-view-plan id=viewFullPlan>Ver Detalhes</button></div><div class=plan-quick-stats><div class=plan-stat><span class=plan-label>Meta</span><span class=plan-value id=planGoal>-</span></div><div class=plan-stat><span class=plan-label>Calorias/dia</span><span class=plan-value id=planCalories>-</span></div><div class=plan-stat><span class=plan-label>Treino</span><span class=plan-value id=planWorkout>-</span></div></div><div class=coach-message id=coachMessage> 💪 Continue assim! Você está no caminho certo! </div></div></div><div class=quick-actions><h3 class=section-title>Comece Agora</h3><div class=action-cards><div class=action-card data-navigate="calendar"><div class=action-icon>📅</div><h4>Plano 30 Dias</h4><p>Seu programa personalizado</p></div><div class=action-card data-navigate="workouts"><div class=action-icon>💪</div><h4>Treinar</h4><p>Escolha sua área</p></div><div class=action-card data-navigate="nutrition"><div class=action-icon>🥗</div><h4>Nutrição</h4><p>Acompanhe sua dieta</p></div><div class=action-card data-navigate="wellness"><div class=action-icon>🧘♀️</div><h4>Bem-Estar</h4><p>Massagens & Postura</p></div><div class=action-card data-navigate="progress"><div class=action-icon>📈</div><h4>Progresso</h4><p>Veja sua evolução</p></div></div></div><div class=motivation-card><div class=motivation-icon>✨</div><p class=motivation-text id=dailyMotivation>Você é capaz de coisas incríveis! Continue brilhando! 💫</p></div></section><section class=view id=workoutsView><div class=view-header><button class=btn-back data-back="home">← Voltar</button><h2 class=view-title>Escolha a Área</h2></div><div class=category-grid><div class=category-card data-category="personalized" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;"><div class=category-image>🎯</div><h3>Personalizado</h3><p>Vídeos exclusivos locais</p><span class=category-badge style="background: rgba(255,255,255,0.3);">20 exercícios</span></div><div class=category-card data-category="abs"><div class=category-image>🔥</div><h3>Abdômen</h3><p>Barriga definida</p><span class=category-badge>12 exercícios</span></div><div class=category-card data-category="legs"><div class=category-image>🦵</div><h3>Pernas</h3><p>Pernas torneadas</p><span class=category-badge>12 exercícios</span></div><div class=category-card data-category="glutes"><div class=category-image>🍑</div><h3>Glúteos</h3><p>Bumbum empinado</p><span class=category-badge>12 exercícios</span></div><div class=category-card data-category="arms"><div class=category-image>💪</div><h3>Braços</h3><p>Braços definidos</p><span class=category-badge>12 exercícios</span></div><div class=category-card data-category="face"><div class=category-image>😊</div><h3>Massagem Facial</h3><p>Rosto afinado</p><span class=category-badge>3 exercícios</span></div><div class=category-card data-category="waist"><div class=category-image>⏳</div><h3>Cintura</h3><p>Cintura fina</p><span class=category-badge>8 exercícios</span></div><div class=category-card data-category="back"><div class=category-image>🧘♀️</div><h3>Postura e Mobilidade</h3><p>Costas fortes</p><span class=category-badge>10 exercícios</span></div><div class=category-card data-category="cardio"><div class=category-image>❤️</div><h3>Cardio</h3><p>Queime calorias</p><span class=category-badge>15 exercícios</span></div><div class=category-card data-category="fullbody"><div class=category-image>✨</div><h3>Corpo Todo</h3><p>Treino completo</p><span class=category-badge>11 exercícios</span></div><div class=category-card data-category="yoga"><div class=category-image>🧘♀️</div><h3>Yoga</h3><p>Flexibilidade e paz</p><span class=category-badge>13 posições</span></div><div class=category-card data-category="massage"><div class=category-image>💆♀️</div><h3>Massagem</h3><p>Relaxamento total</p><span class=category-badge>3 técnicas</span></div></div></section><section class=view id=exercisesListView><div class=view-header><button class=btn-back data-back="workouts">← Voltar</button><h2 class=view-title id=categoryTitle>Exercícios</h2></div><div class=exercises-container id=exercisesList></div></section><section class=view id=workoutSessionView><div class=workout-header><button class=btn-close-workout id=closeWorkout>✕</button><div class=workout-timer id=workoutTimer>00:00</div></div><div class=workout-content><div class=exercise-display><div class=exercise-name id=currentExerciseName>Preparando...</div><div class=exercise-count id=exerciseCount>Exercício 1 de 5</div><div class=exercise-demo id=exerciseDemo><div class=demo-placeholder><video class=demo-video id=demoVideo loop muted playsinline webkit-playsinline style="display: none;"><source src="" type="video/mp4"></video><button class=video-play-button id=videoPlayButton style="display: none;"> ▶️ Tocar Vídeo </button><span class=demo-icon id=demoIcon>💪</span></div></div><div class=exercise-instructions><div class=reps-info id=repsInfo>3 séries × 15 repetições</div><div class=rest-info id=restInfo>Descanso: 30s entre séries</div></div><div class=series-tracker id=seriesTracker><div class="series-dot completed"></div><div class=series-dot></div><div class=series-dot></div></div></div><div class=workout-controls><button class="btn-workout-action secondary" id=skipExercise>Pular</button><button class="btn-workout-action primary" id=completeExercise>Concluir Série</button></div></div><div class=workout-progress-bar><div class=progress-bar-fill id=workoutProgressBar style="width: 0%"></div></div></section><section class=view id=wellnessView><div class=view-header><button class=btn-back data-back="home">← Voltar</button><h2 class=view-title>Bem-Estar</h2></div><div class=wellness-grid><div class=wellness-card data-wellness="face-massage"><div class=wellness-icon>💆♀️</div><h3>Massagem Facial</h3><p>Rejuvenesça e relaxe</p><span class=duration>10 min</span></div><div class=wellness-card data-wellness="body-massage"><div class=wellness-icon>💫</div><h3>Massagem Corporal</h3><p>Alivie tensões</p><span class=duration>15 min</span></div><div class=wellness-card data-wellness="posture"><div class=wellness-icon>🧍♀️</div><h3>Correção Postural</h3><p>Melhore sua postura</p><span class=duration>12 min</span></div><div class=wellness-card data-wellness="stretching"><div class=wellness-icon>🤸♀️</div><h3>Alongamento</h3><p>Flexibilidade total</p><span class=duration>8 min</span></div><div class=wellness-card data-wellness="breathing"><div class=wellness-icon>🌬️</div><h3>Respiração</h3><p>Acalme sua mente</p><span class=duration>5 min</span></div><div class=wellness-card data-wellness="meditation"><div class=wellness-icon>🧘♀️</div><h3>Meditação</h3><p>Paz interior</p><span class=duration>10 min</span></div></div></section><section class=view id=nutritionView><div class=view-header><button class=btn-back data-back="home">← Voltar</button><h2 class=view-title>Nutrição</h2></div><div class=nutrition-summary><h3>Resumo de Hoje</h3><div class=macros-display><div class=macro-item><div class="macro-circle carbs"><span id=carbsValue>0g</span></div><span class=macro-label>Carboidratos</span></div><div class=macro-item><div class="macro-circle protein"><span id=proteinValue>0g</span></div><span class=macro-label>Proteínas</span></div><div class=macro-item><div class="macro-circle fat"><span id=fatValue>0g</span></div><span class=macro-label>Gorduras</span></div></div><div class=calories-total><span class=calories-value id=totalCalories>0</span><span class=calories-label>kcal hoje</span></div></div><div class=water-tracker><h3>Hidratação 💧</h3><div class=water-glasses><div class=glass data-glass="1">💧</div><div class=glass data-glass="2">💧</div><div class=glass data-glass="3">💧</div><div class=glass data-glass="4">💧</div><div class=glass data-glass="5">💧</div><div class=glass data-glass="6">💧</div><div class=glass data-glass="7">💧</div><div class=glass data-glass="8">💧</div></div><p class=water-goal><span id=waterCount>0</span>/8 copos (2L)</p></div></section><section class=view id=calendarView><div class=view-header><button class=btn-back data-back="home">← Voltar</button><h2 class=view-title>Plano 30 Dias 📅</h2></div><div class=calendar-intro><div class=intro-card><h3>🎯 Sua Jornada de Transformação</h3><p>Um plano personalizado de 30 dias focado em seus objetivos. Cada dia com treinos específicos para sua meta!</p></div></div><div class=calendar-grid id=calendar30Days></div></section><section class=view id=progressView><div class=view-header><button class=btn-back data-back="home">← Voltar</button><h2 class=view-title>Seu Progresso</h2></div><div class=weight-tracking-section><h3>Controle de Peso ⚖️</h3><div class=weight-card><div class=weight-current><div class=weight-label>Peso Atual</div><div class=weight-value id=currentWeight>--</div><button class=btn-update-weight id=updateWeightBtn>Atualizar Peso</button></div><div class=weight-stats><div class=weight-stat><div class=weight-stat-label>Peso Inicial</div><div class=weight-stat-value id=initialWeight>--</div></div><div class="weight-stat success"><div class=weight-stat-label>Perdeu</div><div class=weight-stat-value id=weightLost>0 kg</div></div><div class=weight-stat><div class=weight-stat-label>Meta</div><div class=weight-stat-value id=goalWeight>--</div></div></div><div class=weight-progress-bar><div class=weight-progress-fill id=weightProgressFill style="width: 0%"></div></div><div class=weight-chart-mini id=weightChartMini></div></div></div><div class=weekly-activity-section><h3>Atividade Semanal 📅</h3><div class=weekly-activity-grid id=weeklyActivityGrid></div></div><div class=detailed-stats-section><h3>Estatísticas Detalhadas 📊</h3><div class=stats-grid><div class=stat-detail-card><div class=stat-detail-icon>🔥</div><div class=stat-detail-content><div class=stat-detail-number id=totalWorkouts>0</div><div class=stat-detail-label>Treinos Completos</div><div class=stat-detail-sublabel><span id=thisWeekWorkouts>0</span> esta semana </div></div></div><div class=stat-detail-card><div class=stat-detail-icon>⏱️</div><div class=stat-detail-content><div class=stat-detail-number id=totalMinutes>0</div><div class=stat-detail-label>Minutos Ativos</div><div class=stat-detail-sublabel><span id=avgMinutes>0</span> min/treino </div></div></div><div class=stat-detail-card><div class=stat-detail-icon>🔥</div><div class=stat-detail-content><div class=stat-detail-number id=totalCaloriesDetail>0</div><div class=stat-detail-label>Calorias Queimadas</div><div class=stat-detail-sublabel><span id=avgCalories>0</span> kcal/treino </div></div></div><div class=stat-detail-card><div class=stat-detail-icon>📅</div><div class=stat-detail-content><div class=stat-detail-number id=daysActiveDetail>0</div><div class=stat-detail-label>Dias Ativos</div><div class=stat-detail-sublabel> Sequência: <span id=currentStreak>0</span> dias </div></div></div><div class=stat-detail-card><div class=stat-detail-icon>💧</div><div class=stat-detail-content><div class=stat-detail-number id=totalWaterGlasses>0</div><div class=stat-detail-label>Copos de Água</div><div class=stat-detail-sublabel><span id=waterStreak>0</span> dias 8 copos </div></div></div><div class=stat-detail-card><div class=stat-detail-icon>🏆</div><div class=stat-detail-content><div class=stat-detail-number id=achievementsUnlocked>0</div><div class=stat-detail-label>Conquistas</div><div class=stat-detail-sublabel> de <span id=totalAchievements>12</span> possíveis </div></div></div></div></div><div class=activity-chart-section><h3>Atividade Semanal 📈</h3><div class=weekly-chart><div class=chart-bars id=weeklyChart></div></div></div><div class=achievements-section><h3>Conquistas 🏆</h3><div class=achievements-grid id=achievementsGrid></div></div><div class=records-section><h3>Recordes Pessoais 🌟</h3><div class=records-list><div class=record-item><div class=record-icon>🔥</div><div class=record-content><div class=record-label>Maior Sequência</div><div class=record-value id=longestStreak>0 dias</div></div></div><div class=record-item><div class=record-icon>⏱️</div><div class=record-content><div class=record-label>Treino Mais Longo</div><div class=record-value id=longestWorkout>0 min</div></div></div><div class=record-item><div class=record-icon>💪</div><div class=record-content><div class=record-label>Categoria Favorita</div><div class=record-value id=favoriteCategory>--</div></div></div><div class=record-item><div class=record-icon>📅</div><div class=record-content><div class=record-label>Membro Desde</div><div class=record-value id=memberSince>--</div></div></div></div></div></section></main><nav class=bottom-nav><button class="nav-item active" data-nav="home"><span class=nav-icon>🏠</span><span class=nav-label>Início</span></button><button class=nav-item data-nav="workouts"><span class=nav-icon>💪</span><span class=nav-label>Treinar</span></button><button class=nav-item data-nav="nutrition"><span class=nav-icon>🥗</span><span class=nav-label>Nutrição</span></button><button class=nav-item data-nav="progress"><span class=nav-icon>📊</span><span class=nav-label>Progresso</span></button></nav></div><div class=modal id=completionModal><div class="modal-content celebration"><div class=celebration-confetti>🎉</div><h2 class=modal-title>Parabéns! 🎊</h2><p class=modal-message id=completionMessage>Você completou o treino!</p><div class=workout-summary id=workoutSummary><div class=summary-stat><span class=summary-icon>⏱️</span><span class=summary-value id=summaryTime>15 min</span></div><div class=summary-stat><span class=summary-icon>🔥</span><span class=summary-value id=summaryCalories>120 kcal</span></div><div class=summary-stat><span class=summary-icon>💪</span><span class=summary-value id=summaryExercises>8 exercícios</span></div></div><div class=workout-details id=workoutDetails style="margin-top: var(--spacing-md); padding: var(--spacing-md); background: var(--bg-light); border-radius: var(--radius-md); text-align: left; font-size: 0.9rem; color: var(--text-secondary);"></div><button class=btn-modal-primary id=closeCompletionModal>Continuar ✨</button></div></div><div class=modal id=weightModal><div class=modal-content><h2 class=modal-title>Atualizar Peso ⚖️</h2><div class=weight-input-group><label for=weightInput>Seu peso atual (kg)</label><input type=number id=weightInput step="0.1" min=30 max=200 placeholder="Ex: 65.5"></div><div class=weight-input-group><label for=goalWeightInput>Seu peso meta (kg)</label><input type=number id=goalWeightInput step="0.1" min=30 max=200 placeholder="Ex: 60.0"></div><div class=modal-actions><button class=btn-modal-secondary id=cancelWeightBtn>Cancelar</button><button class=btn-modal-primary id=saveWeightBtn>Salvar 💖</button></div></div></div><div class=settings-fab id=settingsFab><button class=fab-settings id=toggleSound><span class=fab-icon id=soundIcon>🔊</span></button></div><div class=modal id=planModal><div class="modal-content plan-modal-content"><button class=modal-close id=closePlanModal>×</button><div id=planModalContent><h2 class=modal-title>🎯 Seu Plano Completo</h2><div class=profile-info id=profileInfo></div><div class=plan-section><h3>🍽️ Plano Nutricional</h3><div id=nutritionPlan></div></div><div class=plan-section><h3>💪 Plano de Treino</h3><div id=workoutPlan></div></div><div class=plan-section><h3>📅 Linha do Tempo</h3><div id=timelinePlan></div></div><div class=plan-section><h3>💡 Dicas Personalizadas</h3><div id=tipsPlan></div></div><button class=btn-edit-profile id=editProfile>✏️ Editar Perfil</button></div></div></div><script type=module src="utils-performance.js"></script><script src="app.js" defer></script></body></html>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dist/styles.min.css
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/styles.min.css.gz
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:42eceddc161ab8227ee766a2b08c92aca09a18990f401655881ec90d3e9d8357
|
| 3 |
+
size 9585
|
dist/sw.min.js
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
const VERSION='3.15.0';const APP_VERSION_KEY='app_version';const FORCE_UPDATE=true;const CACHE_NAME=`fitness-app-${VERSION}`;const STATIC_CACHE=`static-${VERSION}`;const DYNAMIC_CACHE=`dynamic-${VERSION}`;const VIDEO_CACHE=`video-${VERSION}`;const AUDIO_CACHE=`audio-${VERSION}`;const HF_VIDEO_CACHE=`hf-video-${VERSION}`;const HF_AUDIO_CACHE=`hf-audio-${VERSION}`;const IMAGE_CACHE=`image-${VERSION}`;const FONT_CACHE=`font-${VERSION}`;const MAX_VIDEO_CACHE=25;const MAX_AUDIO_CACHE=15;const MAX_HF_VIDEO_CACHE=10;const MAX_HF_AUDIO_CACHE=8;const MAX_IMAGE_CACHE=50;const MAX_DYNAMIC_CACHE=100;const CACHE_TIMEOUT=5000;const CACHE_REVALIDATION_TIME=86400000;const STATIC_ASSETS=['/','/index.html','/app.js','/styles.css','/manifest.json','/icons/icon-72x72.svg','/icons/icon-96x96.svg','/icons/icon-128x128.svg','/icons/icon-192x192.svg','/icons/icon-512x512.svg'];self.addEventListener('install',(event)=>{self.skipWaiting();event.waitUntil(Promise.all([caches.open(STATIC_CACHE).then(cache=>{
|
|
|
|
| 1 |
+
//🌟 PREMIUM PWA SERVICE WORKER v3.15.0 const VERSION='3.15.0';const APP_VERSION_KEY='app_version';const FORCE_UPDATE=true;const CACHE_NAME=`fitness-app-${VERSION}`;const STATIC_CACHE=`static-${VERSION}`;const DYNAMIC_CACHE=`dynamic-${VERSION}`;const VIDEO_CACHE=`video-${VERSION}`;const AUDIO_CACHE=`audio-${VERSION}`;const HF_VIDEO_CACHE=`hf-video-${VERSION}`;const HF_AUDIO_CACHE=`hf-audio-${VERSION}`;const IMAGE_CACHE=`image-${VERSION}`;const FONT_CACHE=`font-${VERSION}`;const MAX_VIDEO_CACHE=25;const MAX_AUDIO_CACHE=15;const MAX_HF_VIDEO_CACHE=10;const MAX_HF_AUDIO_CACHE=8;const MAX_IMAGE_CACHE=50;const MAX_DYNAMIC_CACHE=100;const CACHE_TIMEOUT=5000;const CACHE_REVALIDATION_TIME=86400000;const STATIC_ASSETS=['/','/index.html','/app.js','/styles.css','/manifest.json','/icons/icon-72x72.svg','/icons/icon-96x96.svg','/icons/icon-128x128.svg','/icons/icon-192x192.svg','/icons/icon-512x512.svg'];self.addEventListener('install',(event)=>{self.skipWaiting();event.waitUntil(Promise.all([caches.open(STATIC_CACHE).then(cache=>{return Promise.all(STATIC_ASSETS.map(url=>cache.delete(url))).then(()=>{return cache.addAll(STATIC_ASSETS.map(url=>new Request(url,{cache:'reload'})))})}),caches.open(STATIC_CACHE).then(cache=>{return cache.put('/version',new Response(VERSION))}),caches.open(DYNAMIC_CACHE),caches.open(VIDEO_CACHE),caches.open(AUDIO_CACHE),caches.open(IMAGE_CACHE),caches.open(FONT_CACHE)]).then(()=>{return self.clients.claim()}).catch(err=>{console.error('❌[SW]Installation failed:',err)}))});self.addEventListener('activate',(event)=>{event.waitUntil(clients.claim().then(()=>{return clients.matchAll({type:'window'}).then(clientList=>{clientList.forEach(client=>{client.postMessage({type:'SW_UPDATED',version:VERSION,autoRefresh:false,updateAvailable:true})})})}));const currentCaches=[STATIC_CACHE,DYNAMIC_CACHE,VIDEO_CACHE,AUDIO_CACHE,HF_VIDEO_CACHE,HF_AUDIO_CACHE,IMAGE_CACHE,FONT_CACHE];event.waitUntil(caches.keys().then(keys=>{const deletePromises=keys .filter(key=>!currentCaches.includes(key)).map(key=>{return caches.delete(key)});return Promise.all(deletePromises)}).then(()=>{return self.clients.claim()}).then(()=>{return self.clients.matchAll().then(clients=>{clients.forEach(client=>{client.postMessage({type:'SW_UPDATED',version:VERSION})})})}))});self.addEventListener('fetch',(event)=>{const{request}=event;const url=new URL(request.url);if(url.hostname==='huggingface.co'||url.hostname==='cdn-lfs.huggingface.co'){event.respondWith(caches.open(HF_VIDEO_CACHE).then(cache=>{return cache.match(request).then(cachedResponse=>{if(cachedResponse){return cachedResponse}return fetch(request,{mode:'cors',credentials:'omit'}).then(networkResponse=>{if(networkResponse&&networkResponse.status===200){cache.put(request,networkResponse.clone());cache.keys().then(keys=>{if(keys.length>MAX_HF_VIDEO_CACHE){cache.delete(keys[0])}})}return networkResponse})})}).catch(()=>{return caches.match(request)}));return}if(url.origin!==location.origin){return}if(request.url.includes('/videos/')){event.respondWith(caches.open(VIDEO_CACHE).then(cache=>{return cache.match(request).then(cachedResponse=>{if(cachedResponse){return cachedResponse}return fetch(request).then(networkResponse=>{if(networkResponse.status===200){cache.put(request,networkResponse.clone());cache.keys().then(keys=>{if(keys.length>MAX_VIDEO_CACHE){cache.delete(keys[0])}})}return networkResponse})})}).catch(()=>{return caches.match(request)}));return}if(request.url.includes('/songs/')){event.respondWith(caches.open(AUDIO_CACHE).then(cache=>{return cache.match(request).then(cachedResponse=>{if(cachedResponse){return cachedResponse}return fetch(request).then(networkResponse=>{if(networkResponse.status===200){cache.put(request,networkResponse.clone());cache.keys().then(keys=>{if(keys.length>MAX_AUDIO_CACHE){cache.delete(keys[0])}})}return networkResponse})})}).catch(()=>{return caches.match(request)}));return}if((url.hostname==='huggingface.co'||url.hostname==='cdn-lfs.huggingface.co')&&(request.url.includes('.mp3')||request.url.includes('.ogg'))){event.respondWith(caches.open(HF_AUDIO_CACHE).then(cache=>{return cache.match(request).then(cachedResponse=>{if(cachedResponse){return cachedResponse}return fetch(request,{mode:'cors',credentials:'omit'}).then(networkResponse=>{if(networkResponse&&networkResponse.status===200){cache.put(request,networkResponse.clone());cache.keys().then(keys=>{if(keys.length>MAX_HF_AUDIO_CACHE){cache.delete(keys[0])}})}return networkResponse})})}).catch(()=>{return caches.match(request)}));return}if(request.url.includes('/songs/')){event.respondWith(caches.match(request).then(response=>response||fetch(request).then(fetchResponse=>{return caches.open(DYNAMIC_CACHE).then(cache=>{cache.put(request,fetchResponse.clone());return fetchResponse})})));return}event.respondWith(caches.match(request).then(response=>{if(response)return response;return fetch(request).then(fetchResponse=>{if(fetchResponse.status===200){const responseClone=fetchResponse.clone();caches.open(DYNAMIC_CACHE).then(cache=>{cache.put(request,responseClone)})}return fetchResponse})}).catch(()=>{if(request.destination==='document'){return caches.match('/index.html')}}));if(event.request.url.endsWith('.mp4')){event.respondWith(caches.match(event.request).then((response)=>{return response||fetch(event.request).then((fetchResponse)=>{return caches.open(VIDEO_CACHE).then((cache)=>{cache.put(event.request,fetchResponse.clone());return fetchResponse})})}))}});self.addEventListener('notificationclick',(event)=>{event.notification.close();event.waitUntil(clients.matchAll({type:'window',includeUncontrolled:true}).then((clientList)=>{for(const client of clientList){if(client.url.includes(self.registration.scope)&&'focus' in client){return client.focus()}}if(clients.openWindow){return clients.openWindow('/')}}))});self.addEventListener('push',(event)=>{if(!event.data)return;try{const data=event.data.json();const options={body:data.body||'Nova notificação do seu app fitness!',icon:'/icons/icon-192x192.svg',badge:'/icons/icon-72x72.png',vibrate:[200,100,200],data:data.data||{},actions:[{action:'open',title:'Abrir App',icon:'/icons/icon-96x96.svg'},{action:'close',title:'Fechar',icon:'/icons/icon-96x96.svg'}]};event.waitUntil(self.registration.showNotification(data.title||'Fitness App',options))}catch(error){console.error('Erro ao processar push notification:',error)}});self.addEventListener('sync',(event)=>{if(event.tag==='sync-data'){event.waitUntil(syncData())}});async function syncData(){}self.addEventListener('periodicsync',(event)=>{if(event.tag==='daily-motivation'){event.waitUntil(sendDailyMotivation())}});async function sendDailyMotivation(){const motivationalMessages=['💪 Hora de treinar!Seu corpo agradece!','✨ Você está mais perto do seu objetivo!','🔥 Continue assim!Cada dia conta!'];const randomMessage=motivationalMessages[Math.floor(Math.random()*motivationalMessages.length)];await self.registration.showNotification('Lembrete Diário',{body:randomMessage,icon:'/icons/icon-192x192.svg',badge:'/icons/icon-72x72.png',vibrate:[200,100,200]})}
|
exercises-report.json
DELETED
|
@@ -1,113 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"generatedAt": "2025-11-04T21:59:14.242Z",
|
| 3 |
-
"source": {
|
| 4 |
-
"file": "leap-fitness-videos-1761951265358.json",
|
| 5 |
-
"totalVideos": 918,
|
| 6 |
-
"shortVideos": 783
|
| 7 |
-
},
|
| 8 |
-
"processing": {
|
| 9 |
-
"filtered": 783,
|
| 10 |
-
"categorized": 783,
|
| 11 |
-
"categories": 12
|
| 12 |
-
},
|
| 13 |
-
"breakdown": {
|
| 14 |
-
"legs": {
|
| 15 |
-
"count": 194,
|
| 16 |
-
"examples": [
|
| 17 |
-
"Como Fazer: WALL SUMO AGACHAMENTOS AND CALF RAISE",
|
| 18 |
-
"Como Fazer: CRESCENT LOW AFUNDO WITH CACTUS ARMS",
|
| 19 |
-
"Como Fazer: REVOLVED CRESCENT LOW AFUNDO"
|
| 20 |
-
]
|
| 21 |
-
},
|
| 22 |
-
"mobility": {
|
| 23 |
-
"count": 1,
|
| 24 |
-
"examples": [
|
| 25 |
-
"Como Fazer: WALL STANDING THORACIC LEFT"
|
| 26 |
-
]
|
| 27 |
-
},
|
| 28 |
-
"arms": {
|
| 29 |
-
"count": 133,
|
| 30 |
-
"examples": [
|
| 31 |
-
"Como fazer: Rosca reversa com halteres",
|
| 32 |
-
"Como Fazer: STANDING FORWARD BEND WITH SHOULDER OPENER",
|
| 33 |
-
"Como Fazer: FLEXÃO HOLD"
|
| 34 |
-
]
|
| 35 |
-
},
|
| 36 |
-
"fullbody": {
|
| 37 |
-
"count": 103,
|
| 38 |
-
"examples": [
|
| 39 |
-
"Como Fazer: REVOLVED SIDE ANGLE",
|
| 40 |
-
"Como Fazer: EXTENDED SIDE ANGLE",
|
| 41 |
-
"Como Fazer: HALF FORWARD BEND"
|
| 42 |
-
]
|
| 43 |
-
},
|
| 44 |
-
"face": {
|
| 45 |
-
"count": 14,
|
| 46 |
-
"examples": [
|
| 47 |
-
"Como Fazer: COW FACE",
|
| 48 |
-
"How to Do:CHEEK FIRMER",
|
| 49 |
-
"How to Do:SIDE NECK STRETCH"
|
| 50 |
-
]
|
| 51 |
-
},
|
| 52 |
-
"yoga": {
|
| 53 |
-
"count": 57,
|
| 54 |
-
"examples": [
|
| 55 |
-
"Como Fazer: HALF MOON POSE",
|
| 56 |
-
"Como Fazer: WARRIOR III",
|
| 57 |
-
"Como Fazer: REVERSE WARRIOR"
|
| 58 |
-
]
|
| 59 |
-
},
|
| 60 |
-
"abs": {
|
| 61 |
-
"count": 143,
|
| 62 |
-
"examples": [
|
| 63 |
-
"Como Fazer: STANDING EAGLE ABDOMINAL",
|
| 64 |
-
"Como Fazer: PONTE ONE ELEVAÇÃO DE PERNA",
|
| 65 |
-
"Como Fazer: REVERSE PRANCHA"
|
| 66 |
-
]
|
| 67 |
-
},
|
| 68 |
-
"waist": {
|
| 69 |
-
"count": 16,
|
| 70 |
-
"examples": [
|
| 71 |
-
"Como Fazer: HALF BOAT TWIST",
|
| 72 |
-
"How to Do:TWISTING PISTON",
|
| 73 |
-
"How to Do:SEATED SIDE BEND"
|
| 74 |
-
]
|
| 75 |
-
},
|
| 76 |
-
"back": {
|
| 77 |
-
"count": 22,
|
| 78 |
-
"examples": [
|
| 79 |
-
"Como Fazer: THORACIC SPINE CAT COW",
|
| 80 |
-
"Como Fazer: FORWARD SPINE STRETCH PULSE",
|
| 81 |
-
"Como Fazer: SPINE LUMBAR TWIST STRETCH"
|
| 82 |
-
]
|
| 83 |
-
},
|
| 84 |
-
"glutes": {
|
| 85 |
-
"count": 64,
|
| 86 |
-
"examples": [
|
| 87 |
-
"Como Fazer: EASY BUTTERFLY POSE",
|
| 88 |
-
"Como Fazer: BUTTERFLY POSE",
|
| 89 |
-
"How to Do:SEATED BUTTERFLY STRETCH"
|
| 90 |
-
]
|
| 91 |
-
},
|
| 92 |
-
"cardio": {
|
| 93 |
-
"count": 25,
|
| 94 |
-
"examples": [
|
| 95 |
-
"How to Do:STAR JUMPS",
|
| 96 |
-
"How to Do:X-BURPEES",
|
| 97 |
-
"How to Do:RUN ON THE WALL"
|
| 98 |
-
]
|
| 99 |
-
},
|
| 100 |
-
"chest": {
|
| 101 |
-
"count": 11,
|
| 102 |
-
"examples": [
|
| 103 |
-
"How to Do:STANDING DUMBBELL CHEST FLY",
|
| 104 |
-
"How to Do:DUMBBELL CHEST FLY",
|
| 105 |
-
"How to Do:STANDING CROSSOVER TOE TOUCHES"
|
| 106 |
-
]
|
| 107 |
-
}
|
| 108 |
-
},
|
| 109 |
-
"output": {
|
| 110 |
-
"file": "public/exercises-database.js",
|
| 111 |
-
"size": "366.46 KB"
|
| 112 |
-
}
|
| 113 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
generate-icons.html
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html>
|
| 3 |
+
<head>
|
| 4 |
+
<title>Icon Generator</title>
|
| 5 |
+
</head>
|
| 6 |
+
<body>
|
| 7 |
+
<canvas id="canvas" width="512" height="512" style="display: none;"></canvas>
|
| 8 |
+
<script>
|
| 9 |
+
// Generate PWA icons
|
| 10 |
+
function generateIcon(size) {
|
| 11 |
+
const canvas = document.getElementById('canvas');
|
| 12 |
+
const ctx = canvas.getContext('2d');
|
| 13 |
+
|
| 14 |
+
canvas.width = size;
|
| 15 |
+
canvas.height = size;
|
| 16 |
+
|
| 17 |
+
// Clear canvas
|
| 18 |
+
ctx.clearRect(0, 0, size, size);
|
| 19 |
+
|
| 20 |
+
// Create gradient background
|
| 21 |
+
const gradient = ctx.createLinearGradient(0, 0, size, size);
|
| 22 |
+
gradient.addColorStop(0, '#1a0d2e');
|
| 23 |
+
gradient.addColorStop(0.5, '#6b46c1');
|
| 24 |
+
gradient.addColorStop(1, '#d946ef');
|
| 25 |
+
|
| 26 |
+
ctx.fillStyle = gradient;
|
| 27 |
+
ctx.fillRect(0, 0, size, size);
|
| 28 |
+
|
| 29 |
+
// Add rounded corners
|
| 30 |
+
ctx.globalCompositeOperation = 'destination-in';
|
| 31 |
+
ctx.beginPath();
|
| 32 |
+
ctx.roundRect(0, 0, size, size, size * 0.1);
|
| 33 |
+
ctx.fill();
|
| 34 |
+
ctx.globalCompositeOperation = 'source-over';
|
| 35 |
+
|
| 36 |
+
// Add fire emoji
|
| 37 |
+
ctx.font = `${size * 0.4}px Arial`;
|
| 38 |
+
ctx.textAlign = 'center';
|
| 39 |
+
ctx.textBaseline = 'middle';
|
| 40 |
+
ctx.fillStyle = '#ffffff';
|
| 41 |
+
ctx.fillText('🔥', size / 2, size / 2);
|
| 42 |
+
|
| 43 |
+
// Convert to blob and download
|
| 44 |
+
canvas.toBlob((blob) => {
|
| 45 |
+
const url = URL.createObjectURL(blob);
|
| 46 |
+
const a = document.createElement('a');
|
| 47 |
+
a.href = url;
|
| 48 |
+
a.download = `icon-${size}x${size}.png`;
|
| 49 |
+
a.click();
|
| 50 |
+
URL.revokeObjectURL(url);
|
| 51 |
+
});
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
// Generate all required icon sizes
|
| 55 |
+
const sizes = [72, 96, 128, 144, 152, 192, 384, 512];
|
| 56 |
+
sizes.forEach((size, index) => {
|
| 57 |
+
setTimeout(() => generateIcon(size), index * 100);
|
| 58 |
+
});
|
| 59 |
+
</script>
|
| 60 |
+
</body>
|
| 61 |
+
</html>
|
jest.config.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* 🧪 CONFIGURAÇÃO DO JEST
|
| 3 |
-
* Framework de testes para JavaScript
|
| 4 |
-
*
|
| 5 |
-
* @version 4.0.0
|
| 6 |
-
*/
|
| 7 |
-
|
| 8 |
-
module.exports = {
|
| 9 |
-
// Ambiente de teste
|
| 10 |
-
testEnvironment: 'jsdom',
|
| 11 |
-
|
| 12 |
-
// Padrão de arquivos de teste
|
| 13 |
-
testMatch: [
|
| 14 |
-
'**/__tests__/**/*.js',
|
| 15 |
-
'**/?(*.)+(spec|test).js'
|
| 16 |
-
],
|
| 17 |
-
|
| 18 |
-
// Cobertura de código
|
| 19 |
-
collectCoverage: true,
|
| 20 |
-
coverageDirectory: 'coverage',
|
| 21 |
-
coverageReporters: ['text', 'lcov', 'html'],
|
| 22 |
-
|
| 23 |
-
collectCoverageFrom: [
|
| 24 |
-
'public/**/*.js',
|
| 25 |
-
'!public/**/*.min.js',
|
| 26 |
-
'!public/exercises-database.js',
|
| 27 |
-
'!public/modules/**/*.test.js'
|
| 28 |
-
],
|
| 29 |
-
|
| 30 |
-
// Limites de cobertura
|
| 31 |
-
coverageThreshold: {
|
| 32 |
-
global: {
|
| 33 |
-
branches: 70,
|
| 34 |
-
functions: 70,
|
| 35 |
-
lines: 70,
|
| 36 |
-
statements: 70
|
| 37 |
-
}
|
| 38 |
-
},
|
| 39 |
-
|
| 40 |
-
// Setup files
|
| 41 |
-
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
|
| 42 |
-
|
| 43 |
-
// Módulos a serem transformados
|
| 44 |
-
transform: {
|
| 45 |
-
'^.+\\.js$': 'babel-jest'
|
| 46 |
-
},
|
| 47 |
-
|
| 48 |
-
// Arquivos a ignorar
|
| 49 |
-
testPathIgnorePatterns: [
|
| 50 |
-
'/node_modules/',
|
| 51 |
-
'/dist/',
|
| 52 |
-
'/public/videos/',
|
| 53 |
-
'/public/songs/'
|
| 54 |
-
],
|
| 55 |
-
|
| 56 |
-
// Timeout de testes
|
| 57 |
-
testTimeout: 10000,
|
| 58 |
-
|
| 59 |
-
// Verbose output
|
| 60 |
-
verbose: true,
|
| 61 |
-
|
| 62 |
-
// Mocks automáticos
|
| 63 |
-
automock: false,
|
| 64 |
-
|
| 65 |
-
// Reset entre testes
|
| 66 |
-
resetMocks: true,
|
| 67 |
-
restoreMocks: true,
|
| 68 |
-
|
| 69 |
-
// Limpar mocks entre testes
|
| 70 |
-
clearMocks: true,
|
| 71 |
-
|
| 72 |
-
// Módulos a serem mockados
|
| 73 |
-
moduleNameMapper: {
|
| 74 |
-
'\\.(css|less|scss|sass)$': 'identity-obj-proxy'
|
| 75 |
-
}
|
| 76 |
-
};
|
| 77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jest.setup.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* 🧪 CONFIGURAÇÃO INICIAL DO JEST
|
| 3 |
-
* Setup executado antes de cada teste
|
| 4 |
-
*/
|
| 5 |
-
|
| 6 |
-
// Mock do localStorage
|
| 7 |
-
const localStorageMock = {
|
| 8 |
-
getItem: jest.fn(),
|
| 9 |
-
setItem: jest.fn(),
|
| 10 |
-
removeItem: jest.fn(),
|
| 11 |
-
clear: jest.fn(),
|
| 12 |
-
length: 0,
|
| 13 |
-
key: jest.fn()
|
| 14 |
-
};
|
| 15 |
-
|
| 16 |
-
global.localStorage = localStorageMock;
|
| 17 |
-
|
| 18 |
-
// Mock do Notification
|
| 19 |
-
global.Notification = class Notification {
|
| 20 |
-
constructor(title, options) {
|
| 21 |
-
this.title = title;
|
| 22 |
-
this.options = options;
|
| 23 |
-
}
|
| 24 |
-
|
| 25 |
-
close() {}
|
| 26 |
-
|
| 27 |
-
static requestPermission() {
|
| 28 |
-
return Promise.resolve('granted');
|
| 29 |
-
}
|
| 30 |
-
|
| 31 |
-
static permission = 'granted';
|
| 32 |
-
};
|
| 33 |
-
|
| 34 |
-
// Mock do performance
|
| 35 |
-
global.performance = {
|
| 36 |
-
mark: jest.fn(),
|
| 37 |
-
measure: jest.fn(),
|
| 38 |
-
getEntriesByName: jest.fn(() => [{ duration: 100 }]),
|
| 39 |
-
getEntriesByType: jest.fn(() => []),
|
| 40 |
-
now: jest.fn(() => Date.now()),
|
| 41 |
-
memory: {
|
| 42 |
-
usedJSHeapSize: 50000000,
|
| 43 |
-
totalJSHeapSize: 100000000,
|
| 44 |
-
jsHeapSizeLimit: 200000000
|
| 45 |
-
}
|
| 46 |
-
};
|
| 47 |
-
|
| 48 |
-
// Mock do ServiceWorker
|
| 49 |
-
global.navigator.serviceWorker = {
|
| 50 |
-
register: jest.fn(() => Promise.resolve()),
|
| 51 |
-
ready: Promise.resolve({
|
| 52 |
-
sync: {
|
| 53 |
-
register: jest.fn(() => Promise.resolve())
|
| 54 |
-
}
|
| 55 |
-
})
|
| 56 |
-
};
|
| 57 |
-
|
| 58 |
-
// Console silencioso em testes (opcional)
|
| 59 |
-
// global.console = {
|
| 60 |
-
// log: jest.fn(),
|
| 61 |
-
// error: jest.fn(),
|
| 62 |
-
// warn: jest.fn(),
|
| 63 |
-
// info: jest.fn()
|
| 64 |
-
// };
|
| 65 |
-
|
| 66 |
-
console.log('✅ Jest setup completo');
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.json
CHANGED
|
@@ -6,18 +6,12 @@
|
|
| 6 |
"scripts": {
|
| 7 |
"start": "node server.js",
|
| 8 |
"dev": "nodemon server.js",
|
| 9 |
-
"build": "
|
| 10 |
-
"
|
|
|
|
| 11 |
"minify": "node scripts/minify.js",
|
| 12 |
-
"
|
| 13 |
-
"
|
| 14 |
-
"split-db": "node scripts/split-exercises-database.js",
|
| 15 |
-
"optimize-db": "node scripts/split-exercises-database.js && npm run minify",
|
| 16 |
-
"test": "jest",
|
| 17 |
-
"test:watch": "jest --watch",
|
| 18 |
-
"serve:dist": "npx serve dist",
|
| 19 |
-
"translate": "node scripts/translate-exercises.js",
|
| 20 |
-
"process-videos": "node scripts/process-leap-videos.js"
|
| 21 |
},
|
| 22 |
"keywords": [
|
| 23 |
"ketogenic",
|
|
|
|
| 6 |
"scripts": {
|
| 7 |
"start": "node server.js",
|
| 8 |
"dev": "nodemon server.js",
|
| 9 |
+
"build": "node scripts/build-production.js",
|
| 10 |
+
"download": "node scripts/download-videos.js",
|
| 11 |
+
"analyze": "node scripts/analyze-bundle.js",
|
| 12 |
"minify": "node scripts/minify.js",
|
| 13 |
+
"optimize": "npm run analyze && npm run minify",
|
| 14 |
+
"perf": "node scripts/analyze-bundle.js"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
},
|
| 16 |
"keywords": [
|
| 17 |
"ketogenic",
|
public/app-modules.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// 📦 MÓDULOS LAZY-LOADED DO APP
|
| 2 |
+
// Este arquivo carrega módulos sob demanda para melhorar a performance inicial
|
| 3 |
+
|
| 4 |
+
// Cache de módulos carregados
|
| 5 |
+
const moduleCache = new Map();
|
| 6 |
+
|
| 7 |
+
// Lazy loading de módulos
|
| 8 |
+
async function loadModule(moduleName) {
|
| 9 |
+
if (moduleCache.has(moduleName)) {
|
| 10 |
+
return moduleCache.get(moduleName);
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
console.log(`📦 Carregando módulo: ${moduleName}`);
|
| 14 |
+
|
| 15 |
+
try {
|
| 16 |
+
const module = await import(`./modules/${moduleName}.js`);
|
| 17 |
+
moduleCache.set(moduleName, module);
|
| 18 |
+
return module;
|
| 19 |
+
} catch (error) {
|
| 20 |
+
console.error(`❌ Erro ao carregar módulo ${moduleName}:`, error);
|
| 21 |
+
return null;
|
| 22 |
+
}
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
// Pré-carregar módulos críticos após o carregamento inicial
|
| 26 |
+
function preloadCriticalModules() {
|
| 27 |
+
// Aguardar idle time para pré-carregar
|
| 28 |
+
if ('requestIdleCallback' in window) {
|
| 29 |
+
requestIdleCallback(() => {
|
| 30 |
+
// Pré-carregar módulos que provavelmente serão usados
|
| 31 |
+
loadModule('workouts').catch(console.error);
|
| 32 |
+
loadModule('calendar').catch(console.error);
|
| 33 |
+
}, { timeout: 2000 });
|
| 34 |
+
} else {
|
| 35 |
+
// Fallback para navegadores sem requestIdleCallback
|
| 36 |
+
setTimeout(() => {
|
| 37 |
+
loadModule('workouts').catch(console.error);
|
| 38 |
+
loadModule('calendar').catch(console.error);
|
| 39 |
+
}, 2000);
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
// Exportar funções
|
| 44 |
+
window.AppModules = {
|
| 45 |
+
load: loadModule,
|
| 46 |
+
preload: preloadCriticalModules
|
| 47 |
+
};
|
| 48 |
+
|
| 49 |
+
// Auto-inicializar pré-carregamento quando o DOM estiver pronto
|
| 50 |
+
if (document.readyState === 'loading') {
|
| 51 |
+
document.addEventListener('DOMContentLoaded', preloadCriticalModules);
|
| 52 |
+
} else {
|
| 53 |
+
preloadCriticalModules();
|
| 54 |
+
}
|
| 55 |
+
|
public/app.js
CHANGED
|
@@ -467,12 +467,6 @@ class FitnessApp {
|
|
| 467 |
}
|
| 468 |
|
| 469 |
showProfileSetup() {
|
| 470 |
-
// 🐛 FIX: Esconde a welcome screen para mostrar o formulário de perfil
|
| 471 |
-
const welcomeScreen = document.getElementById('welcomeScreen');
|
| 472 |
-
if (welcomeScreen) {
|
| 473 |
-
welcomeScreen.style.display = 'none';
|
| 474 |
-
}
|
| 475 |
-
|
| 476 |
const setupHTML = `
|
| 477 |
<div class="profile-setup-screen" id="profileSetup">
|
| 478 |
<div class="profile-setup-content">
|
|
@@ -972,27 +966,27 @@ class FitnessApp {
|
|
| 972 |
<div class="profile-metrics">
|
| 973 |
<div class="metric-item">
|
| 974 |
<span class="metric-label">Altura</span>
|
| 975 |
-
<span class="metric-value">${
|
| 976 |
</div>
|
| 977 |
<div class="metric-item">
|
| 978 |
<span class="metric-label">Peso Atual</span>
|
| 979 |
-
<span class="metric-value">${
|
| 980 |
</div>
|
| 981 |
<div class="metric-item">
|
| 982 |
<span class="metric-label">Peso Meta</span>
|
| 983 |
-
<span class="metric-value">${
|
| 984 |
</div>
|
| 985 |
<div class="metric-item">
|
| 986 |
<span class="metric-label">IMC</span>
|
| 987 |
-
<span class="metric-value">${
|
| 988 |
</div>
|
| 989 |
<div class="metric-item">
|
| 990 |
<span class="metric-label">TMB</span>
|
| 991 |
-
<span class="metric-value">${Math.round(
|
| 992 |
</div>
|
| 993 |
<div class="metric-item">
|
| 994 |
<span class="metric-label">TDEE</span>
|
| 995 |
-
<span class="metric-value">${
|
| 996 |
</div>
|
| 997 |
</div>
|
| 998 |
`;
|
|
@@ -1022,7 +1016,7 @@ class FitnessApp {
|
|
| 1022 |
</div>
|
| 1023 |
<div class="nutrition-item">
|
| 1024 |
<span class="nutrition-label">Dieta</span>
|
| 1025 |
-
<span class="nutrition-value" style="font-size: 0.9rem;">${
|
| 1026 |
</div>
|
| 1027 |
</div>
|
| 1028 |
<div class="meal-plan">
|
|
@@ -2421,10 +2415,6 @@ class FitnessApp {
|
|
| 2421 |
</div>
|
| 2422 |
`;
|
| 2423 |
|
| 2424 |
-
// 🐛 BUG FIX: Remove headers antigos antes de inserir novo (previne duplicação)
|
| 2425 |
-
const existingHeaders = calendarContainer.parentElement.querySelectorAll('.scientific-plan-header');
|
| 2426 |
-
existingHeaders.forEach(header => header.remove());
|
| 2427 |
-
|
| 2428 |
calendarContainer.insertAdjacentHTML('beforebegin', planHeaderHTML);
|
| 2429 |
|
| 2430 |
// 🚀 PERFORMANCE: Use DocumentFragment for batch DOM insertion
|
|
@@ -2641,24 +2631,7 @@ class FitnessApp {
|
|
| 2641 |
* 🎯 SELEÇÃO INTELIGENTE DE EXERCÍCIOS
|
| 2642 |
* Escolhe os melhores exercícios baseado no objetivo e dia
|
| 2643 |
*/
|
| 2644 |
-
/**
|
| 2645 |
-
* 🧠 SISTEMA INTELIGENTE DE SELEÇÃO DE EXERCÍCIOS
|
| 2646 |
-
* Seleciona exercícios baseado em:
|
| 2647 |
-
* - Perfil do usuário (idade, condicionamento, peso)
|
| 2648 |
-
* - Meta (perder peso, ganhar músculo, tonificar)
|
| 2649 |
-
* - Dia do plano (periodização e variação)
|
| 2650 |
-
* - Dificuldade progressiva
|
| 2651 |
-
* - Base de dados de 783 exercícios
|
| 2652 |
-
*/
|
| 2653 |
selectIntelligentExercises(dayPlan) {
|
| 2654 |
-
// 🎯 Usar base de dados completa se disponível
|
| 2655 |
-
const useFullDatabase = typeof EXERCISES_DATABASE !== 'undefined' && EXERCISES_DATABASE;
|
| 2656 |
-
|
| 2657 |
-
if (useFullDatabase) {
|
| 2658 |
-
return this.selectFromCompleteDatabase(dayPlan);
|
| 2659 |
-
}
|
| 2660 |
-
|
| 2661 |
-
// 🔙 Fallback para método antigo se base não disponível
|
| 2662 |
const exercises1 = this.getExercisesByCategory(dayPlan.category);
|
| 2663 |
let selected = exercises1.slice(0, 5);
|
| 2664 |
|
|
@@ -2670,197 +2643,6 @@ class FitnessApp {
|
|
| 2670 |
return selected;
|
| 2671 |
}
|
| 2672 |
|
| 2673 |
-
/**
|
| 2674 |
-
* 🎯 SELEÇÃO INTELIGENTE DA BASE COMPLETA
|
| 2675 |
-
* Analisa 783 exercícios e seleciona os melhores para o perfil
|
| 2676 |
-
*/
|
| 2677 |
-
selectFromCompleteDatabase(dayPlan) {
|
| 2678 |
-
const profile = this.userProfile || {};
|
| 2679 |
-
const day = dayPlan.day;
|
| 2680 |
-
|
| 2681 |
-
// 📊 Parâmetros de seleção baseados no perfil
|
| 2682 |
-
const selectionParams = this.calculateSelectionParameters(profile, dayPlan);
|
| 2683 |
-
|
| 2684 |
-
// 🎯 Buscar exercícios da categoria principal
|
| 2685 |
-
const category1Exercises = EXERCISES_DATABASE[dayPlan.category] || [];
|
| 2686 |
-
|
| 2687 |
-
// 🧠 Filtrar e pontuar exercícios
|
| 2688 |
-
const scored1 = this.scoreExercises(category1Exercises, selectionParams, day);
|
| 2689 |
-
|
| 2690 |
-
// 📈 Selecionar top 5 com variação
|
| 2691 |
-
let selectedExercises = this.selectVariedExercises(scored1, 5, day);
|
| 2692 |
-
|
| 2693 |
-
// 💪 Se treino duplo, adicionar segunda categoria
|
| 2694 |
-
if (dayPlan.doubleWorkout && dayPlan.secondCategory) {
|
| 2695 |
-
const category2Exercises = EXERCISES_DATABASE[dayPlan.secondCategory] || [];
|
| 2696 |
-
const scored2 = this.scoreExercises(category2Exercises, selectionParams, day + 1000);
|
| 2697 |
-
const selected2 = this.selectVariedExercises(scored2, 5, day + 1000);
|
| 2698 |
-
selectedExercises = [...selectedExercises, ...selected2];
|
| 2699 |
-
}
|
| 2700 |
-
|
| 2701 |
-
return selectedExercises;
|
| 2702 |
-
}
|
| 2703 |
-
|
| 2704 |
-
/**
|
| 2705 |
-
* 📊 CALCULA PARÂMETROS DE SELEÇÃO
|
| 2706 |
-
* Define preferências baseadas no perfil e meta
|
| 2707 |
-
*/
|
| 2708 |
-
calculateSelectionParameters(profile, dayPlan) {
|
| 2709 |
-
const age = profile.age || 30;
|
| 2710 |
-
const weight = profile.weight || 70;
|
| 2711 |
-
const goal = profile.goal || 'lose-weight';
|
| 2712 |
-
const fitness = profile.fitness || 'intermediate';
|
| 2713 |
-
|
| 2714 |
-
// 🎯 Preferências por meta
|
| 2715 |
-
const goalPreferences = {
|
| 2716 |
-
'lose-weight': {
|
| 2717 |
-
preferHighCalories: true,
|
| 2718 |
-
preferCardio: true,
|
| 2719 |
-
intensityMultiplier: 1.2,
|
| 2720 |
-
minCalories: 8,
|
| 2721 |
-
maxDuration: 90
|
| 2722 |
-
},
|
| 2723 |
-
'lose-weight-fast': {
|
| 2724 |
-
preferHighCalories: true,
|
| 2725 |
-
preferCardio: true,
|
| 2726 |
-
intensityMultiplier: 1.4,
|
| 2727 |
-
minCalories: 10,
|
| 2728 |
-
maxDuration: 80
|
| 2729 |
-
},
|
| 2730 |
-
'gain-muscle': {
|
| 2731 |
-
preferHighCalories: false,
|
| 2732 |
-
preferCardio: false,
|
| 2733 |
-
intensityMultiplier: 0.9,
|
| 2734 |
-
minCalories: 5,
|
| 2735 |
-
maxDuration: 100,
|
| 2736 |
-
preferSets: true
|
| 2737 |
-
},
|
| 2738 |
-
'tone': {
|
| 2739 |
-
preferHighCalories: false,
|
| 2740 |
-
preferCardio: false,
|
| 2741 |
-
intensityMultiplier: 1.0,
|
| 2742 |
-
minCalories: 6,
|
| 2743 |
-
maxDuration: 90
|
| 2744 |
-
},
|
| 2745 |
-
'health': {
|
| 2746 |
-
preferHighCalories: false,
|
| 2747 |
-
preferCardio: true,
|
| 2748 |
-
intensityMultiplier: 0.8,
|
| 2749 |
-
minCalories: 4,
|
| 2750 |
-
maxDuration: 100
|
| 2751 |
-
}
|
| 2752 |
-
};
|
| 2753 |
-
|
| 2754 |
-
const prefs = goalPreferences[goal] || goalPreferences['lose-weight'];
|
| 2755 |
-
|
| 2756 |
-
// 🎚️ Ajustar por condicionamento
|
| 2757 |
-
const fitnessAdjustments = {
|
| 2758 |
-
'beginner': { intensityMultiplier: 0.7, maxDuration: 70 },
|
| 2759 |
-
'intermediate': { intensityMultiplier: 1.0, maxDuration: 90 },
|
| 2760 |
-
'advanced': { intensityMultiplier: 1.3, maxDuration: 120 }
|
| 2761 |
-
};
|
| 2762 |
-
|
| 2763 |
-
const fitnessAdj = fitnessAdjustments[fitness] || fitnessAdjustments['intermediate'];
|
| 2764 |
-
|
| 2765 |
-
// 👤 Ajustar por idade (pessoas mais velhas = intensidade menor)
|
| 2766 |
-
const ageMultiplier = age < 25 ? 1.1 : age < 40 ? 1.0 : age < 55 ? 0.9 : 0.8;
|
| 2767 |
-
|
| 2768 |
-
return {
|
| 2769 |
-
...prefs,
|
| 2770 |
-
intensityMultiplier: prefs.intensityMultiplier * fitnessAdj.intensityMultiplier * ageMultiplier,
|
| 2771 |
-
maxDuration: Math.min(prefs.maxDuration, fitnessAdj.maxDuration),
|
| 2772 |
-
age,
|
| 2773 |
-
weight,
|
| 2774 |
-
goal,
|
| 2775 |
-
fitness,
|
| 2776 |
-
dayIntensity: dayPlan.intensityPercent || 70
|
| 2777 |
-
};
|
| 2778 |
-
}
|
| 2779 |
-
|
| 2780 |
-
/**
|
| 2781 |
-
* 🎯 PONTUA EXERCÍCIOS
|
| 2782 |
-
* Calcula score para cada exercício baseado em múltiplos fatores
|
| 2783 |
-
*/
|
| 2784 |
-
scoreExercises(exercises, params, seed) {
|
| 2785 |
-
return exercises.map((exercise, index) => {
|
| 2786 |
-
let score = 100; // Score base
|
| 2787 |
-
|
| 2788 |
-
// 🔥 Preferência por calorias (se meta é perder peso)
|
| 2789 |
-
if (params.preferHighCalories) {
|
| 2790 |
-
score += (exercise.calories || 5) * 2;
|
| 2791 |
-
}
|
| 2792 |
-
|
| 2793 |
-
// ⏱️ Preferência por duração adequada
|
| 2794 |
-
const duration = exercise.durationInSeconds || 40;
|
| 2795 |
-
if (duration >= 30 && duration <= params.maxDuration) {
|
| 2796 |
-
score += 20;
|
| 2797 |
-
}
|
| 2798 |
-
|
| 2799 |
-
// 🎯 Bonus para exercícios de alta intensidade (se apropriado)
|
| 2800 |
-
if ((exercise.calories || 5) >= params.minCalories) {
|
| 2801 |
-
score += 15 * params.intensityMultiplier;
|
| 2802 |
-
}
|
| 2803 |
-
|
| 2804 |
-
// 💪 Bonus para exercícios com mais séries (se ganho de músculo)
|
| 2805 |
-
if (params.preferSets && (exercise.sets || 3) >= 3) {
|
| 2806 |
-
score += 10;
|
| 2807 |
-
}
|
| 2808 |
-
|
| 2809 |
-
// 🎲 Variação: adiciona aleatoriedade baseada no dia (mas determinística)
|
| 2810 |
-
// Isso garante que dias diferentes tenham exercícios diferentes
|
| 2811 |
-
const pseudoRandom = ((seed + index) * 9301 + 49297) % 233280 / 233280;
|
| 2812 |
-
score += pseudoRandom * 30; // Até 30 pontos de variação
|
| 2813 |
-
|
| 2814 |
-
return {
|
| 2815 |
-
...exercise,
|
| 2816 |
-
score
|
| 2817 |
-
};
|
| 2818 |
-
}).sort((a, b) => b.score - a.score);
|
| 2819 |
-
}
|
| 2820 |
-
|
| 2821 |
-
/**
|
| 2822 |
-
* 🎲 SELECIONA EXERCÍCIOS COM VARIAÇÃO
|
| 2823 |
-
* Garante variedade e não repetição excessiva
|
| 2824 |
-
*/
|
| 2825 |
-
selectVariedExercises(scoredExercises, count, seed) {
|
| 2826 |
-
const selected = [];
|
| 2827 |
-
const usedNames = new Set();
|
| 2828 |
-
|
| 2829 |
-
// 🎯 Top 30% dos melhores pontuados
|
| 2830 |
-
const topCandidates = scoredExercises.slice(0, Math.ceil(scoredExercises.length * 0.3));
|
| 2831 |
-
|
| 2832 |
-
// 🔀 Embaralha levemente os top candidates (mantendo os melhores no topo)
|
| 2833 |
-
const shuffled = topCandidates.sort((a, b) => {
|
| 2834 |
-
const randomA = ((seed + a.score) * 9301) % 233280 / 233280;
|
| 2835 |
-
const randomB = ((seed + b.score) * 9301) % 233280 / 233280;
|
| 2836 |
-
return (b.score + randomA * 10) - (a.score + randomB * 10);
|
| 2837 |
-
});
|
| 2838 |
-
|
| 2839 |
-
// 📝 Seleciona evitando duplicatas
|
| 2840 |
-
for (const exercise of shuffled) {
|
| 2841 |
-
if (selected.length >= count) break;
|
| 2842 |
-
|
| 2843 |
-
// Evita exercícios com nome muito similar
|
| 2844 |
-
const simpleName = exercise.name.toLowerCase().substring(0, 20);
|
| 2845 |
-
if (!usedNames.has(simpleName)) {
|
| 2846 |
-
selected.push(exercise);
|
| 2847 |
-
usedNames.add(simpleName);
|
| 2848 |
-
}
|
| 2849 |
-
}
|
| 2850 |
-
|
| 2851 |
-
// 🔄 Se não tiver exercícios suficientes, completa com os melhores
|
| 2852 |
-
if (selected.length < count) {
|
| 2853 |
-
for (const exercise of scoredExercises) {
|
| 2854 |
-
if (selected.length >= count) break;
|
| 2855 |
-
if (!selected.includes(exercise)) {
|
| 2856 |
-
selected.push(exercise);
|
| 2857 |
-
}
|
| 2858 |
-
}
|
| 2859 |
-
}
|
| 2860 |
-
|
| 2861 |
-
return selected;
|
| 2862 |
-
}
|
| 2863 |
-
|
| 2864 |
getCategoryName(category) {
|
| 2865 |
const names = {
|
| 2866 |
'abs': 'Abdômen',
|
|
@@ -3219,7 +3001,7 @@ class FitnessApp {
|
|
| 3219 |
iframe.height = '100%';
|
| 3220 |
iframe.style.borderRadius = 'var(--radius-lg)';
|
| 3221 |
iframe.style.maxHeight = '60vh';
|
| 3222 |
-
iframe.src = `https://www.youtube.com/embed/${exercise.youtubeId}?autoplay=1&mute=1&loop=1&playlist=${exercise.youtubeId}&modestbranding=1&rel=0&showinfo=0&controls=
|
| 3223 |
iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';
|
| 3224 |
iframe.allowFullscreen = true;
|
| 3225 |
|
|
@@ -3250,32 +3032,39 @@ class FitnessApp {
|
|
| 3250 |
let videoUrl = exercise.video;
|
| 3251 |
|
| 3252 |
// Sempre tenta carregar do caminho especificado (local se existir)
|
|
|
|
|
|
|
| 3253 |
videoSource.src = videoUrl;
|
| 3254 |
videoSource.type = 'video/mp4';
|
| 3255 |
demoVideo.load();
|
| 3256 |
|
| 3257 |
// 🔄 PREMIUM FALLBACK: Se vídeo local falhar, tenta CDN
|
| 3258 |
const handleVideoError = () => {
|
|
|
|
|
|
|
| 3259 |
// Se é caminho local e falhou, tenta CDN
|
| 3260 |
if (exercise.video.startsWith('videos/')) {
|
| 3261 |
const videoFileName = exercise.video.replace('videos/', '');
|
| 3262 |
const cdnUrl = this.VIDEO_BASE_URL_FALLBACK + videoFileName;
|
| 3263 |
|
|
|
|
| 3264 |
videoSource.src = cdnUrl;
|
| 3265 |
demoVideo.load();
|
| 3266 |
|
| 3267 |
-
//
|
| 3268 |
-
|
|
|
|
| 3269 |
demoVideo.currentTime = startTime;
|
| 3270 |
-
demoVideo.play().catch(
|
|
|
|
| 3271 |
// Fallback final: mostra emoji
|
| 3272 |
demoVideo.style.display = 'none';
|
| 3273 |
demoIcon.style.display = 'block';
|
| 3274 |
});
|
| 3275 |
-
};
|
| 3276 |
-
demoVideo.addEventListener('canplaythrough', cdnLoadHandler, { once: true });
|
| 3277 |
} else {
|
| 3278 |
// URL já é externa e falhou, mostra emoji
|
|
|
|
| 3279 |
demoVideo.style.display = 'none';
|
| 3280 |
demoIcon.style.display = 'block';
|
| 3281 |
}
|
|
@@ -3285,8 +3074,8 @@ class FitnessApp {
|
|
| 3285 |
videoSource.onerror = handleVideoError;
|
| 3286 |
|
| 3287 |
// 📱 MOBILE FIX: Esperar vídeo estar pronto antes de tocar
|
| 3288 |
-
|
| 3289 |
-
|
| 3290 |
demoVideo.currentTime = startTime;
|
| 3291 |
demoVideo.style.display = 'block';
|
| 3292 |
demoIcon.style.display = 'none';
|
|
@@ -3295,7 +3084,9 @@ class FitnessApp {
|
|
| 3295 |
const playPromise = demoVideo.play();
|
| 3296 |
|
| 3297 |
if (playPromise !== undefined) {
|
| 3298 |
-
playPromise.catch(
|
|
|
|
|
|
|
| 3299 |
// 📱 MOBILE: Mostrar botão de play
|
| 3300 |
const playButton = document.getElementById('videoPlayButton');
|
| 3301 |
if (playButton) {
|
|
@@ -3307,8 +3098,8 @@ class FitnessApp {
|
|
| 3307 |
demoVideo.play().then(() => {
|
| 3308 |
playButton.style.display = 'none';
|
| 3309 |
this.playCuteSound('tap');
|
| 3310 |
-
}).catch(
|
| 3311 |
-
|
| 3312 |
});
|
| 3313 |
};
|
| 3314 |
|
|
@@ -3319,21 +3110,7 @@ class FitnessApp {
|
|
| 3319 |
}
|
| 3320 |
});
|
| 3321 |
}
|
| 3322 |
-
};
|
| 3323 |
-
|
| 3324 |
-
// 🐛 BUG FIX: Limpa handler anterior antes de adicionar novo (previne memory leak)
|
| 3325 |
-
if (this.activeVideoHandlers && this.activeVideoHandlers.loadHandler) {
|
| 3326 |
-
demoVideo.removeEventListener('loadeddata', this.activeVideoHandlers.loadHandler);
|
| 3327 |
-
}
|
| 3328 |
-
|
| 3329 |
-
demoVideo.addEventListener('loadeddata', loadedDataHandler, { once: true });
|
| 3330 |
-
|
| 3331 |
-
// 🐛 BUG FIX: Salva handlers ativos para cleanup posterior
|
| 3332 |
-
this.activeVideoHandlers = {
|
| 3333 |
-
video: demoVideo,
|
| 3334 |
-
loadHandler: loadedDataHandler,
|
| 3335 |
-
errorHandler: handleVideoError
|
| 3336 |
-
};
|
| 3337 |
|
| 3338 |
// 🔄 LOOP FIX: Armazenar startTime no elemento para garantir loop correto
|
| 3339 |
demoVideo.dataset.startTime = startTime;
|
|
@@ -3341,6 +3118,7 @@ class FitnessApp {
|
|
| 3341 |
// 🔄 Loop handler: volta para o tempo de início configurado (4s ou 3s)
|
| 3342 |
demoVideo.onended = () => {
|
| 3343 |
const skipTime = parseInt(demoVideo.dataset.startTime) || 3;
|
|
|
|
| 3344 |
demoVideo.currentTime = skipTime;
|
| 3345 |
demoVideo.play().catch(() => {}); // Silent fail
|
| 3346 |
};
|
|
@@ -4862,6 +4640,9 @@ class FitnessApp {
|
|
| 4862 |
} else {
|
| 4863 |
document.getElementById('memberSince').textContent = '--';
|
| 4864 |
}
|
|
|
|
|
|
|
|
|
|
| 4865 |
}
|
| 4866 |
|
| 4867 |
getThisWeekWorkouts() {
|
|
@@ -4927,6 +4708,43 @@ class FitnessApp {
|
|
| 4927 |
return categoryNames[favorite] || favorite;
|
| 4928 |
}
|
| 4929 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4930 |
|
| 4931 |
getExercisesByCategory(category) {
|
| 4932 |
const exercises = {
|
|
|
|
| 467 |
}
|
| 468 |
|
| 469 |
showProfileSetup() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 470 |
const setupHTML = `
|
| 471 |
<div class="profile-setup-screen" id="profileSetup">
|
| 472 |
<div class="profile-setup-content">
|
|
|
|
| 966 |
<div class="profile-metrics">
|
| 967 |
<div class="metric-item">
|
| 968 |
<span class="metric-label">Altura</span>
|
| 969 |
+
<span class="metric-value">${profile.height} cm</span>
|
| 970 |
</div>
|
| 971 |
<div class="metric-item">
|
| 972 |
<span class="metric-label">Peso Atual</span>
|
| 973 |
+
<span class="metric-value">${profile.weight} kg</span>
|
| 974 |
</div>
|
| 975 |
<div class="metric-item">
|
| 976 |
<span class="metric-label">Peso Meta</span>
|
| 977 |
+
<span class="metric-value">${profile.goalWeight} kg</span>
|
| 978 |
</div>
|
| 979 |
<div class="metric-item">
|
| 980 |
<span class="metric-label">IMC</span>
|
| 981 |
+
<span class="metric-value">${profile.bmi}</span>
|
| 982 |
</div>
|
| 983 |
<div class="metric-item">
|
| 984 |
<span class="metric-label">TMB</span>
|
| 985 |
+
<span class="metric-value">${Math.round(profile.bmr)} kcal</span>
|
| 986 |
</div>
|
| 987 |
<div class="metric-item">
|
| 988 |
<span class="metric-label">TDEE</span>
|
| 989 |
+
<span class="metric-value">${profile.tdee} kcal</span>
|
| 990 |
</div>
|
| 991 |
</div>
|
| 992 |
`;
|
|
|
|
| 1016 |
</div>
|
| 1017 |
<div class="nutrition-item">
|
| 1018 |
<span class="nutrition-label">Dieta</span>
|
| 1019 |
+
<span class="nutrition-value" style="font-size: 0.9rem;">${profile.dietPreference}</span>
|
| 1020 |
</div>
|
| 1021 |
</div>
|
| 1022 |
<div class="meal-plan">
|
|
|
|
| 2415 |
</div>
|
| 2416 |
`;
|
| 2417 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2418 |
calendarContainer.insertAdjacentHTML('beforebegin', planHeaderHTML);
|
| 2419 |
|
| 2420 |
// 🚀 PERFORMANCE: Use DocumentFragment for batch DOM insertion
|
|
|
|
| 2631 |
* 🎯 SELEÇÃO INTELIGENTE DE EXERCÍCIOS
|
| 2632 |
* Escolhe os melhores exercícios baseado no objetivo e dia
|
| 2633 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2634 |
selectIntelligentExercises(dayPlan) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2635 |
const exercises1 = this.getExercisesByCategory(dayPlan.category);
|
| 2636 |
let selected = exercises1.slice(0, 5);
|
| 2637 |
|
|
|
|
| 2643 |
return selected;
|
| 2644 |
}
|
| 2645 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2646 |
getCategoryName(category) {
|
| 2647 |
const names = {
|
| 2648 |
'abs': 'Abdômen',
|
|
|
|
| 3001 |
iframe.height = '100%';
|
| 3002 |
iframe.style.borderRadius = 'var(--radius-lg)';
|
| 3003 |
iframe.style.maxHeight = '60vh';
|
| 3004 |
+
iframe.src = `https://www.youtube.com/embed/${exercise.youtubeId}?autoplay=1&mute=1&loop=1&playlist=${exercise.youtubeId}&modestbranding=1&rel=0&showinfo=0&controls=1&playsinline=1`;
|
| 3005 |
iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';
|
| 3006 |
iframe.allowFullscreen = true;
|
| 3007 |
|
|
|
|
| 3032 |
let videoUrl = exercise.video;
|
| 3033 |
|
| 3034 |
// Sempre tenta carregar do caminho especificado (local se existir)
|
| 3035 |
+
console.log('🎥 Carregando vídeo:', videoUrl);
|
| 3036 |
+
|
| 3037 |
videoSource.src = videoUrl;
|
| 3038 |
videoSource.type = 'video/mp4';
|
| 3039 |
demoVideo.load();
|
| 3040 |
|
| 3041 |
// 🔄 PREMIUM FALLBACK: Se vídeo local falhar, tenta CDN
|
| 3042 |
const handleVideoError = () => {
|
| 3043 |
+
console.warn('⚠️ Vídeo local falhou, tentando CDN...');
|
| 3044 |
+
|
| 3045 |
// Se é caminho local e falhou, tenta CDN
|
| 3046 |
if (exercise.video.startsWith('videos/')) {
|
| 3047 |
const videoFileName = exercise.video.replace('videos/', '');
|
| 3048 |
const cdnUrl = this.VIDEO_BASE_URL_FALLBACK + videoFileName;
|
| 3049 |
|
| 3050 |
+
console.log('🌐 Fallback CDN:', cdnUrl);
|
| 3051 |
videoSource.src = cdnUrl;
|
| 3052 |
demoVideo.load();
|
| 3053 |
|
| 3054 |
+
// Tentar tocar após carregar do CDN
|
| 3055 |
+
demoVideo.addEventListener('canplaythrough', () => {
|
| 3056 |
+
console.log('✅ Vídeo carregado via CDN');
|
| 3057 |
demoVideo.currentTime = startTime;
|
| 3058 |
+
demoVideo.play().catch(err => {
|
| 3059 |
+
console.error('❌ CDN também falhou:', err);
|
| 3060 |
// Fallback final: mostra emoji
|
| 3061 |
demoVideo.style.display = 'none';
|
| 3062 |
demoIcon.style.display = 'block';
|
| 3063 |
});
|
| 3064 |
+
}, { once: true });
|
|
|
|
| 3065 |
} else {
|
| 3066 |
// URL já é externa e falhou, mostra emoji
|
| 3067 |
+
console.error('❌ Vídeo externo falhou');
|
| 3068 |
demoVideo.style.display = 'none';
|
| 3069 |
demoIcon.style.display = 'block';
|
| 3070 |
}
|
|
|
|
| 3074 |
videoSource.onerror = handleVideoError;
|
| 3075 |
|
| 3076 |
// 📱 MOBILE FIX: Esperar vídeo estar pronto antes de tocar
|
| 3077 |
+
demoVideo.addEventListener('loadeddata', () => {
|
| 3078 |
+
console.log('✅ Vídeo carregado:', exercise.name);
|
| 3079 |
demoVideo.currentTime = startTime;
|
| 3080 |
demoVideo.style.display = 'block';
|
| 3081 |
demoIcon.style.display = 'none';
|
|
|
|
| 3084 |
const playPromise = demoVideo.play();
|
| 3085 |
|
| 3086 |
if (playPromise !== undefined) {
|
| 3087 |
+
playPromise.catch(err => {
|
| 3088 |
+
console.warn('⚠️ Autoplay bloqueado (normal em mobile):', err.message);
|
| 3089 |
+
|
| 3090 |
// 📱 MOBILE: Mostrar botão de play
|
| 3091 |
const playButton = document.getElementById('videoPlayButton');
|
| 3092 |
if (playButton) {
|
|
|
|
| 3098 |
demoVideo.play().then(() => {
|
| 3099 |
playButton.style.display = 'none';
|
| 3100 |
this.playCuteSound('tap');
|
| 3101 |
+
}).catch(err2 => {
|
| 3102 |
+
console.error('❌ Erro ao tocar vídeo:', err2);
|
| 3103 |
});
|
| 3104 |
};
|
| 3105 |
|
|
|
|
| 3110 |
}
|
| 3111 |
});
|
| 3112 |
}
|
| 3113 |
+
}, { once: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3114 |
|
| 3115 |
// 🔄 LOOP FIX: Armazenar startTime no elemento para garantir loop correto
|
| 3116 |
demoVideo.dataset.startTime = startTime;
|
|
|
|
| 3118 |
// 🔄 Loop handler: volta para o tempo de início configurado (4s ou 3s)
|
| 3119 |
demoVideo.onended = () => {
|
| 3120 |
const skipTime = parseInt(demoVideo.dataset.startTime) || 3;
|
| 3121 |
+
console.log(`🔄 Loop: voltando para ${skipTime}s (${exercise.name})`);
|
| 3122 |
demoVideo.currentTime = skipTime;
|
| 3123 |
demoVideo.play().catch(() => {}); // Silent fail
|
| 3124 |
};
|
|
|
|
| 4640 |
} else {
|
| 4641 |
document.getElementById('memberSince').textContent = '--';
|
| 4642 |
}
|
| 4643 |
+
|
| 4644 |
+
// Weekly chart
|
| 4645 |
+
this.renderWeeklyChart();
|
| 4646 |
}
|
| 4647 |
|
| 4648 |
getThisWeekWorkouts() {
|
|
|
|
| 4708 |
return categoryNames[favorite] || favorite;
|
| 4709 |
}
|
| 4710 |
|
| 4711 |
+
renderWeeklyChart() {
|
| 4712 |
+
const chartContainer = document.getElementById('weeklyChart');
|
| 4713 |
+
if (!chartContainer) return;
|
| 4714 |
+
|
| 4715 |
+
const days = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'];
|
| 4716 |
+
const today = new Date();
|
| 4717 |
+
const weekData = [];
|
| 4718 |
+
|
| 4719 |
+
// Get last 7 days
|
| 4720 |
+
for (let i = 6; i >= 0; i--) {
|
| 4721 |
+
const date = new Date(today);
|
| 4722 |
+
date.setDate(date.getDate() - i);
|
| 4723 |
+
const dayIndex = date.getDay();
|
| 4724 |
+
const dateKey = date.toISOString().split('T')[0];
|
| 4725 |
+
|
| 4726 |
+
const workoutsOnDay = this.progress.workoutHistory
|
| 4727 |
+
? this.progress.workoutHistory.filter(w => w.date.startsWith(dateKey)).length
|
| 4728 |
+
: 0;
|
| 4729 |
+
|
| 4730 |
+
weekData.push({
|
| 4731 |
+
label: days[dayIndex],
|
| 4732 |
+
value: workoutsOnDay
|
| 4733 |
+
});
|
| 4734 |
+
}
|
| 4735 |
+
|
| 4736 |
+
const maxValue = Math.max(...weekData.map(d => d.value), 1);
|
| 4737 |
+
|
| 4738 |
+
chartContainer.innerHTML = weekData.map(day => {
|
| 4739 |
+
const heightPercent = (day.value / maxValue) * 100;
|
| 4740 |
+
return `
|
| 4741 |
+
<div class="chart-day">
|
| 4742 |
+
<div class="chart-bar" style="height: ${heightPercent}%"></div>
|
| 4743 |
+
<div class="chart-label">${day.label}</div>
|
| 4744 |
+
</div>
|
| 4745 |
+
`;
|
| 4746 |
+
}).join('');
|
| 4747 |
+
}
|
| 4748 |
|
| 4749 |
getExercisesByCategory(category) {
|
| 4750 |
const exercises = {
|
public/app.min.js
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
public/exercises-chunks/abs.js
DELETED
|
@@ -1,2294 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: abs
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 143
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_ABS = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Em Pé Eagle Abdominal",
|
| 8 |
-
"originalTitle": "How to Do: STANDING EAGLE CRUNCH",
|
| 9 |
-
"emoji": "🔥",
|
| 10 |
-
"youtubeId": "MkMB8Hdq2qU",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/MkMB8Hdq2qU",
|
| 12 |
-
"duration": "1:19",
|
| 13 |
-
"durationInSeconds": 79,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/MkMB8Hdq2qU/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "40s",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 9,
|
| 19 |
-
"category": "abs",
|
| 20 |
-
"originalName": "How to Do: STANDING EAGLE CRUNCH"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": "Ponte One Elevação De Perna",
|
| 24 |
-
"originalTitle": "How to Do: BRIDGE ONE LEG RAISE",
|
| 25 |
-
"emoji": "🔥",
|
| 26 |
-
"youtubeId": "JxnGOaye88w",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/JxnGOaye88w",
|
| 28 |
-
"duration": "1:07",
|
| 29 |
-
"durationInSeconds": 67,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/JxnGOaye88w/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "40s",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 8,
|
| 35 |
-
"category": "abs",
|
| 36 |
-
"originalName": "How to Do: BRIDGE ONE LEG RAISE"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": "Reverse Prancha",
|
| 40 |
-
"originalTitle": "How to Do: REVERSE PLANK",
|
| 41 |
-
"emoji": "🔥",
|
| 42 |
-
"youtubeId": "mX_SX6I2DSI",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/mX_SX6I2DSI",
|
| 44 |
-
"duration": "1:14",
|
| 45 |
-
"durationInSeconds": 74,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/mX_SX6I2DSI/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "40s",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 9,
|
| 51 |
-
"category": "abs",
|
| 52 |
-
"originalName": "How to Do: REVERSE PLANK"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": "Joelhol Prancha",
|
| 56 |
-
"originalTitle": "How to Do: KNEEL PLANK",
|
| 57 |
-
"emoji": "🔥",
|
| 58 |
-
"youtubeId": "xNBL63AhZcc",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/xNBL63AhZcc",
|
| 60 |
-
"duration": "1:07",
|
| 61 |
-
"durationInSeconds": 67,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/xNBL63AhZcc/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "40s",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 8,
|
| 67 |
-
"category": "abs",
|
| 68 |
-
"originalName": "How to Do: KNEEL PLANK"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": "Straight-braço Joelho Prancha",
|
| 72 |
-
"originalTitle": "How to Do: STRAIGHT-ARM KNEE PLANK",
|
| 73 |
-
"emoji": "🔥",
|
| 74 |
-
"youtubeId": "dKrVU3Fh8hw",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/dKrVU3Fh8hw",
|
| 76 |
-
"duration": "1:00",
|
| 77 |
-
"durationInSeconds": 60,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/dKrVU3Fh8hw/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "40s",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 7,
|
| 83 |
-
"category": "abs",
|
| 84 |
-
"originalName": "How to Do: STRAIGHT-ARM KNEE PLANK"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":prone Flutter Kicks",
|
| 88 |
-
"originalTitle": "How to Do:PRONE FLUTTER KICKS",
|
| 89 |
-
"emoji": "🔥",
|
| 90 |
-
"youtubeId": "9i0J_I4ASow",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/9i0J_I4ASow",
|
| 92 |
-
"duration": "0:44",
|
| 93 |
-
"durationInSeconds": 44,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/9i0J_I4ASow/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "12",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 5,
|
| 99 |
-
"category": "abs",
|
| 100 |
-
"originalName": "How to Do:PRONE FLUTTER KICKS"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":crossbody Alpinista",
|
| 104 |
-
"originalTitle": "How to Do:CROSSBODY MOUNTAIN CLIMBER",
|
| 105 |
-
"emoji": "🔥",
|
| 106 |
-
"youtubeId": "tIEkB8S42j8",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/tIEkB8S42j8",
|
| 108 |
-
"duration": "0:40",
|
| 109 |
-
"durationInSeconds": 40,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/tIEkB8S42j8/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "12",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 5,
|
| 115 |
-
"category": "abs",
|
| 116 |
-
"originalName": "How to Do:CROSSBODY MOUNTAIN CLIMBER"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":prancha Quadril Dips",
|
| 120 |
-
"originalTitle": "How to Do:PLANK HIP DIPS",
|
| 121 |
-
"emoji": "🔥",
|
| 122 |
-
"youtubeId": "h1_Y3GBUd0M",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/h1_Y3GBUd0M",
|
| 124 |
-
"duration": "0:46",
|
| 125 |
-
"durationInSeconds": 46,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/h1_Y3GBUd0M/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "12",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 5,
|
| 131 |
-
"category": "abs",
|
| 132 |
-
"originalName": "How to Do:PLANK HIP DIPS"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":straight Braço Prancha Para Pike",
|
| 136 |
-
"originalTitle": "How to Do:STRAIGHT ARM PLANK TO PIKE",
|
| 137 |
-
"emoji": "🔥",
|
| 138 |
-
"youtubeId": "d_B55dng_bs",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/d_B55dng_bs",
|
| 140 |
-
"duration": "0:48",
|
| 141 |
-
"durationInSeconds": 48,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/d_B55dng_bs/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "12",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 6,
|
| 147 |
-
"category": "abs",
|
| 148 |
-
"originalName": "How to Do:STRAIGHT ARM PLANK TO PIKE"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":oblíquo Abdominal Reach",
|
| 152 |
-
"originalTitle": "How to Do:OBLIQUE CRUNCH REACH",
|
| 153 |
-
"emoji": "🔥",
|
| 154 |
-
"youtubeId": "Z9WtuN50f9s",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/Z9WtuN50f9s",
|
| 156 |
-
"duration": "0:48",
|
| 157 |
-
"durationInSeconds": 48,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/Z9WtuN50f9s/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "12",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 6,
|
| 163 |
-
"category": "abs",
|
| 164 |
-
"originalName": "How to Do:OBLIQUE CRUNCH REACH"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":alpinista Agachamento Thrust",
|
| 168 |
-
"originalTitle": "How to Do:MOUNTAIN CLIMBER SQUAT THRUST",
|
| 169 |
-
"emoji": "🔥",
|
| 170 |
-
"youtubeId": "K0R4snqCbRA",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/K0R4snqCbRA",
|
| 172 |
-
"duration": "0:47",
|
| 173 |
-
"durationInSeconds": 47,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/K0R4snqCbRA/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "12",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 5,
|
| 179 |
-
"category": "abs",
|
| 180 |
-
"originalName": "How to Do:MOUNTAIN CLIMBER SQUAT THRUST"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":starfish Abdominal",
|
| 184 |
-
"originalTitle": "How to Do:STARFISH CRUNCH",
|
| 185 |
-
"emoji": "🔥",
|
| 186 |
-
"youtubeId": "HBB5tf2vndA",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/HBB5tf2vndA",
|
| 188 |
-
"duration": "0:55",
|
| 189 |
-
"durationInSeconds": 55,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/HBB5tf2vndA/maxresdefault.jpg",
|
| 191 |
-
"sets": 3,
|
| 192 |
-
"reps": "40s",
|
| 193 |
-
"rest": 30,
|
| 194 |
-
"calories": 6,
|
| 195 |
-
"category": "abs",
|
| 196 |
-
"originalName": "How to Do:STARFISH CRUNCH"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":crab Chute Para Cima",
|
| 200 |
-
"originalTitle": "How to Do:CRAB KICK UP",
|
| 201 |
-
"emoji": "🔥",
|
| 202 |
-
"youtubeId": "Emknib0y_J4",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/Emknib0y_J4",
|
| 204 |
-
"duration": "0:34",
|
| 205 |
-
"durationInSeconds": 34,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/Emknib0y_J4/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "12",
|
| 209 |
-
"rest": 30,
|
| 210 |
-
"calories": 4,
|
| 211 |
-
"category": "abs",
|
| 212 |
-
"originalName": "How to Do:CRAB KICK UP"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ":lento Alpinista",
|
| 216 |
-
"originalTitle": "How to Do:SLOW MOUNTAIN CLIMBER",
|
| 217 |
-
"emoji": "🔥",
|
| 218 |
-
"youtubeId": "24gpL7t4iPY",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/24gpL7t4iPY",
|
| 220 |
-
"duration": "0:43",
|
| 221 |
-
"durationInSeconds": 43,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/24gpL7t4iPY/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "12",
|
| 225 |
-
"rest": 30,
|
| 226 |
-
"calories": 5,
|
| 227 |
-
"category": "abs",
|
| 228 |
-
"originalName": "How to Do:SLOW MOUNTAIN CLIMBER"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": ":cadeira Bicicleta Abdominal",
|
| 232 |
-
"originalTitle": "How to Do:CHAIR BICYCLE CRUNCH",
|
| 233 |
-
"emoji": "🔥",
|
| 234 |
-
"youtubeId": "1xEZ1So_D-A",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/1xEZ1So_D-A",
|
| 236 |
-
"duration": "0:41",
|
| 237 |
-
"durationInSeconds": 41,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/1xEZ1So_D-A/maxresdefault.jpg",
|
| 239 |
-
"sets": 3,
|
| 240 |
-
"reps": "12",
|
| 241 |
-
"rest": 30,
|
| 242 |
-
"calories": 5,
|
| 243 |
-
"category": "abs",
|
| 244 |
-
"originalName": "How to Do:CHAIR BICYCLE CRUNCH"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": ":spiderman Prancha",
|
| 248 |
-
"originalTitle": "How to Do:SPIDERMAN PLANK",
|
| 249 |
-
"emoji": "🔥",
|
| 250 |
-
"youtubeId": "G8-vocJfWEM",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/G8-vocJfWEM",
|
| 252 |
-
"duration": "0:44",
|
| 253 |
-
"durationInSeconds": 44,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/G8-vocJfWEM/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "12",
|
| 257 |
-
"rest": 30,
|
| 258 |
-
"calories": 5,
|
| 259 |
-
"category": "abs",
|
| 260 |
-
"originalName": "How to Do:SPIDERMAN PLANK"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": ":elbow Prancha Rotation",
|
| 264 |
-
"originalTitle": "How to Do:ELBOW PLANK ROTATION",
|
| 265 |
-
"emoji": "🔥",
|
| 266 |
-
"youtubeId": "fu6-teFilJk",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/fu6-teFilJk",
|
| 268 |
-
"duration": "0:47",
|
| 269 |
-
"durationInSeconds": 47,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/fu6-teFilJk/maxresdefault.jpg",
|
| 271 |
-
"sets": 3,
|
| 272 |
-
"reps": "12",
|
| 273 |
-
"rest": 30,
|
| 274 |
-
"calories": 5,
|
| 275 |
-
"category": "abs",
|
| 276 |
-
"originalName": "How to Do:ELBOW PLANK ROTATION"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": ":lento Alpinista",
|
| 280 |
-
"originalTitle": "How to Do:SLOW MOUNTAIN CLIMBER",
|
| 281 |
-
"emoji": "🔥",
|
| 282 |
-
"youtubeId": "YZstn7BkgvU",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/YZstn7BkgvU",
|
| 284 |
-
"duration": "0:43",
|
| 285 |
-
"durationInSeconds": 43,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/YZstn7BkgvU/maxresdefault.jpg",
|
| 287 |
-
"sets": 3,
|
| 288 |
-
"reps": "12",
|
| 289 |
-
"rest": 30,
|
| 290 |
-
"calories": 5,
|
| 291 |
-
"category": "abs",
|
| 292 |
-
"originalName": "How to Do:SLOW MOUNTAIN CLIMBER"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": ":halter V-para Cima",
|
| 296 |
-
"originalTitle": "How to Do:DUMBBELL V-UP",
|
| 297 |
-
"emoji": "🔥",
|
| 298 |
-
"youtubeId": "Gas9T9-LtHU",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/Gas9T9-LtHU",
|
| 300 |
-
"duration": "0:42",
|
| 301 |
-
"durationInSeconds": 42,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/Gas9T9-LtHU/maxresdefault.jpg",
|
| 303 |
-
"sets": 3,
|
| 304 |
-
"reps": "12",
|
| 305 |
-
"rest": 30,
|
| 306 |
-
"calories": 5,
|
| 307 |
-
"category": "abs",
|
| 308 |
-
"originalName": "How to Do:DUMBBELL V-UP"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": ":starfish Abdominal",
|
| 312 |
-
"originalTitle": "How to Do:STARFISH CRUNCH",
|
| 313 |
-
"emoji": "🔥",
|
| 314 |
-
"youtubeId": "CoTLqNsivCI",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/CoTLqNsivCI",
|
| 316 |
-
"duration": "0:55",
|
| 317 |
-
"durationInSeconds": 55,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/CoTLqNsivCI/maxresdefault.jpg",
|
| 319 |
-
"sets": 3,
|
| 320 |
-
"reps": "40s",
|
| 321 |
-
"rest": 30,
|
| 322 |
-
"calories": 6,
|
| 323 |
-
"category": "abs",
|
| 324 |
-
"originalName": "How to Do:STARFISH CRUNCH"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": ":halter Prancha Rotation",
|
| 328 |
-
"originalTitle": "How to Do:DUMBBELL PLANK ROTATION",
|
| 329 |
-
"emoji": "🔥",
|
| 330 |
-
"youtubeId": "QlwR1Sd57bM",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/QlwR1Sd57bM",
|
| 332 |
-
"duration": "0:45",
|
| 333 |
-
"durationInSeconds": 45,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/QlwR1Sd57bM/maxresdefault.jpg",
|
| 335 |
-
"sets": 3,
|
| 336 |
-
"reps": "12",
|
| 337 |
-
"rest": 30,
|
| 338 |
-
"calories": 5,
|
| 339 |
-
"category": "abs",
|
| 340 |
-
"originalName": "How to Do:DUMBBELL PLANK ROTATION"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": ":oblíquo Crossover Abdominal",
|
| 344 |
-
"originalTitle": "How to Do:OBLIQUE CROSSOVER CRUNCH",
|
| 345 |
-
"emoji": "🔥",
|
| 346 |
-
"youtubeId": "LATqsI5q0hc",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/LATqsI5q0hc",
|
| 348 |
-
"duration": "0:48",
|
| 349 |
-
"durationInSeconds": 48,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/LATqsI5q0hc/maxresdefault.jpg",
|
| 351 |
-
"sets": 3,
|
| 352 |
-
"reps": "12",
|
| 353 |
-
"rest": 30,
|
| 354 |
-
"calories": 6,
|
| 355 |
-
"category": "abs",
|
| 356 |
-
"originalName": "How to Do:OBLIQUE CROSSOVER CRUNCH"
|
| 357 |
-
},
|
| 358 |
-
{
|
| 359 |
-
"name": ":lateral Prancha Joelho Abdominal",
|
| 360 |
-
"originalTitle": "How to Do:SIDE PLANK KNEE CRUNCH",
|
| 361 |
-
"emoji": "🔥",
|
| 362 |
-
"youtubeId": "Ds85Xw3qq9c",
|
| 363 |
-
"embedUrl": "https://www.youtube.com/embed/Ds85Xw3qq9c",
|
| 364 |
-
"duration": "0:56",
|
| 365 |
-
"durationInSeconds": 56,
|
| 366 |
-
"thumbnail": "https://img.youtube.com/vi/Ds85Xw3qq9c/maxresdefault.jpg",
|
| 367 |
-
"sets": 3,
|
| 368 |
-
"reps": "40s",
|
| 369 |
-
"rest": 30,
|
| 370 |
-
"calories": 7,
|
| 371 |
-
"category": "abs",
|
| 372 |
-
"originalName": "How to Do:SIDE PLANK KNEE CRUNCH"
|
| 373 |
-
},
|
| 374 |
-
{
|
| 375 |
-
"name": ":joelholing Lateral Prancha",
|
| 376 |
-
"originalTitle": "How to Do:KNEELING SIDE PLANK",
|
| 377 |
-
"emoji": "🔥",
|
| 378 |
-
"youtubeId": "ZAr0nJn8WPQ",
|
| 379 |
-
"embedUrl": "https://www.youtube.com/embed/ZAr0nJn8WPQ",
|
| 380 |
-
"duration": "0:44",
|
| 381 |
-
"durationInSeconds": 44,
|
| 382 |
-
"thumbnail": "https://img.youtube.com/vi/ZAr0nJn8WPQ/maxresdefault.jpg",
|
| 383 |
-
"sets": 3,
|
| 384 |
-
"reps": "12",
|
| 385 |
-
"rest": 30,
|
| 386 |
-
"calories": 5,
|
| 387 |
-
"category": "abs",
|
| 388 |
-
"originalName": "How to Do:KNEELING SIDE PLANK"
|
| 389 |
-
},
|
| 390 |
-
{
|
| 391 |
-
"name": ":em Pé Oblíquo Abdominales",
|
| 392 |
-
"originalTitle": "How to Do:STANDING OBLIQUE CRUNCHES",
|
| 393 |
-
"emoji": "🔥",
|
| 394 |
-
"youtubeId": "wD2GY3fUJqQ",
|
| 395 |
-
"embedUrl": "https://www.youtube.com/embed/wD2GY3fUJqQ",
|
| 396 |
-
"duration": "0:46",
|
| 397 |
-
"durationInSeconds": 46,
|
| 398 |
-
"thumbnail": "https://img.youtube.com/vi/wD2GY3fUJqQ/maxresdefault.jpg",
|
| 399 |
-
"sets": 3,
|
| 400 |
-
"reps": "12",
|
| 401 |
-
"rest": 30,
|
| 402 |
-
"calories": 5,
|
| 403 |
-
"category": "abs",
|
| 404 |
-
"originalName": "How to Do:STANDING OBLIQUE CRUNCHES"
|
| 405 |
-
},
|
| 406 |
-
{
|
| 407 |
-
"name": ":lateral Prancha Front Chute",
|
| 408 |
-
"originalTitle": "How to Do:SIDE PLANK FRONT KICK",
|
| 409 |
-
"emoji": "🔥",
|
| 410 |
-
"youtubeId": "rhxDpDg7XNM",
|
| 411 |
-
"embedUrl": "https://www.youtube.com/embed/rhxDpDg7XNM",
|
| 412 |
-
"duration": "0:48",
|
| 413 |
-
"durationInSeconds": 48,
|
| 414 |
-
"thumbnail": "https://img.youtube.com/vi/rhxDpDg7XNM/maxresdefault.jpg",
|
| 415 |
-
"sets": 3,
|
| 416 |
-
"reps": "12",
|
| 417 |
-
"rest": 30,
|
| 418 |
-
"calories": 6,
|
| 419 |
-
"category": "abs",
|
| 420 |
-
"originalName": "How to Do:SIDE PLANK FRONT KICK"
|
| 421 |
-
},
|
| 422 |
-
{
|
| 423 |
-
"name": ":flutter Chute Agachamentos",
|
| 424 |
-
"originalTitle": "How to Do:FLUTTER KICK SQUATS",
|
| 425 |
-
"emoji": "🔥",
|
| 426 |
-
"youtubeId": "8zJh1tGtldU",
|
| 427 |
-
"embedUrl": "https://www.youtube.com/embed/8zJh1tGtldU",
|
| 428 |
-
"duration": "0:48",
|
| 429 |
-
"durationInSeconds": 48,
|
| 430 |
-
"thumbnail": "https://img.youtube.com/vi/8zJh1tGtldU/maxresdefault.jpg",
|
| 431 |
-
"sets": 3,
|
| 432 |
-
"reps": "12",
|
| 433 |
-
"rest": 30,
|
| 434 |
-
"calories": 6,
|
| 435 |
-
"category": "abs",
|
| 436 |
-
"originalName": "How to Do:FLUTTER KICK SQUATS"
|
| 437 |
-
},
|
| 438 |
-
{
|
| 439 |
-
"name": ":prancha Taps",
|
| 440 |
-
"originalTitle": "How to Do:PLANK TAPS",
|
| 441 |
-
"emoji": "🔥",
|
| 442 |
-
"youtubeId": "QGnz__47PCo",
|
| 443 |
-
"embedUrl": "https://www.youtube.com/embed/QGnz__47PCo",
|
| 444 |
-
"duration": "0:52",
|
| 445 |
-
"durationInSeconds": 52,
|
| 446 |
-
"thumbnail": "https://img.youtube.com/vi/QGnz__47PCo/maxresdefault.jpg",
|
| 447 |
-
"sets": 3,
|
| 448 |
-
"reps": "40s",
|
| 449 |
-
"rest": 30,
|
| 450 |
-
"calories": 6,
|
| 451 |
-
"category": "abs",
|
| 452 |
-
"originalName": "How to Do:PLANK TAPS"
|
| 453 |
-
},
|
| 454 |
-
{
|
| 455 |
-
"name": ":prancha E Reach",
|
| 456 |
-
"originalTitle": "How to Do:PLANK AND REACH",
|
| 457 |
-
"emoji": "🔥",
|
| 458 |
-
"youtubeId": "PqUi-H1edcE",
|
| 459 |
-
"embedUrl": "https://www.youtube.com/embed/PqUi-H1edcE",
|
| 460 |
-
"duration": "0:33",
|
| 461 |
-
"durationInSeconds": 33,
|
| 462 |
-
"thumbnail": "https://img.youtube.com/vi/PqUi-H1edcE/maxresdefault.jpg",
|
| 463 |
-
"sets": 3,
|
| 464 |
-
"reps": "12",
|
| 465 |
-
"rest": 30,
|
| 466 |
-
"calories": 4,
|
| 467 |
-
"category": "abs",
|
| 468 |
-
"originalName": "How to Do:PLANK AND REACH"
|
| 469 |
-
},
|
| 470 |
-
{
|
| 471 |
-
"name": ":crab Walk",
|
| 472 |
-
"originalTitle": "How to Do:CRAB WALK",
|
| 473 |
-
"emoji": "🔥",
|
| 474 |
-
"youtubeId": "OI-3e5Dcm-I",
|
| 475 |
-
"embedUrl": "https://www.youtube.com/embed/OI-3e5Dcm-I",
|
| 476 |
-
"duration": "0:43",
|
| 477 |
-
"durationInSeconds": 43,
|
| 478 |
-
"thumbnail": "https://img.youtube.com/vi/OI-3e5Dcm-I/maxresdefault.jpg",
|
| 479 |
-
"sets": 3,
|
| 480 |
-
"reps": "12",
|
| 481 |
-
"rest": 30,
|
| 482 |
-
"calories": 5,
|
| 483 |
-
"category": "abs",
|
| 484 |
-
"originalName": "How to Do:CRAB WALK"
|
| 485 |
-
},
|
| 486 |
-
{
|
| 487 |
-
"name": ":para Cima E Para Baixo Prancha",
|
| 488 |
-
"originalTitle": "How to Do:UP AND DOWN PLANK",
|
| 489 |
-
"emoji": "🔥",
|
| 490 |
-
"youtubeId": "Rr1Xq5Hmg7A",
|
| 491 |
-
"embedUrl": "https://www.youtube.com/embed/Rr1Xq5Hmg7A",
|
| 492 |
-
"duration": "0:43",
|
| 493 |
-
"durationInSeconds": 43,
|
| 494 |
-
"thumbnail": "https://img.youtube.com/vi/Rr1Xq5Hmg7A/maxresdefault.jpg",
|
| 495 |
-
"sets": 3,
|
| 496 |
-
"reps": "12",
|
| 497 |
-
"rest": 30,
|
| 498 |
-
"calories": 5,
|
| 499 |
-
"category": "abs",
|
| 500 |
-
"originalName": "How to Do:UP AND DOWN PLANK"
|
| 501 |
-
},
|
| 502 |
-
{
|
| 503 |
-
"name": ":crab Kicks",
|
| 504 |
-
"originalTitle": "How to Do:CRAB KICKS",
|
| 505 |
-
"emoji": "🔥",
|
| 506 |
-
"youtubeId": "4DZzw1Rc-9Y",
|
| 507 |
-
"embedUrl": "https://www.youtube.com/embed/4DZzw1Rc-9Y",
|
| 508 |
-
"duration": "0:53",
|
| 509 |
-
"durationInSeconds": 53,
|
| 510 |
-
"thumbnail": "https://img.youtube.com/vi/4DZzw1Rc-9Y/maxresdefault.jpg",
|
| 511 |
-
"sets": 3,
|
| 512 |
-
"reps": "40s",
|
| 513 |
-
"rest": 30,
|
| 514 |
-
"calories": 6,
|
| 515 |
-
"category": "abs",
|
| 516 |
-
"originalName": "How to Do:CRAB KICKS"
|
| 517 |
-
},
|
| 518 |
-
{
|
| 519 |
-
"name": ":cachorro Apontando",
|
| 520 |
-
"originalTitle": "How to Do:BIRD DOG",
|
| 521 |
-
"emoji": "🔥",
|
| 522 |
-
"youtubeId": "v0oCYe8__bU",
|
| 523 |
-
"embedUrl": "https://www.youtube.com/embed/v0oCYe8__bU",
|
| 524 |
-
"duration": "0:49",
|
| 525 |
-
"durationInSeconds": 49,
|
| 526 |
-
"thumbnail": "https://img.youtube.com/vi/v0oCYe8__bU/maxresdefault.jpg",
|
| 527 |
-
"sets": 3,
|
| 528 |
-
"reps": "12",
|
| 529 |
-
"rest": 30,
|
| 530 |
-
"calories": 6,
|
| 531 |
-
"category": "abs",
|
| 532 |
-
"originalName": "How to Do:BIRD DOG"
|
| 533 |
-
},
|
| 534 |
-
{
|
| 535 |
-
"name": ":diagonal Prancha",
|
| 536 |
-
"originalTitle": "How to Do:DIAGONAL PLANK",
|
| 537 |
-
"emoji": "🔥",
|
| 538 |
-
"youtubeId": "OGfFtF-dhrk",
|
| 539 |
-
"embedUrl": "https://www.youtube.com/embed/OGfFtF-dhrk",
|
| 540 |
-
"duration": "0:43",
|
| 541 |
-
"durationInSeconds": 43,
|
| 542 |
-
"thumbnail": "https://img.youtube.com/vi/OGfFtF-dhrk/maxresdefault.jpg",
|
| 543 |
-
"sets": 3,
|
| 544 |
-
"reps": "12",
|
| 545 |
-
"rest": 30,
|
| 546 |
-
"calories": 5,
|
| 547 |
-
"category": "abs",
|
| 548 |
-
"originalName": "How to Do:DIAGONAL PLANK"
|
| 549 |
-
},
|
| 550 |
-
{
|
| 551 |
-
"name": ":scissors",
|
| 552 |
-
"originalTitle": "How to Do:SCISSORS",
|
| 553 |
-
"emoji": "🔥",
|
| 554 |
-
"youtubeId": "2cc_hUFvTKU",
|
| 555 |
-
"embedUrl": "https://www.youtube.com/embed/2cc_hUFvTKU",
|
| 556 |
-
"duration": "0:39",
|
| 557 |
-
"durationInSeconds": 39,
|
| 558 |
-
"thumbnail": "https://img.youtube.com/vi/2cc_hUFvTKU/maxresdefault.jpg",
|
| 559 |
-
"sets": 3,
|
| 560 |
-
"reps": "12",
|
| 561 |
-
"rest": 30,
|
| 562 |
-
"calories": 5,
|
| 563 |
-
"category": "abs",
|
| 564 |
-
"originalName": "How to Do:SCISSORS"
|
| 565 |
-
},
|
| 566 |
-
{
|
| 567 |
-
"name": ":prancha Jacks",
|
| 568 |
-
"originalTitle": "How to Do:PLANK JACKS",
|
| 569 |
-
"emoji": "🔥",
|
| 570 |
-
"youtubeId": "9A7ZAXxMV0Q",
|
| 571 |
-
"embedUrl": "https://www.youtube.com/embed/9A7ZAXxMV0Q",
|
| 572 |
-
"duration": "0:42",
|
| 573 |
-
"durationInSeconds": 42,
|
| 574 |
-
"thumbnail": "https://img.youtube.com/vi/9A7ZAXxMV0Q/maxresdefault.jpg",
|
| 575 |
-
"sets": 3,
|
| 576 |
-
"reps": "12",
|
| 577 |
-
"rest": 30,
|
| 578 |
-
"calories": 5,
|
| 579 |
-
"category": "abs",
|
| 580 |
-
"originalName": "How to Do:PLANK JACKS"
|
| 581 |
-
},
|
| 582 |
-
{
|
| 583 |
-
"name": ":straight-braço Prancha",
|
| 584 |
-
"originalTitle": "How to Do:STRAIGHT-ARM PLANK",
|
| 585 |
-
"emoji": "🔥",
|
| 586 |
-
"youtubeId": "OxTE4Fu-Kmw",
|
| 587 |
-
"embedUrl": "https://www.youtube.com/embed/OxTE4Fu-Kmw",
|
| 588 |
-
"duration": "0:36",
|
| 589 |
-
"durationInSeconds": 36,
|
| 590 |
-
"thumbnail": "https://img.youtube.com/vi/OxTE4Fu-Kmw/maxresdefault.jpg",
|
| 591 |
-
"sets": 3,
|
| 592 |
-
"reps": "12",
|
| 593 |
-
"rest": 30,
|
| 594 |
-
"calories": 4,
|
| 595 |
-
"category": "abs",
|
| 596 |
-
"originalName": "How to Do:STRAIGHT-ARM PLANK"
|
| 597 |
-
},
|
| 598 |
-
{
|
| 599 |
-
"name": ":joelho Para Elbow Abdominales",
|
| 600 |
-
"originalTitle": "How to Do:KNEE TO ELBOW CRUNCHES",
|
| 601 |
-
"emoji": "🔥",
|
| 602 |
-
"youtubeId": "IqU06UsPp1k",
|
| 603 |
-
"embedUrl": "https://www.youtube.com/embed/IqU06UsPp1k",
|
| 604 |
-
"duration": "0:45",
|
| 605 |
-
"durationInSeconds": 45,
|
| 606 |
-
"thumbnail": "https://img.youtube.com/vi/IqU06UsPp1k/maxresdefault.jpg",
|
| 607 |
-
"sets": 3,
|
| 608 |
-
"reps": "12",
|
| 609 |
-
"rest": 30,
|
| 610 |
-
"calories": 5,
|
| 611 |
-
"category": "abs",
|
| 612 |
-
"originalName": "How to Do:KNEE TO ELBOW CRUNCHES"
|
| 613 |
-
},
|
| 614 |
-
{
|
| 615 |
-
"name": ":lateral Prancha Walk",
|
| 616 |
-
"originalTitle": "How to Do:LATERAL PLANK WALK",
|
| 617 |
-
"emoji": "🔥",
|
| 618 |
-
"youtubeId": "yCVyaX-RjLM",
|
| 619 |
-
"embedUrl": "https://www.youtube.com/embed/yCVyaX-RjLM",
|
| 620 |
-
"duration": "0:49",
|
| 621 |
-
"durationInSeconds": 49,
|
| 622 |
-
"thumbnail": "https://img.youtube.com/vi/yCVyaX-RjLM/maxresdefault.jpg",
|
| 623 |
-
"sets": 3,
|
| 624 |
-
"reps": "12",
|
| 625 |
-
"rest": 30,
|
| 626 |
-
"calories": 6,
|
| 627 |
-
"category": "abs",
|
| 628 |
-
"originalName": "How to Do:LATERAL PLANK WALK"
|
| 629 |
-
},
|
| 630 |
-
{
|
| 631 |
-
"name": ":straight Elevação De Perna",
|
| 632 |
-
"originalTitle": "How to Do:STRAIGHT LEG RAISE",
|
| 633 |
-
"emoji": "🔥",
|
| 634 |
-
"youtubeId": "cyGrjzTbvKs",
|
| 635 |
-
"embedUrl": "https://www.youtube.com/embed/cyGrjzTbvKs",
|
| 636 |
-
"duration": "0:50",
|
| 637 |
-
"durationInSeconds": 50,
|
| 638 |
-
"thumbnail": "https://img.youtube.com/vi/cyGrjzTbvKs/maxresdefault.jpg",
|
| 639 |
-
"sets": 3,
|
| 640 |
-
"reps": "40s",
|
| 641 |
-
"rest": 30,
|
| 642 |
-
"calories": 6,
|
| 643 |
-
"category": "abs",
|
| 644 |
-
"originalName": "How to Do:STRAIGHT LEG RAISE"
|
| 645 |
-
},
|
| 646 |
-
{
|
| 647 |
-
"name": ":crossover Abdominal",
|
| 648 |
-
"originalTitle": "How to Do:CROSSOVER CRUNCH",
|
| 649 |
-
"emoji": "🔥",
|
| 650 |
-
"youtubeId": "q2_KHKE5CDE",
|
| 651 |
-
"embedUrl": "https://www.youtube.com/embed/q2_KHKE5CDE",
|
| 652 |
-
"duration": "0:50",
|
| 653 |
-
"durationInSeconds": 50,
|
| 654 |
-
"thumbnail": "https://img.youtube.com/vi/q2_KHKE5CDE/maxresdefault.jpg",
|
| 655 |
-
"sets": 3,
|
| 656 |
-
"reps": "40s",
|
| 657 |
-
"rest": 30,
|
| 658 |
-
"calories": 6,
|
| 659 |
-
"category": "abs",
|
| 660 |
-
"originalName": "How to Do:CROSSOVER CRUNCH"
|
| 661 |
-
},
|
| 662 |
-
{
|
| 663 |
-
"name": ":braço Scissors",
|
| 664 |
-
"originalTitle": "How to Do:ARM SCISSORS",
|
| 665 |
-
"emoji": "🔥",
|
| 666 |
-
"youtubeId": "pFrJQ-MyL10",
|
| 667 |
-
"embedUrl": "https://www.youtube.com/embed/pFrJQ-MyL10",
|
| 668 |
-
"duration": "0:46",
|
| 669 |
-
"durationInSeconds": 46,
|
| 670 |
-
"thumbnail": "https://img.youtube.com/vi/pFrJQ-MyL10/maxresdefault.jpg",
|
| 671 |
-
"sets": 3,
|
| 672 |
-
"reps": "12",
|
| 673 |
-
"rest": 30,
|
| 674 |
-
"calories": 5,
|
| 675 |
-
"category": "abs",
|
| 676 |
-
"originalName": "How to Do:ARM SCISSORS"
|
| 677 |
-
},
|
| 678 |
-
{
|
| 679 |
-
"name": ":reverse Flutter Kicks",
|
| 680 |
-
"originalTitle": "How to Do:REVERSE FLUTTER KICKS",
|
| 681 |
-
"emoji": "🔥",
|
| 682 |
-
"youtubeId": "UsO66ZUvzb0",
|
| 683 |
-
"embedUrl": "https://www.youtube.com/embed/UsO66ZUvzb0",
|
| 684 |
-
"duration": "0:38",
|
| 685 |
-
"durationInSeconds": 38,
|
| 686 |
-
"thumbnail": "https://img.youtube.com/vi/UsO66ZUvzb0/maxresdefault.jpg",
|
| 687 |
-
"sets": 3,
|
| 688 |
-
"reps": "12",
|
| 689 |
-
"rest": 30,
|
| 690 |
-
"calories": 4,
|
| 691 |
-
"category": "abs",
|
| 692 |
-
"originalName": "How to Do:REVERSE FLUTTER KICKS"
|
| 693 |
-
},
|
| 694 |
-
{
|
| 695 |
-
"name": ":prancha Perna Para Cima",
|
| 696 |
-
"originalTitle": "How to Do:PLANK LEG UP",
|
| 697 |
-
"emoji": "🔥",
|
| 698 |
-
"youtubeId": "O9j5_BriCW4",
|
| 699 |
-
"embedUrl": "https://www.youtube.com/embed/O9j5_BriCW4",
|
| 700 |
-
"duration": "0:51",
|
| 701 |
-
"durationInSeconds": 51,
|
| 702 |
-
"thumbnail": "https://img.youtube.com/vi/O9j5_BriCW4/maxresdefault.jpg",
|
| 703 |
-
"sets": 3,
|
| 704 |
-
"reps": "40s",
|
| 705 |
-
"rest": 30,
|
| 706 |
-
"calories": 6,
|
| 707 |
-
"category": "abs",
|
| 708 |
-
"originalName": "How to Do:PLANK LEG UP"
|
| 709 |
-
},
|
| 710 |
-
{
|
| 711 |
-
"name": "Abdominal Kicks",
|
| 712 |
-
"originalTitle": "How to Do: CRUNCH KICKS",
|
| 713 |
-
"emoji": "🔥",
|
| 714 |
-
"youtubeId": "z0zwPZrPpXc",
|
| 715 |
-
"embedUrl": "https://www.youtube.com/embed/z0zwPZrPpXc",
|
| 716 |
-
"duration": "0:50",
|
| 717 |
-
"durationInSeconds": 50,
|
| 718 |
-
"thumbnail": "https://img.youtube.com/vi/z0zwPZrPpXc/maxresdefault.jpg",
|
| 719 |
-
"sets": 3,
|
| 720 |
-
"reps": "40s",
|
| 721 |
-
"rest": 30,
|
| 722 |
-
"calories": 6,
|
| 723 |
-
"category": "abs",
|
| 724 |
-
"originalName": "How to Do: CRUNCH KICKS"
|
| 725 |
-
},
|
| 726 |
-
{
|
| 727 |
-
"name": ":halter Abdominales",
|
| 728 |
-
"originalTitle": "How to Do:DUMBBELL CRUNCHES",
|
| 729 |
-
"emoji": "🔥",
|
| 730 |
-
"youtubeId": "wngf6BI012Y",
|
| 731 |
-
"embedUrl": "https://www.youtube.com/embed/wngf6BI012Y",
|
| 732 |
-
"duration": "0:43",
|
| 733 |
-
"durationInSeconds": 43,
|
| 734 |
-
"thumbnail": "https://img.youtube.com/vi/wngf6BI012Y/maxresdefault.jpg",
|
| 735 |
-
"sets": 3,
|
| 736 |
-
"reps": "12",
|
| 737 |
-
"rest": 30,
|
| 738 |
-
"calories": 5,
|
| 739 |
-
"category": "abs",
|
| 740 |
-
"originalName": "How to Do:DUMBBELL CRUNCHES"
|
| 741 |
-
},
|
| 742 |
-
{
|
| 743 |
-
"name": ":alt V-para Cima",
|
| 744 |
-
"originalTitle": "How to Do:ALT V-UP",
|
| 745 |
-
"emoji": "🔥",
|
| 746 |
-
"youtubeId": "k8_a4wFtG1I",
|
| 747 |
-
"embedUrl": "https://www.youtube.com/embed/k8_a4wFtG1I",
|
| 748 |
-
"duration": "0:53",
|
| 749 |
-
"durationInSeconds": 53,
|
| 750 |
-
"thumbnail": "https://img.youtube.com/vi/k8_a4wFtG1I/maxresdefault.jpg",
|
| 751 |
-
"sets": 3,
|
| 752 |
-
"reps": "40s",
|
| 753 |
-
"rest": 30,
|
| 754 |
-
"calories": 6,
|
| 755 |
-
"category": "abs",
|
| 756 |
-
"originalName": "How to Do:ALT V-UP"
|
| 757 |
-
},
|
| 758 |
-
{
|
| 759 |
-
"name": "Elevação De Pernas",
|
| 760 |
-
"originalTitle": "How to Do: LEG RAISES",
|
| 761 |
-
"emoji": "🔥",
|
| 762 |
-
"youtubeId": "dGKbTKLnym4",
|
| 763 |
-
"embedUrl": "https://www.youtube.com/embed/dGKbTKLnym4",
|
| 764 |
-
"duration": "0:49",
|
| 765 |
-
"durationInSeconds": 49,
|
| 766 |
-
"thumbnail": "https://img.youtube.com/vi/dGKbTKLnym4/maxresdefault.jpg",
|
| 767 |
-
"sets": 3,
|
| 768 |
-
"reps": "12",
|
| 769 |
-
"rest": 30,
|
| 770 |
-
"calories": 6,
|
| 771 |
-
"category": "abs",
|
| 772 |
-
"originalName": "How to Do: LEG RAISES"
|
| 773 |
-
},
|
| 774 |
-
{
|
| 775 |
-
"name": "Reverse Abdominales",
|
| 776 |
-
"originalTitle": "How to Do: REVERSE CRUNCHES",
|
| 777 |
-
"emoji": "🔥",
|
| 778 |
-
"youtubeId": "UwRfRN5fYRg",
|
| 779 |
-
"embedUrl": "https://www.youtube.com/embed/UwRfRN5fYRg",
|
| 780 |
-
"duration": "0:42",
|
| 781 |
-
"durationInSeconds": 42,
|
| 782 |
-
"thumbnail": "https://img.youtube.com/vi/UwRfRN5fYRg/maxresdefault.jpg",
|
| 783 |
-
"sets": 3,
|
| 784 |
-
"reps": "12",
|
| 785 |
-
"rest": 30,
|
| 786 |
-
"calories": 5,
|
| 787 |
-
"category": "abs",
|
| 788 |
-
"originalName": "How to Do: REVERSE CRUNCHES"
|
| 789 |
-
},
|
| 790 |
-
{
|
| 791 |
-
"name": "Cross Joelho Prancha",
|
| 792 |
-
"originalTitle": "How to Do: CROSS KNEE PLANK",
|
| 793 |
-
"emoji": "🔥",
|
| 794 |
-
"youtubeId": "O4fFIYpYySU",
|
| 795 |
-
"embedUrl": "https://www.youtube.com/embed/O4fFIYpYySU",
|
| 796 |
-
"duration": "0:49",
|
| 797 |
-
"durationInSeconds": 49,
|
| 798 |
-
"thumbnail": "https://img.youtube.com/vi/O4fFIYpYySU/maxresdefault.jpg",
|
| 799 |
-
"sets": 3,
|
| 800 |
-
"reps": "12",
|
| 801 |
-
"rest": 30,
|
| 802 |
-
"calories": 6,
|
| 803 |
-
"category": "abs",
|
| 804 |
-
"originalName": "How to Do: CROSS KNEE PLANK"
|
| 805 |
-
},
|
| 806 |
-
{
|
| 807 |
-
"name": ":sentado Abdômen Circles",
|
| 808 |
-
"originalTitle": "How to Do:SEATED ABS CIRCLES",
|
| 809 |
-
"emoji": "🔥",
|
| 810 |
-
"youtubeId": "GflQ_ymx9Nw",
|
| 811 |
-
"embedUrl": "https://www.youtube.com/embed/GflQ_ymx9Nw",
|
| 812 |
-
"duration": "0:48",
|
| 813 |
-
"durationInSeconds": 48,
|
| 814 |
-
"thumbnail": "https://img.youtube.com/vi/GflQ_ymx9Nw/maxresdefault.jpg",
|
| 815 |
-
"sets": 3,
|
| 816 |
-
"reps": "12",
|
| 817 |
-
"rest": 30,
|
| 818 |
-
"calories": 6,
|
| 819 |
-
"category": "abs",
|
| 820 |
-
"originalName": "How to Do:SEATED ABS CIRCLES"
|
| 821 |
-
},
|
| 822 |
-
{
|
| 823 |
-
"name": "Alpinista",
|
| 824 |
-
"originalTitle": "How to Do: MOUNTAIN CLIMBER",
|
| 825 |
-
"emoji": "🔥",
|
| 826 |
-
"youtubeId": "wQq3ybaLZeA",
|
| 827 |
-
"embedUrl": "https://www.youtube.com/embed/wQq3ybaLZeA",
|
| 828 |
-
"duration": "0:45",
|
| 829 |
-
"durationInSeconds": 45,
|
| 830 |
-
"thumbnail": "https://img.youtube.com/vi/wQq3ybaLZeA/maxresdefault.jpg",
|
| 831 |
-
"sets": 3,
|
| 832 |
-
"reps": "12",
|
| 833 |
-
"rest": 30,
|
| 834 |
-
"calories": 5,
|
| 835 |
-
"category": "abs",
|
| 836 |
-
"originalName": "How to Do: MOUNTAIN CLIMBER"
|
| 837 |
-
},
|
| 838 |
-
{
|
| 839 |
-
"name": "Lateral Abdominales",
|
| 840 |
-
"originalTitle": "How to Do: SIDE CRUNCHES",
|
| 841 |
-
"emoji": "🔥",
|
| 842 |
-
"youtubeId": "w0OWFjfI3zM",
|
| 843 |
-
"embedUrl": "https://www.youtube.com/embed/w0OWFjfI3zM",
|
| 844 |
-
"duration": "0:43",
|
| 845 |
-
"durationInSeconds": 43,
|
| 846 |
-
"thumbnail": "https://img.youtube.com/vi/w0OWFjfI3zM/maxresdefault.jpg",
|
| 847 |
-
"sets": 3,
|
| 848 |
-
"reps": "12",
|
| 849 |
-
"rest": 30,
|
| 850 |
-
"calories": 5,
|
| 851 |
-
"category": "abs",
|
| 852 |
-
"originalName": "How to Do: SIDE CRUNCHES"
|
| 853 |
-
},
|
| 854 |
-
{
|
| 855 |
-
"name": "Abdominales Com Pernas Raised",
|
| 856 |
-
"originalTitle": "How to Do: CRUNCHES WITH LEGS RAISED",
|
| 857 |
-
"emoji": "🔥",
|
| 858 |
-
"youtubeId": "ulSBgyB8evM",
|
| 859 |
-
"embedUrl": "https://www.youtube.com/embed/ulSBgyB8evM",
|
| 860 |
-
"duration": "0:48",
|
| 861 |
-
"durationInSeconds": 48,
|
| 862 |
-
"thumbnail": "https://img.youtube.com/vi/ulSBgyB8evM/maxresdefault.jpg",
|
| 863 |
-
"sets": 3,
|
| 864 |
-
"reps": "12",
|
| 865 |
-
"rest": 30,
|
| 866 |
-
"calories": 6,
|
| 867 |
-
"category": "abs",
|
| 868 |
-
"originalName": "How to Do: CRUNCHES WITH LEGS RAISED"
|
| 869 |
-
},
|
| 870 |
-
{
|
| 871 |
-
"name": ":t Prancha",
|
| 872 |
-
"originalTitle": "How to Do:T PLANK",
|
| 873 |
-
"emoji": "🔥",
|
| 874 |
-
"youtubeId": "rTY5mqJ1HNo",
|
| 875 |
-
"embedUrl": "https://www.youtube.com/embed/rTY5mqJ1HNo",
|
| 876 |
-
"duration": "0:54",
|
| 877 |
-
"durationInSeconds": 54,
|
| 878 |
-
"thumbnail": "https://img.youtube.com/vi/rTY5mqJ1HNo/maxresdefault.jpg",
|
| 879 |
-
"sets": 3,
|
| 880 |
-
"reps": "40s",
|
| 881 |
-
"rest": 30,
|
| 882 |
-
"calories": 6,
|
| 883 |
-
"category": "abs",
|
| 884 |
-
"originalName": "How to Do:T PLANK"
|
| 885 |
-
},
|
| 886 |
-
{
|
| 887 |
-
"name": ":halter Toe-touch Abdominal",
|
| 888 |
-
"originalTitle": "How to Do:DUMBBELL TOE-TOUCH CRUNCH",
|
| 889 |
-
"emoji": "🔥",
|
| 890 |
-
"youtubeId": "maPIOGXENjs",
|
| 891 |
-
"embedUrl": "https://www.youtube.com/embed/maPIOGXENjs",
|
| 892 |
-
"duration": "0:51",
|
| 893 |
-
"durationInSeconds": 51,
|
| 894 |
-
"thumbnail": "https://img.youtube.com/vi/maPIOGXENjs/maxresdefault.jpg",
|
| 895 |
-
"sets": 3,
|
| 896 |
-
"reps": "40s",
|
| 897 |
-
"rest": 30,
|
| 898 |
-
"calories": 6,
|
| 899 |
-
"category": "abs",
|
| 900 |
-
"originalName": "How to Do:DUMBBELL TOE-TOUCH CRUNCH"
|
| 901 |
-
},
|
| 902 |
-
{
|
| 903 |
-
"name": ":oblíquo V-ups",
|
| 904 |
-
"originalTitle": "How to Do:OBLIQUE V-UPS",
|
| 905 |
-
"emoji": "🔥",
|
| 906 |
-
"youtubeId": "iFaZ095MMGg",
|
| 907 |
-
"embedUrl": "https://www.youtube.com/embed/iFaZ095MMGg",
|
| 908 |
-
"duration": "0:50",
|
| 909 |
-
"durationInSeconds": 50,
|
| 910 |
-
"thumbnail": "https://img.youtube.com/vi/iFaZ095MMGg/maxresdefault.jpg",
|
| 911 |
-
"sets": 3,
|
| 912 |
-
"reps": "40s",
|
| 913 |
-
"rest": 30,
|
| 914 |
-
"calories": 6,
|
| 915 |
-
"category": "abs",
|
| 916 |
-
"originalName": "How to Do:OBLIQUE V-UPS"
|
| 917 |
-
},
|
| 918 |
-
{
|
| 919 |
-
"name": "X Man Abdominal",
|
| 920 |
-
"originalTitle": "How to Do: X MAN CRUNCH",
|
| 921 |
-
"emoji": "🔥",
|
| 922 |
-
"youtubeId": "f_ZsJgaqFNE",
|
| 923 |
-
"embedUrl": "https://www.youtube.com/embed/f_ZsJgaqFNE",
|
| 924 |
-
"duration": "0:50",
|
| 925 |
-
"durationInSeconds": 50,
|
| 926 |
-
"thumbnail": "https://img.youtube.com/vi/f_ZsJgaqFNE/maxresdefault.jpg",
|
| 927 |
-
"sets": 3,
|
| 928 |
-
"reps": "40s",
|
| 929 |
-
"rest": 30,
|
| 930 |
-
"calories": 6,
|
| 931 |
-
"category": "abs",
|
| 932 |
-
"originalName": "How to Do: X MAN CRUNCH"
|
| 933 |
-
},
|
| 934 |
-
{
|
| 935 |
-
"name": "Reverse Abdominales Com Elevação De Pernad",
|
| 936 |
-
"originalTitle": "How to Do: REVERSE CRUNCHES WITH LEG RAISED",
|
| 937 |
-
"emoji": "🔥",
|
| 938 |
-
"youtubeId": "dV8ll1vnle0",
|
| 939 |
-
"embedUrl": "https://www.youtube.com/embed/dV8ll1vnle0",
|
| 940 |
-
"duration": "0:51",
|
| 941 |
-
"durationInSeconds": 51,
|
| 942 |
-
"thumbnail": "https://img.youtube.com/vi/dV8ll1vnle0/maxresdefault.jpg",
|
| 943 |
-
"sets": 3,
|
| 944 |
-
"reps": "40s",
|
| 945 |
-
"rest": 30,
|
| 946 |
-
"calories": 6,
|
| 947 |
-
"category": "abs",
|
| 948 |
-
"originalName": "How to Do: REVERSE CRUNCHES WITH LEG RAISED"
|
| 949 |
-
},
|
| 950 |
-
{
|
| 951 |
-
"name": ":halter Bicicleta Passes",
|
| 952 |
-
"originalTitle": "How to Do:DUMBBELL BICYCLE PASSES",
|
| 953 |
-
"emoji": "🔥",
|
| 954 |
-
"youtubeId": "WfL6YEINfV8",
|
| 955 |
-
"embedUrl": "https://www.youtube.com/embed/WfL6YEINfV8",
|
| 956 |
-
"duration": "0:46",
|
| 957 |
-
"durationInSeconds": 46,
|
| 958 |
-
"thumbnail": "https://img.youtube.com/vi/WfL6YEINfV8/maxresdefault.jpg",
|
| 959 |
-
"sets": 3,
|
| 960 |
-
"reps": "12",
|
| 961 |
-
"rest": 30,
|
| 962 |
-
"calories": 5,
|
| 963 |
-
"category": "abs",
|
| 964 |
-
"originalName": "How to Do:DUMBBELL BICYCLE PASSES"
|
| 965 |
-
},
|
| 966 |
-
{
|
| 967 |
-
"name": ":90/90 Abdominal",
|
| 968 |
-
"originalTitle": "How to Do:90/90 CRUNCH",
|
| 969 |
-
"emoji": "🔥",
|
| 970 |
-
"youtubeId": "KojXAk4lXkE",
|
| 971 |
-
"embedUrl": "https://www.youtube.com/embed/KojXAk4lXkE",
|
| 972 |
-
"duration": "0:50",
|
| 973 |
-
"durationInSeconds": 50,
|
| 974 |
-
"thumbnail": "https://img.youtube.com/vi/KojXAk4lXkE/maxresdefault.jpg",
|
| 975 |
-
"sets": 3,
|
| 976 |
-
"reps": "40s",
|
| 977 |
-
"rest": 30,
|
| 978 |
-
"calories": 6,
|
| 979 |
-
"category": "abs",
|
| 980 |
-
"originalName": "How to Do:90/90 CRUNCH"
|
| 981 |
-
},
|
| 982 |
-
{
|
| 983 |
-
"name": "Abdominal Abdominales",
|
| 984 |
-
"originalTitle": "How to Do: ABDOMINAL CRUNCHES",
|
| 985 |
-
"emoji": "🔥",
|
| 986 |
-
"youtubeId": "RUNrHkbP4Pc",
|
| 987 |
-
"embedUrl": "https://www.youtube.com/embed/RUNrHkbP4Pc",
|
| 988 |
-
"duration": "0:46",
|
| 989 |
-
"durationInSeconds": 46,
|
| 990 |
-
"thumbnail": "https://img.youtube.com/vi/RUNrHkbP4Pc/maxresdefault.jpg",
|
| 991 |
-
"sets": 3,
|
| 992 |
-
"reps": "12",
|
| 993 |
-
"rest": 30,
|
| 994 |
-
"calories": 5,
|
| 995 |
-
"category": "abs",
|
| 996 |
-
"originalName": "How to Do: ABDOMINAL CRUNCHES"
|
| 997 |
-
},
|
| 998 |
-
{
|
| 999 |
-
"name": "Clapping Abdominales",
|
| 1000 |
-
"originalTitle": "How to Do: CLAPPING CRUNCHES",
|
| 1001 |
-
"emoji": "🔥",
|
| 1002 |
-
"youtubeId": "LUQt2wSOFNM",
|
| 1003 |
-
"embedUrl": "https://www.youtube.com/embed/LUQt2wSOFNM",
|
| 1004 |
-
"duration": "0:45",
|
| 1005 |
-
"durationInSeconds": 45,
|
| 1006 |
-
"thumbnail": "https://img.youtube.com/vi/LUQt2wSOFNM/maxresdefault.jpg",
|
| 1007 |
-
"sets": 3,
|
| 1008 |
-
"reps": "12",
|
| 1009 |
-
"rest": 30,
|
| 1010 |
-
"calories": 5,
|
| 1011 |
-
"category": "abs",
|
| 1012 |
-
"originalName": "How to Do: CLAPPING CRUNCHES"
|
| 1013 |
-
},
|
| 1014 |
-
{
|
| 1015 |
-
"name": "Flutter Kicks",
|
| 1016 |
-
"originalTitle": "How to Do: FLUTTER KICKS",
|
| 1017 |
-
"emoji": "🔥",
|
| 1018 |
-
"youtubeId": "K5wuM_gNWyw",
|
| 1019 |
-
"embedUrl": "https://www.youtube.com/embed/K5wuM_gNWyw",
|
| 1020 |
-
"duration": "0:44",
|
| 1021 |
-
"durationInSeconds": 44,
|
| 1022 |
-
"thumbnail": "https://img.youtube.com/vi/K5wuM_gNWyw/maxresdefault.jpg",
|
| 1023 |
-
"sets": 3,
|
| 1024 |
-
"reps": "12",
|
| 1025 |
-
"rest": 30,
|
| 1026 |
-
"calories": 5,
|
| 1027 |
-
"category": "abs",
|
| 1028 |
-
"originalName": "How to Do: FLUTTER KICKS"
|
| 1029 |
-
},
|
| 1030 |
-
{
|
| 1031 |
-
"name": "Lateral Elevação De Perna",
|
| 1032 |
-
"originalTitle": "How to Do: SIDE LEG RAISE",
|
| 1033 |
-
"emoji": "🔥",
|
| 1034 |
-
"youtubeId": "Z_0p0I8B4EU",
|
| 1035 |
-
"embedUrl": "https://www.youtube.com/embed/Z_0p0I8B4EU",
|
| 1036 |
-
"duration": "0:40",
|
| 1037 |
-
"durationInSeconds": 40,
|
| 1038 |
-
"thumbnail": "https://img.youtube.com/vi/Z_0p0I8B4EU/maxresdefault.jpg",
|
| 1039 |
-
"sets": 3,
|
| 1040 |
-
"reps": "12",
|
| 1041 |
-
"rest": 30,
|
| 1042 |
-
"calories": 5,
|
| 1043 |
-
"category": "abs",
|
| 1044 |
-
"originalName": "How to Do: SIDE LEG RAISE"
|
| 1045 |
-
},
|
| 1046 |
-
{
|
| 1047 |
-
"name": "Cross Braço Abdominales",
|
| 1048 |
-
"originalTitle": "How to Do: CROSS ARM CRUNCHES",
|
| 1049 |
-
"emoji": "🔥",
|
| 1050 |
-
"youtubeId": "Qz3ylqqJ90M",
|
| 1051 |
-
"embedUrl": "https://www.youtube.com/embed/Qz3ylqqJ90M",
|
| 1052 |
-
"duration": "0:52",
|
| 1053 |
-
"durationInSeconds": 52,
|
| 1054 |
-
"thumbnail": "https://img.youtube.com/vi/Qz3ylqqJ90M/maxresdefault.jpg",
|
| 1055 |
-
"sets": 3,
|
| 1056 |
-
"reps": "40s",
|
| 1057 |
-
"rest": 30,
|
| 1058 |
-
"calories": 6,
|
| 1059 |
-
"category": "abs",
|
| 1060 |
-
"originalName": "How to Do: CROSS ARM CRUNCHES"
|
| 1061 |
-
},
|
| 1062 |
-
{
|
| 1063 |
-
"name": "Long Braço Abdominales",
|
| 1064 |
-
"originalTitle": "How to Do: LONG ARM CRUNCHES",
|
| 1065 |
-
"emoji": "🔥",
|
| 1066 |
-
"youtubeId": "GxKoSEkmRC8",
|
| 1067 |
-
"embedUrl": "https://www.youtube.com/embed/GxKoSEkmRC8",
|
| 1068 |
-
"duration": "0:48",
|
| 1069 |
-
"durationInSeconds": 48,
|
| 1070 |
-
"thumbnail": "https://img.youtube.com/vi/GxKoSEkmRC8/maxresdefault.jpg",
|
| 1071 |
-
"sets": 3,
|
| 1072 |
-
"reps": "12",
|
| 1073 |
-
"rest": 30,
|
| 1074 |
-
"calories": 6,
|
| 1075 |
-
"category": "abs",
|
| 1076 |
-
"originalName": "How to Do: LONG ARM CRUNCHES"
|
| 1077 |
-
},
|
| 1078 |
-
{
|
| 1079 |
-
"name": "Prancha",
|
| 1080 |
-
"originalTitle": "How to Do: PLANK",
|
| 1081 |
-
"emoji": "🔥",
|
| 1082 |
-
"youtubeId": "Fcbw82ykBvY",
|
| 1083 |
-
"embedUrl": "https://www.youtube.com/embed/Fcbw82ykBvY",
|
| 1084 |
-
"duration": "0:41",
|
| 1085 |
-
"durationInSeconds": 41,
|
| 1086 |
-
"thumbnail": "https://img.youtube.com/vi/Fcbw82ykBvY/maxresdefault.jpg",
|
| 1087 |
-
"sets": 3,
|
| 1088 |
-
"reps": "12",
|
| 1089 |
-
"rest": 30,
|
| 1090 |
-
"calories": 5,
|
| 1091 |
-
"category": "abs",
|
| 1092 |
-
"originalName": "How to Do: PLANK"
|
| 1093 |
-
},
|
| 1094 |
-
{
|
| 1095 |
-
"name": "Russian Torção",
|
| 1096 |
-
"originalTitle": "How to Do: RUSSIAN TWIST",
|
| 1097 |
-
"emoji": "🔥",
|
| 1098 |
-
"youtubeId": "DJQGX2J4IVw",
|
| 1099 |
-
"embedUrl": "https://www.youtube.com/embed/DJQGX2J4IVw",
|
| 1100 |
-
"duration": "0:35",
|
| 1101 |
-
"durationInSeconds": 35,
|
| 1102 |
-
"thumbnail": "https://img.youtube.com/vi/DJQGX2J4IVw/maxresdefault.jpg",
|
| 1103 |
-
"sets": 3,
|
| 1104 |
-
"reps": "12",
|
| 1105 |
-
"rest": 30,
|
| 1106 |
-
"calories": 4,
|
| 1107 |
-
"category": "abs",
|
| 1108 |
-
"originalName": "How to Do: RUSSIAN TWIST"
|
| 1109 |
-
},
|
| 1110 |
-
{
|
| 1111 |
-
"name": ":v Abdominal",
|
| 1112 |
-
"originalTitle": "How to Do:V CRUNCH",
|
| 1113 |
-
"emoji": "🔥",
|
| 1114 |
-
"youtubeId": "AkHgaJiwtFE",
|
| 1115 |
-
"embedUrl": "https://www.youtube.com/embed/AkHgaJiwtFE",
|
| 1116 |
-
"duration": "0:48",
|
| 1117 |
-
"durationInSeconds": 48,
|
| 1118 |
-
"thumbnail": "https://img.youtube.com/vi/AkHgaJiwtFE/maxresdefault.jpg",
|
| 1119 |
-
"sets": 3,
|
| 1120 |
-
"reps": "12",
|
| 1121 |
-
"rest": 30,
|
| 1122 |
-
"calories": 6,
|
| 1123 |
-
"category": "abs",
|
| 1124 |
-
"originalName": "How to Do:V CRUNCH"
|
| 1125 |
-
},
|
| 1126 |
-
{
|
| 1127 |
-
"name": "Em Pé Bicicleta Abdominales",
|
| 1128 |
-
"originalTitle": "How to Do: STANDING BICYCLE CRUNCHES",
|
| 1129 |
-
"emoji": "🔥",
|
| 1130 |
-
"youtubeId": "8lsAXzvVHrc",
|
| 1131 |
-
"embedUrl": "https://www.youtube.com/embed/8lsAXzvVHrc",
|
| 1132 |
-
"duration": "0:50",
|
| 1133 |
-
"durationInSeconds": 50,
|
| 1134 |
-
"thumbnail": "https://img.youtube.com/vi/8lsAXzvVHrc/maxresdefault.jpg",
|
| 1135 |
-
"sets": 3,
|
| 1136 |
-
"reps": "40s",
|
| 1137 |
-
"rest": 30,
|
| 1138 |
-
"calories": 6,
|
| 1139 |
-
"category": "abs",
|
| 1140 |
-
"originalName": "How to Do: STANDING BICYCLE CRUNCHES"
|
| 1141 |
-
},
|
| 1142 |
-
{
|
| 1143 |
-
"name": "Lateral Prancha",
|
| 1144 |
-
"originalTitle": "How to Do: SIDE PLANK",
|
| 1145 |
-
"emoji": "🔥",
|
| 1146 |
-
"youtubeId": "2W96p2PIoPg",
|
| 1147 |
-
"embedUrl": "https://www.youtube.com/embed/2W96p2PIoPg",
|
| 1148 |
-
"duration": "0:43",
|
| 1149 |
-
"durationInSeconds": 43,
|
| 1150 |
-
"thumbnail": "https://img.youtube.com/vi/2W96p2PIoPg/maxresdefault.jpg",
|
| 1151 |
-
"sets": 3,
|
| 1152 |
-
"reps": "12",
|
| 1153 |
-
"rest": 30,
|
| 1154 |
-
"calories": 5,
|
| 1155 |
-
"category": "abs",
|
| 1156 |
-
"originalName": "How to Do: SIDE PLANK"
|
| 1157 |
-
},
|
| 1158 |
-
{
|
| 1159 |
-
"name": "Bicicleta Abdominales",
|
| 1160 |
-
"originalTitle": "How to Do: BICYCLE CRUNCHES",
|
| 1161 |
-
"emoji": "🔥",
|
| 1162 |
-
"youtubeId": "-nJkAJpQemI",
|
| 1163 |
-
"embedUrl": "https://www.youtube.com/embed/-nJkAJpQemI",
|
| 1164 |
-
"duration": "0:51",
|
| 1165 |
-
"durationInSeconds": 51,
|
| 1166 |
-
"thumbnail": "https://img.youtube.com/vi/-nJkAJpQemI/maxresdefault.jpg",
|
| 1167 |
-
"sets": 3,
|
| 1168 |
-
"reps": "40s",
|
| 1169 |
-
"rest": 30,
|
| 1170 |
-
"calories": 6,
|
| 1171 |
-
"category": "abs",
|
| 1172 |
-
"originalName": "How to Do: BICYCLE CRUNCHES"
|
| 1173 |
-
},
|
| 1174 |
-
{
|
| 1175 |
-
"name": "Dead Bug",
|
| 1176 |
-
"originalTitle": "How to Do: DEAD BUG",
|
| 1177 |
-
"emoji": "🔥",
|
| 1178 |
-
"youtubeId": "bXMQkRowNk8",
|
| 1179 |
-
"embedUrl": "https://www.youtube.com/embed/bXMQkRowNk8",
|
| 1180 |
-
"duration": "0:45",
|
| 1181 |
-
"durationInSeconds": 45,
|
| 1182 |
-
"thumbnail": "https://img.youtube.com/vi/bXMQkRowNk8/maxresdefault.jpg",
|
| 1183 |
-
"sets": 3,
|
| 1184 |
-
"reps": "12",
|
| 1185 |
-
"rest": 30,
|
| 1186 |
-
"calories": 5,
|
| 1187 |
-
"category": "abs",
|
| 1188 |
-
"originalName": "How to Do: DEAD BUG"
|
| 1189 |
-
},
|
| 1190 |
-
{
|
| 1191 |
-
"name": ":halter Russian Torção",
|
| 1192 |
-
"originalTitle": "How to Do:DUMBBELL RUSSIAN TWIST",
|
| 1193 |
-
"emoji": "🔥",
|
| 1194 |
-
"youtubeId": "FShbaqrGGu4",
|
| 1195 |
-
"embedUrl": "https://www.youtube.com/embed/FShbaqrGGu4",
|
| 1196 |
-
"duration": "0:34",
|
| 1197 |
-
"durationInSeconds": 34,
|
| 1198 |
-
"thumbnail": "https://img.youtube.com/vi/FShbaqrGGu4/maxresdefault.jpg",
|
| 1199 |
-
"sets": 3,
|
| 1200 |
-
"reps": "12",
|
| 1201 |
-
"rest": 30,
|
| 1202 |
-
"calories": 4,
|
| 1203 |
-
"category": "abs",
|
| 1204 |
-
"originalName": "How to Do:DUMBBELL RUSSIAN TWIST"
|
| 1205 |
-
},
|
| 1206 |
-
{
|
| 1207 |
-
"name": ":halter Abdominal E Punches",
|
| 1208 |
-
"originalTitle": "How to Do:DUMBBELL CRUNCH AND PUNCHES",
|
| 1209 |
-
"emoji": "🔥",
|
| 1210 |
-
"youtubeId": "j19klieazl0",
|
| 1211 |
-
"embedUrl": "https://www.youtube.com/embed/j19klieazl0",
|
| 1212 |
-
"duration": "0:33",
|
| 1213 |
-
"durationInSeconds": 33,
|
| 1214 |
-
"thumbnail": "https://img.youtube.com/vi/j19klieazl0/maxresdefault.jpg",
|
| 1215 |
-
"sets": 3,
|
| 1216 |
-
"reps": "12",
|
| 1217 |
-
"rest": 30,
|
| 1218 |
-
"calories": 4,
|
| 1219 |
-
"category": "abs",
|
| 1220 |
-
"originalName": "How to Do:DUMBBELL CRUNCH AND PUNCHES"
|
| 1221 |
-
},
|
| 1222 |
-
{
|
| 1223 |
-
"name": "V-para Cima",
|
| 1224 |
-
"originalTitle": "How to Do: V-UP",
|
| 1225 |
-
"emoji": "🔥",
|
| 1226 |
-
"youtubeId": "5kvKmRGADlQ",
|
| 1227 |
-
"embedUrl": "https://www.youtube.com/embed/5kvKmRGADlQ",
|
| 1228 |
-
"duration": "0:37",
|
| 1229 |
-
"durationInSeconds": 37,
|
| 1230 |
-
"thumbnail": "https://img.youtube.com/vi/5kvKmRGADlQ/maxresdefault.jpg",
|
| 1231 |
-
"sets": 3,
|
| 1232 |
-
"reps": "12",
|
| 1233 |
-
"rest": 30,
|
| 1234 |
-
"calories": 4,
|
| 1235 |
-
"category": "abs",
|
| 1236 |
-
"originalName": "How to Do: V-UP"
|
| 1237 |
-
},
|
| 1238 |
-
{
|
| 1239 |
-
"name": "Elevação De Panturrilha Com Halteres Em Pé",
|
| 1240 |
-
"originalTitle": "Como fazer: ELEVAÇÃO DE PANTURRILHA COM HALTERES EM PÉ",
|
| 1241 |
-
"emoji": "🔥",
|
| 1242 |
-
"youtubeId": "-A-8LhO84H8",
|
| 1243 |
-
"embedUrl": "https://www.youtube.com/embed/-A-8LhO84H8",
|
| 1244 |
-
"duration": "1:13",
|
| 1245 |
-
"durationInSeconds": 73,
|
| 1246 |
-
"thumbnail": "https://img.youtube.com/vi/-A-8LhO84H8/maxresdefault.jpg",
|
| 1247 |
-
"sets": 3,
|
| 1248 |
-
"reps": "40s",
|
| 1249 |
-
"rest": 30,
|
| 1250 |
-
"calories": 9,
|
| 1251 |
-
"category": "abs",
|
| 1252 |
-
"originalName": "Como fazer: ELEVAÇÃO DE PANTURRILHA COM HALTERES EM PÉ"
|
| 1253 |
-
},
|
| 1254 |
-
{
|
| 1255 |
-
"name": ":halter Toe-touch Abdominal",
|
| 1256 |
-
"originalTitle": "How to Do:DUMBBELL TOE-TOUCH CRUNCH",
|
| 1257 |
-
"emoji": "🔥",
|
| 1258 |
-
"youtubeId": "o60LTZmPUxs",
|
| 1259 |
-
"embedUrl": "https://www.youtube.com/embed/o60LTZmPUxs",
|
| 1260 |
-
"duration": "1:17",
|
| 1261 |
-
"durationInSeconds": 77,
|
| 1262 |
-
"thumbnail": "https://img.youtube.com/vi/o60LTZmPUxs/maxresdefault.jpg",
|
| 1263 |
-
"sets": 3,
|
| 1264 |
-
"reps": "40s",
|
| 1265 |
-
"rest": 30,
|
| 1266 |
-
"calories": 9,
|
| 1267 |
-
"category": "abs",
|
| 1268 |
-
"originalName": "How to Do:DUMBBELL TOE-TOUCH CRUNCH"
|
| 1269 |
-
},
|
| 1270 |
-
{
|
| 1271 |
-
"name": ":halter Abdominales",
|
| 1272 |
-
"originalTitle": "How to Do:DUMBBELL CRUNCHES",
|
| 1273 |
-
"emoji": "🔥",
|
| 1274 |
-
"youtubeId": "8oXkctjfcMw",
|
| 1275 |
-
"embedUrl": "https://www.youtube.com/embed/8oXkctjfcMw",
|
| 1276 |
-
"duration": "1:03",
|
| 1277 |
-
"durationInSeconds": 63,
|
| 1278 |
-
"thumbnail": "https://img.youtube.com/vi/8oXkctjfcMw/maxresdefault.jpg",
|
| 1279 |
-
"sets": 3,
|
| 1280 |
-
"reps": "40s",
|
| 1281 |
-
"rest": 30,
|
| 1282 |
-
"calories": 7,
|
| 1283 |
-
"category": "abs",
|
| 1284 |
-
"originalName": "How to Do:DUMBBELL CRUNCHES"
|
| 1285 |
-
},
|
| 1286 |
-
{
|
| 1287 |
-
"name": ":crossover Abdominal",
|
| 1288 |
-
"originalTitle": "How to Do:CROSSOVER CRUNCH",
|
| 1289 |
-
"emoji": "🔥",
|
| 1290 |
-
"youtubeId": "10LVrfyU4cc",
|
| 1291 |
-
"embedUrl": "https://www.youtube.com/embed/10LVrfyU4cc",
|
| 1292 |
-
"duration": "1:10",
|
| 1293 |
-
"durationInSeconds": 70,
|
| 1294 |
-
"thumbnail": "https://img.youtube.com/vi/10LVrfyU4cc/maxresdefault.jpg",
|
| 1295 |
-
"sets": 3,
|
| 1296 |
-
"reps": "40s",
|
| 1297 |
-
"rest": 30,
|
| 1298 |
-
"calories": 8,
|
| 1299 |
-
"category": "abs",
|
| 1300 |
-
"originalName": "How to Do:CROSSOVER CRUNCH"
|
| 1301 |
-
},
|
| 1302 |
-
{
|
| 1303 |
-
"name": ":lateral Prancha Joelho Abdominal",
|
| 1304 |
-
"originalTitle": "How to Do:SIDE PLANK KNEE CRUNCH",
|
| 1305 |
-
"emoji": "🔥",
|
| 1306 |
-
"youtubeId": "gE0R8g3pcGQ",
|
| 1307 |
-
"embedUrl": "https://www.youtube.com/embed/gE0R8g3pcGQ",
|
| 1308 |
-
"duration": "1:15",
|
| 1309 |
-
"durationInSeconds": 75,
|
| 1310 |
-
"thumbnail": "https://img.youtube.com/vi/gE0R8g3pcGQ/maxresdefault.jpg",
|
| 1311 |
-
"sets": 3,
|
| 1312 |
-
"reps": "40s",
|
| 1313 |
-
"rest": 30,
|
| 1314 |
-
"calories": 9,
|
| 1315 |
-
"category": "abs",
|
| 1316 |
-
"originalName": "How to Do:SIDE PLANK KNEE CRUNCH"
|
| 1317 |
-
},
|
| 1318 |
-
{
|
| 1319 |
-
"name": ":cachorro Apontando",
|
| 1320 |
-
"originalTitle": "How to Do:BIRD DOG",
|
| 1321 |
-
"emoji": "🔥",
|
| 1322 |
-
"youtubeId": "-WUqsBbFddI",
|
| 1323 |
-
"embedUrl": "https://www.youtube.com/embed/-WUqsBbFddI",
|
| 1324 |
-
"duration": "1:20",
|
| 1325 |
-
"durationInSeconds": 80,
|
| 1326 |
-
"thumbnail": "https://img.youtube.com/vi/-WUqsBbFddI/maxresdefault.jpg",
|
| 1327 |
-
"sets": 3,
|
| 1328 |
-
"reps": "40s",
|
| 1329 |
-
"rest": 30,
|
| 1330 |
-
"calories": 9,
|
| 1331 |
-
"category": "abs",
|
| 1332 |
-
"originalName": "How to Do:BIRD DOG"
|
| 1333 |
-
},
|
| 1334 |
-
{
|
| 1335 |
-
"name": ":halter Abdominal E Punches",
|
| 1336 |
-
"originalTitle": "How to Do:DUMBBELL CRUNCH AND PUNCHES",
|
| 1337 |
-
"emoji": "🔥",
|
| 1338 |
-
"youtubeId": "Y-9-el25Rko",
|
| 1339 |
-
"embedUrl": "https://www.youtube.com/embed/Y-9-el25Rko",
|
| 1340 |
-
"duration": "0:52",
|
| 1341 |
-
"durationInSeconds": 52,
|
| 1342 |
-
"thumbnail": "https://img.youtube.com/vi/Y-9-el25Rko/maxresdefault.jpg",
|
| 1343 |
-
"sets": 3,
|
| 1344 |
-
"reps": "40s",
|
| 1345 |
-
"rest": 30,
|
| 1346 |
-
"calories": 6,
|
| 1347 |
-
"category": "abs",
|
| 1348 |
-
"originalName": "How to Do:DUMBBELL CRUNCH AND PUNCHES"
|
| 1349 |
-
},
|
| 1350 |
-
{
|
| 1351 |
-
"name": ":halter Russian Torção",
|
| 1352 |
-
"originalTitle": "How to Do:DUMBBELL RUSSIAN TWIST",
|
| 1353 |
-
"emoji": "🔥",
|
| 1354 |
-
"youtubeId": "n2ZuCxpG-qM",
|
| 1355 |
-
"embedUrl": "https://www.youtube.com/embed/n2ZuCxpG-qM",
|
| 1356 |
-
"duration": "1:09",
|
| 1357 |
-
"durationInSeconds": 69,
|
| 1358 |
-
"thumbnail": "https://img.youtube.com/vi/n2ZuCxpG-qM/maxresdefault.jpg",
|
| 1359 |
-
"sets": 3,
|
| 1360 |
-
"reps": "40s",
|
| 1361 |
-
"rest": 30,
|
| 1362 |
-
"calories": 8,
|
| 1363 |
-
"category": "abs",
|
| 1364 |
-
"originalName": "How to Do:DUMBBELL RUSSIAN TWIST"
|
| 1365 |
-
},
|
| 1366 |
-
{
|
| 1367 |
-
"name": ":sentado Abdômen Circles",
|
| 1368 |
-
"originalTitle": "How to Do:SEATED ABS CIRCLES",
|
| 1369 |
-
"emoji": "🔥",
|
| 1370 |
-
"youtubeId": "GkreGXxwFiQ",
|
| 1371 |
-
"embedUrl": "https://www.youtube.com/embed/GkreGXxwFiQ",
|
| 1372 |
-
"duration": "1:21",
|
| 1373 |
-
"durationInSeconds": 81,
|
| 1374 |
-
"thumbnail": "https://img.youtube.com/vi/GkreGXxwFiQ/maxresdefault.jpg",
|
| 1375 |
-
"sets": 3,
|
| 1376 |
-
"reps": "40s",
|
| 1377 |
-
"rest": 30,
|
| 1378 |
-
"calories": 9,
|
| 1379 |
-
"category": "abs",
|
| 1380 |
-
"originalName": "How to Do:SEATED ABS CIRCLES"
|
| 1381 |
-
},
|
| 1382 |
-
{
|
| 1383 |
-
"name": ":alpinista Agachamento Thrust",
|
| 1384 |
-
"originalTitle": "How to Do:MOUNTAIN CLIMBER SQUAT THRUST",
|
| 1385 |
-
"emoji": "🔥",
|
| 1386 |
-
"youtubeId": "snSqy2pPEa4",
|
| 1387 |
-
"embedUrl": "https://www.youtube.com/embed/snSqy2pPEa4",
|
| 1388 |
-
"duration": "1:18",
|
| 1389 |
-
"durationInSeconds": 78,
|
| 1390 |
-
"thumbnail": "https://img.youtube.com/vi/snSqy2pPEa4/maxresdefault.jpg",
|
| 1391 |
-
"sets": 3,
|
| 1392 |
-
"reps": "40s",
|
| 1393 |
-
"rest": 30,
|
| 1394 |
-
"calories": 9,
|
| 1395 |
-
"category": "abs",
|
| 1396 |
-
"originalName": "How to Do:MOUNTAIN CLIMBER SQUAT THRUST"
|
| 1397 |
-
},
|
| 1398 |
-
{
|
| 1399 |
-
"name": ":flutter Chute Agachamentos",
|
| 1400 |
-
"originalTitle": "How to Do:FLUTTER KICK SQUATS",
|
| 1401 |
-
"emoji": "🔥",
|
| 1402 |
-
"youtubeId": "V6f4VFcF_wM",
|
| 1403 |
-
"embedUrl": "https://www.youtube.com/embed/V6f4VFcF_wM",
|
| 1404 |
-
"duration": "1:21",
|
| 1405 |
-
"durationInSeconds": 81,
|
| 1406 |
-
"thumbnail": "https://img.youtube.com/vi/V6f4VFcF_wM/maxresdefault.jpg",
|
| 1407 |
-
"sets": 3,
|
| 1408 |
-
"reps": "40s",
|
| 1409 |
-
"rest": 30,
|
| 1410 |
-
"calories": 9,
|
| 1411 |
-
"category": "abs",
|
| 1412 |
-
"originalName": "How to Do:FLUTTER KICK SQUATS"
|
| 1413 |
-
},
|
| 1414 |
-
{
|
| 1415 |
-
"name": ":crab Walk",
|
| 1416 |
-
"originalTitle": "How to Do:CRAB WALK",
|
| 1417 |
-
"emoji": "🔥",
|
| 1418 |
-
"youtubeId": "IL4F1xGTZEY",
|
| 1419 |
-
"embedUrl": "https://www.youtube.com/embed/IL4F1xGTZEY",
|
| 1420 |
-
"duration": "0:56",
|
| 1421 |
-
"durationInSeconds": 56,
|
| 1422 |
-
"thumbnail": "https://img.youtube.com/vi/IL4F1xGTZEY/maxresdefault.jpg",
|
| 1423 |
-
"sets": 3,
|
| 1424 |
-
"reps": "40s",
|
| 1425 |
-
"rest": 30,
|
| 1426 |
-
"calories": 7,
|
| 1427 |
-
"category": "abs",
|
| 1428 |
-
"originalName": "How to Do:CRAB WALK"
|
| 1429 |
-
},
|
| 1430 |
-
{
|
| 1431 |
-
"name": ":oblíquo Abdominal Reach",
|
| 1432 |
-
"originalTitle": "How to Do:OBLIQUE CRUNCH REACH",
|
| 1433 |
-
"emoji": "🔥",
|
| 1434 |
-
"youtubeId": "992YPyXMKOs",
|
| 1435 |
-
"embedUrl": "https://www.youtube.com/embed/992YPyXMKOs",
|
| 1436 |
-
"duration": "1:13",
|
| 1437 |
-
"durationInSeconds": 73,
|
| 1438 |
-
"thumbnail": "https://img.youtube.com/vi/992YPyXMKOs/maxresdefault.jpg",
|
| 1439 |
-
"sets": 3,
|
| 1440 |
-
"reps": "40s",
|
| 1441 |
-
"rest": 30,
|
| 1442 |
-
"calories": 9,
|
| 1443 |
-
"category": "abs",
|
| 1444 |
-
"originalName": "How to Do:OBLIQUE CRUNCH REACH"
|
| 1445 |
-
},
|
| 1446 |
-
{
|
| 1447 |
-
"name": ":lateral Prancha Front Chute",
|
| 1448 |
-
"originalTitle": "How to Do:SIDE PLANK FRONT KICK",
|
| 1449 |
-
"emoji": "🔥",
|
| 1450 |
-
"youtubeId": "odZo04hgRzY",
|
| 1451 |
-
"embedUrl": "https://www.youtube.com/embed/odZo04hgRzY",
|
| 1452 |
-
"duration": "1:04",
|
| 1453 |
-
"durationInSeconds": 64,
|
| 1454 |
-
"thumbnail": "https://img.youtube.com/vi/odZo04hgRzY/maxresdefault.jpg",
|
| 1455 |
-
"sets": 3,
|
| 1456 |
-
"reps": "40s",
|
| 1457 |
-
"rest": 30,
|
| 1458 |
-
"calories": 7,
|
| 1459 |
-
"category": "abs",
|
| 1460 |
-
"originalName": "How to Do:SIDE PLANK FRONT KICK"
|
| 1461 |
-
},
|
| 1462 |
-
{
|
| 1463 |
-
"name": ":lento Alpinista",
|
| 1464 |
-
"originalTitle": "How to Do:SLOW MOUNTAIN CLIMBER",
|
| 1465 |
-
"emoji": "🔥",
|
| 1466 |
-
"youtubeId": "uFTCkUQDQak",
|
| 1467 |
-
"embedUrl": "https://www.youtube.com/embed/uFTCkUQDQak",
|
| 1468 |
-
"duration": "1:10",
|
| 1469 |
-
"durationInSeconds": 70,
|
| 1470 |
-
"thumbnail": "https://img.youtube.com/vi/uFTCkUQDQak/maxresdefault.jpg",
|
| 1471 |
-
"sets": 3,
|
| 1472 |
-
"reps": "40s",
|
| 1473 |
-
"rest": 30,
|
| 1474 |
-
"calories": 8,
|
| 1475 |
-
"category": "abs",
|
| 1476 |
-
"originalName": "How to Do:SLOW MOUNTAIN CLIMBER"
|
| 1477 |
-
},
|
| 1478 |
-
{
|
| 1479 |
-
"name": ":spiderman Prancha",
|
| 1480 |
-
"originalTitle": "How to Do:SPIDERMAN PLANK",
|
| 1481 |
-
"emoji": "🔥",
|
| 1482 |
-
"youtubeId": "Ie6ulItPjx4",
|
| 1483 |
-
"embedUrl": "https://www.youtube.com/embed/Ie6ulItPjx4",
|
| 1484 |
-
"duration": "0:53",
|
| 1485 |
-
"durationInSeconds": 53,
|
| 1486 |
-
"thumbnail": "https://img.youtube.com/vi/Ie6ulItPjx4/maxresdefault.jpg",
|
| 1487 |
-
"sets": 3,
|
| 1488 |
-
"reps": "40s",
|
| 1489 |
-
"rest": 30,
|
| 1490 |
-
"calories": 6,
|
| 1491 |
-
"category": "abs",
|
| 1492 |
-
"originalName": "How to Do:SPIDERMAN PLANK"
|
| 1493 |
-
},
|
| 1494 |
-
{
|
| 1495 |
-
"name": ":90/90 Abdominal",
|
| 1496 |
-
"originalTitle": "How to Do:90/90 CRUNCH",
|
| 1497 |
-
"emoji": "🔥",
|
| 1498 |
-
"youtubeId": "XtF1trq0n2Y",
|
| 1499 |
-
"embedUrl": "https://www.youtube.com/embed/XtF1trq0n2Y",
|
| 1500 |
-
"duration": "1:23",
|
| 1501 |
-
"durationInSeconds": 83,
|
| 1502 |
-
"thumbnail": "https://img.youtube.com/vi/XtF1trq0n2Y/maxresdefault.jpg",
|
| 1503 |
-
"sets": 3,
|
| 1504 |
-
"reps": "40s",
|
| 1505 |
-
"rest": 30,
|
| 1506 |
-
"calories": 10,
|
| 1507 |
-
"category": "abs",
|
| 1508 |
-
"originalName": "How to Do:90/90 CRUNCH"
|
| 1509 |
-
},
|
| 1510 |
-
{
|
| 1511 |
-
"name": ":crab Kicks",
|
| 1512 |
-
"originalTitle": "How to Do:CRAB KICKS",
|
| 1513 |
-
"emoji": "🔥",
|
| 1514 |
-
"youtubeId": "KZO7RG0TR-0",
|
| 1515 |
-
"embedUrl": "https://www.youtube.com/embed/KZO7RG0TR-0",
|
| 1516 |
-
"duration": "1:08",
|
| 1517 |
-
"durationInSeconds": 68,
|
| 1518 |
-
"thumbnail": "https://img.youtube.com/vi/KZO7RG0TR-0/maxresdefault.jpg",
|
| 1519 |
-
"sets": 3,
|
| 1520 |
-
"reps": "40s",
|
| 1521 |
-
"rest": 30,
|
| 1522 |
-
"calories": 8,
|
| 1523 |
-
"category": "abs",
|
| 1524 |
-
"originalName": "How to Do:CRAB KICKS"
|
| 1525 |
-
},
|
| 1526 |
-
{
|
| 1527 |
-
"name": ":t Prancha",
|
| 1528 |
-
"originalTitle": "How to Do:T PLANK",
|
| 1529 |
-
"emoji": "🔥",
|
| 1530 |
-
"youtubeId": "wI0jFY4OQe8",
|
| 1531 |
-
"embedUrl": "https://www.youtube.com/embed/wI0jFY4OQe8",
|
| 1532 |
-
"duration": "1:07",
|
| 1533 |
-
"durationInSeconds": 67,
|
| 1534 |
-
"thumbnail": "https://img.youtube.com/vi/wI0jFY4OQe8/maxresdefault.jpg",
|
| 1535 |
-
"sets": 3,
|
| 1536 |
-
"reps": "40s",
|
| 1537 |
-
"rest": 30,
|
| 1538 |
-
"calories": 8,
|
| 1539 |
-
"category": "abs",
|
| 1540 |
-
"originalName": "How to Do:T PLANK"
|
| 1541 |
-
},
|
| 1542 |
-
{
|
| 1543 |
-
"name": ":halter Bicicleta Passes",
|
| 1544 |
-
"originalTitle": "How to Do:DUMBBELL BICYCLE PASSES",
|
| 1545 |
-
"emoji": "🔥",
|
| 1546 |
-
"youtubeId": "MEmHUK_RfQM",
|
| 1547 |
-
"embedUrl": "https://www.youtube.com/embed/MEmHUK_RfQM",
|
| 1548 |
-
"duration": "1:02",
|
| 1549 |
-
"durationInSeconds": 62,
|
| 1550 |
-
"thumbnail": "https://img.youtube.com/vi/MEmHUK_RfQM/maxresdefault.jpg",
|
| 1551 |
-
"sets": 3,
|
| 1552 |
-
"reps": "40s",
|
| 1553 |
-
"rest": 30,
|
| 1554 |
-
"calories": 7,
|
| 1555 |
-
"category": "abs",
|
| 1556 |
-
"originalName": "How to Do:DUMBBELL BICYCLE PASSES"
|
| 1557 |
-
},
|
| 1558 |
-
{
|
| 1559 |
-
"name": ":v Abdominal",
|
| 1560 |
-
"originalTitle": "How to Do:V CRUNCH",
|
| 1561 |
-
"emoji": "🔥",
|
| 1562 |
-
"youtubeId": "Hj4yrp6gOOg",
|
| 1563 |
-
"embedUrl": "https://www.youtube.com/embed/Hj4yrp6gOOg",
|
| 1564 |
-
"duration": "1:04",
|
| 1565 |
-
"durationInSeconds": 64,
|
| 1566 |
-
"thumbnail": "https://img.youtube.com/vi/Hj4yrp6gOOg/maxresdefault.jpg",
|
| 1567 |
-
"sets": 3,
|
| 1568 |
-
"reps": "40s",
|
| 1569 |
-
"rest": 30,
|
| 1570 |
-
"calories": 7,
|
| 1571 |
-
"category": "abs",
|
| 1572 |
-
"originalName": "How to Do:V CRUNCH"
|
| 1573 |
-
},
|
| 1574 |
-
{
|
| 1575 |
-
"name": ":crab Chute Para Cima",
|
| 1576 |
-
"originalTitle": "How to Do:CRAB KICK UP",
|
| 1577 |
-
"emoji": "🔥",
|
| 1578 |
-
"youtubeId": "5tQLkpJsLGA",
|
| 1579 |
-
"embedUrl": "https://www.youtube.com/embed/5tQLkpJsLGA",
|
| 1580 |
-
"duration": "0:52",
|
| 1581 |
-
"durationInSeconds": 52,
|
| 1582 |
-
"thumbnail": "https://img.youtube.com/vi/5tQLkpJsLGA/maxresdefault.jpg",
|
| 1583 |
-
"sets": 3,
|
| 1584 |
-
"reps": "40s",
|
| 1585 |
-
"rest": 30,
|
| 1586 |
-
"calories": 6,
|
| 1587 |
-
"category": "abs",
|
| 1588 |
-
"originalName": "How to Do:CRAB KICK UP"
|
| 1589 |
-
},
|
| 1590 |
-
{
|
| 1591 |
-
"name": ":prone Flutter Kicks",
|
| 1592 |
-
"originalTitle": "How to Do:PRONE FLUTTER KICKS",
|
| 1593 |
-
"emoji": "🔥",
|
| 1594 |
-
"youtubeId": "LuREk_9HqQg",
|
| 1595 |
-
"embedUrl": "https://www.youtube.com/embed/LuREk_9HqQg",
|
| 1596 |
-
"duration": "1:03",
|
| 1597 |
-
"durationInSeconds": 63,
|
| 1598 |
-
"thumbnail": "https://img.youtube.com/vi/LuREk_9HqQg/maxresdefault.jpg",
|
| 1599 |
-
"sets": 3,
|
| 1600 |
-
"reps": "40s",
|
| 1601 |
-
"rest": 30,
|
| 1602 |
-
"calories": 7,
|
| 1603 |
-
"category": "abs",
|
| 1604 |
-
"originalName": "How to Do:PRONE FLUTTER KICKS"
|
| 1605 |
-
},
|
| 1606 |
-
{
|
| 1607 |
-
"name": ":reverse Flutter Kicks",
|
| 1608 |
-
"originalTitle": "How to Do:REVERSE FLUTTER KICKS",
|
| 1609 |
-
"emoji": "🔥",
|
| 1610 |
-
"youtubeId": "c1dfDXOh18k",
|
| 1611 |
-
"embedUrl": "https://www.youtube.com/embed/c1dfDXOh18k",
|
| 1612 |
-
"duration": "0:46",
|
| 1613 |
-
"durationInSeconds": 46,
|
| 1614 |
-
"thumbnail": "https://img.youtube.com/vi/c1dfDXOh18k/maxresdefault.jpg",
|
| 1615 |
-
"sets": 3,
|
| 1616 |
-
"reps": "12",
|
| 1617 |
-
"rest": 30,
|
| 1618 |
-
"calories": 5,
|
| 1619 |
-
"category": "abs",
|
| 1620 |
-
"originalName": "How to Do:REVERSE FLUTTER KICKS"
|
| 1621 |
-
},
|
| 1622 |
-
{
|
| 1623 |
-
"name": ":cadeira Bicicleta Abdominal",
|
| 1624 |
-
"originalTitle": "How to Do:CHAIR BICYCLE CRUNCH",
|
| 1625 |
-
"emoji": "🔥",
|
| 1626 |
-
"youtubeId": "7SmwTVV69Ck",
|
| 1627 |
-
"embedUrl": "https://www.youtube.com/embed/7SmwTVV69Ck",
|
| 1628 |
-
"duration": "1:05",
|
| 1629 |
-
"durationInSeconds": 65,
|
| 1630 |
-
"thumbnail": "https://img.youtube.com/vi/7SmwTVV69Ck/maxresdefault.jpg",
|
| 1631 |
-
"sets": 3,
|
| 1632 |
-
"reps": "40s",
|
| 1633 |
-
"rest": 30,
|
| 1634 |
-
"calories": 8,
|
| 1635 |
-
"category": "abs",
|
| 1636 |
-
"originalName": "How to Do:CHAIR BICYCLE CRUNCH"
|
| 1637 |
-
},
|
| 1638 |
-
{
|
| 1639 |
-
"name": ":joelholing Lateral Prancha",
|
| 1640 |
-
"originalTitle": "How to Do:KNEELING SIDE PLANK",
|
| 1641 |
-
"emoji": "🔥",
|
| 1642 |
-
"youtubeId": "jr_-y1VEkW0",
|
| 1643 |
-
"embedUrl": "https://www.youtube.com/embed/jr_-y1VEkW0",
|
| 1644 |
-
"duration": "1:10",
|
| 1645 |
-
"durationInSeconds": 70,
|
| 1646 |
-
"thumbnail": "https://img.youtube.com/vi/jr_-y1VEkW0/maxresdefault.jpg",
|
| 1647 |
-
"sets": 3,
|
| 1648 |
-
"reps": "40s",
|
| 1649 |
-
"rest": 30,
|
| 1650 |
-
"calories": 8,
|
| 1651 |
-
"category": "abs",
|
| 1652 |
-
"originalName": "How to Do:KNEELING SIDE PLANK"
|
| 1653 |
-
},
|
| 1654 |
-
{
|
| 1655 |
-
"name": ":oblíquo Crossover Abdominal",
|
| 1656 |
-
"originalTitle": "How to Do:OBLIQUE CROSSOVER CRUNCH",
|
| 1657 |
-
"emoji": "🔥",
|
| 1658 |
-
"youtubeId": "OQhy-8XetjY",
|
| 1659 |
-
"embedUrl": "https://www.youtube.com/embed/OQhy-8XetjY",
|
| 1660 |
-
"duration": "1:00",
|
| 1661 |
-
"durationInSeconds": 60,
|
| 1662 |
-
"thumbnail": "https://img.youtube.com/vi/OQhy-8XetjY/maxresdefault.jpg",
|
| 1663 |
-
"sets": 3,
|
| 1664 |
-
"reps": "40s",
|
| 1665 |
-
"rest": 30,
|
| 1666 |
-
"calories": 7,
|
| 1667 |
-
"category": "abs",
|
| 1668 |
-
"originalName": "How to Do:OBLIQUE CROSSOVER CRUNCH"
|
| 1669 |
-
},
|
| 1670 |
-
{
|
| 1671 |
-
"name": ":prancha Quadril Dips",
|
| 1672 |
-
"originalTitle": "How to Do:PLANK HIP DIPS",
|
| 1673 |
-
"emoji": "🔥",
|
| 1674 |
-
"youtubeId": "fwM8O8wl448",
|
| 1675 |
-
"embedUrl": "https://www.youtube.com/embed/fwM8O8wl448",
|
| 1676 |
-
"duration": "0:58",
|
| 1677 |
-
"durationInSeconds": 58,
|
| 1678 |
-
"thumbnail": "https://img.youtube.com/vi/fwM8O8wl448/maxresdefault.jpg",
|
| 1679 |
-
"sets": 3,
|
| 1680 |
-
"reps": "40s",
|
| 1681 |
-
"rest": 30,
|
| 1682 |
-
"calories": 7,
|
| 1683 |
-
"category": "abs",
|
| 1684 |
-
"originalName": "How to Do:PLANK HIP DIPS"
|
| 1685 |
-
},
|
| 1686 |
-
{
|
| 1687 |
-
"name": ":alt V-para Cima",
|
| 1688 |
-
"originalTitle": "How to Do:ALT V-UP",
|
| 1689 |
-
"emoji": "🔥",
|
| 1690 |
-
"youtubeId": "X61wc2Ythgo",
|
| 1691 |
-
"embedUrl": "https://www.youtube.com/embed/X61wc2Ythgo",
|
| 1692 |
-
"duration": "1:22",
|
| 1693 |
-
"durationInSeconds": 82,
|
| 1694 |
-
"thumbnail": "https://img.youtube.com/vi/X61wc2Ythgo/maxresdefault.jpg",
|
| 1695 |
-
"sets": 3,
|
| 1696 |
-
"reps": "40s",
|
| 1697 |
-
"rest": 30,
|
| 1698 |
-
"calories": 10,
|
| 1699 |
-
"category": "abs",
|
| 1700 |
-
"originalName": "How to Do:ALT V-UP"
|
| 1701 |
-
},
|
| 1702 |
-
{
|
| 1703 |
-
"name": ":oblíquo V-para Cima",
|
| 1704 |
-
"originalTitle": "How to Do:OBLIQUE V-UP",
|
| 1705 |
-
"emoji": "🔥",
|
| 1706 |
-
"youtubeId": "dZGajX67rdQ",
|
| 1707 |
-
"embedUrl": "https://www.youtube.com/embed/dZGajX67rdQ",
|
| 1708 |
-
"duration": "0:57",
|
| 1709 |
-
"durationInSeconds": 57,
|
| 1710 |
-
"thumbnail": "https://img.youtube.com/vi/dZGajX67rdQ/maxresdefault.jpg",
|
| 1711 |
-
"sets": 3,
|
| 1712 |
-
"reps": "40s",
|
| 1713 |
-
"rest": 30,
|
| 1714 |
-
"calories": 7,
|
| 1715 |
-
"category": "abs",
|
| 1716 |
-
"originalName": "How to Do:OBLIQUE V-UP"
|
| 1717 |
-
},
|
| 1718 |
-
{
|
| 1719 |
-
"name": ":prancha E Reach",
|
| 1720 |
-
"originalTitle": "How to Do:PLANK AND REACH",
|
| 1721 |
-
"emoji": "🔥",
|
| 1722 |
-
"youtubeId": "d2EMrJCN50Q",
|
| 1723 |
-
"embedUrl": "https://www.youtube.com/embed/d2EMrJCN50Q",
|
| 1724 |
-
"duration": "0:56",
|
| 1725 |
-
"durationInSeconds": 56,
|
| 1726 |
-
"thumbnail": "https://img.youtube.com/vi/d2EMrJCN50Q/maxresdefault.jpg",
|
| 1727 |
-
"sets": 3,
|
| 1728 |
-
"reps": "40s",
|
| 1729 |
-
"rest": 30,
|
| 1730 |
-
"calories": 7,
|
| 1731 |
-
"category": "abs",
|
| 1732 |
-
"originalName": "How to Do:PLANK AND REACH"
|
| 1733 |
-
},
|
| 1734 |
-
{
|
| 1735 |
-
"name": ":prancha Taps",
|
| 1736 |
-
"originalTitle": "How to Do:PLANK TAPS",
|
| 1737 |
-
"emoji": "🔥",
|
| 1738 |
-
"youtubeId": "19lu4ch3M5U",
|
| 1739 |
-
"embedUrl": "https://www.youtube.com/embed/19lu4ch3M5U",
|
| 1740 |
-
"duration": "1:04",
|
| 1741 |
-
"durationInSeconds": 64,
|
| 1742 |
-
"thumbnail": "https://img.youtube.com/vi/19lu4ch3M5U/maxresdefault.jpg",
|
| 1743 |
-
"sets": 3,
|
| 1744 |
-
"reps": "40s",
|
| 1745 |
-
"rest": 30,
|
| 1746 |
-
"calories": 7,
|
| 1747 |
-
"category": "abs",
|
| 1748 |
-
"originalName": "How to Do:PLANK TAPS"
|
| 1749 |
-
},
|
| 1750 |
-
{
|
| 1751 |
-
"name": "Cross Joelho Prancha",
|
| 1752 |
-
"originalTitle": "How to Do: CROSS KNEE PLANK",
|
| 1753 |
-
"emoji": "🔥",
|
| 1754 |
-
"youtubeId": "8fN356WKqPo",
|
| 1755 |
-
"embedUrl": "https://www.youtube.com/embed/8fN356WKqPo",
|
| 1756 |
-
"duration": "1:00",
|
| 1757 |
-
"durationInSeconds": 60,
|
| 1758 |
-
"thumbnail": "https://img.youtube.com/vi/8fN356WKqPo/maxresdefault.jpg",
|
| 1759 |
-
"sets": 3,
|
| 1760 |
-
"reps": "40s",
|
| 1761 |
-
"rest": 30,
|
| 1762 |
-
"calories": 7,
|
| 1763 |
-
"category": "abs",
|
| 1764 |
-
"originalName": "How to Do: CROSS KNEE PLANK"
|
| 1765 |
-
},
|
| 1766 |
-
{
|
| 1767 |
-
"name": "Em Pé Oblíquo Abdominales",
|
| 1768 |
-
"originalTitle": "How to Do: STANDING OBLIQUE CRUNCHES",
|
| 1769 |
-
"emoji": "🔥",
|
| 1770 |
-
"youtubeId": "fFHR8bDdS_4",
|
| 1771 |
-
"embedUrl": "https://www.youtube.com/embed/fFHR8bDdS_4",
|
| 1772 |
-
"duration": "1:06",
|
| 1773 |
-
"durationInSeconds": 66,
|
| 1774 |
-
"thumbnail": "https://img.youtube.com/vi/fFHR8bDdS_4/maxresdefault.jpg",
|
| 1775 |
-
"sets": 3,
|
| 1776 |
-
"reps": "40s",
|
| 1777 |
-
"rest": 30,
|
| 1778 |
-
"calories": 8,
|
| 1779 |
-
"category": "abs",
|
| 1780 |
-
"originalName": "How to Do: STANDING OBLIQUE CRUNCHES"
|
| 1781 |
-
},
|
| 1782 |
-
{
|
| 1783 |
-
"name": "Reverse Abdominales Com Elevação De Pernad",
|
| 1784 |
-
"originalTitle": "How to Do: REVERSE CRUNCHES WITH LEG RAISED",
|
| 1785 |
-
"emoji": "���",
|
| 1786 |
-
"youtubeId": "mRf73Zw7LzA",
|
| 1787 |
-
"embedUrl": "https://www.youtube.com/embed/mRf73Zw7LzA",
|
| 1788 |
-
"duration": "0:57",
|
| 1789 |
-
"durationInSeconds": 57,
|
| 1790 |
-
"thumbnail": "https://img.youtube.com/vi/mRf73Zw7LzA/maxresdefault.jpg",
|
| 1791 |
-
"sets": 3,
|
| 1792 |
-
"reps": "40s",
|
| 1793 |
-
"rest": 30,
|
| 1794 |
-
"calories": 7,
|
| 1795 |
-
"category": "abs",
|
| 1796 |
-
"originalName": "How to Do: REVERSE CRUNCHES WITH LEG RAISED"
|
| 1797 |
-
},
|
| 1798 |
-
{
|
| 1799 |
-
"name": "Dead Bug",
|
| 1800 |
-
"originalTitle": "How to Do: DEAD BUG",
|
| 1801 |
-
"emoji": "🔥",
|
| 1802 |
-
"youtubeId": "ng4aCi3fZ2c",
|
| 1803 |
-
"embedUrl": "https://www.youtube.com/embed/ng4aCi3fZ2c",
|
| 1804 |
-
"duration": "1:01",
|
| 1805 |
-
"durationInSeconds": 61,
|
| 1806 |
-
"thumbnail": "https://img.youtube.com/vi/ng4aCi3fZ2c/maxresdefault.jpg",
|
| 1807 |
-
"sets": 3,
|
| 1808 |
-
"reps": "40s",
|
| 1809 |
-
"rest": 30,
|
| 1810 |
-
"calories": 7,
|
| 1811 |
-
"category": "abs",
|
| 1812 |
-
"originalName": "How to Do: DEAD BUG"
|
| 1813 |
-
},
|
| 1814 |
-
{
|
| 1815 |
-
"name": "Lateral Elevação De Perna",
|
| 1816 |
-
"originalTitle": "How to Do: SIDE LEG RAISE",
|
| 1817 |
-
"emoji": "🔥",
|
| 1818 |
-
"youtubeId": "wJo8inKVKus",
|
| 1819 |
-
"embedUrl": "https://www.youtube.com/embed/wJo8inKVKus",
|
| 1820 |
-
"duration": "1:25",
|
| 1821 |
-
"durationInSeconds": 85,
|
| 1822 |
-
"thumbnail": "https://img.youtube.com/vi/wJo8inKVKus/maxresdefault.jpg",
|
| 1823 |
-
"sets": 3,
|
| 1824 |
-
"reps": "40s",
|
| 1825 |
-
"rest": 30,
|
| 1826 |
-
"calories": 10,
|
| 1827 |
-
"category": "abs",
|
| 1828 |
-
"originalName": "How to Do: SIDE LEG RAISE"
|
| 1829 |
-
},
|
| 1830 |
-
{
|
| 1831 |
-
"name": "Abdominal Kicks",
|
| 1832 |
-
"originalTitle": "How to Do: CRUNCH KICKS",
|
| 1833 |
-
"emoji": "🔥",
|
| 1834 |
-
"youtubeId": "AG9K3GUIfls",
|
| 1835 |
-
"embedUrl": "https://www.youtube.com/embed/AG9K3GUIfls",
|
| 1836 |
-
"duration": "1:10",
|
| 1837 |
-
"durationInSeconds": 70,
|
| 1838 |
-
"thumbnail": "https://img.youtube.com/vi/AG9K3GUIfls/maxresdefault.jpg",
|
| 1839 |
-
"sets": 3,
|
| 1840 |
-
"reps": "40s",
|
| 1841 |
-
"rest": 30,
|
| 1842 |
-
"calories": 8,
|
| 1843 |
-
"category": "abs",
|
| 1844 |
-
"originalName": "How to Do: CRUNCH KICKS"
|
| 1845 |
-
},
|
| 1846 |
-
{
|
| 1847 |
-
"name": "X Man Abdominal",
|
| 1848 |
-
"originalTitle": "How to Do: X MAN CRUNCH",
|
| 1849 |
-
"emoji": "🔥",
|
| 1850 |
-
"youtubeId": "Z7YbVvD7EOg",
|
| 1851 |
-
"embedUrl": "https://www.youtube.com/embed/Z7YbVvD7EOg",
|
| 1852 |
-
"duration": "1:04",
|
| 1853 |
-
"durationInSeconds": 64,
|
| 1854 |
-
"thumbnail": "https://img.youtube.com/vi/Z7YbVvD7EOg/maxresdefault.jpg",
|
| 1855 |
-
"sets": 3,
|
| 1856 |
-
"reps": "40s",
|
| 1857 |
-
"rest": 30,
|
| 1858 |
-
"calories": 7,
|
| 1859 |
-
"category": "abs",
|
| 1860 |
-
"originalName": "How to Do: X MAN CRUNCH"
|
| 1861 |
-
},
|
| 1862 |
-
{
|
| 1863 |
-
"name": "Lateral Abdominales",
|
| 1864 |
-
"originalTitle": "How to Do: SIDE CRUNCHES",
|
| 1865 |
-
"emoji": "🔥",
|
| 1866 |
-
"youtubeId": "WKOE7lcniPY",
|
| 1867 |
-
"embedUrl": "https://www.youtube.com/embed/WKOE7lcniPY",
|
| 1868 |
-
"duration": "1:12",
|
| 1869 |
-
"durationInSeconds": 72,
|
| 1870 |
-
"thumbnail": "https://img.youtube.com/vi/WKOE7lcniPY/maxresdefault.jpg",
|
| 1871 |
-
"sets": 3,
|
| 1872 |
-
"reps": "40s",
|
| 1873 |
-
"rest": 30,
|
| 1874 |
-
"calories": 8,
|
| 1875 |
-
"category": "abs",
|
| 1876 |
-
"originalName": "How to Do: SIDE CRUNCHES"
|
| 1877 |
-
},
|
| 1878 |
-
{
|
| 1879 |
-
"name": "Braço Scissors",
|
| 1880 |
-
"originalTitle": "How to Do: ARM SCISSORS",
|
| 1881 |
-
"emoji": "🔥",
|
| 1882 |
-
"youtubeId": "dPDsW7xvuVY",
|
| 1883 |
-
"embedUrl": "https://www.youtube.com/embed/dPDsW7xvuVY",
|
| 1884 |
-
"duration": "0:59",
|
| 1885 |
-
"durationInSeconds": 59,
|
| 1886 |
-
"thumbnail": "https://img.youtube.com/vi/dPDsW7xvuVY/maxresdefault.jpg",
|
| 1887 |
-
"sets": 3,
|
| 1888 |
-
"reps": "40s",
|
| 1889 |
-
"rest": 30,
|
| 1890 |
-
"calories": 7,
|
| 1891 |
-
"category": "abs",
|
| 1892 |
-
"originalName": "How to Do: ARM SCISSORS"
|
| 1893 |
-
},
|
| 1894 |
-
{
|
| 1895 |
-
"name": "Starfish Abdominal",
|
| 1896 |
-
"originalTitle": "How to Do: STARFISH CRUNCH",
|
| 1897 |
-
"emoji": "🔥",
|
| 1898 |
-
"youtubeId": "ZBeGvx_ixEI",
|
| 1899 |
-
"embedUrl": "https://www.youtube.com/embed/ZBeGvx_ixEI",
|
| 1900 |
-
"duration": "1:13",
|
| 1901 |
-
"durationInSeconds": 73,
|
| 1902 |
-
"thumbnail": "https://img.youtube.com/vi/ZBeGvx_ixEI/maxresdefault.jpg",
|
| 1903 |
-
"sets": 3,
|
| 1904 |
-
"reps": "40s",
|
| 1905 |
-
"rest": 30,
|
| 1906 |
-
"calories": 9,
|
| 1907 |
-
"category": "abs",
|
| 1908 |
-
"originalName": "How to Do: STARFISH CRUNCH"
|
| 1909 |
-
},
|
| 1910 |
-
{
|
| 1911 |
-
"name": "Clapping Abdominales",
|
| 1912 |
-
"originalTitle": "How to Do: CLAPPING CRUNCHES",
|
| 1913 |
-
"emoji": "🔥",
|
| 1914 |
-
"youtubeId": "do75kugLBDM",
|
| 1915 |
-
"embedUrl": "https://www.youtube.com/embed/do75kugLBDM",
|
| 1916 |
-
"duration": "1:03",
|
| 1917 |
-
"durationInSeconds": 63,
|
| 1918 |
-
"thumbnail": "https://img.youtube.com/vi/do75kugLBDM/maxresdefault.jpg",
|
| 1919 |
-
"sets": 3,
|
| 1920 |
-
"reps": "40s",
|
| 1921 |
-
"rest": 30,
|
| 1922 |
-
"calories": 7,
|
| 1923 |
-
"category": "abs",
|
| 1924 |
-
"originalName": "How to Do: CLAPPING CRUNCHES"
|
| 1925 |
-
},
|
| 1926 |
-
{
|
| 1927 |
-
"name": "Prancha Perna Para Cima",
|
| 1928 |
-
"originalTitle": "How to Do: PLANK LEG UP",
|
| 1929 |
-
"emoji": "🔥",
|
| 1930 |
-
"youtubeId": "-9kCq0pB9LI",
|
| 1931 |
-
"embedUrl": "https://www.youtube.com/embed/-9kCq0pB9LI",
|
| 1932 |
-
"duration": "1:01",
|
| 1933 |
-
"durationInSeconds": 61,
|
| 1934 |
-
"thumbnail": "https://img.youtube.com/vi/-9kCq0pB9LI/maxresdefault.jpg",
|
| 1935 |
-
"sets": 3,
|
| 1936 |
-
"reps": "40s",
|
| 1937 |
-
"rest": 30,
|
| 1938 |
-
"calories": 7,
|
| 1939 |
-
"category": "abs",
|
| 1940 |
-
"originalName": "How to Do: PLANK LEG UP"
|
| 1941 |
-
},
|
| 1942 |
-
{
|
| 1943 |
-
"name": "Diagonal Prancha",
|
| 1944 |
-
"originalTitle": "How to Do: DIAGONAL PLANK",
|
| 1945 |
-
"emoji": "🔥",
|
| 1946 |
-
"youtubeId": "qXWu8sN3NOc",
|
| 1947 |
-
"embedUrl": "https://www.youtube.com/embed/qXWu8sN3NOc",
|
| 1948 |
-
"duration": "0:54",
|
| 1949 |
-
"durationInSeconds": 54,
|
| 1950 |
-
"thumbnail": "https://img.youtube.com/vi/qXWu8sN3NOc/maxresdefault.jpg",
|
| 1951 |
-
"sets": 3,
|
| 1952 |
-
"reps": "40s",
|
| 1953 |
-
"rest": 30,
|
| 1954 |
-
"calories": 6,
|
| 1955 |
-
"category": "abs",
|
| 1956 |
-
"originalName": "How to Do: DIAGONAL PLANK"
|
| 1957 |
-
},
|
| 1958 |
-
{
|
| 1959 |
-
"name": "Para Cima E Para Baixo Prancha",
|
| 1960 |
-
"originalTitle": "How to Do: UP AND DOWN PLANK",
|
| 1961 |
-
"emoji": "🔥",
|
| 1962 |
-
"youtubeId": "BZYnP1DXOdE",
|
| 1963 |
-
"embedUrl": "https://www.youtube.com/embed/BZYnP1DXOdE",
|
| 1964 |
-
"duration": "0:53",
|
| 1965 |
-
"durationInSeconds": 53,
|
| 1966 |
-
"thumbnail": "https://img.youtube.com/vi/BZYnP1DXOdE/maxresdefault.jpg",
|
| 1967 |
-
"sets": 3,
|
| 1968 |
-
"reps": "40s",
|
| 1969 |
-
"rest": 30,
|
| 1970 |
-
"calories": 6,
|
| 1971 |
-
"category": "abs",
|
| 1972 |
-
"originalName": "How to Do: UP AND DOWN PLANK"
|
| 1973 |
-
},
|
| 1974 |
-
{
|
| 1975 |
-
"name": "Alpinista",
|
| 1976 |
-
"originalTitle": "How to Do: MOUNTAIN CLIMBER",
|
| 1977 |
-
"emoji": "🔥",
|
| 1978 |
-
"youtubeId": "qclZKbBCyWA",
|
| 1979 |
-
"embedUrl": "https://www.youtube.com/embed/qclZKbBCyWA",
|
| 1980 |
-
"duration": "1:01",
|
| 1981 |
-
"durationInSeconds": 61,
|
| 1982 |
-
"thumbnail": "https://img.youtube.com/vi/qclZKbBCyWA/maxresdefault.jpg",
|
| 1983 |
-
"sets": 3,
|
| 1984 |
-
"reps": "40s",
|
| 1985 |
-
"rest": 30,
|
| 1986 |
-
"calories": 7,
|
| 1987 |
-
"category": "abs",
|
| 1988 |
-
"originalName": "How to Do: MOUNTAIN CLIMBER"
|
| 1989 |
-
},
|
| 1990 |
-
{
|
| 1991 |
-
"name": "Lateral Prancha Walk",
|
| 1992 |
-
"originalTitle": "How to Do: LATERAL PLANK WALK",
|
| 1993 |
-
"emoji": "🔥",
|
| 1994 |
-
"youtubeId": "BU3_nSrgZ24",
|
| 1995 |
-
"embedUrl": "https://www.youtube.com/embed/BU3_nSrgZ24",
|
| 1996 |
-
"duration": "1:05",
|
| 1997 |
-
"durationInSeconds": 65,
|
| 1998 |
-
"thumbnail": "https://img.youtube.com/vi/BU3_nSrgZ24/maxresdefault.jpg",
|
| 1999 |
-
"sets": 3,
|
| 2000 |
-
"reps": "40s",
|
| 2001 |
-
"rest": 30,
|
| 2002 |
-
"calories": 8,
|
| 2003 |
-
"category": "abs",
|
| 2004 |
-
"originalName": "How to Do: LATERAL PLANK WALK"
|
| 2005 |
-
},
|
| 2006 |
-
{
|
| 2007 |
-
"name": "Abdominales Com Pernas Raised",
|
| 2008 |
-
"originalTitle": "How to Do: CRUNCHES WITH LEGS RAISED",
|
| 2009 |
-
"emoji": "🔥",
|
| 2010 |
-
"youtubeId": "ZMYHvl7vNGA",
|
| 2011 |
-
"embedUrl": "https://www.youtube.com/embed/ZMYHvl7vNGA",
|
| 2012 |
-
"duration": "0:57",
|
| 2013 |
-
"durationInSeconds": 57,
|
| 2014 |
-
"thumbnail": "https://img.youtube.com/vi/ZMYHvl7vNGA/maxresdefault.jpg",
|
| 2015 |
-
"sets": 3,
|
| 2016 |
-
"reps": "40s",
|
| 2017 |
-
"rest": 30,
|
| 2018 |
-
"calories": 7,
|
| 2019 |
-
"category": "abs",
|
| 2020 |
-
"originalName": "How to Do: CRUNCHES WITH LEGS RAISED"
|
| 2021 |
-
},
|
| 2022 |
-
{
|
| 2023 |
-
"name": "Prancha Jacks",
|
| 2024 |
-
"originalTitle": "How to Do: PLANK JACKS",
|
| 2025 |
-
"emoji": "🔥",
|
| 2026 |
-
"youtubeId": "Y0J2Pwh21G0",
|
| 2027 |
-
"embedUrl": "https://www.youtube.com/embed/Y0J2Pwh21G0",
|
| 2028 |
-
"duration": "0:59",
|
| 2029 |
-
"durationInSeconds": 59,
|
| 2030 |
-
"thumbnail": "https://img.youtube.com/vi/Y0J2Pwh21G0/maxresdefault.jpg",
|
| 2031 |
-
"sets": 3,
|
| 2032 |
-
"reps": "40s",
|
| 2033 |
-
"rest": 30,
|
| 2034 |
-
"calories": 7,
|
| 2035 |
-
"category": "abs",
|
| 2036 |
-
"originalName": "How to Do: PLANK JACKS"
|
| 2037 |
-
},
|
| 2038 |
-
{
|
| 2039 |
-
"name": "Straight Elevação De Perna",
|
| 2040 |
-
"originalTitle": "How to Do: STRAIGHT LEG RAISE",
|
| 2041 |
-
"emoji": "🔥",
|
| 2042 |
-
"youtubeId": "ApCSBg_GNB0",
|
| 2043 |
-
"embedUrl": "https://www.youtube.com/embed/ApCSBg_GNB0",
|
| 2044 |
-
"duration": "1:03",
|
| 2045 |
-
"durationInSeconds": 63,
|
| 2046 |
-
"thumbnail": "https://img.youtube.com/vi/ApCSBg_GNB0/maxresdefault.jpg",
|
| 2047 |
-
"sets": 3,
|
| 2048 |
-
"reps": "40s",
|
| 2049 |
-
"rest": 30,
|
| 2050 |
-
"calories": 7,
|
| 2051 |
-
"category": "abs",
|
| 2052 |
-
"originalName": "How to Do: STRAIGHT LEG RAISE"
|
| 2053 |
-
},
|
| 2054 |
-
{
|
| 2055 |
-
"name": "Lateral Prancha",
|
| 2056 |
-
"originalTitle": "How to Do: SIDE PLANK",
|
| 2057 |
-
"emoji": "🔥",
|
| 2058 |
-
"youtubeId": "JN6vmeObPe8",
|
| 2059 |
-
"embedUrl": "https://www.youtube.com/embed/JN6vmeObPe8",
|
| 2060 |
-
"duration": "1:08",
|
| 2061 |
-
"durationInSeconds": 68,
|
| 2062 |
-
"thumbnail": "https://img.youtube.com/vi/JN6vmeObPe8/maxresdefault.jpg",
|
| 2063 |
-
"sets": 3,
|
| 2064 |
-
"reps": "40s",
|
| 2065 |
-
"rest": 30,
|
| 2066 |
-
"calories": 8,
|
| 2067 |
-
"category": "abs",
|
| 2068 |
-
"originalName": "How to Do: SIDE PLANK"
|
| 2069 |
-
},
|
| 2070 |
-
{
|
| 2071 |
-
"name": "Scissors",
|
| 2072 |
-
"originalTitle": "How to Do: SCISSORS",
|
| 2073 |
-
"emoji": "🔥",
|
| 2074 |
-
"youtubeId": "LsYYC0Tvd14",
|
| 2075 |
-
"embedUrl": "https://www.youtube.com/embed/LsYYC0Tvd14",
|
| 2076 |
-
"duration": "0:47",
|
| 2077 |
-
"durationInSeconds": 47,
|
| 2078 |
-
"thumbnail": "https://img.youtube.com/vi/LsYYC0Tvd14/maxresdefault.jpg",
|
| 2079 |
-
"sets": 3,
|
| 2080 |
-
"reps": "12",
|
| 2081 |
-
"rest": 30,
|
| 2082 |
-
"calories": 5,
|
| 2083 |
-
"category": "abs",
|
| 2084 |
-
"originalName": "How to Do: SCISSORS"
|
| 2085 |
-
},
|
| 2086 |
-
{
|
| 2087 |
-
"name": "Flutter Kicks",
|
| 2088 |
-
"originalTitle": "How to Do: FLUTTER KICKS",
|
| 2089 |
-
"emoji": "🔥",
|
| 2090 |
-
"youtubeId": "ay9j17QSn_s",
|
| 2091 |
-
"embedUrl": "https://www.youtube.com/embed/ay9j17QSn_s",
|
| 2092 |
-
"duration": "1:03",
|
| 2093 |
-
"durationInSeconds": 63,
|
| 2094 |
-
"thumbnail": "https://img.youtube.com/vi/ay9j17QSn_s/maxresdefault.jpg",
|
| 2095 |
-
"sets": 3,
|
| 2096 |
-
"reps": "40s",
|
| 2097 |
-
"rest": 30,
|
| 2098 |
-
"calories": 7,
|
| 2099 |
-
"category": "abs",
|
| 2100 |
-
"originalName": "How to Do: FLUTTER KICKS"
|
| 2101 |
-
},
|
| 2102 |
-
{
|
| 2103 |
-
"name": "Abdominais Em Pé Na Bicicleta",
|
| 2104 |
-
"originalTitle": "Como fazer: abdominais em pé na bicicleta",
|
| 2105 |
-
"emoji": "🔥",
|
| 2106 |
-
"youtubeId": "YmxHIHmMvvY",
|
| 2107 |
-
"embedUrl": "https://www.youtube.com/embed/YmxHIHmMvvY",
|
| 2108 |
-
"duration": "1:01",
|
| 2109 |
-
"durationInSeconds": 61,
|
| 2110 |
-
"thumbnail": "https://img.youtube.com/vi/YmxHIHmMvvY/maxresdefault.jpg",
|
| 2111 |
-
"sets": 3,
|
| 2112 |
-
"reps": "40s",
|
| 2113 |
-
"rest": 30,
|
| 2114 |
-
"calories": 7,
|
| 2115 |
-
"category": "abs",
|
| 2116 |
-
"originalName": "Como fazer: abdominais em pé na bicicleta"
|
| 2117 |
-
},
|
| 2118 |
-
{
|
| 2119 |
-
"name": "V-para Cima",
|
| 2120 |
-
"originalTitle": "How to Do: V-UP",
|
| 2121 |
-
"emoji": "🔥",
|
| 2122 |
-
"youtubeId": "BHSEKanPob4",
|
| 2123 |
-
"embedUrl": "https://www.youtube.com/embed/BHSEKanPob4",
|
| 2124 |
-
"duration": "1:12",
|
| 2125 |
-
"durationInSeconds": 72,
|
| 2126 |
-
"thumbnail": "https://img.youtube.com/vi/BHSEKanPob4/maxresdefault.jpg",
|
| 2127 |
-
"sets": 3,
|
| 2128 |
-
"reps": "40s",
|
| 2129 |
-
"rest": 30,
|
| 2130 |
-
"calories": 8,
|
| 2131 |
-
"category": "abs",
|
| 2132 |
-
"originalName": "How to Do: V-UP"
|
| 2133 |
-
},
|
| 2134 |
-
{
|
| 2135 |
-
"name": "Elevação De Pernas",
|
| 2136 |
-
"originalTitle": "How to Do: LEG RAISES",
|
| 2137 |
-
"emoji": "🔥",
|
| 2138 |
-
"youtubeId": "yXqjt1TtfTA",
|
| 2139 |
-
"embedUrl": "https://www.youtube.com/embed/yXqjt1TtfTA",
|
| 2140 |
-
"duration": "1:14",
|
| 2141 |
-
"durationInSeconds": 74,
|
| 2142 |
-
"thumbnail": "https://img.youtube.com/vi/yXqjt1TtfTA/maxresdefault.jpg",
|
| 2143 |
-
"sets": 3,
|
| 2144 |
-
"reps": "40s",
|
| 2145 |
-
"rest": 30,
|
| 2146 |
-
"calories": 9,
|
| 2147 |
-
"category": "abs",
|
| 2148 |
-
"originalName": "How to Do: LEG RAISES"
|
| 2149 |
-
},
|
| 2150 |
-
{
|
| 2151 |
-
"name": "Prancha",
|
| 2152 |
-
"originalTitle": "Como fazer: PRANCHA",
|
| 2153 |
-
"emoji": "🔥",
|
| 2154 |
-
"youtubeId": "l1nvQjztmEI",
|
| 2155 |
-
"embedUrl": "https://www.youtube.com/embed/l1nvQjztmEI",
|
| 2156 |
-
"duration": "1:17",
|
| 2157 |
-
"durationInSeconds": 77,
|
| 2158 |
-
"thumbnail": "https://img.youtube.com/vi/l1nvQjztmEI/maxresdefault.jpg",
|
| 2159 |
-
"sets": 3,
|
| 2160 |
-
"reps": "40s",
|
| 2161 |
-
"rest": 30,
|
| 2162 |
-
"calories": 9,
|
| 2163 |
-
"category": "abs",
|
| 2164 |
-
"originalName": "Como fazer: PRANCHA"
|
| 2165 |
-
},
|
| 2166 |
-
{
|
| 2167 |
-
"name": "Reverse Abdominales",
|
| 2168 |
-
"originalTitle": "How to Do: REVERSE CRUNCHES",
|
| 2169 |
-
"emoji": "🔥",
|
| 2170 |
-
"youtubeId": "5HyXYi1oqZE",
|
| 2171 |
-
"embedUrl": "https://www.youtube.com/embed/5HyXYi1oqZE",
|
| 2172 |
-
"duration": "1:13",
|
| 2173 |
-
"durationInSeconds": 73,
|
| 2174 |
-
"thumbnail": "https://img.youtube.com/vi/5HyXYi1oqZE/maxresdefault.jpg",
|
| 2175 |
-
"sets": 3,
|
| 2176 |
-
"reps": "40s",
|
| 2177 |
-
"rest": 30,
|
| 2178 |
-
"calories": 9,
|
| 2179 |
-
"category": "abs",
|
| 2180 |
-
"originalName": "How to Do: REVERSE CRUNCHES"
|
| 2181 |
-
},
|
| 2182 |
-
{
|
| 2183 |
-
"name": "Long Braço Abdominales",
|
| 2184 |
-
"originalTitle": "How to Do: LONG ARM CRUNCHES",
|
| 2185 |
-
"emoji": "🔥",
|
| 2186 |
-
"youtubeId": "wnArIdUfIM0",
|
| 2187 |
-
"embedUrl": "https://www.youtube.com/embed/wnArIdUfIM0",
|
| 2188 |
-
"duration": "1:18",
|
| 2189 |
-
"durationInSeconds": 78,
|
| 2190 |
-
"thumbnail": "https://img.youtube.com/vi/wnArIdUfIM0/maxresdefault.jpg",
|
| 2191 |
-
"sets": 3,
|
| 2192 |
-
"reps": "40s",
|
| 2193 |
-
"rest": 30,
|
| 2194 |
-
"calories": 9,
|
| 2195 |
-
"category": "abs",
|
| 2196 |
-
"originalName": "How to Do: LONG ARM CRUNCHES"
|
| 2197 |
-
},
|
| 2198 |
-
{
|
| 2199 |
-
"name": "Russian Torção",
|
| 2200 |
-
"originalTitle": "How to Do: RUSSIAN TWIST",
|
| 2201 |
-
"emoji": "🔥",
|
| 2202 |
-
"youtubeId": "uYr7rhV0qpo",
|
| 2203 |
-
"embedUrl": "https://www.youtube.com/embed/uYr7rhV0qpo",
|
| 2204 |
-
"duration": "1:01",
|
| 2205 |
-
"durationInSeconds": 61,
|
| 2206 |
-
"thumbnail": "https://img.youtube.com/vi/uYr7rhV0qpo/maxresdefault.jpg",
|
| 2207 |
-
"sets": 3,
|
| 2208 |
-
"reps": "40s",
|
| 2209 |
-
"rest": 30,
|
| 2210 |
-
"calories": 7,
|
| 2211 |
-
"category": "abs",
|
| 2212 |
-
"originalName": "How to Do: RUSSIAN TWIST"
|
| 2213 |
-
},
|
| 2214 |
-
{
|
| 2215 |
-
"name": "Bicicleta Abdominales",
|
| 2216 |
-
"originalTitle": "How to Do: BICYCLE CRUNCHES",
|
| 2217 |
-
"emoji": "🔥",
|
| 2218 |
-
"youtubeId": "7JhZPRa-R80",
|
| 2219 |
-
"embedUrl": "https://www.youtube.com/embed/7JhZPRa-R80",
|
| 2220 |
-
"duration": "1:05",
|
| 2221 |
-
"durationInSeconds": 65,
|
| 2222 |
-
"thumbnail": "https://img.youtube.com/vi/7JhZPRa-R80/maxresdefault.jpg",
|
| 2223 |
-
"sets": 3,
|
| 2224 |
-
"reps": "40s",
|
| 2225 |
-
"rest": 30,
|
| 2226 |
-
"calories": 8,
|
| 2227 |
-
"category": "abs",
|
| 2228 |
-
"originalName": "How to Do: BICYCLE CRUNCHES"
|
| 2229 |
-
},
|
| 2230 |
-
{
|
| 2231 |
-
"name": "Cross Braço Abdominales",
|
| 2232 |
-
"originalTitle": "How to Do: CROSS ARM CRUNCHES",
|
| 2233 |
-
"emoji": "🔥",
|
| 2234 |
-
"youtubeId": "vgDkGrtv4vc",
|
| 2235 |
-
"embedUrl": "https://www.youtube.com/embed/vgDkGrtv4vc",
|
| 2236 |
-
"duration": "1:28",
|
| 2237 |
-
"durationInSeconds": 88,
|
| 2238 |
-
"thumbnail": "https://img.youtube.com/vi/vgDkGrtv4vc/maxresdefault.jpg",
|
| 2239 |
-
"sets": 3,
|
| 2240 |
-
"reps": "40s",
|
| 2241 |
-
"rest": 30,
|
| 2242 |
-
"calories": 10,
|
| 2243 |
-
"category": "abs",
|
| 2244 |
-
"originalName": "How to Do: CROSS ARM CRUNCHES"
|
| 2245 |
-
},
|
| 2246 |
-
{
|
| 2247 |
-
"name": "Straight-braço Prancha",
|
| 2248 |
-
"originalTitle": "How to Do: STRAIGHT-ARM PLANK",
|
| 2249 |
-
"emoji": "🔥",
|
| 2250 |
-
"youtubeId": "TMdPy8ak0mw",
|
| 2251 |
-
"embedUrl": "https://www.youtube.com/embed/TMdPy8ak0mw",
|
| 2252 |
-
"duration": "0:49",
|
| 2253 |
-
"durationInSeconds": 49,
|
| 2254 |
-
"thumbnail": "https://img.youtube.com/vi/TMdPy8ak0mw/maxresdefault.jpg",
|
| 2255 |
-
"sets": 3,
|
| 2256 |
-
"reps": "12",
|
| 2257 |
-
"rest": 30,
|
| 2258 |
-
"calories": 6,
|
| 2259 |
-
"category": "abs",
|
| 2260 |
-
"originalName": "How to Do: STRAIGHT-ARM PLANK"
|
| 2261 |
-
},
|
| 2262 |
-
{
|
| 2263 |
-
"name": "Abdominal Abdominal",
|
| 2264 |
-
"originalTitle": "How to Do: ABDOMINAL CRUNCH",
|
| 2265 |
-
"emoji": "🔥",
|
| 2266 |
-
"youtubeId": "obc8bQWANvM",
|
| 2267 |
-
"embedUrl": "https://www.youtube.com/embed/obc8bQWANvM",
|
| 2268 |
-
"duration": "1:18",
|
| 2269 |
-
"durationInSeconds": 78,
|
| 2270 |
-
"thumbnail": "https://img.youtube.com/vi/obc8bQWANvM/maxresdefault.jpg",
|
| 2271 |
-
"sets": 3,
|
| 2272 |
-
"reps": "40s",
|
| 2273 |
-
"rest": 30,
|
| 2274 |
-
"calories": 9,
|
| 2275 |
-
"category": "abs",
|
| 2276 |
-
"originalName": "How to Do: ABDOMINAL CRUNCH"
|
| 2277 |
-
},
|
| 2278 |
-
{
|
| 2279 |
-
"name": "Alternado Cachorro Apontando",
|
| 2280 |
-
"originalTitle": "How to Do: ALTERNATING BIRD DOG",
|
| 2281 |
-
"emoji": "🔥",
|
| 2282 |
-
"youtubeId": "AWl8aFYAQuw",
|
| 2283 |
-
"embedUrl": "https://www.youtube.com/embed/AWl8aFYAQuw",
|
| 2284 |
-
"duration": "0:53",
|
| 2285 |
-
"durationInSeconds": 53,
|
| 2286 |
-
"thumbnail": "https://img.youtube.com/vi/AWl8aFYAQuw/maxresdefault.jpg",
|
| 2287 |
-
"sets": 3,
|
| 2288 |
-
"reps": "40s",
|
| 2289 |
-
"rest": 30,
|
| 2290 |
-
"calories": 6,
|
| 2291 |
-
"category": "abs",
|
| 2292 |
-
"originalName": "How to Do: ALTERNATING BIRD DOG"
|
| 2293 |
-
}
|
| 2294 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/arms.js
DELETED
|
@@ -1,2134 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: arms
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 133
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_ARMS = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Rosca Reversa Com Halteres",
|
| 8 |
-
"originalTitle": "Como fazer: Rosca reversa com halteres",
|
| 9 |
-
"emoji": "💪",
|
| 10 |
-
"youtubeId": "vM40o2TiJfM",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/vM40o2TiJfM",
|
| 12 |
-
"duration": "0:44",
|
| 13 |
-
"durationInSeconds": 44,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/vM40o2TiJfM/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "12",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 4,
|
| 19 |
-
"category": "arms",
|
| 20 |
-
"originalName": "Como fazer: Rosca reversa com halteres"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": "Em Pé Para Frente Flexão Com Ombro Opener",
|
| 24 |
-
"originalTitle": "How to Do: STANDING FORWARD BEND WITH SHOULDER OPENER",
|
| 25 |
-
"emoji": "💪",
|
| 26 |
-
"youtubeId": "AKhSglU4YVw",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/AKhSglU4YVw",
|
| 28 |
-
"duration": "0:56",
|
| 29 |
-
"durationInSeconds": 56,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/AKhSglU4YVw/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "40s",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 6,
|
| 35 |
-
"category": "arms",
|
| 36 |
-
"originalName": "How to Do: STANDING FORWARD BEND WITH SHOULDER OPENER"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": "Flexão Manter",
|
| 40 |
-
"originalTitle": "How to Do: PUSH UP HOLD",
|
| 41 |
-
"emoji": "💪",
|
| 42 |
-
"youtubeId": "16-WWEQNiK0",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/16-WWEQNiK0",
|
| 44 |
-
"duration": "1:07",
|
| 45 |
-
"durationInSeconds": 67,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/16-WWEQNiK0/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "40s",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 7,
|
| 51 |
-
"category": "arms",
|
| 52 |
-
"originalName": "How to Do: PUSH UP HOLD"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": "Ombro Shrugs",
|
| 56 |
-
"originalTitle": "How to Do: SHOULDER SHRUGS",
|
| 57 |
-
"emoji": "💪",
|
| 58 |
-
"youtubeId": "lykMBrXHVKk",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/lykMBrXHVKk",
|
| 60 |
-
"duration": "0:53",
|
| 61 |
-
"durationInSeconds": 53,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/lykMBrXHVKk/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "40s",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 5,
|
| 67 |
-
"category": "arms",
|
| 68 |
-
"originalName": "How to Do: SHOULDER SHRUGS"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":halter Reverse Rosca",
|
| 72 |
-
"originalTitle": "How to Do:DUMBBELL REVERSE CURL",
|
| 73 |
-
"emoji": "💪",
|
| 74 |
-
"youtubeId": "t1BBTqAXKrI",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/t1BBTqAXKrI",
|
| 76 |
-
"duration": "0:44",
|
| 77 |
-
"durationInSeconds": 44,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/t1BBTqAXKrI/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "12",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 4,
|
| 83 |
-
"category": "arms",
|
| 84 |
-
"originalName": "How to Do:DUMBBELL REVERSE CURL"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":halter Pullover Sobre Floor",
|
| 88 |
-
"originalTitle": "How to Do:DUMBBELL PULLOVER ON FLOOR",
|
| 89 |
-
"emoji": "💪",
|
| 90 |
-
"youtubeId": "a3cF2sS5v6I",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/a3cF2sS5v6I",
|
| 92 |
-
"duration": "0:55",
|
| 93 |
-
"durationInSeconds": 55,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/a3cF2sS5v6I/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "40s",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 6,
|
| 99 |
-
"category": "arms",
|
| 100 |
-
"originalName": "How to Do:DUMBBELL PULLOVER ON FLOOR"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":halter Close Grip Floor Pressão",
|
| 104 |
-
"originalTitle": "How to Do:DUMBBELL CLOSE GRIP FLOOR PRESS",
|
| 105 |
-
"emoji": "💪",
|
| 106 |
-
"youtubeId": "gDO6U_C1ktE",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/gDO6U_C1ktE",
|
| 108 |
-
"duration": "0:47",
|
| 109 |
-
"durationInSeconds": 47,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/gDO6U_C1ktE/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "12",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 5,
|
| 115 |
-
"category": "arms",
|
| 116 |
-
"originalName": "How to Do:DUMBBELL CLOSE GRIP FLOOR PRESS"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":halter Floor Crucifixo Para Close Grip Pressão",
|
| 120 |
-
"originalTitle": "How to Do:DUMBBELL FLOOR FLY TO CLOSE GRIP PRESS",
|
| 121 |
-
"emoji": "💪",
|
| 122 |
-
"youtubeId": "YcVRQr5xQLk",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/YcVRQr5xQLk",
|
| 124 |
-
"duration": "0:45",
|
| 125 |
-
"durationInSeconds": 45,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/YcVRQr5xQLk/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "12",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 5,
|
| 131 |
-
"category": "arms",
|
| 132 |
-
"originalName": "How to Do:DUMBBELL FLOOR FLY TO CLOSE GRIP PRESS"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":halter Floor Pressão",
|
| 136 |
-
"originalTitle": "How to Do:DUMBBELL FLOOR PRESS",
|
| 137 |
-
"emoji": "💪",
|
| 138 |
-
"youtubeId": "2NbOwF_mJ2g",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/2NbOwF_mJ2g",
|
| 140 |
-
"duration": "0:50",
|
| 141 |
-
"durationInSeconds": 50,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/2NbOwF_mJ2g/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "40s",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 5,
|
| 147 |
-
"category": "arms",
|
| 148 |
-
"originalName": "How to Do:DUMBBELL FLOOR PRESS"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":bent Over Remada",
|
| 152 |
-
"originalTitle": "How to Do:BENT OVER ROW",
|
| 153 |
-
"emoji": "💪",
|
| 154 |
-
"youtubeId": "t2DUqP_13x8",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/t2DUqP_13x8",
|
| 156 |
-
"duration": "0:49",
|
| 157 |
-
"durationInSeconds": 49,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/t2DUqP_13x8/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "12",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 5,
|
| 163 |
-
"category": "arms",
|
| 164 |
-
"originalName": "How to Do:BENT OVER ROW"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":ombro Alongamento Com Cadeira",
|
| 168 |
-
"originalTitle": "How to Do:SHOULDER STRETCH WITH CHAIR",
|
| 169 |
-
"emoji": "💪",
|
| 170 |
-
"youtubeId": "1McKjXfOIJ4",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/1McKjXfOIJ4",
|
| 172 |
-
"duration": "0:36",
|
| 173 |
-
"durationInSeconds": 36,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/1McKjXfOIJ4/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "12",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 4,
|
| 179 |
-
"category": "arms",
|
| 180 |
-
"originalName": "How to Do:SHOULDER STRETCH WITH CHAIR"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":halter Close Grip Banco Pressão",
|
| 184 |
-
"originalTitle": "How to Do:DUMBBELL CLOSE GRIP BENCH PRESS",
|
| 185 |
-
"emoji": "💪",
|
| 186 |
-
"youtubeId": "kQoVg8dUB6Y",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/kQoVg8dUB6Y",
|
| 188 |
-
"duration": "0:51",
|
| 189 |
-
"durationInSeconds": 51,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/kQoVg8dUB6Y/maxresdefault.jpg",
|
| 191 |
-
"sets": 3,
|
| 192 |
-
"reps": "40s",
|
| 193 |
-
"rest": 30,
|
| 194 |
-
"calories": 5,
|
| 195 |
-
"category": "arms",
|
| 196 |
-
"originalName": "How to Do:DUMBBELL CLOSE GRIP BENCH PRESS"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":empurrar-para Cima Remada",
|
| 200 |
-
"originalTitle": "How to Do:PUSH-UP ROW",
|
| 201 |
-
"emoji": "💪",
|
| 202 |
-
"youtubeId": "DpsHmYX3Ifg",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/DpsHmYX3Ifg",
|
| 204 |
-
"duration": "0:49",
|
| 205 |
-
"durationInSeconds": 49,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/DpsHmYX3Ifg/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "12",
|
| 209 |
-
"rest": 30,
|
| 210 |
-
"calories": 5,
|
| 211 |
-
"category": "arms",
|
| 212 |
-
"originalName": "How to Do:PUSH-UP ROW"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ":halter Unilateral Braço Crucifixo",
|
| 216 |
-
"originalTitle": "How to Do:DUMBBELL SINGLE ARM FLY",
|
| 217 |
-
"emoji": "💪",
|
| 218 |
-
"youtubeId": "VzahmWiMbLI",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/VzahmWiMbLI",
|
| 220 |
-
"duration": "0:42",
|
| 221 |
-
"durationInSeconds": 42,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/VzahmWiMbLI/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "12",
|
| 225 |
-
"rest": 30,
|
| 226 |
-
"calories": 4,
|
| 227 |
-
"category": "arms",
|
| 228 |
-
"originalName": "How to Do:DUMBBELL SINGLE ARM FLY"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": ":valley Pressão",
|
| 232 |
-
"originalTitle": "How to Do:VALLEY PRESS",
|
| 233 |
-
"emoji": "💪",
|
| 234 |
-
"youtubeId": "Az3ZkQzc2pU",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/Az3ZkQzc2pU",
|
| 236 |
-
"duration": "0:52",
|
| 237 |
-
"durationInSeconds": 52,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/Az3ZkQzc2pU/maxresdefault.jpg",
|
| 239 |
-
"sets": 3,
|
| 240 |
-
"reps": "40s",
|
| 241 |
-
"rest": 30,
|
| 242 |
-
"calories": 5,
|
| 243 |
-
"category": "arms",
|
| 244 |
-
"originalName": "How to Do:VALLEY PRESS"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": ":halter Upright-remada",
|
| 248 |
-
"originalTitle": "How to Do:DUMBBELL UPRIGHT-ROW",
|
| 249 |
-
"emoji": "💪",
|
| 250 |
-
"youtubeId": "8ywEQiJuBNg",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/8ywEQiJuBNg",
|
| 252 |
-
"duration": "0:55",
|
| 253 |
-
"durationInSeconds": 55,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/8ywEQiJuBNg/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "40s",
|
| 257 |
-
"rest": 30,
|
| 258 |
-
"calories": 6,
|
| 259 |
-
"category": "arms",
|
| 260 |
-
"originalName": "How to Do:DUMBBELL UPRIGHT-ROW"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": ":bent Over Halter Rows",
|
| 264 |
-
"originalTitle": "How to Do:BENT OVER DUMBBELL ROWS",
|
| 265 |
-
"emoji": "💪",
|
| 266 |
-
"youtubeId": "6YfpfLvUa5w",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/6YfpfLvUa5w",
|
| 268 |
-
"duration": "0:48",
|
| 269 |
-
"durationInSeconds": 48,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/6YfpfLvUa5w/maxresdefault.jpg",
|
| 271 |
-
"sets": 3,
|
| 272 |
-
"reps": "12",
|
| 273 |
-
"rest": 30,
|
| 274 |
-
"calories": 5,
|
| 275 |
-
"category": "arms",
|
| 276 |
-
"originalName": "How to Do:BENT OVER DUMBBELL ROWS"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": ":halter Pullover",
|
| 280 |
-
"originalTitle": "How to Do:DUMBBELL PULLOVER",
|
| 281 |
-
"emoji": "💪",
|
| 282 |
-
"youtubeId": "FCogymf_XK0",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/FCogymf_XK0",
|
| 284 |
-
"duration": "0:53",
|
| 285 |
-
"durationInSeconds": 53,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/FCogymf_XK0/maxresdefault.jpg",
|
| 287 |
-
"sets": 3,
|
| 288 |
-
"reps": "40s",
|
| 289 |
-
"rest": 30,
|
| 290 |
-
"calories": 5,
|
| 291 |
-
"category": "arms",
|
| 292 |
-
"originalName": "How to Do:DUMBBELL PULLOVER"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": ":halter Balanço",
|
| 296 |
-
"originalTitle": "How to Do:DUMBBELL SWING",
|
| 297 |
-
"emoji": "💪",
|
| 298 |
-
"youtubeId": "ELSro-2v_Sw",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/ELSro-2v_Sw",
|
| 300 |
-
"duration": "0:46",
|
| 301 |
-
"durationInSeconds": 46,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/ELSro-2v_Sw/maxresdefault.jpg",
|
| 303 |
-
"sets": 3,
|
| 304 |
-
"reps": "12",
|
| 305 |
-
"rest": 30,
|
| 306 |
-
"calories": 5,
|
| 307 |
-
"category": "arms",
|
| 308 |
-
"originalName": "How to Do:DUMBBELL SWING"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": ":tríceps Halter Flick Costas",
|
| 312 |
-
"originalTitle": "How to Do:TRICEP DUMBBELL FLICK BACK",
|
| 313 |
-
"emoji": "💪",
|
| 314 |
-
"youtubeId": "A1XWkJLwAI0",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/A1XWkJLwAI0",
|
| 316 |
-
"duration": "0:47",
|
| 317 |
-
"durationInSeconds": 47,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/A1XWkJLwAI0/maxresdefault.jpg",
|
| 319 |
-
"sets": 3,
|
| 320 |
-
"reps": "12",
|
| 321 |
-
"rest": 30,
|
| 322 |
-
"calories": 5,
|
| 323 |
-
"category": "arms",
|
| 324 |
-
"originalName": "How to Do:TRICEP DUMBBELL FLICK BACK"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": ":sentado Overhead Tríceps Extension",
|
| 328 |
-
"originalTitle": "How to Do:SEATED OVERHEAD TRICEP EXTENSION",
|
| 329 |
-
"emoji": "💪",
|
| 330 |
-
"youtubeId": "-9Uup5bhPBI",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/-9Uup5bhPBI",
|
| 332 |
-
"duration": "0:45",
|
| 333 |
-
"durationInSeconds": 45,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/-9Uup5bhPBI/maxresdefault.jpg",
|
| 335 |
-
"sets": 3,
|
| 336 |
-
"reps": "12",
|
| 337 |
-
"rest": 30,
|
| 338 |
-
"calories": 5,
|
| 339 |
-
"category": "arms",
|
| 340 |
-
"originalName": "How to Do:SEATED OVERHEAD TRICEP EXTENSION"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": ":halter Braço Coice De Tríceps",
|
| 344 |
-
"originalTitle": "How to Do:DUMBBELL ARM TRICEPS KICKBACK",
|
| 345 |
-
"emoji": "💪",
|
| 346 |
-
"youtubeId": "zfnWQVmDspU",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/zfnWQVmDspU",
|
| 348 |
-
"duration": "0:48",
|
| 349 |
-
"durationInSeconds": 48,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/zfnWQVmDspU/maxresdefault.jpg",
|
| 351 |
-
"sets": 3,
|
| 352 |
-
"reps": "12",
|
| 353 |
-
"rest": 30,
|
| 354 |
-
"calories": 5,
|
| 355 |
-
"category": "arms",
|
| 356 |
-
"originalName": "How to Do:DUMBBELL ARM TRICEPS KICKBACK"
|
| 357 |
-
},
|
| 358 |
-
{
|
| 359 |
-
"name": ":halter Posterior De Coxa Rosca",
|
| 360 |
-
"originalTitle": "How to Do:DUMBBELL HAMSTRING CURL",
|
| 361 |
-
"emoji": "💪",
|
| 362 |
-
"youtubeId": "0dO19gUYGyc",
|
| 363 |
-
"embedUrl": "https://www.youtube.com/embed/0dO19gUYGyc",
|
| 364 |
-
"duration": "0:54",
|
| 365 |
-
"durationInSeconds": 54,
|
| 366 |
-
"thumbnail": "https://img.youtube.com/vi/0dO19gUYGyc/maxresdefault.jpg",
|
| 367 |
-
"sets": 3,
|
| 368 |
-
"reps": "40s",
|
| 369 |
-
"rest": 30,
|
| 370 |
-
"calories": 5,
|
| 371 |
-
"category": "arms",
|
| 372 |
-
"originalName": "How to Do:DUMBBELL HAMSTRING CURL"
|
| 373 |
-
},
|
| 374 |
-
{
|
| 375 |
-
"name": ":halter Deitado Tríceps Extension",
|
| 376 |
-
"originalTitle": "How to Do:DUMBBELL LYING TRICEPS EXTENSION",
|
| 377 |
-
"emoji": "💪",
|
| 378 |
-
"youtubeId": "FyBXas1QUWo",
|
| 379 |
-
"embedUrl": "https://www.youtube.com/embed/FyBXas1QUWo",
|
| 380 |
-
"duration": "0:47",
|
| 381 |
-
"durationInSeconds": 47,
|
| 382 |
-
"thumbnail": "https://img.youtube.com/vi/FyBXas1QUWo/maxresdefault.jpg",
|
| 383 |
-
"sets": 3,
|
| 384 |
-
"reps": "12",
|
| 385 |
-
"rest": 30,
|
| 386 |
-
"calories": 5,
|
| 387 |
-
"category": "arms",
|
| 388 |
-
"originalName": "How to Do:DUMBBELL LYING TRICEPS EXTENSION"
|
| 389 |
-
},
|
| 390 |
-
{
|
| 391 |
-
"name": ":halter Cuban Rotation",
|
| 392 |
-
"originalTitle": "How to Do:DUMBBELL CUBAN ROTATION",
|
| 393 |
-
"emoji": "💪",
|
| 394 |
-
"youtubeId": "voe9vZ0Yjlk",
|
| 395 |
-
"embedUrl": "https://www.youtube.com/embed/voe9vZ0Yjlk",
|
| 396 |
-
"duration": "0:51",
|
| 397 |
-
"durationInSeconds": 51,
|
| 398 |
-
"thumbnail": "https://img.youtube.com/vi/voe9vZ0Yjlk/maxresdefault.jpg",
|
| 399 |
-
"sets": 3,
|
| 400 |
-
"reps": "40s",
|
| 401 |
-
"rest": 30,
|
| 402 |
-
"calories": 5,
|
| 403 |
-
"category": "arms",
|
| 404 |
-
"originalName": "How to Do:DUMBBELL CUBAN ROTATION"
|
| 405 |
-
},
|
| 406 |
-
{
|
| 407 |
-
"name": ":cross Body Hammer Rosca",
|
| 408 |
-
"originalTitle": "How to Do:CROSS BODY HAMMER CURL",
|
| 409 |
-
"emoji": "💪",
|
| 410 |
-
"youtubeId": "uBSgMtuxnv0",
|
| 411 |
-
"embedUrl": "https://www.youtube.com/embed/uBSgMtuxnv0",
|
| 412 |
-
"duration": "0:57",
|
| 413 |
-
"durationInSeconds": 57,
|
| 414 |
-
"thumbnail": "https://img.youtube.com/vi/uBSgMtuxnv0/maxresdefault.jpg",
|
| 415 |
-
"sets": 3,
|
| 416 |
-
"reps": "40s",
|
| 417 |
-
"rest": 30,
|
| 418 |
-
"calories": 6,
|
| 419 |
-
"category": "arms",
|
| 420 |
-
"originalName": "How to Do:CROSS BODY HAMMER CURL"
|
| 421 |
-
},
|
| 422 |
-
{
|
| 423 |
-
"name": ":halter Unilateral Braço Otis Para Cima",
|
| 424 |
-
"originalTitle": "How to Do:DUMBBELL SINGLE ARM OTIS UP",
|
| 425 |
-
"emoji": "💪",
|
| 426 |
-
"youtubeId": "sQbtGNsAcl4",
|
| 427 |
-
"embedUrl": "https://www.youtube.com/embed/sQbtGNsAcl4",
|
| 428 |
-
"duration": "0:52",
|
| 429 |
-
"durationInSeconds": 52,
|
| 430 |
-
"thumbnail": "https://img.youtube.com/vi/sQbtGNsAcl4/maxresdefault.jpg",
|
| 431 |
-
"sets": 3,
|
| 432 |
-
"reps": "40s",
|
| 433 |
-
"rest": 30,
|
| 434 |
-
"calories": 5,
|
| 435 |
-
"category": "arms",
|
| 436 |
-
"originalName": "How to Do:DUMBBELL SINGLE ARM OTIS UP"
|
| 437 |
-
},
|
| 438 |
-
{
|
| 439 |
-
"name": ":halter Aberto Bíceps Curls",
|
| 440 |
-
"originalTitle": "How to Do:DUMBBELL WIDE BICEP CURLS",
|
| 441 |
-
"emoji": "💪",
|
| 442 |
-
"youtubeId": "pB4Iic8p6Ag",
|
| 443 |
-
"embedUrl": "https://www.youtube.com/embed/pB4Iic8p6Ag",
|
| 444 |
-
"duration": "0:51",
|
| 445 |
-
"durationInSeconds": 51,
|
| 446 |
-
"thumbnail": "https://img.youtube.com/vi/pB4Iic8p6Ag/maxresdefault.jpg",
|
| 447 |
-
"sets": 3,
|
| 448 |
-
"reps": "40s",
|
| 449 |
-
"rest": 30,
|
| 450 |
-
"calories": 5,
|
| 451 |
-
"category": "arms",
|
| 452 |
-
"originalName": "How to Do:DUMBBELL WIDE BICEP CURLS"
|
| 453 |
-
},
|
| 454 |
-
{
|
| 455 |
-
"name": ":halter Tríceps Extension",
|
| 456 |
-
"originalTitle": "How to Do:DUMBBELL TRICEPS EXTENSION",
|
| 457 |
-
"emoji": "💪",
|
| 458 |
-
"youtubeId": "a1Uanj_vaYA",
|
| 459 |
-
"embedUrl": "https://www.youtube.com/embed/a1Uanj_vaYA",
|
| 460 |
-
"duration": "0:52",
|
| 461 |
-
"durationInSeconds": 52,
|
| 462 |
-
"thumbnail": "https://img.youtube.com/vi/a1Uanj_vaYA/maxresdefault.jpg",
|
| 463 |
-
"sets": 3,
|
| 464 |
-
"reps": "40s",
|
| 465 |
-
"rest": 30,
|
| 466 |
-
"calories": 5,
|
| 467 |
-
"category": "arms",
|
| 468 |
-
"originalName": "How to Do:DUMBBELL TRICEPS EXTENSION"
|
| 469 |
-
},
|
| 470 |
-
{
|
| 471 |
-
"name": ":halter Punch",
|
| 472 |
-
"originalTitle": "How to Do:DUMBBELL PUNCH",
|
| 473 |
-
"emoji": "💪",
|
| 474 |
-
"youtubeId": "NyOGzlXqa8g",
|
| 475 |
-
"embedUrl": "https://www.youtube.com/embed/NyOGzlXqa8g",
|
| 476 |
-
"duration": "0:39",
|
| 477 |
-
"durationInSeconds": 39,
|
| 478 |
-
"thumbnail": "https://img.youtube.com/vi/NyOGzlXqa8g/maxresdefault.jpg",
|
| 479 |
-
"sets": 3,
|
| 480 |
-
"reps": "12",
|
| 481 |
-
"rest": 30,
|
| 482 |
-
"calories": 4,
|
| 483 |
-
"category": "arms",
|
| 484 |
-
"originalName": "How to Do:DUMBBELL PUNCH"
|
| 485 |
-
},
|
| 486 |
-
{
|
| 487 |
-
"name": ":halter Barco Manter",
|
| 488 |
-
"originalTitle": "How to Do:DUMBBELL BOAT HOLD",
|
| 489 |
-
"emoji": "💪",
|
| 490 |
-
"youtubeId": "wm7g8UoTZj4",
|
| 491 |
-
"embedUrl": "https://www.youtube.com/embed/wm7g8UoTZj4",
|
| 492 |
-
"duration": "0:41",
|
| 493 |
-
"durationInSeconds": 41,
|
| 494 |
-
"thumbnail": "https://img.youtube.com/vi/wm7g8UoTZj4/maxresdefault.jpg",
|
| 495 |
-
"sets": 3,
|
| 496 |
-
"reps": "12",
|
| 497 |
-
"rest": 30,
|
| 498 |
-
"calories": 4,
|
| 499 |
-
"category": "arms",
|
| 500 |
-
"originalName": "How to Do:DUMBBELL BOAT HOLD"
|
| 501 |
-
},
|
| 502 |
-
{
|
| 503 |
-
"name": ":halter Drag Curls",
|
| 504 |
-
"originalTitle": "How to Do:DUMBBELL DRAG CURLS",
|
| 505 |
-
"emoji": "💪",
|
| 506 |
-
"youtubeId": "896qScV6qi4",
|
| 507 |
-
"embedUrl": "https://www.youtube.com/embed/896qScV6qi4",
|
| 508 |
-
"duration": "0:49",
|
| 509 |
-
"durationInSeconds": 49,
|
| 510 |
-
"thumbnail": "https://img.youtube.com/vi/896qScV6qi4/maxresdefault.jpg",
|
| 511 |
-
"sets": 3,
|
| 512 |
-
"reps": "12",
|
| 513 |
-
"rest": 30,
|
| 514 |
-
"calories": 5,
|
| 515 |
-
"category": "arms",
|
| 516 |
-
"originalName": "How to Do:DUMBBELL DRAG CURLS"
|
| 517 |
-
},
|
| 518 |
-
{
|
| 519 |
-
"name": ":halter Rear Delt Remada",
|
| 520 |
-
"originalTitle": "How to Do:DUMBBELL REAR DELT ROW",
|
| 521 |
-
"emoji": "💪",
|
| 522 |
-
"youtubeId": "65gMtswVB1c",
|
| 523 |
-
"embedUrl": "https://www.youtube.com/embed/65gMtswVB1c",
|
| 524 |
-
"duration": "0:59",
|
| 525 |
-
"durationInSeconds": 59,
|
| 526 |
-
"thumbnail": "https://img.youtube.com/vi/65gMtswVB1c/maxresdefault.jpg",
|
| 527 |
-
"sets": 3,
|
| 528 |
-
"reps": "40s",
|
| 529 |
-
"rest": 30,
|
| 530 |
-
"calories": 6,
|
| 531 |
-
"category": "arms",
|
| 532 |
-
"originalName": "How to Do:DUMBBELL REAR DELT ROW"
|
| 533 |
-
},
|
| 534 |
-
{
|
| 535 |
-
"name": ":halter Agachamento Clean E Pressão",
|
| 536 |
-
"originalTitle": "How to Do:DUMBBELL SQUAT CLEAN AND PRESS",
|
| 537 |
-
"emoji": "💪",
|
| 538 |
-
"youtubeId": "vIt0SeDcAug",
|
| 539 |
-
"embedUrl": "https://www.youtube.com/embed/vIt0SeDcAug",
|
| 540 |
-
"duration": "0:58",
|
| 541 |
-
"durationInSeconds": 58,
|
| 542 |
-
"thumbnail": "https://img.youtube.com/vi/vIt0SeDcAug/maxresdefault.jpg",
|
| 543 |
-
"sets": 3,
|
| 544 |
-
"reps": "40s",
|
| 545 |
-
"rest": 30,
|
| 546 |
-
"calories": 6,
|
| 547 |
-
"category": "arms",
|
| 548 |
-
"originalName": "How to Do:DUMBBELL SQUAT CLEAN AND PRESS"
|
| 549 |
-
},
|
| 550 |
-
{
|
| 551 |
-
"name": ":unilateral Braço Renegade Remada",
|
| 552 |
-
"originalTitle": "How to Do:SINGLE ARM RENEGADE ROW",
|
| 553 |
-
"emoji": "💪",
|
| 554 |
-
"youtubeId": "m0KEk-Y4iII",
|
| 555 |
-
"embedUrl": "https://www.youtube.com/embed/m0KEk-Y4iII",
|
| 556 |
-
"duration": "0:44",
|
| 557 |
-
"durationInSeconds": 44,
|
| 558 |
-
"thumbnail": "https://img.youtube.com/vi/m0KEk-Y4iII/maxresdefault.jpg",
|
| 559 |
-
"sets": 3,
|
| 560 |
-
"reps": "12",
|
| 561 |
-
"rest": 30,
|
| 562 |
-
"calories": 4,
|
| 563 |
-
"category": "arms",
|
| 564 |
-
"originalName": "How to Do:SINGLE ARM RENEGADE ROW"
|
| 565 |
-
},
|
| 566 |
-
{
|
| 567 |
-
"name": ":halter Crucifixo Para Close Grip Pressão",
|
| 568 |
-
"originalTitle": "How to Do:DUMBBELL FLY TO CLOSE GRIP PRESS",
|
| 569 |
-
"emoji": "💪",
|
| 570 |
-
"youtubeId": "hJo-BOz_rfw",
|
| 571 |
-
"embedUrl": "https://www.youtube.com/embed/hJo-BOz_rfw",
|
| 572 |
-
"duration": "0:52",
|
| 573 |
-
"durationInSeconds": 52,
|
| 574 |
-
"thumbnail": "https://img.youtube.com/vi/hJo-BOz_rfw/maxresdefault.jpg",
|
| 575 |
-
"sets": 3,
|
| 576 |
-
"reps": "40s",
|
| 577 |
-
"rest": 30,
|
| 578 |
-
"calories": 5,
|
| 579 |
-
"category": "arms",
|
| 580 |
-
"originalName": "How to Do:DUMBBELL FLY TO CLOSE GRIP PRESS"
|
| 581 |
-
},
|
| 582 |
-
{
|
| 583 |
-
"name": ":halter Sentado Em & Outs",
|
| 584 |
-
"originalTitle": "How to Do:DUMBBELL SEATED IN & OUTS",
|
| 585 |
-
"emoji": "💪",
|
| 586 |
-
"youtubeId": "dFqJpeDO7R0",
|
| 587 |
-
"embedUrl": "https://www.youtube.com/embed/dFqJpeDO7R0",
|
| 588 |
-
"duration": "0:57",
|
| 589 |
-
"durationInSeconds": 57,
|
| 590 |
-
"thumbnail": "https://img.youtube.com/vi/dFqJpeDO7R0/maxresdefault.jpg",
|
| 591 |
-
"sets": 3,
|
| 592 |
-
"reps": "40s",
|
| 593 |
-
"rest": 30,
|
| 594 |
-
"calories": 6,
|
| 595 |
-
"category": "arms",
|
| 596 |
-
"originalName": "How to Do:DUMBBELL SEATED IN & OUTS"
|
| 597 |
-
},
|
| 598 |
-
{
|
| 599 |
-
"name": ":halter Lateral Barco Manter",
|
| 600 |
-
"originalTitle": "How to Do:DUMBBELL SIDE BOAT HOLD",
|
| 601 |
-
"emoji": "💪",
|
| 602 |
-
"youtubeId": "BszZ8i6bn1A",
|
| 603 |
-
"embedUrl": "https://www.youtube.com/embed/BszZ8i6bn1A",
|
| 604 |
-
"duration": "0:38",
|
| 605 |
-
"durationInSeconds": 38,
|
| 606 |
-
"thumbnail": "https://img.youtube.com/vi/BszZ8i6bn1A/maxresdefault.jpg",
|
| 607 |
-
"sets": 3,
|
| 608 |
-
"reps": "12",
|
| 609 |
-
"rest": 30,
|
| 610 |
-
"calories": 4,
|
| 611 |
-
"category": "arms",
|
| 612 |
-
"originalName": "How to Do:DUMBBELL SIDE BOAT HOLD"
|
| 613 |
-
},
|
| 614 |
-
{
|
| 615 |
-
"name": ":halter Bíceps Rosca Para Pressão",
|
| 616 |
-
"originalTitle": "How to Do:DUMBBELL BICEP CURL TO PRESS",
|
| 617 |
-
"emoji": "💪",
|
| 618 |
-
"youtubeId": "9C5EtvkK6k4",
|
| 619 |
-
"embedUrl": "https://www.youtube.com/embed/9C5EtvkK6k4",
|
| 620 |
-
"duration": "0:57",
|
| 621 |
-
"durationInSeconds": 57,
|
| 622 |
-
"thumbnail": "https://img.youtube.com/vi/9C5EtvkK6k4/maxresdefault.jpg",
|
| 623 |
-
"sets": 3,
|
| 624 |
-
"reps": "40s",
|
| 625 |
-
"rest": 30,
|
| 626 |
-
"calories": 6,
|
| 627 |
-
"category": "arms",
|
| 628 |
-
"originalName": "How to Do:DUMBBELL BICEP CURL TO PRESS"
|
| 629 |
-
},
|
| 630 |
-
{
|
| 631 |
-
"name": ":overhead Braço Circles",
|
| 632 |
-
"originalTitle": "How to Do:OVERHEAD ARM CIRCLES",
|
| 633 |
-
"emoji": "💪",
|
| 634 |
-
"youtubeId": "wZVO6ZnARIE",
|
| 635 |
-
"embedUrl": "https://www.youtube.com/embed/wZVO6ZnARIE",
|
| 636 |
-
"duration": "0:43",
|
| 637 |
-
"durationInSeconds": 43,
|
| 638 |
-
"thumbnail": "https://img.youtube.com/vi/wZVO6ZnARIE/maxresdefault.jpg",
|
| 639 |
-
"sets": 3,
|
| 640 |
-
"reps": "12",
|
| 641 |
-
"rest": 30,
|
| 642 |
-
"calories": 4,
|
| 643 |
-
"category": "arms",
|
| 644 |
-
"originalName": "How to Do:OVERHEAD ARM CIRCLES"
|
| 645 |
-
},
|
| 646 |
-
{
|
| 647 |
-
"name": ":alternado Renegade Remada",
|
| 648 |
-
"originalTitle": "How to Do:ALTERNATING RENEGADE ROW",
|
| 649 |
-
"emoji": "💪",
|
| 650 |
-
"youtubeId": "KvoHxslZun0",
|
| 651 |
-
"embedUrl": "https://www.youtube.com/embed/KvoHxslZun0",
|
| 652 |
-
"duration": "0:46",
|
| 653 |
-
"durationInSeconds": 46,
|
| 654 |
-
"thumbnail": "https://img.youtube.com/vi/KvoHxslZun0/maxresdefault.jpg",
|
| 655 |
-
"sets": 3,
|
| 656 |
-
"reps": "12",
|
| 657 |
-
"rest": 30,
|
| 658 |
-
"calories": 5,
|
| 659 |
-
"category": "arms",
|
| 660 |
-
"originalName": "How to Do:ALTERNATING RENEGADE ROW"
|
| 661 |
-
},
|
| 662 |
-
{
|
| 663 |
-
"name": ":halter Shrug",
|
| 664 |
-
"originalTitle": "How to Do:DUMBBELL SHRUG",
|
| 665 |
-
"emoji": "💪",
|
| 666 |
-
"youtubeId": "IuMXYFCVIdA",
|
| 667 |
-
"embedUrl": "https://www.youtube.com/embed/IuMXYFCVIdA",
|
| 668 |
-
"duration": "0:41",
|
| 669 |
-
"durationInSeconds": 41,
|
| 670 |
-
"thumbnail": "https://img.youtube.com/vi/IuMXYFCVIdA/maxresdefault.jpg",
|
| 671 |
-
"sets": 3,
|
| 672 |
-
"reps": "12",
|
| 673 |
-
"rest": 30,
|
| 674 |
-
"calories": 4,
|
| 675 |
-
"category": "arms",
|
| 676 |
-
"originalName": "How to Do:DUMBBELL SHRUG"
|
| 677 |
-
},
|
| 678 |
-
{
|
| 679 |
-
"name": ":halter Banco Pressão",
|
| 680 |
-
"originalTitle": "How to Do:DUMBBELL BENCH PRESS",
|
| 681 |
-
"emoji": "💪",
|
| 682 |
-
"youtubeId": "GrmETJwvBgY",
|
| 683 |
-
"embedUrl": "https://www.youtube.com/embed/GrmETJwvBgY",
|
| 684 |
-
"duration": "0:44",
|
| 685 |
-
"durationInSeconds": 44,
|
| 686 |
-
"thumbnail": "https://img.youtube.com/vi/GrmETJwvBgY/maxresdefault.jpg",
|
| 687 |
-
"sets": 3,
|
| 688 |
-
"reps": "12",
|
| 689 |
-
"rest": 30,
|
| 690 |
-
"calories": 4,
|
| 691 |
-
"category": "arms",
|
| 692 |
-
"originalName": "How to Do:DUMBBELL BENCH PRESS"
|
| 693 |
-
},
|
| 694 |
-
{
|
| 695 |
-
"name": ":em Pé Halter Rosca",
|
| 696 |
-
"originalTitle": "How to Do:STANDING DUMBBELL CURL",
|
| 697 |
-
"emoji": "💪",
|
| 698 |
-
"youtubeId": "CxM4wKfus_Y",
|
| 699 |
-
"embedUrl": "https://www.youtube.com/embed/CxM4wKfus_Y",
|
| 700 |
-
"duration": "0:47",
|
| 701 |
-
"durationInSeconds": 47,
|
| 702 |
-
"thumbnail": "https://img.youtube.com/vi/CxM4wKfus_Y/maxresdefault.jpg",
|
| 703 |
-
"sets": 3,
|
| 704 |
-
"reps": "12",
|
| 705 |
-
"rest": 30,
|
| 706 |
-
"calories": 5,
|
| 707 |
-
"category": "arms",
|
| 708 |
-
"originalName": "How to Do:STANDING DUMBBELL CURL"
|
| 709 |
-
},
|
| 710 |
-
{
|
| 711 |
-
"name": ":zottman Rosca",
|
| 712 |
-
"originalTitle": "How to Do:ZOTTMAN CURL",
|
| 713 |
-
"emoji": "💪",
|
| 714 |
-
"youtubeId": "d69IO-dO2pc",
|
| 715 |
-
"embedUrl": "https://www.youtube.com/embed/d69IO-dO2pc",
|
| 716 |
-
"duration": "0:50",
|
| 717 |
-
"durationInSeconds": 50,
|
| 718 |
-
"thumbnail": "https://img.youtube.com/vi/d69IO-dO2pc/maxresdefault.jpg",
|
| 719 |
-
"sets": 3,
|
| 720 |
-
"reps": "40s",
|
| 721 |
-
"rest": 30,
|
| 722 |
-
"calories": 5,
|
| 723 |
-
"category": "arms",
|
| 724 |
-
"originalName": "How to Do:ZOTTMAN CURL"
|
| 725 |
-
},
|
| 726 |
-
{
|
| 727 |
-
"name": ":halter Concentration Rosca",
|
| 728 |
-
"originalTitle": "How to Do:DUMBBELL CONCENTRATION CURL",
|
| 729 |
-
"emoji": "💪",
|
| 730 |
-
"youtubeId": "a6VgtO2ZOwM",
|
| 731 |
-
"embedUrl": "https://www.youtube.com/embed/a6VgtO2ZOwM",
|
| 732 |
-
"duration": "0:56",
|
| 733 |
-
"durationInSeconds": 56,
|
| 734 |
-
"thumbnail": "https://img.youtube.com/vi/a6VgtO2ZOwM/maxresdefault.jpg",
|
| 735 |
-
"sets": 3,
|
| 736 |
-
"reps": "40s",
|
| 737 |
-
"rest": 30,
|
| 738 |
-
"calories": 6,
|
| 739 |
-
"category": "arms",
|
| 740 |
-
"originalName": "How to Do:DUMBBELL CONCENTRATION CURL"
|
| 741 |
-
},
|
| 742 |
-
{
|
| 743 |
-
"name": ":alternate Hammer Rosca",
|
| 744 |
-
"originalTitle": "How to Do:ALTERNATE HAMMER CURL",
|
| 745 |
-
"emoji": "💪",
|
| 746 |
-
"youtubeId": "L1bDrPlfu1Q",
|
| 747 |
-
"embedUrl": "https://www.youtube.com/embed/L1bDrPlfu1Q",
|
| 748 |
-
"duration": "0:54",
|
| 749 |
-
"durationInSeconds": 54,
|
| 750 |
-
"thumbnail": "https://img.youtube.com/vi/L1bDrPlfu1Q/maxresdefault.jpg",
|
| 751 |
-
"sets": 3,
|
| 752 |
-
"reps": "40s",
|
| 753 |
-
"rest": 30,
|
| 754 |
-
"calories": 5,
|
| 755 |
-
"category": "arms",
|
| 756 |
-
"originalName": "How to Do:ALTERNATE HAMMER CURL"
|
| 757 |
-
},
|
| 758 |
-
{
|
| 759 |
-
"name": ":halter Decline Floor Pressão",
|
| 760 |
-
"originalTitle": "How to Do:DUMBBELL DECLINE FLOOR PRESS",
|
| 761 |
-
"emoji": "💪",
|
| 762 |
-
"youtubeId": "kBDMTp1-iTw",
|
| 763 |
-
"embedUrl": "https://www.youtube.com/embed/kBDMTp1-iTw",
|
| 764 |
-
"duration": "0:52",
|
| 765 |
-
"durationInSeconds": 52,
|
| 766 |
-
"thumbnail": "https://img.youtube.com/vi/kBDMTp1-iTw/maxresdefault.jpg",
|
| 767 |
-
"sets": 3,
|
| 768 |
-
"reps": "40s",
|
| 769 |
-
"rest": 30,
|
| 770 |
-
"calories": 5,
|
| 771 |
-
"category": "arms",
|
| 772 |
-
"originalName": "How to Do:DUMBBELL DECLINE FLOOR PRESS"
|
| 773 |
-
},
|
| 774 |
-
{
|
| 775 |
-
"name": ":braço Swings",
|
| 776 |
-
"originalTitle": "How to Do:ARM SWINGS",
|
| 777 |
-
"emoji": "💪",
|
| 778 |
-
"youtubeId": "dW3Pi-RXSyM",
|
| 779 |
-
"embedUrl": "https://www.youtube.com/embed/dW3Pi-RXSyM",
|
| 780 |
-
"duration": "0:31",
|
| 781 |
-
"durationInSeconds": 31,
|
| 782 |
-
"thumbnail": "https://img.youtube.com/vi/dW3Pi-RXSyM/maxresdefault.jpg",
|
| 783 |
-
"sets": 3,
|
| 784 |
-
"reps": "12",
|
| 785 |
-
"rest": 30,
|
| 786 |
-
"calories": 3,
|
| 787 |
-
"category": "arms",
|
| 788 |
-
"originalName": "How to Do:ARM SWINGS"
|
| 789 |
-
},
|
| 790 |
-
{
|
| 791 |
-
"name": ":halter Lateral Lateral Elevação",
|
| 792 |
-
"originalTitle": "How to Do:DUMBBELL SIDE LATERAL RAISE",
|
| 793 |
-
"emoji": "💪",
|
| 794 |
-
"youtubeId": "6L19uhg2otQ",
|
| 795 |
-
"embedUrl": "https://www.youtube.com/embed/6L19uhg2otQ",
|
| 796 |
-
"duration": "0:46",
|
| 797 |
-
"durationInSeconds": 46,
|
| 798 |
-
"thumbnail": "https://img.youtube.com/vi/6L19uhg2otQ/maxresdefault.jpg",
|
| 799 |
-
"sets": 3,
|
| 800 |
-
"reps": "12",
|
| 801 |
-
"rest": 30,
|
| 802 |
-
"calories": 5,
|
| 803 |
-
"category": "arms",
|
| 804 |
-
"originalName": "How to Do:DUMBBELL SIDE LATERAL RAISE"
|
| 805 |
-
},
|
| 806 |
-
{
|
| 807 |
-
"name": ":military Pressão",
|
| 808 |
-
"originalTitle": "How to Do:MILITARY PRESS",
|
| 809 |
-
"emoji": "💪",
|
| 810 |
-
"youtubeId": "pNa0_QN2eUg",
|
| 811 |
-
"embedUrl": "https://www.youtube.com/embed/pNa0_QN2eUg",
|
| 812 |
-
"duration": "0:57",
|
| 813 |
-
"durationInSeconds": 57,
|
| 814 |
-
"thumbnail": "https://img.youtube.com/vi/pNa0_QN2eUg/maxresdefault.jpg",
|
| 815 |
-
"sets": 3,
|
| 816 |
-
"reps": "40s",
|
| 817 |
-
"rest": 30,
|
| 818 |
-
"calories": 6,
|
| 819 |
-
"category": "arms",
|
| 820 |
-
"originalName": "How to Do:MILITARY PRESS"
|
| 821 |
-
},
|
| 822 |
-
{
|
| 823 |
-
"name": ":ombro Outward Rotation",
|
| 824 |
-
"originalTitle": "How to Do:SHOULDER OUTWARD ROTATION",
|
| 825 |
-
"emoji": "💪",
|
| 826 |
-
"youtubeId": "q_uOqXQhBq4",
|
| 827 |
-
"embedUrl": "https://www.youtube.com/embed/q_uOqXQhBq4",
|
| 828 |
-
"duration": "0:59",
|
| 829 |
-
"durationInSeconds": 59,
|
| 830 |
-
"thumbnail": "https://img.youtube.com/vi/q_uOqXQhBq4/maxresdefault.jpg",
|
| 831 |
-
"sets": 3,
|
| 832 |
-
"reps": "40s",
|
| 833 |
-
"rest": 30,
|
| 834 |
-
"calories": 6,
|
| 835 |
-
"category": "arms",
|
| 836 |
-
"originalName": "How to Do:SHOULDER OUTWARD ROTATION"
|
| 837 |
-
},
|
| 838 |
-
{
|
| 839 |
-
"name": ":tríceps Alongamento",
|
| 840 |
-
"originalTitle": "How to Do:TRICEPS STRETCH",
|
| 841 |
-
"emoji": "💪",
|
| 842 |
-
"youtubeId": "L9IGOcrdcFk",
|
| 843 |
-
"embedUrl": "https://www.youtube.com/embed/L9IGOcrdcFk",
|
| 844 |
-
"duration": "0:37",
|
| 845 |
-
"durationInSeconds": 37,
|
| 846 |
-
"thumbnail": "https://img.youtube.com/vi/L9IGOcrdcFk/maxresdefault.jpg",
|
| 847 |
-
"sets": 3,
|
| 848 |
-
"reps": "12",
|
| 849 |
-
"rest": 30,
|
| 850 |
-
"calories": 4,
|
| 851 |
-
"category": "arms",
|
| 852 |
-
"originalName": "How to Do:TRICEPS STRETCH"
|
| 853 |
-
},
|
| 854 |
-
{
|
| 855 |
-
"name": ":anterior Ombro Alongamento",
|
| 856 |
-
"originalTitle": "How to Do:ANTERIOR SHOULDER STRETCH",
|
| 857 |
-
"emoji": "💪",
|
| 858 |
-
"youtubeId": "s8C3OmS82qw",
|
| 859 |
-
"embedUrl": "https://www.youtube.com/embed/s8C3OmS82qw",
|
| 860 |
-
"duration": "0:38",
|
| 861 |
-
"durationInSeconds": 38,
|
| 862 |
-
"thumbnail": "https://img.youtube.com/vi/s8C3OmS82qw/maxresdefault.jpg",
|
| 863 |
-
"sets": 3,
|
| 864 |
-
"reps": "12",
|
| 865 |
-
"rest": 30,
|
| 866 |
-
"calories": 4,
|
| 867 |
-
"category": "arms",
|
| 868 |
-
"originalName": "How to Do:ANTERIOR SHOULDER STRETCH"
|
| 869 |
-
},
|
| 870 |
-
{
|
| 871 |
-
"name": ":em Pé Bíceps Alongamento",
|
| 872 |
-
"originalTitle": "How to Do:STANDING BICEPS STRETCH",
|
| 873 |
-
"emoji": "💪",
|
| 874 |
-
"youtubeId": "jw8EXo5h0ec",
|
| 875 |
-
"embedUrl": "https://www.youtube.com/embed/jw8EXo5h0ec",
|
| 876 |
-
"duration": "0:34",
|
| 877 |
-
"durationInSeconds": 34,
|
| 878 |
-
"thumbnail": "https://img.youtube.com/vi/jw8EXo5h0ec/maxresdefault.jpg",
|
| 879 |
-
"sets": 3,
|
| 880 |
-
"reps": "12",
|
| 881 |
-
"rest": 30,
|
| 882 |
-
"calories": 3,
|
| 883 |
-
"category": "arms",
|
| 884 |
-
"originalName": "How to Do:STANDING BICEPS STRETCH"
|
| 885 |
-
},
|
| 886 |
-
{
|
| 887 |
-
"name": ":deitado Halter Lateral Elevação",
|
| 888 |
-
"originalTitle": "How to Do:LYING DUMBBELL LATERAL RAISE",
|
| 889 |
-
"emoji": "💪",
|
| 890 |
-
"youtubeId": "Y6CIPU0uqdY",
|
| 891 |
-
"embedUrl": "https://www.youtube.com/embed/Y6CIPU0uqdY",
|
| 892 |
-
"duration": "0:44",
|
| 893 |
-
"durationInSeconds": 44,
|
| 894 |
-
"thumbnail": "https://img.youtube.com/vi/Y6CIPU0uqdY/maxresdefault.jpg",
|
| 895 |
-
"sets": 3,
|
| 896 |
-
"reps": "12",
|
| 897 |
-
"rest": 30,
|
| 898 |
-
"calories": 4,
|
| 899 |
-
"category": "arms",
|
| 900 |
-
"originalName": "How to Do:LYING DUMBBELL LATERAL RAISE"
|
| 901 |
-
},
|
| 902 |
-
{
|
| 903 |
-
"name": ":ombro Rolls",
|
| 904 |
-
"originalTitle": "How to Do:SHOULDER ROLLS",
|
| 905 |
-
"emoji": "💪",
|
| 906 |
-
"youtubeId": "Uf0MKHeT67c",
|
| 907 |
-
"embedUrl": "https://www.youtube.com/embed/Uf0MKHeT67c",
|
| 908 |
-
"duration": "0:34",
|
| 909 |
-
"durationInSeconds": 34,
|
| 910 |
-
"thumbnail": "https://img.youtube.com/vi/Uf0MKHeT67c/maxresdefault.jpg",
|
| 911 |
-
"sets": 3,
|
| 912 |
-
"reps": "12",
|
| 913 |
-
"rest": 30,
|
| 914 |
-
"calories": 3,
|
| 915 |
-
"category": "arms",
|
| 916 |
-
"originalName": "How to Do:SHOULDER ROLLS"
|
| 917 |
-
},
|
| 918 |
-
{
|
| 919 |
-
"name": ":braço Circles",
|
| 920 |
-
"originalTitle": "How to Do:ARM CIRCLES",
|
| 921 |
-
"emoji": "💪",
|
| 922 |
-
"youtubeId": "Lha66p0ZXUc",
|
| 923 |
-
"embedUrl": "https://www.youtube.com/embed/Lha66p0ZXUc",
|
| 924 |
-
"duration": "0:51",
|
| 925 |
-
"durationInSeconds": 51,
|
| 926 |
-
"thumbnail": "https://img.youtube.com/vi/Lha66p0ZXUc/maxresdefault.jpg",
|
| 927 |
-
"sets": 3,
|
| 928 |
-
"reps": "40s",
|
| 929 |
-
"rest": 30,
|
| 930 |
-
"calories": 5,
|
| 931 |
-
"category": "arms",
|
| 932 |
-
"originalName": "How to Do:ARM CIRCLES"
|
| 933 |
-
},
|
| 934 |
-
{
|
| 935 |
-
"name": ":halter Front Elevação",
|
| 936 |
-
"originalTitle": "How to Do:DUMBBELL FRONT RAISE",
|
| 937 |
-
"emoji": "💪",
|
| 938 |
-
"youtubeId": "1GG7dkTrBEk",
|
| 939 |
-
"embedUrl": "https://www.youtube.com/embed/1GG7dkTrBEk",
|
| 940 |
-
"duration": "0:51",
|
| 941 |
-
"durationInSeconds": 51,
|
| 942 |
-
"thumbnail": "https://img.youtube.com/vi/1GG7dkTrBEk/maxresdefault.jpg",
|
| 943 |
-
"sets": 3,
|
| 944 |
-
"reps": "40s",
|
| 945 |
-
"rest": 30,
|
| 946 |
-
"calories": 5,
|
| 947 |
-
"category": "arms",
|
| 948 |
-
"originalName": "How to Do:DUMBBELL FRONT RAISE"
|
| 949 |
-
},
|
| 950 |
-
{
|
| 951 |
-
"name": ":doorway Curls",
|
| 952 |
-
"originalTitle": "How to Do:DOORWAY CURLS",
|
| 953 |
-
"emoji": "💪",
|
| 954 |
-
"youtubeId": "134v7cB-1W8",
|
| 955 |
-
"embedUrl": "https://www.youtube.com/embed/134v7cB-1W8",
|
| 956 |
-
"duration": "0:48",
|
| 957 |
-
"durationInSeconds": 48,
|
| 958 |
-
"thumbnail": "https://img.youtube.com/vi/134v7cB-1W8/maxresdefault.jpg",
|
| 959 |
-
"sets": 3,
|
| 960 |
-
"reps": "12",
|
| 961 |
-
"rest": 30,
|
| 962 |
-
"calories": 5,
|
| 963 |
-
"category": "arms",
|
| 964 |
-
"originalName": "How to Do:DOORWAY CURLS"
|
| 965 |
-
},
|
| 966 |
-
{
|
| 967 |
-
"name": ":one Braço Halter Lateral Elevação",
|
| 968 |
-
"originalTitle": "How to Do:ONE ARM DUMBBELL LATERAL RAISE",
|
| 969 |
-
"emoji": "💪",
|
| 970 |
-
"youtubeId": "JdDf5rIP5Ss",
|
| 971 |
-
"embedUrl": "https://www.youtube.com/embed/JdDf5rIP5Ss",
|
| 972 |
-
"duration": "0:51",
|
| 973 |
-
"durationInSeconds": 51,
|
| 974 |
-
"thumbnail": "https://img.youtube.com/vi/JdDf5rIP5Ss/maxresdefault.jpg",
|
| 975 |
-
"sets": 3,
|
| 976 |
-
"reps": "40s",
|
| 977 |
-
"rest": 30,
|
| 978 |
-
"calories": 5,
|
| 979 |
-
"category": "arms",
|
| 980 |
-
"originalName": "How to Do:ONE ARM DUMBBELL LATERAL RAISE"
|
| 981 |
-
},
|
| 982 |
-
{
|
| 983 |
-
"name": ":military Flexãos",
|
| 984 |
-
"originalTitle": "How to Do:MILITARY PUSH UPS",
|
| 985 |
-
"emoji": "💪",
|
| 986 |
-
"youtubeId": "H8LoGZ-ZN48",
|
| 987 |
-
"embedUrl": "https://www.youtube.com/embed/H8LoGZ-ZN48",
|
| 988 |
-
"duration": "0:55",
|
| 989 |
-
"durationInSeconds": 55,
|
| 990 |
-
"thumbnail": "https://img.youtube.com/vi/H8LoGZ-ZN48/maxresdefault.jpg",
|
| 991 |
-
"sets": 3,
|
| 992 |
-
"reps": "40s",
|
| 993 |
-
"rest": 30,
|
| 994 |
-
"calories": 6,
|
| 995 |
-
"category": "arms",
|
| 996 |
-
"originalName": "How to Do:MILITARY PUSH UPS"
|
| 997 |
-
},
|
| 998 |
-
{
|
| 999 |
-
"name": ":braço Curls Abdominal",
|
| 1000 |
-
"originalTitle": "How to Do:ARM CURLS CRUNCH",
|
| 1001 |
-
"emoji": "💪",
|
| 1002 |
-
"youtubeId": "pxsOe8MJq68",
|
| 1003 |
-
"embedUrl": "https://www.youtube.com/embed/pxsOe8MJq68",
|
| 1004 |
-
"duration": "0:51",
|
| 1005 |
-
"durationInSeconds": 51,
|
| 1006 |
-
"thumbnail": "https://img.youtube.com/vi/pxsOe8MJq68/maxresdefault.jpg",
|
| 1007 |
-
"sets": 3,
|
| 1008 |
-
"reps": "40s",
|
| 1009 |
-
"rest": 30,
|
| 1010 |
-
"calories": 5,
|
| 1011 |
-
"category": "arms",
|
| 1012 |
-
"originalName": "How to Do:ARM CURLS CRUNCH"
|
| 1013 |
-
},
|
| 1014 |
-
{
|
| 1015 |
-
"name": ":arnold Halter Pressão",
|
| 1016 |
-
"originalTitle": "How to Do:ARNOLD DUMBBELL PRESS",
|
| 1017 |
-
"emoji": "💪",
|
| 1018 |
-
"youtubeId": "at9pnhR2cFM",
|
| 1019 |
-
"embedUrl": "https://www.youtube.com/embed/at9pnhR2cFM",
|
| 1020 |
-
"duration": "0:47",
|
| 1021 |
-
"durationInSeconds": 47,
|
| 1022 |
-
"thumbnail": "https://img.youtube.com/vi/at9pnhR2cFM/maxresdefault.jpg",
|
| 1023 |
-
"sets": 3,
|
| 1024 |
-
"reps": "12",
|
| 1025 |
-
"rest": 30,
|
| 1026 |
-
"calories": 5,
|
| 1027 |
-
"category": "arms",
|
| 1028 |
-
"originalName": "How to Do:ARNOLD DUMBBELL PRESS"
|
| 1029 |
-
},
|
| 1030 |
-
{
|
| 1031 |
-
"name": ":ombro Gators",
|
| 1032 |
-
"originalTitle": "How to Do:SHOULDER GATORS",
|
| 1033 |
-
"emoji": "💪",
|
| 1034 |
-
"youtubeId": "JWp8_LGkTR8",
|
| 1035 |
-
"embedUrl": "https://www.youtube.com/embed/JWp8_LGkTR8",
|
| 1036 |
-
"duration": "0:45",
|
| 1037 |
-
"durationInSeconds": 45,
|
| 1038 |
-
"thumbnail": "https://img.youtube.com/vi/JWp8_LGkTR8/maxresdefault.jpg",
|
| 1039 |
-
"sets": 3,
|
| 1040 |
-
"reps": "12",
|
| 1041 |
-
"rest": 30,
|
| 1042 |
-
"calories": 5,
|
| 1043 |
-
"category": "arms",
|
| 1044 |
-
"originalName": "How to Do:SHOULDER GATORS"
|
| 1045 |
-
},
|
| 1046 |
-
{
|
| 1047 |
-
"name": ":alternado Halter Ombro Pressão",
|
| 1048 |
-
"originalTitle": "How to Do:ALTERNATING DUMBBELL SHOULDER PRESS",
|
| 1049 |
-
"emoji": "💪",
|
| 1050 |
-
"youtubeId": "2OpSgEwaguk",
|
| 1051 |
-
"embedUrl": "https://www.youtube.com/embed/2OpSgEwaguk",
|
| 1052 |
-
"duration": "0:48",
|
| 1053 |
-
"durationInSeconds": 48,
|
| 1054 |
-
"thumbnail": "https://img.youtube.com/vi/2OpSgEwaguk/maxresdefault.jpg",
|
| 1055 |
-
"sets": 3,
|
| 1056 |
-
"reps": "12",
|
| 1057 |
-
"rest": 30,
|
| 1058 |
-
"calories": 5,
|
| 1059 |
-
"category": "arms",
|
| 1060 |
-
"originalName": "How to Do:ALTERNATING DUMBBELL SHOULDER PRESS"
|
| 1061 |
-
},
|
| 1062 |
-
{
|
| 1063 |
-
"name": ":frog Pressão",
|
| 1064 |
-
"originalTitle": "How to Do:FROG PRESS",
|
| 1065 |
-
"emoji": "💪",
|
| 1066 |
-
"youtubeId": "JvA7t9xKWgg",
|
| 1067 |
-
"embedUrl": "https://www.youtube.com/embed/JvA7t9xKWgg",
|
| 1068 |
-
"duration": "0:54",
|
| 1069 |
-
"durationInSeconds": 54,
|
| 1070 |
-
"thumbnail": "https://img.youtube.com/vi/JvA7t9xKWgg/maxresdefault.jpg",
|
| 1071 |
-
"sets": 3,
|
| 1072 |
-
"reps": "40s",
|
| 1073 |
-
"rest": 30,
|
| 1074 |
-
"calories": 5,
|
| 1075 |
-
"category": "arms",
|
| 1076 |
-
"originalName": "How to Do:FROG PRESS"
|
| 1077 |
-
},
|
| 1078 |
-
{
|
| 1079 |
-
"name": ":aberto Braço Empurrar-ups",
|
| 1080 |
-
"originalTitle": "How to Do:WIDE ARM PUSH-UPS",
|
| 1081 |
-
"emoji": "💪",
|
| 1082 |
-
"youtubeId": "pQUsUHvyoI0",
|
| 1083 |
-
"embedUrl": "https://www.youtube.com/embed/pQUsUHvyoI0",
|
| 1084 |
-
"duration": "0:51",
|
| 1085 |
-
"durationInSeconds": 51,
|
| 1086 |
-
"thumbnail": "https://img.youtube.com/vi/pQUsUHvyoI0/maxresdefault.jpg",
|
| 1087 |
-
"sets": 3,
|
| 1088 |
-
"reps": "40s",
|
| 1089 |
-
"rest": 30,
|
| 1090 |
-
"calories": 5,
|
| 1091 |
-
"category": "arms",
|
| 1092 |
-
"originalName": "How to Do:WIDE ARM PUSH-UPS"
|
| 1093 |
-
},
|
| 1094 |
-
{
|
| 1095 |
-
"name": ":prone Tríceps Flexãos",
|
| 1096 |
-
"originalTitle": "How to Do:PRONE TRICEPS PUSH UPS",
|
| 1097 |
-
"emoji": "💪",
|
| 1098 |
-
"youtubeId": "Rr43jMaoJ9g",
|
| 1099 |
-
"embedUrl": "https://www.youtube.com/embed/Rr43jMaoJ9g",
|
| 1100 |
-
"duration": "0:54",
|
| 1101 |
-
"durationInSeconds": 54,
|
| 1102 |
-
"thumbnail": "https://img.youtube.com/vi/Rr43jMaoJ9g/maxresdefault.jpg",
|
| 1103 |
-
"sets": 3,
|
| 1104 |
-
"reps": "40s",
|
| 1105 |
-
"rest": 30,
|
| 1106 |
-
"calories": 5,
|
| 1107 |
-
"category": "arms",
|
| 1108 |
-
"originalName": "How to Do:PRONE TRICEPS PUSH UPS"
|
| 1109 |
-
},
|
| 1110 |
-
{
|
| 1111 |
-
"name": ":pike Flexãos",
|
| 1112 |
-
"originalTitle": "How to Do:PIKE PUSH UPS",
|
| 1113 |
-
"emoji": "💪",
|
| 1114 |
-
"youtubeId": "Q2koXI9jphI",
|
| 1115 |
-
"embedUrl": "https://www.youtube.com/embed/Q2koXI9jphI",
|
| 1116 |
-
"duration": "0:48",
|
| 1117 |
-
"durationInSeconds": 48,
|
| 1118 |
-
"thumbnail": "https://img.youtube.com/vi/Q2koXI9jphI/maxresdefault.jpg",
|
| 1119 |
-
"sets": 3,
|
| 1120 |
-
"reps": "12",
|
| 1121 |
-
"rest": 30,
|
| 1122 |
-
"calories": 5,
|
| 1123 |
-
"category": "arms",
|
| 1124 |
-
"originalName": "How to Do:PIKE PUSH UPS"
|
| 1125 |
-
},
|
| 1126 |
-
{
|
| 1127 |
-
"name": ":hover Flexão",
|
| 1128 |
-
"originalTitle": "How to Do:HOVER PUSH UP",
|
| 1129 |
-
"emoji": "💪",
|
| 1130 |
-
"youtubeId": "6wdVoBSkU0Y",
|
| 1131 |
-
"embedUrl": "https://www.youtube.com/embed/6wdVoBSkU0Y",
|
| 1132 |
-
"duration": "0:45",
|
| 1133 |
-
"durationInSeconds": 45,
|
| 1134 |
-
"thumbnail": "https://img.youtube.com/vi/6wdVoBSkU0Y/maxresdefault.jpg",
|
| 1135 |
-
"sets": 3,
|
| 1136 |
-
"reps": "12",
|
| 1137 |
-
"rest": 30,
|
| 1138 |
-
"calories": 5,
|
| 1139 |
-
"category": "arms",
|
| 1140 |
-
"originalName": "How to Do:HOVER PUSH UP"
|
| 1141 |
-
},
|
| 1142 |
-
{
|
| 1143 |
-
"name": ":lateral Braço Elevação",
|
| 1144 |
-
"originalTitle": "How to Do:SIDE ARM RAISE",
|
| 1145 |
-
"emoji": "💪",
|
| 1146 |
-
"youtubeId": "YslHgg2E-Ro",
|
| 1147 |
-
"embedUrl": "https://www.youtube.com/embed/YslHgg2E-Ro",
|
| 1148 |
-
"duration": "0:44",
|
| 1149 |
-
"durationInSeconds": 44,
|
| 1150 |
-
"thumbnail": "https://img.youtube.com/vi/YslHgg2E-Ro/maxresdefault.jpg",
|
| 1151 |
-
"sets": 3,
|
| 1152 |
-
"reps": "12",
|
| 1153 |
-
"rest": 30,
|
| 1154 |
-
"calories": 4,
|
| 1155 |
-
"category": "arms",
|
| 1156 |
-
"originalName": "How to Do:SIDE ARM RAISE"
|
| 1157 |
-
},
|
| 1158 |
-
{
|
| 1159 |
-
"name": ":supine Flexão",
|
| 1160 |
-
"originalTitle": "How to Do:SUPINE PUSH UP",
|
| 1161 |
-
"emoji": "💪",
|
| 1162 |
-
"youtubeId": "WwbgPb9Gb48",
|
| 1163 |
-
"embedUrl": "https://www.youtube.com/embed/WwbgPb9Gb48",
|
| 1164 |
-
"duration": "0:49",
|
| 1165 |
-
"durationInSeconds": 49,
|
| 1166 |
-
"thumbnail": "https://img.youtube.com/vi/WwbgPb9Gb48/maxresdefault.jpg",
|
| 1167 |
-
"sets": 3,
|
| 1168 |
-
"reps": "12",
|
| 1169 |
-
"rest": 30,
|
| 1170 |
-
"calories": 5,
|
| 1171 |
-
"category": "arms",
|
| 1172 |
-
"originalName": "How to Do:SUPINE PUSH UP"
|
| 1173 |
-
},
|
| 1174 |
-
{
|
| 1175 |
-
"name": ":hyperextension",
|
| 1176 |
-
"originalTitle": "How to Do:HYPEREXTENSION",
|
| 1177 |
-
"emoji": "💪",
|
| 1178 |
-
"youtubeId": "W9y8xq4Ya_E",
|
| 1179 |
-
"embedUrl": "https://www.youtube.com/embed/W9y8xq4Ya_E",
|
| 1180 |
-
"duration": "0:55",
|
| 1181 |
-
"durationInSeconds": 55,
|
| 1182 |
-
"thumbnail": "https://img.youtube.com/vi/W9y8xq4Ya_E/maxresdefault.jpg",
|
| 1183 |
-
"sets": 3,
|
| 1184 |
-
"reps": "40s",
|
| 1185 |
-
"rest": 30,
|
| 1186 |
-
"calories": 6,
|
| 1187 |
-
"category": "arms",
|
| 1188 |
-
"originalName": "How to Do:HYPEREXTENSION"
|
| 1189 |
-
},
|
| 1190 |
-
{
|
| 1191 |
-
"name": ":ombro Alongamento",
|
| 1192 |
-
"originalTitle": "How to Do:SHOULDER STRETCH",
|
| 1193 |
-
"emoji": "💪",
|
| 1194 |
-
"youtubeId": "9k0EN2RCGgU",
|
| 1195 |
-
"embedUrl": "https://www.youtube.com/embed/9k0EN2RCGgU",
|
| 1196 |
-
"duration": "0:45",
|
| 1197 |
-
"durationInSeconds": 45,
|
| 1198 |
-
"thumbnail": "https://img.youtube.com/vi/9k0EN2RCGgU/maxresdefault.jpg",
|
| 1199 |
-
"sets": 3,
|
| 1200 |
-
"reps": "12",
|
| 1201 |
-
"rest": 30,
|
| 1202 |
-
"calories": 5,
|
| 1203 |
-
"category": "arms",
|
| 1204 |
-
"originalName": "How to Do:SHOULDER STRETCH"
|
| 1205 |
-
},
|
| 1206 |
-
{
|
| 1207 |
-
"name": ":braço Circles",
|
| 1208 |
-
"originalTitle": "How to Do:ARM CIRCLES",
|
| 1209 |
-
"emoji": "💪",
|
| 1210 |
-
"youtubeId": "h6GkzSA5tTc",
|
| 1211 |
-
"embedUrl": "https://www.youtube.com/embed/h6GkzSA5tTc",
|
| 1212 |
-
"duration": "0:45",
|
| 1213 |
-
"durationInSeconds": 45,
|
| 1214 |
-
"thumbnail": "https://img.youtube.com/vi/h6GkzSA5tTc/maxresdefault.jpg",
|
| 1215 |
-
"sets": 3,
|
| 1216 |
-
"reps": "12",
|
| 1217 |
-
"rest": 30,
|
| 1218 |
-
"calories": 5,
|
| 1219 |
-
"category": "arms",
|
| 1220 |
-
"originalName": "How to Do:ARM CIRCLES"
|
| 1221 |
-
},
|
| 1222 |
-
{
|
| 1223 |
-
"name": ":floor Tríceps Dips",
|
| 1224 |
-
"originalTitle": "How to Do:FLOOR TRICEP DIPS",
|
| 1225 |
-
"emoji": "💪",
|
| 1226 |
-
"youtubeId": "geNkbcZ6qDo",
|
| 1227 |
-
"embedUrl": "https://www.youtube.com/embed/geNkbcZ6qDo",
|
| 1228 |
-
"duration": "0:50",
|
| 1229 |
-
"durationInSeconds": 50,
|
| 1230 |
-
"thumbnail": "https://img.youtube.com/vi/geNkbcZ6qDo/maxresdefault.jpg",
|
| 1231 |
-
"sets": 3,
|
| 1232 |
-
"reps": "40s",
|
| 1233 |
-
"rest": 30,
|
| 1234 |
-
"calories": 5,
|
| 1235 |
-
"category": "arms",
|
| 1236 |
-
"originalName": "How to Do:FLOOR TRICEP DIPS"
|
| 1237 |
-
},
|
| 1238 |
-
{
|
| 1239 |
-
"name": ":tríceps Dips",
|
| 1240 |
-
"originalTitle": "How to Do:TRICEPS DIPS",
|
| 1241 |
-
"emoji": "💪",
|
| 1242 |
-
"youtubeId": "JhX1nBnirNw",
|
| 1243 |
-
"embedUrl": "https://www.youtube.com/embed/JhX1nBnirNw",
|
| 1244 |
-
"duration": "0:47",
|
| 1245 |
-
"durationInSeconds": 47,
|
| 1246 |
-
"thumbnail": "https://img.youtube.com/vi/JhX1nBnirNw/maxresdefault.jpg",
|
| 1247 |
-
"sets": 3,
|
| 1248 |
-
"reps": "12",
|
| 1249 |
-
"rest": 30,
|
| 1250 |
-
"calories": 5,
|
| 1251 |
-
"category": "arms",
|
| 1252 |
-
"originalName": "How to Do:TRICEPS DIPS"
|
| 1253 |
-
},
|
| 1254 |
-
{
|
| 1255 |
-
"name": ":braço Raises",
|
| 1256 |
-
"originalTitle": "How to Do:ARM RAISES",
|
| 1257 |
-
"emoji": "💪",
|
| 1258 |
-
"youtubeId": "Bqvmyni_sKQ",
|
| 1259 |
-
"embedUrl": "https://www.youtube.com/embed/Bqvmyni_sKQ",
|
| 1260 |
-
"duration": "0:46",
|
| 1261 |
-
"durationInSeconds": 46,
|
| 1262 |
-
"thumbnail": "https://img.youtube.com/vi/Bqvmyni_sKQ/maxresdefault.jpg",
|
| 1263 |
-
"sets": 3,
|
| 1264 |
-
"reps": "12",
|
| 1265 |
-
"rest": 30,
|
| 1266 |
-
"calories": 5,
|
| 1267 |
-
"category": "arms",
|
| 1268 |
-
"originalName": "How to Do:ARM RAISES"
|
| 1269 |
-
},
|
| 1270 |
-
{
|
| 1271 |
-
"name": ":halter Torture Tucks",
|
| 1272 |
-
"originalTitle": "How to Do:DUMBBELL TORTURE TUCKS",
|
| 1273 |
-
"emoji": "💪",
|
| 1274 |
-
"youtubeId": "K0Sonq8jz3M",
|
| 1275 |
-
"embedUrl": "https://www.youtube.com/embed/K0Sonq8jz3M",
|
| 1276 |
-
"duration": "0:50",
|
| 1277 |
-
"durationInSeconds": 50,
|
| 1278 |
-
"thumbnail": "https://img.youtube.com/vi/K0Sonq8jz3M/maxresdefault.jpg",
|
| 1279 |
-
"sets": 3,
|
| 1280 |
-
"reps": "40s",
|
| 1281 |
-
"rest": 30,
|
| 1282 |
-
"calories": 5,
|
| 1283 |
-
"category": "arms",
|
| 1284 |
-
"originalName": "How to Do:DUMBBELL TORTURE TUCKS"
|
| 1285 |
-
},
|
| 1286 |
-
{
|
| 1287 |
-
"name": ":halter Lateral Flexão",
|
| 1288 |
-
"originalTitle": "How to Do:DUMBBELL SIDE BEND",
|
| 1289 |
-
"emoji": "💪",
|
| 1290 |
-
"youtubeId": "E1amGLJEqpU",
|
| 1291 |
-
"embedUrl": "https://www.youtube.com/embed/E1amGLJEqpU",
|
| 1292 |
-
"duration": "0:40",
|
| 1293 |
-
"durationInSeconds": 40,
|
| 1294 |
-
"thumbnail": "https://img.youtube.com/vi/E1amGLJEqpU/maxresdefault.jpg",
|
| 1295 |
-
"sets": 3,
|
| 1296 |
-
"reps": "12",
|
| 1297 |
-
"rest": 30,
|
| 1298 |
-
"calories": 4,
|
| 1299 |
-
"category": "arms",
|
| 1300 |
-
"originalName": "How to Do:DUMBBELL SIDE BEND"
|
| 1301 |
-
},
|
| 1302 |
-
{
|
| 1303 |
-
"name": ":halter Para Cima-n-overs",
|
| 1304 |
-
"originalTitle": "How to Do:DUMBBELL UP-N-OVERS",
|
| 1305 |
-
"emoji": "💪",
|
| 1306 |
-
"youtubeId": "mDq3uINkKm0",
|
| 1307 |
-
"embedUrl": "https://www.youtube.com/embed/mDq3uINkKm0",
|
| 1308 |
-
"duration": "0:50",
|
| 1309 |
-
"durationInSeconds": 50,
|
| 1310 |
-
"thumbnail": "https://img.youtube.com/vi/mDq3uINkKm0/maxresdefault.jpg",
|
| 1311 |
-
"sets": 3,
|
| 1312 |
-
"reps": "40s",
|
| 1313 |
-
"rest": 30,
|
| 1314 |
-
"calories": 5,
|
| 1315 |
-
"category": "arms",
|
| 1316 |
-
"originalName": "How to Do:DUMBBELL UP-N-OVERS"
|
| 1317 |
-
},
|
| 1318 |
-
{
|
| 1319 |
-
"name": ":halter Paddle Boats",
|
| 1320 |
-
"originalTitle": "How to Do:DUMBBELL PADDLE BOATS",
|
| 1321 |
-
"emoji": "💪",
|
| 1322 |
-
"youtubeId": "PZLb4_ymTwA",
|
| 1323 |
-
"embedUrl": "https://www.youtube.com/embed/PZLb4_ymTwA",
|
| 1324 |
-
"duration": "0:51",
|
| 1325 |
-
"durationInSeconds": 51,
|
| 1326 |
-
"thumbnail": "https://img.youtube.com/vi/PZLb4_ymTwA/maxresdefault.jpg",
|
| 1327 |
-
"sets": 3,
|
| 1328 |
-
"reps": "40s",
|
| 1329 |
-
"rest": 30,
|
| 1330 |
-
"calories": 5,
|
| 1331 |
-
"category": "arms",
|
| 1332 |
-
"originalName": "How to Do:DUMBBELL PADDLE BOATS"
|
| 1333 |
-
},
|
| 1334 |
-
{
|
| 1335 |
-
"name": ":doorway Curls",
|
| 1336 |
-
"originalTitle": "How to Do:DOORWAY CURLS",
|
| 1337 |
-
"emoji": "💪",
|
| 1338 |
-
"youtubeId": "znC4Ehvp1q4",
|
| 1339 |
-
"embedUrl": "https://www.youtube.com/embed/znC4Ehvp1q4",
|
| 1340 |
-
"duration": "0:54",
|
| 1341 |
-
"durationInSeconds": 54,
|
| 1342 |
-
"thumbnail": "https://img.youtube.com/vi/znC4Ehvp1q4/maxresdefault.jpg",
|
| 1343 |
-
"sets": 3,
|
| 1344 |
-
"reps": "40s",
|
| 1345 |
-
"rest": 30,
|
| 1346 |
-
"calories": 5,
|
| 1347 |
-
"category": "arms",
|
| 1348 |
-
"originalName": "How to Do:DOORWAY CURLS"
|
| 1349 |
-
},
|
| 1350 |
-
{
|
| 1351 |
-
"name": ":braço Swings",
|
| 1352 |
-
"originalTitle": "How to Do:ARM SWINGS",
|
| 1353 |
-
"emoji": "💪",
|
| 1354 |
-
"youtubeId": "kNbwvTsNobE",
|
| 1355 |
-
"embedUrl": "https://www.youtube.com/embed/kNbwvTsNobE",
|
| 1356 |
-
"duration": "0:43",
|
| 1357 |
-
"durationInSeconds": 43,
|
| 1358 |
-
"thumbnail": "https://img.youtube.com/vi/kNbwvTsNobE/maxresdefault.jpg",
|
| 1359 |
-
"sets": 3,
|
| 1360 |
-
"reps": "12",
|
| 1361 |
-
"rest": 30,
|
| 1362 |
-
"calories": 4,
|
| 1363 |
-
"category": "arms",
|
| 1364 |
-
"originalName": "How to Do:ARM SWINGS"
|
| 1365 |
-
},
|
| 1366 |
-
{
|
| 1367 |
-
"name": ":halter Unilateral Braço Crucifixo",
|
| 1368 |
-
"originalTitle": "How to Do:DUMBBELL SINGLE ARM FLY",
|
| 1369 |
-
"emoji": "💪",
|
| 1370 |
-
"youtubeId": "ASvGuQYcpbE",
|
| 1371 |
-
"embedUrl": "https://www.youtube.com/embed/ASvGuQYcpbE",
|
| 1372 |
-
"duration": "1:06",
|
| 1373 |
-
"durationInSeconds": 66,
|
| 1374 |
-
"thumbnail": "https://img.youtube.com/vi/ASvGuQYcpbE/maxresdefault.jpg",
|
| 1375 |
-
"sets": 3,
|
| 1376 |
-
"reps": "40s",
|
| 1377 |
-
"rest": 30,
|
| 1378 |
-
"calories": 7,
|
| 1379 |
-
"category": "arms",
|
| 1380 |
-
"originalName": "How to Do:DUMBBELL SINGLE ARM FLY"
|
| 1381 |
-
},
|
| 1382 |
-
{
|
| 1383 |
-
"name": "Supino Com Halteres",
|
| 1384 |
-
"originalTitle": "Como fazer: SUPINO COM HALTERES",
|
| 1385 |
-
"emoji": "💪",
|
| 1386 |
-
"youtubeId": "DXENL1YOZDU",
|
| 1387 |
-
"embedUrl": "https://www.youtube.com/embed/DXENL1YOZDU",
|
| 1388 |
-
"duration": "1:06",
|
| 1389 |
-
"durationInSeconds": 66,
|
| 1390 |
-
"thumbnail": "https://img.youtube.com/vi/DXENL1YOZDU/maxresdefault.jpg",
|
| 1391 |
-
"sets": 3,
|
| 1392 |
-
"reps": "40s",
|
| 1393 |
-
"rest": 30,
|
| 1394 |
-
"calories": 7,
|
| 1395 |
-
"category": "arms",
|
| 1396 |
-
"originalName": "Como fazer: SUPINO COM HALTERES"
|
| 1397 |
-
},
|
| 1398 |
-
{
|
| 1399 |
-
"name": ":ombro Rolls",
|
| 1400 |
-
"originalTitle": "How to Do:SHOULDER ROLLS",
|
| 1401 |
-
"emoji": "💪",
|
| 1402 |
-
"youtubeId": "Xve3ePIaHo8",
|
| 1403 |
-
"embedUrl": "https://www.youtube.com/embed/Xve3ePIaHo8",
|
| 1404 |
-
"duration": "1:01",
|
| 1405 |
-
"durationInSeconds": 61,
|
| 1406 |
-
"thumbnail": "https://img.youtube.com/vi/Xve3ePIaHo8/maxresdefault.jpg",
|
| 1407 |
-
"sets": 3,
|
| 1408 |
-
"reps": "40s",
|
| 1409 |
-
"rest": 30,
|
| 1410 |
-
"calories": 6,
|
| 1411 |
-
"category": "arms",
|
| 1412 |
-
"originalName": "How to Do:SHOULDER ROLLS"
|
| 1413 |
-
},
|
| 1414 |
-
{
|
| 1415 |
-
"name": ":halter Torture Tucks",
|
| 1416 |
-
"originalTitle": "How to Do:DUMBBELL TORTURE TUCKS",
|
| 1417 |
-
"emoji": "💪",
|
| 1418 |
-
"youtubeId": "CKLSzM2OUw0",
|
| 1419 |
-
"embedUrl": "https://www.youtube.com/embed/CKLSzM2OUw0",
|
| 1420 |
-
"duration": "1:06",
|
| 1421 |
-
"durationInSeconds": 66,
|
| 1422 |
-
"thumbnail": "https://img.youtube.com/vi/CKLSzM2OUw0/maxresdefault.jpg",
|
| 1423 |
-
"sets": 3,
|
| 1424 |
-
"reps": "40s",
|
| 1425 |
-
"rest": 30,
|
| 1426 |
-
"calories": 7,
|
| 1427 |
-
"category": "arms",
|
| 1428 |
-
"originalName": "How to Do:DUMBBELL TORTURE TUCKS"
|
| 1429 |
-
},
|
| 1430 |
-
{
|
| 1431 |
-
"name": ":halter Lateral Flexão",
|
| 1432 |
-
"originalTitle": "How to Do:DUMBBELL SIDE BEND",
|
| 1433 |
-
"emoji": "💪",
|
| 1434 |
-
"youtubeId": "XGVmsVHbMRs",
|
| 1435 |
-
"embedUrl": "https://www.youtube.com/embed/XGVmsVHbMRs",
|
| 1436 |
-
"duration": "0:57",
|
| 1437 |
-
"durationInSeconds": 57,
|
| 1438 |
-
"thumbnail": "https://img.youtube.com/vi/XGVmsVHbMRs/maxresdefault.jpg",
|
| 1439 |
-
"sets": 3,
|
| 1440 |
-
"reps": "40s",
|
| 1441 |
-
"rest": 30,
|
| 1442 |
-
"calories": 6,
|
| 1443 |
-
"category": "arms",
|
| 1444 |
-
"originalName": "How to Do:DUMBBELL SIDE BEND"
|
| 1445 |
-
},
|
| 1446 |
-
{
|
| 1447 |
-
"name": ":supine Flexão",
|
| 1448 |
-
"originalTitle": "How to Do:SUPINE PUSH UP",
|
| 1449 |
-
"emoji": "💪",
|
| 1450 |
-
"youtubeId": "9MVQjmdsrMc",
|
| 1451 |
-
"embedUrl": "https://www.youtube.com/embed/9MVQjmdsrMc",
|
| 1452 |
-
"duration": "1:04",
|
| 1453 |
-
"durationInSeconds": 64,
|
| 1454 |
-
"thumbnail": "https://img.youtube.com/vi/9MVQjmdsrMc/maxresdefault.jpg",
|
| 1455 |
-
"sets": 3,
|
| 1456 |
-
"reps": "40s",
|
| 1457 |
-
"rest": 30,
|
| 1458 |
-
"calories": 6,
|
| 1459 |
-
"category": "arms",
|
| 1460 |
-
"originalName": "How to Do:SUPINE PUSH UP"
|
| 1461 |
-
},
|
| 1462 |
-
{
|
| 1463 |
-
"name": ":pike Flexãos",
|
| 1464 |
-
"originalTitle": "How to Do:PIKE PUSH UPS",
|
| 1465 |
-
"emoji": "💪",
|
| 1466 |
-
"youtubeId": "Ef89ur3lAbY",
|
| 1467 |
-
"embedUrl": "https://www.youtube.com/embed/Ef89ur3lAbY",
|
| 1468 |
-
"duration": "1:08",
|
| 1469 |
-
"durationInSeconds": 68,
|
| 1470 |
-
"thumbnail": "https://img.youtube.com/vi/Ef89ur3lAbY/maxresdefault.jpg",
|
| 1471 |
-
"sets": 3,
|
| 1472 |
-
"reps": "40s",
|
| 1473 |
-
"rest": 30,
|
| 1474 |
-
"calories": 7,
|
| 1475 |
-
"category": "arms",
|
| 1476 |
-
"originalName": "How to Do:PIKE PUSH UPS"
|
| 1477 |
-
},
|
| 1478 |
-
{
|
| 1479 |
-
"name": ":hover Flexão",
|
| 1480 |
-
"originalTitle": "How to Do:HOVER PUSH UP",
|
| 1481 |
-
"emoji": "💪",
|
| 1482 |
-
"youtubeId": "gtkXFpj_8lU",
|
| 1483 |
-
"embedUrl": "https://www.youtube.com/embed/gtkXFpj_8lU",
|
| 1484 |
-
"duration": "1:05",
|
| 1485 |
-
"durationInSeconds": 65,
|
| 1486 |
-
"thumbnail": "https://img.youtube.com/vi/gtkXFpj_8lU/maxresdefault.jpg",
|
| 1487 |
-
"sets": 3,
|
| 1488 |
-
"reps": "40s",
|
| 1489 |
-
"rest": 30,
|
| 1490 |
-
"calories": 7,
|
| 1491 |
-
"category": "arms",
|
| 1492 |
-
"originalName": "How to Do:HOVER PUSH UP"
|
| 1493 |
-
},
|
| 1494 |
-
{
|
| 1495 |
-
"name": ":braço Curls Abdominal",
|
| 1496 |
-
"originalTitle": "How to Do:ARM CURLS CRUNCH",
|
| 1497 |
-
"emoji": "💪",
|
| 1498 |
-
"youtubeId": "u3MD5H7JONA",
|
| 1499 |
-
"embedUrl": "https://www.youtube.com/embed/u3MD5H7JONA",
|
| 1500 |
-
"duration": "1:08",
|
| 1501 |
-
"durationInSeconds": 68,
|
| 1502 |
-
"thumbnail": "https://img.youtube.com/vi/u3MD5H7JONA/maxresdefault.jpg",
|
| 1503 |
-
"sets": 3,
|
| 1504 |
-
"reps": "40s",
|
| 1505 |
-
"rest": 30,
|
| 1506 |
-
"calories": 7,
|
| 1507 |
-
"category": "arms",
|
| 1508 |
-
"originalName": "How to Do:ARM CURLS CRUNCH"
|
| 1509 |
-
},
|
| 1510 |
-
{
|
| 1511 |
-
"name": ":bent Over Halter Rows",
|
| 1512 |
-
"originalTitle": "How to Do:BENT OVER DUMBBELL ROWS",
|
| 1513 |
-
"emoji": "💪",
|
| 1514 |
-
"youtubeId": "v_pbjQAv3Ec",
|
| 1515 |
-
"embedUrl": "https://www.youtube.com/embed/v_pbjQAv3Ec",
|
| 1516 |
-
"duration": "1:16",
|
| 1517 |
-
"durationInSeconds": 76,
|
| 1518 |
-
"thumbnail": "https://img.youtube.com/vi/v_pbjQAv3Ec/maxresdefault.jpg",
|
| 1519 |
-
"sets": 3,
|
| 1520 |
-
"reps": "40s",
|
| 1521 |
-
"rest": 30,
|
| 1522 |
-
"calories": 8,
|
| 1523 |
-
"category": "arms",
|
| 1524 |
-
"originalName": "How to Do:BENT OVER DUMBBELL ROWS"
|
| 1525 |
-
},
|
| 1526 |
-
{
|
| 1527 |
-
"name": ":tríceps Halter Flick Costas",
|
| 1528 |
-
"originalTitle": "How to Do:TRICEP DUMBBELL FLICK BACK",
|
| 1529 |
-
"emoji": "💪",
|
| 1530 |
-
"youtubeId": "0lJRcEY1li8",
|
| 1531 |
-
"embedUrl": "https://www.youtube.com/embed/0lJRcEY1li8",
|
| 1532 |
-
"duration": "1:22",
|
| 1533 |
-
"durationInSeconds": 82,
|
| 1534 |
-
"thumbnail": "https://img.youtube.com/vi/0lJRcEY1li8/maxresdefault.jpg",
|
| 1535 |
-
"sets": 3,
|
| 1536 |
-
"reps": "40s",
|
| 1537 |
-
"rest": 30,
|
| 1538 |
-
"calories": 8,
|
| 1539 |
-
"category": "arms",
|
| 1540 |
-
"originalName": "How to Do:TRICEP DUMBBELL FLICK BACK"
|
| 1541 |
-
},
|
| 1542 |
-
{
|
| 1543 |
-
"name": ":zottman Rosca",
|
| 1544 |
-
"originalTitle": "How to Do:ZOTTMAN CURL",
|
| 1545 |
-
"emoji": "💪",
|
| 1546 |
-
"youtubeId": "MDoE6CJ9Aec",
|
| 1547 |
-
"embedUrl": "https://www.youtube.com/embed/MDoE6CJ9Aec",
|
| 1548 |
-
"duration": "1:34",
|
| 1549 |
-
"durationInSeconds": 94,
|
| 1550 |
-
"thumbnail": "https://img.youtube.com/vi/MDoE6CJ9Aec/maxresdefault.jpg",
|
| 1551 |
-
"sets": 3,
|
| 1552 |
-
"reps": "40s",
|
| 1553 |
-
"rest": 30,
|
| 1554 |
-
"calories": 9,
|
| 1555 |
-
"category": "arms",
|
| 1556 |
-
"originalName": "How to Do:ZOTTMAN CURL"
|
| 1557 |
-
},
|
| 1558 |
-
{
|
| 1559 |
-
"name": "Extensão De Tríceps Com Halteres",
|
| 1560 |
-
"originalTitle": "Como fazer: EXTENSÃO DE TRÍCEPS COM HALTERES",
|
| 1561 |
-
"emoji": "💪",
|
| 1562 |
-
"youtubeId": "k0OT0xqAXJs",
|
| 1563 |
-
"embedUrl": "https://www.youtube.com/embed/k0OT0xqAXJs",
|
| 1564 |
-
"duration": "1:22",
|
| 1565 |
-
"durationInSeconds": 82,
|
| 1566 |
-
"thumbnail": "https://img.youtube.com/vi/k0OT0xqAXJs/maxresdefault.jpg",
|
| 1567 |
-
"sets": 3,
|
| 1568 |
-
"reps": "40s",
|
| 1569 |
-
"rest": 30,
|
| 1570 |
-
"calories": 8,
|
| 1571 |
-
"category": "arms",
|
| 1572 |
-
"originalName": "Como fazer: EXTENSÃO DE TRÍCEPS COM HALTERES"
|
| 1573 |
-
},
|
| 1574 |
-
{
|
| 1575 |
-
"name": "Retrocesso Com Halteres",
|
| 1576 |
-
"originalTitle": "Como fazer: RETROCESSO COM HALTERES",
|
| 1577 |
-
"emoji": "💪",
|
| 1578 |
-
"youtubeId": "qOQZN2G4_3k",
|
| 1579 |
-
"embedUrl": "https://www.youtube.com/embed/qOQZN2G4_3k",
|
| 1580 |
-
"duration": "1:23",
|
| 1581 |
-
"durationInSeconds": 83,
|
| 1582 |
-
"thumbnail": "https://img.youtube.com/vi/qOQZN2G4_3k/maxresdefault.jpg",
|
| 1583 |
-
"sets": 3,
|
| 1584 |
-
"reps": "40s",
|
| 1585 |
-
"rest": 30,
|
| 1586 |
-
"calories": 8,
|
| 1587 |
-
"category": "arms",
|
| 1588 |
-
"originalName": "Como fazer: RETROCESSO COM HALTERES"
|
| 1589 |
-
},
|
| 1590 |
-
{
|
| 1591 |
-
"name": ":sentado Overhead Tríceps Extension",
|
| 1592 |
-
"originalTitle": "How to Do:SEATED OVERHEAD TRICEP EXTENSION",
|
| 1593 |
-
"emoji": "💪",
|
| 1594 |
-
"youtubeId": "NQzLqpHLyuI",
|
| 1595 |
-
"embedUrl": "https://www.youtube.com/embed/NQzLqpHLyuI",
|
| 1596 |
-
"duration": "1:14",
|
| 1597 |
-
"durationInSeconds": 74,
|
| 1598 |
-
"thumbnail": "https://img.youtube.com/vi/NQzLqpHLyuI/maxresdefault.jpg",
|
| 1599 |
-
"sets": 3,
|
| 1600 |
-
"reps": "40s",
|
| 1601 |
-
"rest": 30,
|
| 1602 |
-
"calories": 7,
|
| 1603 |
-
"category": "arms",
|
| 1604 |
-
"originalName": "How to Do:SEATED OVERHEAD TRICEP EXTENSION"
|
| 1605 |
-
},
|
| 1606 |
-
{
|
| 1607 |
-
"name": ":military Flexãos",
|
| 1608 |
-
"originalTitle": "How to Do:MILITARY PUSH UPS",
|
| 1609 |
-
"emoji": "💪",
|
| 1610 |
-
"youtubeId": "wbSSlYNratA",
|
| 1611 |
-
"embedUrl": "https://www.youtube.com/embed/wbSSlYNratA",
|
| 1612 |
-
"duration": "1:11",
|
| 1613 |
-
"durationInSeconds": 71,
|
| 1614 |
-
"thumbnail": "https://img.youtube.com/vi/wbSSlYNratA/maxresdefault.jpg",
|
| 1615 |
-
"sets": 3,
|
| 1616 |
-
"reps": "40s",
|
| 1617 |
-
"rest": 30,
|
| 1618 |
-
"calories": 7,
|
| 1619 |
-
"category": "arms",
|
| 1620 |
-
"originalName": "How to Do:MILITARY PUSH UPS"
|
| 1621 |
-
},
|
| 1622 |
-
{
|
| 1623 |
-
"name": ":ombro Alongamento Com Cadeira",
|
| 1624 |
-
"originalTitle": "How to Do:SHOULDER STRETCH WITH CHAIR",
|
| 1625 |
-
"emoji": "💪",
|
| 1626 |
-
"youtubeId": "RAeNkKPQhgY",
|
| 1627 |
-
"embedUrl": "https://www.youtube.com/embed/RAeNkKPQhgY",
|
| 1628 |
-
"duration": "0:56",
|
| 1629 |
-
"durationInSeconds": 56,
|
| 1630 |
-
"thumbnail": "https://img.youtube.com/vi/RAeNkKPQhgY/maxresdefault.jpg",
|
| 1631 |
-
"sets": 3,
|
| 1632 |
-
"reps": "40s",
|
| 1633 |
-
"rest": 30,
|
| 1634 |
-
"calories": 6,
|
| 1635 |
-
"category": "arms",
|
| 1636 |
-
"originalName": "How to Do:SHOULDER STRETCH WITH CHAIR"
|
| 1637 |
-
},
|
| 1638 |
-
{
|
| 1639 |
-
"name": "Rosca De Concentração Com Halteres",
|
| 1640 |
-
"originalTitle": "Como fazer: Rosca de concentração com halteres",
|
| 1641 |
-
"emoji": "💪",
|
| 1642 |
-
"youtubeId": "9Hvlg3rH5qY",
|
| 1643 |
-
"embedUrl": "https://www.youtube.com/embed/9Hvlg3rH5qY",
|
| 1644 |
-
"duration": "1:17",
|
| 1645 |
-
"durationInSeconds": 77,
|
| 1646 |
-
"thumbnail": "https://img.youtube.com/vi/9Hvlg3rH5qY/maxresdefault.jpg",
|
| 1647 |
-
"sets": 3,
|
| 1648 |
-
"reps": "40s",
|
| 1649 |
-
"rest": 30,
|
| 1650 |
-
"calories": 8,
|
| 1651 |
-
"category": "arms",
|
| 1652 |
-
"originalName": "Como fazer: Rosca de concentração com halteres"
|
| 1653 |
-
},
|
| 1654 |
-
{
|
| 1655 |
-
"name": ":em Pé Halter Rosca",
|
| 1656 |
-
"originalTitle": "How to Do:STANDING DUMBBELL CURL",
|
| 1657 |
-
"emoji": "💪",
|
| 1658 |
-
"youtubeId": "w336bY_Ilf0",
|
| 1659 |
-
"embedUrl": "https://www.youtube.com/embed/w336bY_Ilf0",
|
| 1660 |
-
"duration": "1:22",
|
| 1661 |
-
"durationInSeconds": 82,
|
| 1662 |
-
"thumbnail": "https://img.youtube.com/vi/w336bY_Ilf0/maxresdefault.jpg",
|
| 1663 |
-
"sets": 3,
|
| 1664 |
-
"reps": "40s",
|
| 1665 |
-
"rest": 30,
|
| 1666 |
-
"calories": 8,
|
| 1667 |
-
"category": "arms",
|
| 1668 |
-
"originalName": "How to Do:STANDING DUMBBELL CURL"
|
| 1669 |
-
},
|
| 1670 |
-
{
|
| 1671 |
-
"name": ":deitado Halter Lateral Elevação",
|
| 1672 |
-
"originalTitle": "How to Do:LYING DUMBBELL LATERAL RAISE",
|
| 1673 |
-
"emoji": "💪",
|
| 1674 |
-
"youtubeId": "ciJl9ztrhGU",
|
| 1675 |
-
"embedUrl": "https://www.youtube.com/embed/ciJl9ztrhGU",
|
| 1676 |
-
"duration": "0:54",
|
| 1677 |
-
"durationInSeconds": 54,
|
| 1678 |
-
"thumbnail": "https://img.youtube.com/vi/ciJl9ztrhGU/maxresdefault.jpg",
|
| 1679 |
-
"sets": 3,
|
| 1680 |
-
"reps": "40s",
|
| 1681 |
-
"rest": 30,
|
| 1682 |
-
"calories": 5,
|
| 1683 |
-
"category": "arms",
|
| 1684 |
-
"originalName": "How to Do:LYING DUMBBELL LATERAL RAISE"
|
| 1685 |
-
},
|
| 1686 |
-
{
|
| 1687 |
-
"name": ":one Braço Halter Lateral Elevação",
|
| 1688 |
-
"originalTitle": "How to Do:ONE ARM DUMBBELL LATERAL RAISE",
|
| 1689 |
-
"emoji": "💪",
|
| 1690 |
-
"youtubeId": "mEuUMOokHqY",
|
| 1691 |
-
"embedUrl": "https://www.youtube.com/embed/mEuUMOokHqY",
|
| 1692 |
-
"duration": "1:16",
|
| 1693 |
-
"durationInSeconds": 76,
|
| 1694 |
-
"thumbnail": "https://img.youtube.com/vi/mEuUMOokHqY/maxresdefault.jpg",
|
| 1695 |
-
"sets": 3,
|
| 1696 |
-
"reps": "40s",
|
| 1697 |
-
"rest": 30,
|
| 1698 |
-
"calories": 8,
|
| 1699 |
-
"category": "arms",
|
| 1700 |
-
"originalName": "How to Do:ONE ARM DUMBBELL LATERAL RAISE"
|
| 1701 |
-
},
|
| 1702 |
-
{
|
| 1703 |
-
"name": ":halter Lateral Lateral Elevação",
|
| 1704 |
-
"originalTitle": "How to Do:DUMBBELL SIDE LATERAL RAISE",
|
| 1705 |
-
"emoji": "💪",
|
| 1706 |
-
"youtubeId": "CVwh8H61c2k",
|
| 1707 |
-
"embedUrl": "https://www.youtube.com/embed/CVwh8H61c2k",
|
| 1708 |
-
"duration": "1:11",
|
| 1709 |
-
"durationInSeconds": 71,
|
| 1710 |
-
"thumbnail": "https://img.youtube.com/vi/CVwh8H61c2k/maxresdefault.jpg",
|
| 1711 |
-
"sets": 3,
|
| 1712 |
-
"reps": "40s",
|
| 1713 |
-
"rest": 30,
|
| 1714 |
-
"calories": 7,
|
| 1715 |
-
"category": "arms",
|
| 1716 |
-
"originalName": "How to Do:DUMBBELL SIDE LATERAL RAISE"
|
| 1717 |
-
},
|
| 1718 |
-
{
|
| 1719 |
-
"name": ":arnold Halter Pressão",
|
| 1720 |
-
"originalTitle": "How to Do:ARNOLD DUMBBELL PRESS",
|
| 1721 |
-
"emoji": "💪",
|
| 1722 |
-
"youtubeId": "8k8aH_M2uHY",
|
| 1723 |
-
"embedUrl": "https://www.youtube.com/embed/8k8aH_M2uHY",
|
| 1724 |
-
"duration": "0:58",
|
| 1725 |
-
"durationInSeconds": 58,
|
| 1726 |
-
"thumbnail": "https://img.youtube.com/vi/8k8aH_M2uHY/maxresdefault.jpg",
|
| 1727 |
-
"sets": 3,
|
| 1728 |
-
"reps": "40s",
|
| 1729 |
-
"rest": 30,
|
| 1730 |
-
"calories": 6,
|
| 1731 |
-
"category": "arms",
|
| 1732 |
-
"originalName": "How to Do:ARNOLD DUMBBELL PRESS"
|
| 1733 |
-
},
|
| 1734 |
-
{
|
| 1735 |
-
"name": ":halter Front Elevação",
|
| 1736 |
-
"originalTitle": "How to Do:DUMBBELL FRONT RAISE",
|
| 1737 |
-
"emoji": "💪",
|
| 1738 |
-
"youtubeId": "HiSauqBAlUg",
|
| 1739 |
-
"embedUrl": "https://www.youtube.com/embed/HiSauqBAlUg",
|
| 1740 |
-
"duration": "1:09",
|
| 1741 |
-
"durationInSeconds": 69,
|
| 1742 |
-
"thumbnail": "https://img.youtube.com/vi/HiSauqBAlUg/maxresdefault.jpg",
|
| 1743 |
-
"sets": 3,
|
| 1744 |
-
"reps": "40s",
|
| 1745 |
-
"rest": 30,
|
| 1746 |
-
"calories": 7,
|
| 1747 |
-
"category": "arms",
|
| 1748 |
-
"originalName": "How to Do:DUMBBELL FRONT RAISE"
|
| 1749 |
-
},
|
| 1750 |
-
{
|
| 1751 |
-
"name": ":military Pressão",
|
| 1752 |
-
"originalTitle": "How to Do:MILITARY PRESS",
|
| 1753 |
-
"emoji": "💪",
|
| 1754 |
-
"youtubeId": "uKOYuEwsI4Q",
|
| 1755 |
-
"embedUrl": "https://www.youtube.com/embed/uKOYuEwsI4Q",
|
| 1756 |
-
"duration": "1:16",
|
| 1757 |
-
"durationInSeconds": 76,
|
| 1758 |
-
"thumbnail": "https://img.youtube.com/vi/uKOYuEwsI4Q/maxresdefault.jpg",
|
| 1759 |
-
"sets": 3,
|
| 1760 |
-
"reps": "40s",
|
| 1761 |
-
"rest": 30,
|
| 1762 |
-
"calories": 8,
|
| 1763 |
-
"category": "arms",
|
| 1764 |
-
"originalName": "How to Do:MILITARY PRESS"
|
| 1765 |
-
},
|
| 1766 |
-
{
|
| 1767 |
-
"name": ":overhead Braço Circles",
|
| 1768 |
-
"originalTitle": "How to Do:OVERHEAD ARM CIRCLES",
|
| 1769 |
-
"emoji": "💪",
|
| 1770 |
-
"youtubeId": "tDK3if-gjtQ",
|
| 1771 |
-
"embedUrl": "https://www.youtube.com/embed/tDK3if-gjtQ",
|
| 1772 |
-
"duration": "0:50",
|
| 1773 |
-
"durationInSeconds": 50,
|
| 1774 |
-
"thumbnail": "https://img.youtube.com/vi/tDK3if-gjtQ/maxresdefault.jpg",
|
| 1775 |
-
"sets": 3,
|
| 1776 |
-
"reps": "40s",
|
| 1777 |
-
"rest": 30,
|
| 1778 |
-
"calories": 5,
|
| 1779 |
-
"category": "arms",
|
| 1780 |
-
"originalName": "How to Do:OVERHEAD ARM CIRCLES"
|
| 1781 |
-
},
|
| 1782 |
-
{
|
| 1783 |
-
"name": ":ombro Outward Rotation",
|
| 1784 |
-
"originalTitle": "How to Do:SHOULDER OUTWARD ROTATION",
|
| 1785 |
-
"emoji": "💪",
|
| 1786 |
-
"youtubeId": "WxA6zPOl-Yw",
|
| 1787 |
-
"embedUrl": "https://www.youtube.com/embed/WxA6zPOl-Yw",
|
| 1788 |
-
"duration": "1:22",
|
| 1789 |
-
"durationInSeconds": 82,
|
| 1790 |
-
"thumbnail": "https://img.youtube.com/vi/WxA6zPOl-Yw/maxresdefault.jpg",
|
| 1791 |
-
"sets": 3,
|
| 1792 |
-
"reps": "40s",
|
| 1793 |
-
"rest": 30,
|
| 1794 |
-
"calories": 8,
|
| 1795 |
-
"category": "arms",
|
| 1796 |
-
"originalName": "How to Do:SHOULDER OUTWARD ROTATION"
|
| 1797 |
-
},
|
| 1798 |
-
{
|
| 1799 |
-
"name": ":alternado Halter Ombro Pressão",
|
| 1800 |
-
"originalTitle": "How to Do:ALTERNATING DUMBBELL SHOULDER PRESS",
|
| 1801 |
-
"emoji": "💪",
|
| 1802 |
-
"youtubeId": "XBbxm07FgpM",
|
| 1803 |
-
"embedUrl": "https://www.youtube.com/embed/XBbxm07FgpM",
|
| 1804 |
-
"duration": "0:58",
|
| 1805 |
-
"durationInSeconds": 58,
|
| 1806 |
-
"thumbnail": "https://img.youtube.com/vi/XBbxm07FgpM/maxresdefault.jpg",
|
| 1807 |
-
"sets": 3,
|
| 1808 |
-
"reps": "40s",
|
| 1809 |
-
"rest": 30,
|
| 1810 |
-
"calories": 6,
|
| 1811 |
-
"category": "arms",
|
| 1812 |
-
"originalName": "How to Do:ALTERNATING DUMBBELL SHOULDER PRESS"
|
| 1813 |
-
},
|
| 1814 |
-
{
|
| 1815 |
-
"name": ":alternate Hammer Rosca",
|
| 1816 |
-
"originalTitle": "How to Do:ALTERNATE HAMMER CURL",
|
| 1817 |
-
"emoji": "💪",
|
| 1818 |
-
"youtubeId": "rvI9KlobD9E",
|
| 1819 |
-
"embedUrl": "https://www.youtube.com/embed/rvI9KlobD9E",
|
| 1820 |
-
"duration": "1:19",
|
| 1821 |
-
"durationInSeconds": 79,
|
| 1822 |
-
"thumbnail": "https://img.youtube.com/vi/rvI9KlobD9E/maxresdefault.jpg",
|
| 1823 |
-
"sets": 3,
|
| 1824 |
-
"reps": "40s",
|
| 1825 |
-
"rest": 30,
|
| 1826 |
-
"calories": 8,
|
| 1827 |
-
"category": "arms",
|
| 1828 |
-
"originalName": "How to Do:ALTERNATE HAMMER CURL"
|
| 1829 |
-
},
|
| 1830 |
-
{
|
| 1831 |
-
"name": ":anterior Ombro Alongamento",
|
| 1832 |
-
"originalTitle": "How to Do:ANTERIOR SHOULDER STRETCH",
|
| 1833 |
-
"emoji": "💪",
|
| 1834 |
-
"youtubeId": "zkkdN01JC_o",
|
| 1835 |
-
"embedUrl": "https://www.youtube.com/embed/zkkdN01JC_o",
|
| 1836 |
-
"duration": "1:01",
|
| 1837 |
-
"durationInSeconds": 61,
|
| 1838 |
-
"thumbnail": "https://img.youtube.com/vi/zkkdN01JC_o/maxresdefault.jpg",
|
| 1839 |
-
"sets": 3,
|
| 1840 |
-
"reps": "40s",
|
| 1841 |
-
"rest": 30,
|
| 1842 |
-
"calories": 6,
|
| 1843 |
-
"category": "arms",
|
| 1844 |
-
"originalName": "How to Do:ANTERIOR SHOULDER STRETCH"
|
| 1845 |
-
},
|
| 1846 |
-
{
|
| 1847 |
-
"name": ":ombro Gators",
|
| 1848 |
-
"originalTitle": "How to Do:SHOULDER GATORS",
|
| 1849 |
-
"emoji": "💪",
|
| 1850 |
-
"youtubeId": "4c-wsl6BA-E",
|
| 1851 |
-
"embedUrl": "https://www.youtube.com/embed/4c-wsl6BA-E",
|
| 1852 |
-
"duration": "0:51",
|
| 1853 |
-
"durationInSeconds": 51,
|
| 1854 |
-
"thumbnail": "https://img.youtube.com/vi/4c-wsl6BA-E/maxresdefault.jpg",
|
| 1855 |
-
"sets": 3,
|
| 1856 |
-
"reps": "40s",
|
| 1857 |
-
"rest": 30,
|
| 1858 |
-
"calories": 5,
|
| 1859 |
-
"category": "arms",
|
| 1860 |
-
"originalName": "How to Do:SHOULDER GATORS"
|
| 1861 |
-
},
|
| 1862 |
-
{
|
| 1863 |
-
"name": ":halter Para Cima-n-overs",
|
| 1864 |
-
"originalTitle": "How to Do:DUMBBELL UP-N-OVERS",
|
| 1865 |
-
"emoji": "💪",
|
| 1866 |
-
"youtubeId": "8BEneroKR0E",
|
| 1867 |
-
"embedUrl": "https://www.youtube.com/embed/8BEneroKR0E",
|
| 1868 |
-
"duration": "1:06",
|
| 1869 |
-
"durationInSeconds": 66,
|
| 1870 |
-
"thumbnail": "https://img.youtube.com/vi/8BEneroKR0E/maxresdefault.jpg",
|
| 1871 |
-
"sets": 3,
|
| 1872 |
-
"reps": "40s",
|
| 1873 |
-
"rest": 30,
|
| 1874 |
-
"calories": 7,
|
| 1875 |
-
"category": "arms",
|
| 1876 |
-
"originalName": "How to Do:DUMBBELL UP-N-OVERS"
|
| 1877 |
-
},
|
| 1878 |
-
{
|
| 1879 |
-
"name": ":halter Paddle Boats",
|
| 1880 |
-
"originalTitle": "How to Do:DUMBBELL PADDLE BOATS",
|
| 1881 |
-
"emoji": "💪",
|
| 1882 |
-
"youtubeId": "BHzui4J01AI",
|
| 1883 |
-
"embedUrl": "https://www.youtube.com/embed/BHzui4J01AI",
|
| 1884 |
-
"duration": "1:04",
|
| 1885 |
-
"durationInSeconds": 64,
|
| 1886 |
-
"thumbnail": "https://img.youtube.com/vi/BHzui4J01AI/maxresdefault.jpg",
|
| 1887 |
-
"sets": 3,
|
| 1888 |
-
"reps": "40s",
|
| 1889 |
-
"rest": 30,
|
| 1890 |
-
"calories": 6,
|
| 1891 |
-
"category": "arms",
|
| 1892 |
-
"originalName": "How to Do:DUMBBELL PADDLE BOATS"
|
| 1893 |
-
},
|
| 1894 |
-
{
|
| 1895 |
-
"name": ":hyperextension",
|
| 1896 |
-
"originalTitle": "How to Do:HYPEREXTENSION",
|
| 1897 |
-
"emoji": "💪",
|
| 1898 |
-
"youtubeId": "ldZk7JKRhJ4",
|
| 1899 |
-
"embedUrl": "https://www.youtube.com/embed/ldZk7JKRhJ4",
|
| 1900 |
-
"duration": "1:12",
|
| 1901 |
-
"durationInSeconds": 72,
|
| 1902 |
-
"thumbnail": "https://img.youtube.com/vi/ldZk7JKRhJ4/maxresdefault.jpg",
|
| 1903 |
-
"sets": 3,
|
| 1904 |
-
"reps": "40s",
|
| 1905 |
-
"rest": 30,
|
| 1906 |
-
"calories": 7,
|
| 1907 |
-
"category": "arms",
|
| 1908 |
-
"originalName": "How to Do:HYPEREXTENSION"
|
| 1909 |
-
},
|
| 1910 |
-
{
|
| 1911 |
-
"name": ":lateral Braço Elevação",
|
| 1912 |
-
"originalTitle": "How to Do:SIDE ARM RAISE",
|
| 1913 |
-
"emoji": "💪",
|
| 1914 |
-
"youtubeId": "eEcUyYlf8UI",
|
| 1915 |
-
"embedUrl": "https://www.youtube.com/embed/eEcUyYlf8UI",
|
| 1916 |
-
"duration": "1:00",
|
| 1917 |
-
"durationInSeconds": 60,
|
| 1918 |
-
"thumbnail": "https://img.youtube.com/vi/eEcUyYlf8UI/maxresdefault.jpg",
|
| 1919 |
-
"sets": 3,
|
| 1920 |
-
"reps": "40s",
|
| 1921 |
-
"rest": 30,
|
| 1922 |
-
"calories": 6,
|
| 1923 |
-
"category": "arms",
|
| 1924 |
-
"originalName": "How to Do:SIDE ARM RAISE"
|
| 1925 |
-
},
|
| 1926 |
-
{
|
| 1927 |
-
"name": ":prone Tríceps Flexãos",
|
| 1928 |
-
"originalTitle": "How to Do:PRONE TRICEPS PUSH UPS",
|
| 1929 |
-
"emoji": "💪",
|
| 1930 |
-
"youtubeId": "lDQ1iRTezQY",
|
| 1931 |
-
"embedUrl": "https://www.youtube.com/embed/lDQ1iRTezQY",
|
| 1932 |
-
"duration": "1:19",
|
| 1933 |
-
"durationInSeconds": 79,
|
| 1934 |
-
"thumbnail": "https://img.youtube.com/vi/lDQ1iRTezQY/maxresdefault.jpg",
|
| 1935 |
-
"sets": 3,
|
| 1936 |
-
"reps": "40s",
|
| 1937 |
-
"rest": 30,
|
| 1938 |
-
"calories": 8,
|
| 1939 |
-
"category": "arms",
|
| 1940 |
-
"originalName": "How to Do:PRONE TRICEPS PUSH UPS"
|
| 1941 |
-
},
|
| 1942 |
-
{
|
| 1943 |
-
"name": ":braço Raises",
|
| 1944 |
-
"originalTitle": "How to Do:ARM RAISES",
|
| 1945 |
-
"emoji": "💪",
|
| 1946 |
-
"youtubeId": "i_vx_I9-v6U",
|
| 1947 |
-
"embedUrl": "https://www.youtube.com/embed/i_vx_I9-v6U",
|
| 1948 |
-
"duration": "0:44",
|
| 1949 |
-
"durationInSeconds": 44,
|
| 1950 |
-
"thumbnail": "https://img.youtube.com/vi/i_vx_I9-v6U/maxresdefault.jpg",
|
| 1951 |
-
"sets": 3,
|
| 1952 |
-
"reps": "12",
|
| 1953 |
-
"rest": 30,
|
| 1954 |
-
"calories": 4,
|
| 1955 |
-
"category": "arms",
|
| 1956 |
-
"originalName": "How to Do:ARM RAISES"
|
| 1957 |
-
},
|
| 1958 |
-
{
|
| 1959 |
-
"name": ":floor Tríceps Dips",
|
| 1960 |
-
"originalTitle": "How to Do:FLOOR TRICEP DIPS",
|
| 1961 |
-
"emoji": "💪",
|
| 1962 |
-
"youtubeId": "UaZhjXS0AbM",
|
| 1963 |
-
"embedUrl": "https://www.youtube.com/embed/UaZhjXS0AbM",
|
| 1964 |
-
"duration": "1:16",
|
| 1965 |
-
"durationInSeconds": 76,
|
| 1966 |
-
"thumbnail": "https://img.youtube.com/vi/UaZhjXS0AbM/maxresdefault.jpg",
|
| 1967 |
-
"sets": 3,
|
| 1968 |
-
"reps": "40s",
|
| 1969 |
-
"rest": 30,
|
| 1970 |
-
"calories": 8,
|
| 1971 |
-
"category": "arms",
|
| 1972 |
-
"originalName": "How to Do:FLOOR TRICEP DIPS"
|
| 1973 |
-
},
|
| 1974 |
-
{
|
| 1975 |
-
"name": ":braço Circles",
|
| 1976 |
-
"originalTitle": "How to Do:ARM CIRCLES",
|
| 1977 |
-
"emoji": "💪",
|
| 1978 |
-
"youtubeId": "ckH1P_1sFOs",
|
| 1979 |
-
"embedUrl": "https://www.youtube.com/embed/ckH1P_1sFOs",
|
| 1980 |
-
"duration": "1:11",
|
| 1981 |
-
"durationInSeconds": 71,
|
| 1982 |
-
"thumbnail": "https://img.youtube.com/vi/ckH1P_1sFOs/maxresdefault.jpg",
|
| 1983 |
-
"sets": 3,
|
| 1984 |
-
"reps": "40s",
|
| 1985 |
-
"rest": 30,
|
| 1986 |
-
"calories": 7,
|
| 1987 |
-
"category": "arms",
|
| 1988 |
-
"originalName": "How to Do:ARM CIRCLES"
|
| 1989 |
-
},
|
| 1990 |
-
{
|
| 1991 |
-
"name": "Braço Circles",
|
| 1992 |
-
"originalTitle": "How to Do: ARM CIRCLES",
|
| 1993 |
-
"emoji": "💪",
|
| 1994 |
-
"youtubeId": "4TJv9YmECjc",
|
| 1995 |
-
"embedUrl": "https://www.youtube.com/embed/4TJv9YmECjc",
|
| 1996 |
-
"duration": "1:13",
|
| 1997 |
-
"durationInSeconds": 73,
|
| 1998 |
-
"thumbnail": "https://img.youtube.com/vi/4TJv9YmECjc/maxresdefault.jpg",
|
| 1999 |
-
"sets": 3,
|
| 2000 |
-
"reps": "40s",
|
| 2001 |
-
"rest": 30,
|
| 2002 |
-
"calories": 7,
|
| 2003 |
-
"category": "arms",
|
| 2004 |
-
"originalName": "How to Do: ARM CIRCLES"
|
| 2005 |
-
},
|
| 2006 |
-
{
|
| 2007 |
-
"name": "Clockwise Braço Swings",
|
| 2008 |
-
"originalTitle": "How to Do: CLOCKWISE ARM SWINGS",
|
| 2009 |
-
"emoji": "💪",
|
| 2010 |
-
"youtubeId": "5QVIPA8rp7w",
|
| 2011 |
-
"embedUrl": "https://www.youtube.com/embed/5QVIPA8rp7w",
|
| 2012 |
-
"duration": "0:49",
|
| 2013 |
-
"durationInSeconds": 49,
|
| 2014 |
-
"thumbnail": "https://img.youtube.com/vi/5QVIPA8rp7w/maxresdefault.jpg",
|
| 2015 |
-
"sets": 3,
|
| 2016 |
-
"reps": "12",
|
| 2017 |
-
"rest": 30,
|
| 2018 |
-
"calories": 5,
|
| 2019 |
-
"category": "arms",
|
| 2020 |
-
"originalName": "How to Do: CLOCKWISE ARM SWINGS"
|
| 2021 |
-
},
|
| 2022 |
-
{
|
| 2023 |
-
"name": "Em Pé Bíceps Alongamento",
|
| 2024 |
-
"originalTitle": "How to Do: STANDING BICEPS STRETCH",
|
| 2025 |
-
"emoji": "💪",
|
| 2026 |
-
"youtubeId": "u8KplvVTrI8",
|
| 2027 |
-
"embedUrl": "https://www.youtube.com/embed/u8KplvVTrI8",
|
| 2028 |
-
"duration": "0:50",
|
| 2029 |
-
"durationInSeconds": 50,
|
| 2030 |
-
"thumbnail": "https://img.youtube.com/vi/u8KplvVTrI8/maxresdefault.jpg",
|
| 2031 |
-
"sets": 3,
|
| 2032 |
-
"reps": "40s",
|
| 2033 |
-
"rest": 30,
|
| 2034 |
-
"calories": 5,
|
| 2035 |
-
"category": "arms",
|
| 2036 |
-
"originalName": "How to Do: STANDING BICEPS STRETCH"
|
| 2037 |
-
},
|
| 2038 |
-
{
|
| 2039 |
-
"name": "Ombro Alongamento",
|
| 2040 |
-
"originalTitle": "How to Do: SHOULDER STRETCH",
|
| 2041 |
-
"emoji": "💪",
|
| 2042 |
-
"youtubeId": "d6pWDbmVp1U",
|
| 2043 |
-
"embedUrl": "https://www.youtube.com/embed/d6pWDbmVp1U",
|
| 2044 |
-
"duration": "0:55",
|
| 2045 |
-
"durationInSeconds": 55,
|
| 2046 |
-
"thumbnail": "https://img.youtube.com/vi/d6pWDbmVp1U/maxresdefault.jpg",
|
| 2047 |
-
"sets": 3,
|
| 2048 |
-
"reps": "40s",
|
| 2049 |
-
"rest": 30,
|
| 2050 |
-
"calories": 6,
|
| 2051 |
-
"category": "arms",
|
| 2052 |
-
"originalName": "How to Do: SHOULDER STRETCH"
|
| 2053 |
-
},
|
| 2054 |
-
{
|
| 2055 |
-
"name": "Tríceps Alongamento",
|
| 2056 |
-
"originalTitle": "How to Do: TRICEPS STRETCH",
|
| 2057 |
-
"emoji": "💪",
|
| 2058 |
-
"youtubeId": "8fN9H37Ts7w",
|
| 2059 |
-
"embedUrl": "https://www.youtube.com/embed/8fN9H37Ts7w",
|
| 2060 |
-
"duration": "0:45",
|
| 2061 |
-
"durationInSeconds": 45,
|
| 2062 |
-
"thumbnail": "https://img.youtube.com/vi/8fN9H37Ts7w/maxresdefault.jpg",
|
| 2063 |
-
"sets": 3,
|
| 2064 |
-
"reps": "12",
|
| 2065 |
-
"rest": 30,
|
| 2066 |
-
"calories": 5,
|
| 2067 |
-
"category": "arms",
|
| 2068 |
-
"originalName": "How to Do: TRICEPS STRETCH"
|
| 2069 |
-
},
|
| 2070 |
-
{
|
| 2071 |
-
"name": "Frog Pressão",
|
| 2072 |
-
"originalTitle": "How to Do: FROG PRESS",
|
| 2073 |
-
"emoji": "💪",
|
| 2074 |
-
"youtubeId": "ToTUkX3am4w",
|
| 2075 |
-
"embedUrl": "https://www.youtube.com/embed/ToTUkX3am4w",
|
| 2076 |
-
"duration": "1:08",
|
| 2077 |
-
"durationInSeconds": 68,
|
| 2078 |
-
"thumbnail": "https://img.youtube.com/vi/ToTUkX3am4w/maxresdefault.jpg",
|
| 2079 |
-
"sets": 3,
|
| 2080 |
-
"reps": "40s",
|
| 2081 |
-
"rest": 30,
|
| 2082 |
-
"calories": 7,
|
| 2083 |
-
"category": "arms",
|
| 2084 |
-
"originalName": "How to Do: FROG PRESS"
|
| 2085 |
-
},
|
| 2086 |
-
{
|
| 2087 |
-
"name": "Aberto Braço Empurrar-ups",
|
| 2088 |
-
"originalTitle": "How to Do: WIDE ARM PUSH-UPS",
|
| 2089 |
-
"emoji": "💪",
|
| 2090 |
-
"youtubeId": "kBREQ4OSds8",
|
| 2091 |
-
"embedUrl": "https://www.youtube.com/embed/kBREQ4OSds8",
|
| 2092 |
-
"duration": "1:26",
|
| 2093 |
-
"durationInSeconds": 86,
|
| 2094 |
-
"thumbnail": "https://img.youtube.com/vi/kBREQ4OSds8/maxresdefault.jpg",
|
| 2095 |
-
"sets": 3,
|
| 2096 |
-
"reps": "40s",
|
| 2097 |
-
"rest": 30,
|
| 2098 |
-
"calories": 9,
|
| 2099 |
-
"category": "arms",
|
| 2100 |
-
"originalName": "How to Do: WIDE ARM PUSH-UPS"
|
| 2101 |
-
},
|
| 2102 |
-
{
|
| 2103 |
-
"name": "Mergulhos De Tríceps",
|
| 2104 |
-
"originalTitle": "Como fazer: Mergulhos de tríceps",
|
| 2105 |
-
"emoji": "💪",
|
| 2106 |
-
"youtubeId": "jF0UaL-I11U",
|
| 2107 |
-
"embedUrl": "https://www.youtube.com/embed/jF0UaL-I11U",
|
| 2108 |
-
"duration": "1:00",
|
| 2109 |
-
"durationInSeconds": 60,
|
| 2110 |
-
"thumbnail": "https://img.youtube.com/vi/jF0UaL-I11U/maxresdefault.jpg",
|
| 2111 |
-
"sets": 3,
|
| 2112 |
-
"reps": "40s",
|
| 2113 |
-
"rest": 30,
|
| 2114 |
-
"calories": 6,
|
| 2115 |
-
"category": "arms",
|
| 2116 |
-
"originalName": "Como fazer: Mergulhos de tríceps"
|
| 2117 |
-
},
|
| 2118 |
-
{
|
| 2119 |
-
"name": "Flexãos",
|
| 2120 |
-
"originalTitle": "How to Do: PUSH UPS",
|
| 2121 |
-
"emoji": "💪",
|
| 2122 |
-
"youtubeId": "eMQuAjuPCV0",
|
| 2123 |
-
"embedUrl": "https://www.youtube.com/embed/eMQuAjuPCV0",
|
| 2124 |
-
"duration": "1:09",
|
| 2125 |
-
"durationInSeconds": 69,
|
| 2126 |
-
"thumbnail": "https://img.youtube.com/vi/eMQuAjuPCV0/maxresdefault.jpg",
|
| 2127 |
-
"sets": 3,
|
| 2128 |
-
"reps": "40s",
|
| 2129 |
-
"rest": 30,
|
| 2130 |
-
"calories": 7,
|
| 2131 |
-
"category": "arms",
|
| 2132 |
-
"originalName": "How to Do: PUSH UPS"
|
| 2133 |
-
}
|
| 2134 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/back.js
DELETED
|
@@ -1,358 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: back
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 22
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_BACK = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Thoracic Spine Gato E Vaca",
|
| 8 |
-
"originalTitle": "How to Do: THORACIC SPINE CAT COW",
|
| 9 |
-
"emoji": "🧘♀️",
|
| 10 |
-
"youtubeId": "nbhJvFWFPTE",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/nbhJvFWFPTE",
|
| 12 |
-
"duration": "1:03",
|
| 13 |
-
"durationInSeconds": 63,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/nbhJvFWFPTE/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "40s",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 6,
|
| 19 |
-
"category": "back",
|
| 20 |
-
"originalName": "How to Do: THORACIC SPINE CAT COW"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": "Para Frente Spine Alongamento Pulsação",
|
| 24 |
-
"originalTitle": "How to Do: FORWARD SPINE STRETCH PULSE",
|
| 25 |
-
"emoji": "🧘♀️",
|
| 26 |
-
"youtubeId": "IAKURhFoODE",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/IAKURhFoODE",
|
| 28 |
-
"duration": "1:06",
|
| 29 |
-
"durationInSeconds": 66,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/IAKURhFoODE/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "40s",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 7,
|
| 35 |
-
"category": "back",
|
| 36 |
-
"originalName": "How to Do: FORWARD SPINE STRETCH PULSE"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": "Spine Lumbar Torção Alongamento",
|
| 40 |
-
"originalTitle": "How to Do: SPINE LUMBAR TWIST STRETCH",
|
| 41 |
-
"emoji": "🧘♀️",
|
| 42 |
-
"youtubeId": "nfhIuzZauTo",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/nfhIuzZauTo",
|
| 44 |
-
"duration": "0:58",
|
| 45 |
-
"durationInSeconds": 58,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/nfhIuzZauTo/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "40s",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 6,
|
| 51 |
-
"category": "back",
|
| 52 |
-
"originalName": "How to Do: SPINE LUMBAR TWIST STRETCH"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": ":costas Bow Pulls",
|
| 56 |
-
"originalTitle": "How to Do:BACK BOW PULLS",
|
| 57 |
-
"emoji": "🧘♀️",
|
| 58 |
-
"youtubeId": "GvyCtKvmaVE",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/GvyCtKvmaVE",
|
| 60 |
-
"duration": "0:44",
|
| 61 |
-
"durationInSeconds": 44,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/GvyCtKvmaVE/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "12",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 4,
|
| 67 |
-
"category": "back",
|
| 68 |
-
"originalName": "How to Do:BACK BOW PULLS"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":lips Para Baixo Puxar",
|
| 72 |
-
"originalTitle": "How to Do:LIPS DOWN PULL",
|
| 73 |
-
"emoji": "🧘♀️",
|
| 74 |
-
"youtubeId": "LXBFKwPbRW4",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/LXBFKwPbRW4",
|
| 76 |
-
"duration": "0:44",
|
| 77 |
-
"durationInSeconds": 44,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/LXBFKwPbRW4/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "12",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 4,
|
| 83 |
-
"category": "back",
|
| 84 |
-
"originalName": "How to Do:LIPS DOWN PULL"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":clasp Hands Behind Costas",
|
| 88 |
-
"originalTitle": "How to Do:CLASP HANDS BEHIND BACK",
|
| 89 |
-
"emoji": "🧘♀️",
|
| 90 |
-
"youtubeId": "JoxGFxbgJ2Y",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/JoxGFxbgJ2Y",
|
| 92 |
-
"duration": "0:43",
|
| 93 |
-
"durationInSeconds": 43,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/JoxGFxbgJ2Y/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "12",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 4,
|
| 99 |
-
"category": "back",
|
| 100 |
-
"originalName": "How to Do:CLASP HANDS BEHIND BACK"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":pilates Perna Pulls",
|
| 104 |
-
"originalTitle": "How to Do:PILATES LEG PULLS",
|
| 105 |
-
"emoji": "🧘♀️",
|
| 106 |
-
"youtubeId": "DV3AN2_OOU8",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/DV3AN2_OOU8",
|
| 108 |
-
"duration": "0:52",
|
| 109 |
-
"durationInSeconds": 52,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/DV3AN2_OOU8/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "40s",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 5,
|
| 115 |
-
"category": "back",
|
| 116 |
-
"originalName": "How to Do:PILATES LEG PULLS"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":elbows Costas",
|
| 120 |
-
"originalTitle": "How to Do:ELBOWS BACK",
|
| 121 |
-
"emoji": "🧘♀️",
|
| 122 |
-
"youtubeId": "rhtadqkrWo0",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/rhtadqkrWo0",
|
| 124 |
-
"duration": "0:52",
|
| 125 |
-
"durationInSeconds": 52,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/rhtadqkrWo0/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "40s",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 5,
|
| 131 |
-
"category": "back",
|
| 132 |
-
"originalName": "How to Do:ELBOWS BACK"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":spine Lumbar Torção Alongamento",
|
| 136 |
-
"originalTitle": "How to Do:SPINE LUMBAR TWIST STRETCH",
|
| 137 |
-
"emoji": "🧘♀️",
|
| 138 |
-
"youtubeId": "ryNlb_0GmAw",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/ryNlb_0GmAw",
|
| 140 |
-
"duration": "0:35",
|
| 141 |
-
"durationInSeconds": 35,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/ryNlb_0GmAw/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "12",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 4,
|
| 147 |
-
"category": "back",
|
| 148 |
-
"originalName": "How to Do:SPINE LUMBAR TWIST STRETCH"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":reclined Rhomboid Squeezes",
|
| 152 |
-
"originalTitle": "How to Do:RECLINED RHOMBOID SQUEEZES",
|
| 153 |
-
"emoji": "🧘♀️",
|
| 154 |
-
"youtubeId": "olv2Sv9DwmA",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/olv2Sv9DwmA",
|
| 156 |
-
"duration": "0:48",
|
| 157 |
-
"durationInSeconds": 48,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/olv2Sv9DwmA/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "12",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 5,
|
| 163 |
-
"category": "back",
|
| 164 |
-
"originalName": "How to Do:RECLINED RHOMBOID SQUEEZES"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":rhomboid Pulls",
|
| 168 |
-
"originalTitle": "How to Do:RHOMBOID PULLS",
|
| 169 |
-
"emoji": "🧘♀️",
|
| 170 |
-
"youtubeId": "DEyDbzSudEU",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/DEyDbzSudEU",
|
| 172 |
-
"duration": "0:51",
|
| 173 |
-
"durationInSeconds": 51,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/DEyDbzSudEU/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "40s",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 5,
|
| 179 |
-
"category": "back",
|
| 180 |
-
"originalName": "How to Do:RHOMBOID PULLS"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": "Super-homem",
|
| 184 |
-
"originalTitle": "How to Do: SUPERMAN",
|
| 185 |
-
"emoji": "🧘♀️",
|
| 186 |
-
"youtubeId": "pGeaBXLwDtw",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/pGeaBXLwDtw",
|
| 188 |
-
"duration": "0:41",
|
| 189 |
-
"durationInSeconds": 41,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/pGeaBXLwDtw/maxresdefault.jpg",
|
| 191 |
-
"sets": 3,
|
| 192 |
-
"reps": "12",
|
| 193 |
-
"rest": 30,
|
| 194 |
-
"calories": 4,
|
| 195 |
-
"category": "back",
|
| 196 |
-
"originalName": "How to Do: SUPERMAN"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":swimmer E Super-homem",
|
| 200 |
-
"originalTitle": "How to Do:SWIMMER AND SUPERMAN",
|
| 201 |
-
"emoji": "🧘♀️",
|
| 202 |
-
"youtubeId": "XydDDn_Rngw",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/XydDDn_Rngw",
|
| 204 |
-
"duration": "0:49",
|
| 205 |
-
"durationInSeconds": 49,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/XydDDn_Rngw/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "12",
|
| 209 |
-
"rest": 30,
|
| 210 |
-
"calories": 5,
|
| 211 |
-
"category": "back",
|
| 212 |
-
"originalName": "How to Do:SWIMMER AND SUPERMAN"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ":pilates Perna Pulls",
|
| 216 |
-
"originalTitle": "How to Do:PILATES LEG PULLS",
|
| 217 |
-
"emoji": "🧘♀️",
|
| 218 |
-
"youtubeId": "GH5UbMIDy-A",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/GH5UbMIDy-A",
|
| 220 |
-
"duration": "1:18",
|
| 221 |
-
"durationInSeconds": 78,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/GH5UbMIDy-A/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "40s",
|
| 225 |
-
"rest": 30,
|
| 226 |
-
"calories": 8,
|
| 227 |
-
"category": "back",
|
| 228 |
-
"originalName": "How to Do:PILATES LEG PULLS"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": ":costas Bow Pulls",
|
| 232 |
-
"originalTitle": "How to Do:BACK BOW PULLS",
|
| 233 |
-
"emoji": "🧘♀️",
|
| 234 |
-
"youtubeId": "XPyrOc7M0dQ",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/XPyrOc7M0dQ",
|
| 236 |
-
"duration": "1:19",
|
| 237 |
-
"durationInSeconds": 79,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/XPyrOc7M0dQ/maxresdefault.jpg",
|
| 239 |
-
"sets": 3,
|
| 240 |
-
"reps": "40s",
|
| 241 |
-
"rest": 30,
|
| 242 |
-
"calories": 8,
|
| 243 |
-
"category": "back",
|
| 244 |
-
"originalName": "How to Do:BACK BOW PULLS"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": ":elbows Costas",
|
| 248 |
-
"originalTitle": "How to Do:ELBOWS BACK",
|
| 249 |
-
"emoji": "🧘♀️",
|
| 250 |
-
"youtubeId": "LDY2LiB8sxE",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/LDY2LiB8sxE",
|
| 252 |
-
"duration": "1:06",
|
| 253 |
-
"durationInSeconds": 66,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/LDY2LiB8sxE/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "40s",
|
| 257 |
-
"rest": 30,
|
| 258 |
-
"calories": 7,
|
| 259 |
-
"category": "back",
|
| 260 |
-
"originalName": "How to Do:ELBOWS BACK"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": ":spine Lumbar Torção Alongamento",
|
| 264 |
-
"originalTitle": "How to Do:SPINE LUMBAR TWIST STRETCH",
|
| 265 |
-
"emoji": "🧘♀️",
|
| 266 |
-
"youtubeId": "ZgJtbiM_FMs",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/ZgJtbiM_FMs",
|
| 268 |
-
"duration": "0:54",
|
| 269 |
-
"durationInSeconds": 54,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/ZgJtbiM_FMs/maxresdefault.jpg",
|
| 271 |
-
"sets": 3,
|
| 272 |
-
"reps": "40s",
|
| 273 |
-
"rest": 30,
|
| 274 |
-
"calories": 5,
|
| 275 |
-
"category": "back",
|
| 276 |
-
"originalName": "How to Do:SPINE LUMBAR TWIST STRETCH"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": ":rhomboid Pulls",
|
| 280 |
-
"originalTitle": "How to Do:RHOMBOID PULLS",
|
| 281 |
-
"emoji": "🧘♀️",
|
| 282 |
-
"youtubeId": "krKWWqS9VDk",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/krKWWqS9VDk",
|
| 284 |
-
"duration": "1:27",
|
| 285 |
-
"durationInSeconds": 87,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/krKWWqS9VDk/maxresdefault.jpg",
|
| 287 |
-
"sets": 3,
|
| 288 |
-
"reps": "40s",
|
| 289 |
-
"rest": 30,
|
| 290 |
-
"calories": 9,
|
| 291 |
-
"category": "back",
|
| 292 |
-
"originalName": "How to Do:RHOMBOID PULLS"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": ":clasp Hands Behind Costas",
|
| 296 |
-
"originalTitle": "How to Do:CLASP HANDS BEHIND BACK",
|
| 297 |
-
"emoji": "🧘♀️",
|
| 298 |
-
"youtubeId": "oOoscO1Uxv8",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/oOoscO1Uxv8",
|
| 300 |
-
"duration": "0:58",
|
| 301 |
-
"durationInSeconds": 58,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/oOoscO1Uxv8/maxresdefault.jpg",
|
| 303 |
-
"sets": 3,
|
| 304 |
-
"reps": "40s",
|
| 305 |
-
"rest": 30,
|
| 306 |
-
"calories": 6,
|
| 307 |
-
"category": "back",
|
| 308 |
-
"originalName": "How to Do:CLASP HANDS BEHIND BACK"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": ":reclined Rhomboid Squeezes",
|
| 312 |
-
"originalTitle": "How to Do:RECLINED RHOMBOID SQUEEZES",
|
| 313 |
-
"emoji": "🧘♀️",
|
| 314 |
-
"youtubeId": "5WgGkAFybvw",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/5WgGkAFybvw",
|
| 316 |
-
"duration": "1:10",
|
| 317 |
-
"durationInSeconds": 70,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/5WgGkAFybvw/maxresdefault.jpg",
|
| 319 |
-
"sets": 3,
|
| 320 |
-
"reps": "40s",
|
| 321 |
-
"rest": 30,
|
| 322 |
-
"calories": 7,
|
| 323 |
-
"category": "back",
|
| 324 |
-
"originalName": "How to Do:RECLINED RHOMBOID SQUEEZES"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": ":swimmer E Super-homem",
|
| 328 |
-
"originalTitle": "How to Do:SWIMMER AND SUPERMAN",
|
| 329 |
-
"emoji": "🧘♀️",
|
| 330 |
-
"youtubeId": "xJS-arpsT5g",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/xJS-arpsT5g",
|
| 332 |
-
"duration": "0:57",
|
| 333 |
-
"durationInSeconds": 57,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/xJS-arpsT5g/maxresdefault.jpg",
|
| 335 |
-
"sets": 3,
|
| 336 |
-
"reps": "40s",
|
| 337 |
-
"rest": 30,
|
| 338 |
-
"calories": 6,
|
| 339 |
-
"category": "back",
|
| 340 |
-
"originalName": "How to Do:SWIMMER AND SUPERMAN"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": "Super-homem",
|
| 344 |
-
"originalTitle": "How to Do: SUPERMAN",
|
| 345 |
-
"emoji": "🧘♀️",
|
| 346 |
-
"youtubeId": "iMHTMPVR59c",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/iMHTMPVR59c",
|
| 348 |
-
"duration": "0:54",
|
| 349 |
-
"durationInSeconds": 54,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/iMHTMPVR59c/maxresdefault.jpg",
|
| 351 |
-
"sets": 3,
|
| 352 |
-
"reps": "40s",
|
| 353 |
-
"rest": 30,
|
| 354 |
-
"calories": 5,
|
| 355 |
-
"category": "back",
|
| 356 |
-
"originalName": "How to Do: SUPERMAN"
|
| 357 |
-
}
|
| 358 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/cardio.js
DELETED
|
@@ -1,406 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: cardio
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 25
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_CARDIO = [
|
| 6 |
-
{
|
| 7 |
-
"name": ":Estrela Saltada",
|
| 8 |
-
"originalTitle": "How to Do:STAR JUMPS",
|
| 9 |
-
"emoji": "❤️",
|
| 10 |
-
"youtubeId": "VVEO_J1tIXU",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/VVEO_J1tIXU",
|
| 12 |
-
"duration": "0:31",
|
| 13 |
-
"durationInSeconds": 31,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/VVEO_J1tIXU/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "20s on/10s off",
|
| 17 |
-
"rest": 20,
|
| 18 |
-
"calories": 5,
|
| 19 |
-
"category": "cardio",
|
| 20 |
-
"originalName": "How to Do:STAR JUMPS"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": ":burpee Em X",
|
| 24 |
-
"originalTitle": "How to Do:X-BURPEES",
|
| 25 |
-
"emoji": "❤️",
|
| 26 |
-
"youtubeId": "uD5BUL79CvY",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/uD5BUL79CvY",
|
| 28 |
-
"duration": "0:55",
|
| 29 |
-
"durationInSeconds": 55,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/uD5BUL79CvY/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "30s",
|
| 33 |
-
"rest": 20,
|
| 34 |
-
"calories": 9,
|
| 35 |
-
"category": "cardio",
|
| 36 |
-
"originalName": "How to Do:X-BURPEES"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": ":Corrida Na Parede",
|
| 40 |
-
"originalTitle": "How to Do:RUN ON THE WALL",
|
| 41 |
-
"emoji": "❤️",
|
| 42 |
-
"youtubeId": "Vvuj9R-w6a4",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/Vvuj9R-w6a4",
|
| 44 |
-
"duration": "0:32",
|
| 45 |
-
"durationInSeconds": 32,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/Vvuj9R-w6a4/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "20s on/10s off",
|
| 49 |
-
"rest": 20,
|
| 50 |
-
"calories": 5,
|
| 51 |
-
"category": "cardio",
|
| 52 |
-
"originalName": "How to Do:RUN ON THE WALL"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": ":wood Chops",
|
| 56 |
-
"originalTitle": "How to Do:WOOD CHOPS",
|
| 57 |
-
"emoji": "❤️",
|
| 58 |
-
"youtubeId": "Ax_94gEavYo",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/Ax_94gEavYo",
|
| 60 |
-
"duration": "0:40",
|
| 61 |
-
"durationInSeconds": 40,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/Ax_94gEavYo/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "20s on/10s off",
|
| 65 |
-
"rest": 20,
|
| 66 |
-
"calories": 7,
|
| 67 |
-
"category": "cardio",
|
| 68 |
-
"originalName": "How to Do:WOOD CHOPS"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":trunk Rotation",
|
| 72 |
-
"originalTitle": "How to Do:TRUNK ROTATION",
|
| 73 |
-
"emoji": "❤️",
|
| 74 |
-
"youtubeId": "YBgjuQMviCE",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/YBgjuQMviCE",
|
| 76 |
-
"duration": "0:38",
|
| 77 |
-
"durationInSeconds": 38,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/YBgjuQMviCE/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "20s on/10s off",
|
| 81 |
-
"rest": 20,
|
| 82 |
-
"calories": 6,
|
| 83 |
-
"category": "cardio",
|
| 84 |
-
"originalName": "How to Do:TRUNK ROTATION"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":star Crawl",
|
| 88 |
-
"originalTitle": "How to Do:STAR CRAWL",
|
| 89 |
-
"emoji": "❤️",
|
| 90 |
-
"youtubeId": "M_uNXxdI018",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/M_uNXxdI018",
|
| 92 |
-
"duration": "0:38",
|
| 93 |
-
"durationInSeconds": 38,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/M_uNXxdI018/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "20s on/10s off",
|
| 97 |
-
"rest": 20,
|
| 98 |
-
"calories": 6,
|
| 99 |
-
"category": "cardio",
|
| 100 |
-
"originalName": "How to Do:STAR CRAWL"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":jumping Empurrar-ups",
|
| 104 |
-
"originalTitle": "How to Do:JUMPING PUSH-UPS",
|
| 105 |
-
"emoji": "❤️",
|
| 106 |
-
"youtubeId": "SdP5TSgRHPc",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/SdP5TSgRHPc",
|
| 108 |
-
"duration": "0:44",
|
| 109 |
-
"durationInSeconds": 44,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/SdP5TSgRHPc/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "30s",
|
| 113 |
-
"rest": 20,
|
| 114 |
-
"calories": 7,
|
| 115 |
-
"category": "cardio",
|
| 116 |
-
"originalName": "How to Do:JUMPING PUSH-UPS"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":modified Burpees",
|
| 120 |
-
"originalTitle": "How to Do:MODIFIED BURPEES",
|
| 121 |
-
"emoji": "❤️",
|
| 122 |
-
"youtubeId": "8PbnMQISmZQ",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/8PbnMQISmZQ",
|
| 124 |
-
"duration": "0:46",
|
| 125 |
-
"durationInSeconds": 46,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/8PbnMQISmZQ/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "30s",
|
| 129 |
-
"rest": 20,
|
| 130 |
-
"calories": 8,
|
| 131 |
-
"category": "cardio",
|
| 132 |
-
"originalName": "How to Do:MODIFIED BURPEES"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":hops Sobre Spot",
|
| 136 |
-
"originalTitle": "How to Do:HOPS ON THE SPOT",
|
| 137 |
-
"emoji": "❤️",
|
| 138 |
-
"youtubeId": "ImamH6J566s",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/ImamH6J566s",
|
| 140 |
-
"duration": "0:30",
|
| 141 |
-
"durationInSeconds": 30,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/ImamH6J566s/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "20s on/10s off",
|
| 145 |
-
"rest": 20,
|
| 146 |
-
"calories": 5,
|
| 147 |
-
"category": "cardio",
|
| 148 |
-
"originalName": "How to Do:HOPS ON THE SPOT"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":skipping Sem Rope",
|
| 152 |
-
"originalTitle": "How to Do:SKIPPING WITHOUT ROPE",
|
| 153 |
-
"emoji": "❤️",
|
| 154 |
-
"youtubeId": "CYGeazlNbU4",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/CYGeazlNbU4",
|
| 156 |
-
"duration": "0:41",
|
| 157 |
-
"durationInSeconds": 41,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/CYGeazlNbU4/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "30s",
|
| 161 |
-
"rest": 20,
|
| 162 |
-
"calories": 7,
|
| 163 |
-
"category": "cardio",
|
| 164 |
-
"originalName": "How to Do:SKIPPING WITHOUT ROPE"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":lateral Pulo",
|
| 168 |
-
"originalTitle": "How to Do:SIDE HOP",
|
| 169 |
-
"emoji": "❤️",
|
| 170 |
-
"youtubeId": "nYmUEJIBj3c",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/nYmUEJIBj3c",
|
| 172 |
-
"duration": "0:36",
|
| 173 |
-
"durationInSeconds": 36,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/nYmUEJIBj3c/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "20s on/10s off",
|
| 177 |
-
"rest": 20,
|
| 178 |
-
"calories": 6,
|
| 179 |
-
"category": "cardio",
|
| 180 |
-
"originalName": "How to Do:SIDE HOP"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":burpees",
|
| 184 |
-
"originalTitle": "How to Do:BURPEES",
|
| 185 |
-
"emoji": "❤️",
|
| 186 |
-
"youtubeId": "818SkLAPyKY",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/818SkLAPyKY",
|
| 188 |
-
"duration": "0:44",
|
| 189 |
-
"durationInSeconds": 44,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/818SkLAPyKY/maxresdefault.jpg",
|
| 191 |
-
"sets": 3,
|
| 192 |
-
"reps": "30s",
|
| 193 |
-
"rest": 20,
|
| 194 |
-
"calories": 7,
|
| 195 |
-
"category": "cardio",
|
| 196 |
-
"originalName": "How to Do:BURPEES"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": "Polichinelos",
|
| 200 |
-
"originalTitle": "How to Do: JUMPING JACKS",
|
| 201 |
-
"emoji": "❤️",
|
| 202 |
-
"youtubeId": "2W4ZNSwoW_4",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/2W4ZNSwoW_4",
|
| 204 |
-
"duration": "0:40",
|
| 205 |
-
"durationInSeconds": 40,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/2W4ZNSwoW_4/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "20s on/10s off",
|
| 209 |
-
"rest": 20,
|
| 210 |
-
"calories": 7,
|
| 211 |
-
"category": "cardio",
|
| 212 |
-
"originalName": "How to Do: JUMPING JACKS"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ":Corrida Na Parede",
|
| 216 |
-
"originalTitle": "How to Do:RUN ON THE WALL",
|
| 217 |
-
"emoji": "❤️",
|
| 218 |
-
"youtubeId": "3FJzSc0eaXY",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/3FJzSc0eaXY",
|
| 220 |
-
"duration": "0:51",
|
| 221 |
-
"durationInSeconds": 51,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/3FJzSc0eaXY/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "30s",
|
| 225 |
-
"rest": 20,
|
| 226 |
-
"calories": 9,
|
| 227 |
-
"category": "cardio",
|
| 228 |
-
"originalName": "How to Do:RUN ON THE WALL"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": ":star Crawl",
|
| 232 |
-
"originalTitle": "How to Do:STAR CRAWL",
|
| 233 |
-
"emoji": "❤️",
|
| 234 |
-
"youtubeId": "n6B9mBKk8ig",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/n6B9mBKk8ig",
|
| 236 |
-
"duration": "1:02",
|
| 237 |
-
"durationInSeconds": 62,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/n6B9mBKk8ig/maxresdefault.jpg",
|
| 239 |
-
"sets": 3,
|
| 240 |
-
"reps": "30s",
|
| 241 |
-
"rest": 20,
|
| 242 |
-
"calories": 10,
|
| 243 |
-
"category": "cardio",
|
| 244 |
-
"originalName": "How to Do:STAR CRAWL"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": ":jumping Empurrar-ups",
|
| 248 |
-
"originalTitle": "How to Do:JUMPING PUSH-UPS",
|
| 249 |
-
"emoji": "❤️",
|
| 250 |
-
"youtubeId": "UNGOvrVOqJs",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/UNGOvrVOqJs",
|
| 252 |
-
"duration": "1:06",
|
| 253 |
-
"durationInSeconds": 66,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/UNGOvrVOqJs/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "30s",
|
| 257 |
-
"rest": 20,
|
| 258 |
-
"calories": 11,
|
| 259 |
-
"category": "cardio",
|
| 260 |
-
"originalName": "How to Do:JUMPING PUSH-UPS"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": ":hops Sobre Spot",
|
| 264 |
-
"originalTitle": "How to Do:HOPS ON THE SPOT",
|
| 265 |
-
"emoji": "❤️",
|
| 266 |
-
"youtubeId": "cuFo41RmBtg",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/cuFo41RmBtg",
|
| 268 |
-
"duration": "0:45",
|
| 269 |
-
"durationInSeconds": 45,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/cuFo41RmBtg/maxresdefault.jpg",
|
| 271 |
-
"sets": 3,
|
| 272 |
-
"reps": "30s",
|
| 273 |
-
"rest": 20,
|
| 274 |
-
"calories": 8,
|
| 275 |
-
"category": "cardio",
|
| 276 |
-
"originalName": "How to Do:HOPS ON THE SPOT"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": ":Estrela Saltada",
|
| 280 |
-
"originalTitle": "How to Do:STAR JUMPS",
|
| 281 |
-
"emoji": "❤️",
|
| 282 |
-
"youtubeId": "4uaqCn1p1Xk",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/4uaqCn1p1Xk",
|
| 284 |
-
"duration": "0:47",
|
| 285 |
-
"durationInSeconds": 47,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/4uaqCn1p1Xk/maxresdefault.jpg",
|
| 287 |
-
"sets": 3,
|
| 288 |
-
"reps": "30s",
|
| 289 |
-
"rest": 20,
|
| 290 |
-
"calories": 8,
|
| 291 |
-
"category": "cardio",
|
| 292 |
-
"originalName": "How to Do:STAR JUMPS"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": ":trunk Rotation",
|
| 296 |
-
"originalTitle": "How to Do:TRUNK ROTATION",
|
| 297 |
-
"emoji": "❤️",
|
| 298 |
-
"youtubeId": "BfACG9NsL0E",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/BfACG9NsL0E",
|
| 300 |
-
"duration": "0:45",
|
| 301 |
-
"durationInSeconds": 45,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/BfACG9NsL0E/maxresdefault.jpg",
|
| 303 |
-
"sets": 3,
|
| 304 |
-
"reps": "30s",
|
| 305 |
-
"rest": 20,
|
| 306 |
-
"calories": 8,
|
| 307 |
-
"category": "cardio",
|
| 308 |
-
"originalName": "How to Do:TRUNK ROTATION"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": ":burpee Em X",
|
| 312 |
-
"originalTitle": "How to Do:X-BURPEES",
|
| 313 |
-
"emoji": "❤️",
|
| 314 |
-
"youtubeId": "zOiLU5TaWdY",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/zOiLU5TaWdY",
|
| 316 |
-
"duration": "1:14",
|
| 317 |
-
"durationInSeconds": 74,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/zOiLU5TaWdY/maxresdefault.jpg",
|
| 319 |
-
"sets": 3,
|
| 320 |
-
"reps": "30s",
|
| 321 |
-
"rest": 20,
|
| 322 |
-
"calories": 12,
|
| 323 |
-
"category": "cardio",
|
| 324 |
-
"originalName": "How to Do:X-BURPEES"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": "Lateral Pulo",
|
| 328 |
-
"originalTitle": "How to Do: SIDE HOP",
|
| 329 |
-
"emoji": "❤️",
|
| 330 |
-
"youtubeId": "wcQqb9hVS_Y",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/wcQqb9hVS_Y",
|
| 332 |
-
"duration": "0:47",
|
| 333 |
-
"durationInSeconds": 47,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/wcQqb9hVS_Y/maxresdefault.jpg",
|
| 335 |
-
"sets": 3,
|
| 336 |
-
"reps": "30s",
|
| 337 |
-
"rest": 20,
|
| 338 |
-
"calories": 8,
|
| 339 |
-
"category": "cardio",
|
| 340 |
-
"originalName": "How to Do: SIDE HOP"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": "Modified Burpees",
|
| 344 |
-
"originalTitle": "How to Do: MODIFIED BURPEES",
|
| 345 |
-
"emoji": "❤️",
|
| 346 |
-
"youtubeId": "8o-7v3TU1Pc",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/8o-7v3TU1Pc",
|
| 348 |
-
"duration": "1:09",
|
| 349 |
-
"durationInSeconds": 69,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/8o-7v3TU1Pc/maxresdefault.jpg",
|
| 351 |
-
"sets": 3,
|
| 352 |
-
"reps": "30s",
|
| 353 |
-
"rest": 20,
|
| 354 |
-
"calories": 12,
|
| 355 |
-
"category": "cardio",
|
| 356 |
-
"originalName": "How to Do: MODIFIED BURPEES"
|
| 357 |
-
},
|
| 358 |
-
{
|
| 359 |
-
"name": "Skipping Sem Rope",
|
| 360 |
-
"originalTitle": "How to Do: SKIPPING WITHOUT ROPE",
|
| 361 |
-
"emoji": "❤️",
|
| 362 |
-
"youtubeId": "XfFe0xjopos",
|
| 363 |
-
"embedUrl": "https://www.youtube.com/embed/XfFe0xjopos",
|
| 364 |
-
"duration": "0:56",
|
| 365 |
-
"durationInSeconds": 56,
|
| 366 |
-
"thumbnail": "https://img.youtube.com/vi/XfFe0xjopos/maxresdefault.jpg",
|
| 367 |
-
"sets": 3,
|
| 368 |
-
"reps": "30s",
|
| 369 |
-
"rest": 20,
|
| 370 |
-
"calories": 9,
|
| 371 |
-
"category": "cardio",
|
| 372 |
-
"originalName": "How to Do: SKIPPING WITHOUT ROPE"
|
| 373 |
-
},
|
| 374 |
-
{
|
| 375 |
-
"name": "Burpees",
|
| 376 |
-
"originalTitle": "How to Do: BURPEES",
|
| 377 |
-
"emoji": "❤️",
|
| 378 |
-
"youtubeId": "DyF2u0f-RP0",
|
| 379 |
-
"embedUrl": "https://www.youtube.com/embed/DyF2u0f-RP0",
|
| 380 |
-
"duration": "1:16",
|
| 381 |
-
"durationInSeconds": 76,
|
| 382 |
-
"thumbnail": "https://img.youtube.com/vi/DyF2u0f-RP0/maxresdefault.jpg",
|
| 383 |
-
"sets": 3,
|
| 384 |
-
"reps": "30s",
|
| 385 |
-
"rest": 20,
|
| 386 |
-
"calories": 13,
|
| 387 |
-
"category": "cardio",
|
| 388 |
-
"originalName": "How to Do: BURPEES"
|
| 389 |
-
},
|
| 390 |
-
{
|
| 391 |
-
"name": "Polichinelos",
|
| 392 |
-
"originalTitle": "How to Do: JUMPING JACKS",
|
| 393 |
-
"emoji": "❤️",
|
| 394 |
-
"youtubeId": "w0yjlVqfgyU",
|
| 395 |
-
"embedUrl": "https://www.youtube.com/embed/w0yjlVqfgyU",
|
| 396 |
-
"duration": "0:40",
|
| 397 |
-
"durationInSeconds": 40,
|
| 398 |
-
"thumbnail": "https://img.youtube.com/vi/w0yjlVqfgyU/maxresdefault.jpg",
|
| 399 |
-
"sets": 3,
|
| 400 |
-
"reps": "20s on/10s off",
|
| 401 |
-
"rest": 20,
|
| 402 |
-
"calories": 7,
|
| 403 |
-
"category": "cardio",
|
| 404 |
-
"originalName": "How to Do: JUMPING JACKS"
|
| 405 |
-
}
|
| 406 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/chest.js
DELETED
|
@@ -1,182 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: chest
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 11
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_CHEST = [
|
| 6 |
-
{
|
| 7 |
-
"name": ":em Pé Halter Peito Crucifixo",
|
| 8 |
-
"originalTitle": "How to Do:STANDING DUMBBELL CHEST FLY",
|
| 9 |
-
"emoji": "💪",
|
| 10 |
-
"youtubeId": "rvpbZiife1I",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/rvpbZiife1I",
|
| 12 |
-
"duration": "0:56",
|
| 13 |
-
"durationInSeconds": 56,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/rvpbZiife1I/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "40s",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 6,
|
| 19 |
-
"category": "chest",
|
| 20 |
-
"originalName": "How to Do:STANDING DUMBBELL CHEST FLY"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": ":halter Peito Crucifixo",
|
| 24 |
-
"originalTitle": "How to Do:DUMBBELL CHEST FLY",
|
| 25 |
-
"emoji": "💪",
|
| 26 |
-
"youtubeId": "7uvFOUA4gsY",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/7uvFOUA4gsY",
|
| 28 |
-
"duration": "0:43",
|
| 29 |
-
"durationInSeconds": 43,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/7uvFOUA4gsY/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "12",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 4,
|
| 35 |
-
"category": "chest",
|
| 36 |
-
"originalName": "How to Do:DUMBBELL CHEST FLY"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": ":em Pé Crossover Toe Touches",
|
| 40 |
-
"originalTitle": "How to Do:STANDING CROSSOVER TOE TOUCHES",
|
| 41 |
-
"emoji": "💪",
|
| 42 |
-
"youtubeId": "OUJD4yjr3I4",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/OUJD4yjr3I4",
|
| 44 |
-
"duration": "1:02",
|
| 45 |
-
"durationInSeconds": 62,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/OUJD4yjr3I4/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "40s",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 6,
|
| 51 |
-
"category": "chest",
|
| 52 |
-
"originalName": "How to Do:STANDING CROSSOVER TOE TOUCHES"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": ":dinâmico Peito",
|
| 56 |
-
"originalTitle": "How to Do:DYNAMIC CHEST",
|
| 57 |
-
"emoji": "💪",
|
| 58 |
-
"youtubeId": "kLmWN3Qsj0A",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/kLmWN3Qsj0A",
|
| 60 |
-
"duration": "0:40",
|
| 61 |
-
"durationInSeconds": 40,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/kLmWN3Qsj0A/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "12",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 4,
|
| 67 |
-
"category": "chest",
|
| 68 |
-
"originalName": "How to Do:DYNAMIC CHEST"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":peito Pressão Pulsação",
|
| 72 |
-
"originalTitle": "How to Do:CHEST PRESS PULSE",
|
| 73 |
-
"emoji": "💪",
|
| 74 |
-
"youtubeId": "Fz4oo1vFo9M",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/Fz4oo1vFo9M",
|
| 76 |
-
"duration": "0:45",
|
| 77 |
-
"durationInSeconds": 45,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/Fz4oo1vFo9M/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "12",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 5,
|
| 83 |
-
"category": "chest",
|
| 84 |
-
"originalName": "How to Do:CHEST PRESS PULSE"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":reverse Flys",
|
| 88 |
-
"originalTitle": "How to Do:REVERSE FLYS",
|
| 89 |
-
"emoji": "💪",
|
| 90 |
-
"youtubeId": "Cu57U1AqCBk",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/Cu57U1AqCBk",
|
| 92 |
-
"duration": "1:02",
|
| 93 |
-
"durationInSeconds": 62,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/Cu57U1AqCBk/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "40s",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 6,
|
| 99 |
-
"category": "chest",
|
| 100 |
-
"originalName": "How to Do:REVERSE FLYS"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":peito Alongamento",
|
| 104 |
-
"originalTitle": "How to Do:CHEST STRETCH",
|
| 105 |
-
"emoji": "💪",
|
| 106 |
-
"youtubeId": "NS64IgKUyeY",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/NS64IgKUyeY",
|
| 108 |
-
"duration": "0:49",
|
| 109 |
-
"durationInSeconds": 49,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/NS64IgKUyeY/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "12",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 5,
|
| 115 |
-
"category": "chest",
|
| 116 |
-
"originalName": "How to Do:CHEST STRETCH"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":halter Peito Crucifixo",
|
| 120 |
-
"originalTitle": "How to Do:DUMBBELL CHEST FLY",
|
| 121 |
-
"emoji": "💪",
|
| 122 |
-
"youtubeId": "MZfp-nfKQ_E",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/MZfp-nfKQ_E",
|
| 124 |
-
"duration": "1:05",
|
| 125 |
-
"durationInSeconds": 65,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/MZfp-nfKQ_E/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "40s",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 7,
|
| 131 |
-
"category": "chest",
|
| 132 |
-
"originalName": "How to Do:DUMBBELL CHEST FLY"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": "Dinâmico Peito",
|
| 136 |
-
"originalTitle": "How to Do: DYNAMIC CHEST",
|
| 137 |
-
"emoji": "💪",
|
| 138 |
-
"youtubeId": "YUdPw8FCb5Y",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/YUdPw8FCb5Y",
|
| 140 |
-
"duration": "0:58",
|
| 141 |
-
"durationInSeconds": 58,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/YUdPw8FCb5Y/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "40s",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 6,
|
| 147 |
-
"category": "chest",
|
| 148 |
-
"originalName": "How to Do: DYNAMIC CHEST"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": "Peito Alongamento",
|
| 152 |
-
"originalTitle": "How to Do: CHEST STRETCH",
|
| 153 |
-
"emoji": "💪",
|
| 154 |
-
"youtubeId": "DzYbKoktWao",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/DzYbKoktWao",
|
| 156 |
-
"duration": "0:56",
|
| 157 |
-
"durationInSeconds": 56,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/DzYbKoktWao/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "40s",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 6,
|
| 163 |
-
"category": "chest",
|
| 164 |
-
"originalName": "How to Do: CHEST STRETCH"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": "Peito Pressão Pulsação",
|
| 168 |
-
"originalTitle": "How to Do: CHEST PRESS PULSE",
|
| 169 |
-
"emoji": "💪",
|
| 170 |
-
"youtubeId": "jBDy37pM5jo",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/jBDy37pM5jo",
|
| 172 |
-
"duration": "1:03",
|
| 173 |
-
"durationInSeconds": 63,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/jBDy37pM5jo/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "40s",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 6,
|
| 179 |
-
"category": "chest",
|
| 180 |
-
"originalName": "How to Do: CHEST PRESS PULSE"
|
| 181 |
-
}
|
| 182 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/face.js
DELETED
|
@@ -1,230 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: face
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 14
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_FACE = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Cow Rosto",
|
| 8 |
-
"originalTitle": "How to Do: COW FACE",
|
| 9 |
-
"emoji": "😊",
|
| 10 |
-
"youtubeId": "jJlSkHHmaZg",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/jJlSkHHmaZg",
|
| 12 |
-
"duration": "1:17",
|
| 13 |
-
"durationInSeconds": 77,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/jJlSkHHmaZg/maxresdefault.jpg",
|
| 15 |
-
"sets": 2,
|
| 16 |
-
"reps": "15",
|
| 17 |
-
"rest": 20,
|
| 18 |
-
"calories": 3,
|
| 19 |
-
"category": "face",
|
| 20 |
-
"originalName": "How to Do: COW FACE"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": ":bochecha Firmer",
|
| 24 |
-
"originalTitle": "How to Do:CHEEK FIRMER",
|
| 25 |
-
"emoji": "😊",
|
| 26 |
-
"youtubeId": "83Xu_F92j60",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/83Xu_F92j60",
|
| 28 |
-
"duration": "0:26",
|
| 29 |
-
"durationInSeconds": 26,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/83Xu_F92j60/maxresdefault.jpg",
|
| 31 |
-
"sets": 2,
|
| 32 |
-
"reps": "15",
|
| 33 |
-
"rest": 20,
|
| 34 |
-
"calories": 1,
|
| 35 |
-
"category": "face",
|
| 36 |
-
"originalName": "How to Do:CHEEK FIRMER"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": ":lateral Pescoço Alongamento",
|
| 40 |
-
"originalTitle": "How to Do:SIDE NECK STRETCH",
|
| 41 |
-
"emoji": "😊",
|
| 42 |
-
"youtubeId": "e-zXrtIPjMc",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/e-zXrtIPjMc",
|
| 44 |
-
"duration": "0:48",
|
| 45 |
-
"durationInSeconds": 48,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/e-zXrtIPjMc/maxresdefault.jpg",
|
| 47 |
-
"sets": 2,
|
| 48 |
-
"reps": "15",
|
| 49 |
-
"rest": 20,
|
| 50 |
-
"calories": 2,
|
| 51 |
-
"category": "face",
|
| 52 |
-
"originalName": "How to Do:SIDE NECK STRETCH"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": ":marchin Quadril Raises",
|
| 56 |
-
"originalTitle": "How to Do:MARCHIN HIP RAISES",
|
| 57 |
-
"emoji": "😊",
|
| 58 |
-
"youtubeId": "lD8TZAPjfLk",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/lD8TZAPjfLk",
|
| 60 |
-
"duration": "0:51",
|
| 61 |
-
"durationInSeconds": 51,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/lD8TZAPjfLk/maxresdefault.jpg",
|
| 63 |
-
"sets": 2,
|
| 64 |
-
"reps": "15",
|
| 65 |
-
"rest": 20,
|
| 66 |
-
"calories": 2,
|
| 67 |
-
"category": "face",
|
| 68 |
-
"originalName": "How to Do:MARCHIN HIP RAISES"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":maxilar Line",
|
| 72 |
-
"originalTitle": "How to Do:JAW LINE",
|
| 73 |
-
"emoji": "😊",
|
| 74 |
-
"youtubeId": "R2cqpjvaB3E",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/R2cqpjvaB3E",
|
| 76 |
-
"duration": "0:22",
|
| 77 |
-
"durationInSeconds": 22,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/R2cqpjvaB3E/maxresdefault.jpg",
|
| 79 |
-
"sets": 2,
|
| 80 |
-
"reps": "15",
|
| 81 |
-
"rest": 20,
|
| 82 |
-
"calories": 1,
|
| 83 |
-
"category": "face",
|
| 84 |
-
"originalName": "How to Do:JAW LINE"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":underchin Duck",
|
| 88 |
-
"originalTitle": "How to Do:UNDERCHIN DUCK",
|
| 89 |
-
"emoji": "😊",
|
| 90 |
-
"youtubeId": "p4zyEGc4DXs",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/p4zyEGc4DXs",
|
| 92 |
-
"duration": "0:39",
|
| 93 |
-
"durationInSeconds": 39,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/p4zyEGc4DXs/maxresdefault.jpg",
|
| 95 |
-
"sets": 2,
|
| 96 |
-
"reps": "15",
|
| 97 |
-
"rest": 20,
|
| 98 |
-
"calories": 1,
|
| 99 |
-
"category": "face",
|
| 100 |
-
"originalName": "How to Do:UNDERCHIN DUCK"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":nose Touching",
|
| 104 |
-
"originalTitle": "How to Do:NOSE TOUCHING",
|
| 105 |
-
"emoji": "😊",
|
| 106 |
-
"youtubeId": "CYhQ44hsPHc",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/CYhQ44hsPHc",
|
| 108 |
-
"duration": "0:38",
|
| 109 |
-
"durationInSeconds": 38,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/CYhQ44hsPHc/maxresdefault.jpg",
|
| 111 |
-
"sets": 2,
|
| 112 |
-
"reps": "15",
|
| 113 |
-
"rest": 20,
|
| 114 |
-
"calories": 1,
|
| 115 |
-
"category": "face",
|
| 116 |
-
"originalName": "How to Do:NOSE TOUCHING"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":smiling Fish Rosto",
|
| 120 |
-
"originalTitle": "How to Do:SMILING FISH FACE",
|
| 121 |
-
"emoji": "😊",
|
| 122 |
-
"youtubeId": "mLYm4ItAuro",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/mLYm4ItAuro",
|
| 124 |
-
"duration": "0:29",
|
| 125 |
-
"durationInSeconds": 29,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/mLYm4ItAuro/maxresdefault.jpg",
|
| 127 |
-
"sets": 2,
|
| 128 |
-
"reps": "15",
|
| 129 |
-
"rest": 20,
|
| 130 |
-
"calories": 1,
|
| 131 |
-
"category": "face",
|
| 132 |
-
"originalName": "How to Do:SMILING FISH FACE"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":pescoço Levantamento",
|
| 136 |
-
"originalTitle": "How to Do:NECK LIFT",
|
| 137 |
-
"emoji": "😊",
|
| 138 |
-
"youtubeId": "CRKO4lDtRzE",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/CRKO4lDtRzE",
|
| 140 |
-
"duration": "0:40",
|
| 141 |
-
"durationInSeconds": 40,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/CRKO4lDtRzE/maxresdefault.jpg",
|
| 143 |
-
"sets": 2,
|
| 144 |
-
"reps": "15",
|
| 145 |
-
"rest": 20,
|
| 146 |
-
"calories": 1,
|
| 147 |
-
"category": "face",
|
| 148 |
-
"originalName": "How to Do:NECK LIFT"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":puffy Cheeks",
|
| 152 |
-
"originalTitle": "How to Do:PUFFY CHEEKS",
|
| 153 |
-
"emoji": "😊",
|
| 154 |
-
"youtubeId": "2JhZ3K8PPHY",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/2JhZ3K8PPHY",
|
| 156 |
-
"duration": "0:30",
|
| 157 |
-
"durationInSeconds": 30,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/2JhZ3K8PPHY/maxresdefault.jpg",
|
| 159 |
-
"sets": 2,
|
| 160 |
-
"reps": "15",
|
| 161 |
-
"rest": 20,
|
| 162 |
-
"calories": 1,
|
| 163 |
-
"category": "face",
|
| 164 |
-
"originalName": "How to Do:PUFFY CHEEKS"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":smile",
|
| 168 |
-
"originalTitle": "How to Do:SMILE",
|
| 169 |
-
"emoji": "😊",
|
| 170 |
-
"youtubeId": "DoB_Dh0OxSc",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/DoB_Dh0OxSc",
|
| 172 |
-
"duration": "0:38",
|
| 173 |
-
"durationInSeconds": 38,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/DoB_Dh0OxSc/maxresdefault.jpg",
|
| 175 |
-
"sets": 2,
|
| 176 |
-
"reps": "15",
|
| 177 |
-
"rest": 20,
|
| 178 |
-
"calories": 1,
|
| 179 |
-
"category": "face",
|
| 180 |
-
"originalName": "How to Do:SMILE"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":drawn Cheeks",
|
| 184 |
-
"originalTitle": "How to Do:DRAWN CHEEKS",
|
| 185 |
-
"emoji": "😊",
|
| 186 |
-
"youtubeId": "DI939pnWhmk",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/DI939pnWhmk",
|
| 188 |
-
"duration": "0:35",
|
| 189 |
-
"durationInSeconds": 35,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/DI939pnWhmk/maxresdefault.jpg",
|
| 191 |
-
"sets": 2,
|
| 192 |
-
"reps": "15",
|
| 193 |
-
"rest": 20,
|
| 194 |
-
"calories": 1,
|
| 195 |
-
"category": "face",
|
| 196 |
-
"originalName": "How to Do:DRAWN CHEEKS"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":lateral Pescoço Alongamento",
|
| 200 |
-
"originalTitle": "How to Do:SIDE NECK STRETCH",
|
| 201 |
-
"emoji": "😊",
|
| 202 |
-
"youtubeId": "vuXefIK-pgw",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/vuXefIK-pgw",
|
| 204 |
-
"duration": "0:53",
|
| 205 |
-
"durationInSeconds": 53,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/vuXefIK-pgw/maxresdefault.jpg",
|
| 207 |
-
"sets": 2,
|
| 208 |
-
"reps": "15",
|
| 209 |
-
"rest": 20,
|
| 210 |
-
"calories": 2,
|
| 211 |
-
"category": "face",
|
| 212 |
-
"originalName": "How to Do:SIDE NECK STRETCH"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": "Polichinelos Laterais",
|
| 216 |
-
"originalTitle": "Como fazer: polichinelos laterais",
|
| 217 |
-
"emoji": "😊",
|
| 218 |
-
"youtubeId": "eW2x6ikoXqA",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/eW2x6ikoXqA",
|
| 220 |
-
"duration": "0:57",
|
| 221 |
-
"durationInSeconds": 57,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/eW2x6ikoXqA/maxresdefault.jpg",
|
| 223 |
-
"sets": 2,
|
| 224 |
-
"reps": "15",
|
| 225 |
-
"rest": 20,
|
| 226 |
-
"calories": 2,
|
| 227 |
-
"category": "face",
|
| 228 |
-
"originalName": "Como fazer: polichinelos laterais"
|
| 229 |
-
}
|
| 230 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/fullbody.js
DELETED
|
@@ -1,1654 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: fullbody
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 103
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_FULLBODY = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Revolved Lateral Angle",
|
| 8 |
-
"originalTitle": "How to Do: REVOLVED SIDE ANGLE",
|
| 9 |
-
"emoji": "✨",
|
| 10 |
-
"youtubeId": "lqOuqA1Ii7U",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/lqOuqA1Ii7U",
|
| 12 |
-
"duration": "1:21",
|
| 13 |
-
"durationInSeconds": 81,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/lqOuqA1Ii7U/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "40s",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 12,
|
| 19 |
-
"category": "fullbody",
|
| 20 |
-
"originalName": "How to Do: REVOLVED SIDE ANGLE"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": "Extended Lateral Angle",
|
| 24 |
-
"originalTitle": "How to Do: EXTENDED SIDE ANGLE",
|
| 25 |
-
"emoji": "✨",
|
| 26 |
-
"youtubeId": "O06t2tg1hlg",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/O06t2tg1hlg",
|
| 28 |
-
"duration": "1:18",
|
| 29 |
-
"durationInSeconds": 78,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/O06t2tg1hlg/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "40s",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 12,
|
| 35 |
-
"category": "fullbody",
|
| 36 |
-
"originalName": "How to Do: EXTENDED SIDE ANGLE"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": "Half Para Frente Flexão",
|
| 40 |
-
"originalTitle": "How to Do: HALF FORWARD BEND",
|
| 41 |
-
"emoji": "✨",
|
| 42 |
-
"youtubeId": "twUDaY6WbOM",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/twUDaY6WbOM",
|
| 44 |
-
"duration": "1:12",
|
| 45 |
-
"durationInSeconds": 72,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/twUDaY6WbOM/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "40s",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 11,
|
| 51 |
-
"category": "fullbody",
|
| 52 |
-
"originalName": "How to Do: HALF FORWARD BEND"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": "Thread Needle",
|
| 56 |
-
"originalTitle": "How to Do: THREAD THE NEEDLE",
|
| 57 |
-
"emoji": "✨",
|
| 58 |
-
"youtubeId": "2CGqyWvxP-g",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/2CGqyWvxP-g",
|
| 60 |
-
"duration": "1:08",
|
| 61 |
-
"durationInSeconds": 68,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/2CGqyWvxP-g/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "40s",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 10,
|
| 67 |
-
"category": "fullbody",
|
| 68 |
-
"originalName": "How to Do: THREAD THE NEEDLE"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": "Spinal Rolling",
|
| 72 |
-
"originalTitle": "How to Do: SPINAL ROLLING",
|
| 73 |
-
"emoji": "✨",
|
| 74 |
-
"youtubeId": "_TesLrPS1Mw",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/_TesLrPS1Mw",
|
| 76 |
-
"duration": "1:06",
|
| 77 |
-
"durationInSeconds": 66,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/_TesLrPS1Mw/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "40s",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 10,
|
| 83 |
-
"category": "fullbody",
|
| 84 |
-
"originalName": "How to Do: SPINAL ROLLING"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": "Prone Scorpion Kicks",
|
| 88 |
-
"originalTitle": "How to Do: PRONE SCORPION KICKS",
|
| 89 |
-
"emoji": "✨",
|
| 90 |
-
"youtubeId": "OwwbXnVwNF4",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/OwwbXnVwNF4",
|
| 92 |
-
"duration": "1:05",
|
| 93 |
-
"durationInSeconds": 65,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/OwwbXnVwNF4/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "40s",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 10,
|
| 99 |
-
"category": "fullbody",
|
| 100 |
-
"originalName": "How to Do: PRONE SCORPION KICKS"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": "Cadeira",
|
| 104 |
-
"originalTitle": "How to Do: CHAIR",
|
| 105 |
-
"emoji": "✨",
|
| 106 |
-
"youtubeId": "8A7san5fxLY",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/8A7san5fxLY",
|
| 108 |
-
"duration": "1:01",
|
| 109 |
-
"durationInSeconds": 61,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/8A7san5fxLY/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "40s",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 9,
|
| 115 |
-
"category": "fullbody",
|
| 116 |
-
"originalName": "How to Do: CHAIR"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": "Camel",
|
| 120 |
-
"originalTitle": "How to Do: CAMEL",
|
| 121 |
-
"emoji": "✨",
|
| 122 |
-
"youtubeId": "SK6G-mPYHcg",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/SK6G-mPYHcg",
|
| 124 |
-
"duration": "1:07",
|
| 125 |
-
"durationInSeconds": 67,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/SK6G-mPYHcg/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "40s",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 10,
|
| 131 |
-
"category": "fullbody",
|
| 132 |
-
"originalName": "How to Do: CAMEL"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":pendulum Swings",
|
| 136 |
-
"originalTitle": "How to Do:PENDULUM SWINGS",
|
| 137 |
-
"emoji": "✨",
|
| 138 |
-
"youtubeId": "RN2qWm0f3eM",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/RN2qWm0f3eM",
|
| 140 |
-
"duration": "0:36",
|
| 141 |
-
"durationInSeconds": 36,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/RN2qWm0f3eM/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "12",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 5,
|
| 147 |
-
"category": "fullbody",
|
| 148 |
-
"originalName": "How to Do:PENDULUM SWINGS"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":windshield Wipers",
|
| 152 |
-
"originalTitle": "How to Do:WINDSHIELD WIPERS",
|
| 153 |
-
"emoji": "✨",
|
| 154 |
-
"youtubeId": "fNf_IfTAVD0",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/fNf_IfTAVD0",
|
| 156 |
-
"duration": "0:39",
|
| 157 |
-
"durationInSeconds": 39,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/fNf_IfTAVD0/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "12",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 6,
|
| 163 |
-
"category": "fullbody",
|
| 164 |
-
"originalName": "How to Do:WINDSHIELD WIPERS"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":body Saw",
|
| 168 |
-
"originalTitle": "How to Do:BODY SAW",
|
| 169 |
-
"emoji": "✨",
|
| 170 |
-
"youtubeId": "CJHdCRhZCwY",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/CJHdCRhZCwY",
|
| 172 |
-
"duration": "0:38",
|
| 173 |
-
"durationInSeconds": 38,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/CJHdCRhZCwY/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "12",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 6,
|
| 179 |
-
"category": "fullbody",
|
| 180 |
-
"originalName": "How to Do:BODY SAW"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":mouth Circles",
|
| 184 |
-
"originalTitle": "How to Do:MOUTH CIRCLES",
|
| 185 |
-
"emoji": "✨",
|
| 186 |
-
"youtubeId": "FwiiAJhH3bg",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/FwiiAJhH3bg",
|
| 188 |
-
"duration": "0:26",
|
| 189 |
-
"durationInSeconds": 26,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/FwiiAJhH3bg/maxresdefault.jpg",
|
| 191 |
-
"sets": 4,
|
| 192 |
-
"reps": "15",
|
| 193 |
-
"rest": 30,
|
| 194 |
-
"calories": 4,
|
| 195 |
-
"category": "fullbody",
|
| 196 |
-
"originalName": "How to Do:MOUTH CIRCLES"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":havyk Raises",
|
| 200 |
-
"originalTitle": "How to Do:HAVYK RAISES",
|
| 201 |
-
"emoji": "✨",
|
| 202 |
-
"youtubeId": "HTSdBBXRR6I",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/HTSdBBXRR6I",
|
| 204 |
-
"duration": "0:55",
|
| 205 |
-
"durationInSeconds": 55,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/HTSdBBXRR6I/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "40s",
|
| 209 |
-
"rest": 30,
|
| 210 |
-
"calories": 8,
|
| 211 |
-
"category": "fullbody",
|
| 212 |
-
"originalName": "How to Do:HAVYK RAISES"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ": Roll",
|
| 216 |
-
"originalTitle": "How to Do:THE ROLL",
|
| 217 |
-
"emoji": "✨",
|
| 218 |
-
"youtubeId": "Be0SH5OCFxo",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/Be0SH5OCFxo",
|
| 220 |
-
"duration": "0:52",
|
| 221 |
-
"durationInSeconds": 52,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/Be0SH5OCFxo/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "40s",
|
| 225 |
-
"rest": 30,
|
| 226 |
-
"calories": 8,
|
| 227 |
-
"category": "fullbody",
|
| 228 |
-
"originalName": "How to Do:THE ROLL"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": ":eyes Circles",
|
| 232 |
-
"originalTitle": "How to Do:EYES CIRCLES",
|
| 233 |
-
"emoji": "✨",
|
| 234 |
-
"youtubeId": "uLy76pbdh8s",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/uLy76pbdh8s",
|
| 236 |
-
"duration": "0:26",
|
| 237 |
-
"durationInSeconds": 26,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/uLy76pbdh8s/maxresdefault.jpg",
|
| 239 |
-
"sets": 4,
|
| 240 |
-
"reps": "15",
|
| 241 |
-
"rest": 30,
|
| 242 |
-
"calories": 4,
|
| 243 |
-
"category": "fullbody",
|
| 244 |
-
"originalName": "How to Do:EYES CIRCLES"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": ":toe Tap",
|
| 248 |
-
"originalTitle": "How to Do:TOE TAP",
|
| 249 |
-
"emoji": "✨",
|
| 250 |
-
"youtubeId": "SmsSb_DlOwo",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/SmsSb_DlOwo",
|
| 252 |
-
"duration": "0:47",
|
| 253 |
-
"durationInSeconds": 47,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/SmsSb_DlOwo/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "12",
|
| 257 |
-
"rest": 30,
|
| 258 |
-
"calories": 7,
|
| 259 |
-
"category": "fullbody",
|
| 260 |
-
"originalName": "How to Do:TOE TAP"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": ":half Bending Pushing Para Frente",
|
| 264 |
-
"originalTitle": "How to Do:HALF BENDING PUSHING FORWARD",
|
| 265 |
-
"emoji": "✨",
|
| 266 |
-
"youtubeId": "ABSbePQDruk",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/ABSbePQDruk",
|
| 268 |
-
"duration": "0:41",
|
| 269 |
-
"durationInSeconds": 41,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/ABSbePQDruk/maxresdefault.jpg",
|
| 271 |
-
"sets": 3,
|
| 272 |
-
"reps": "12",
|
| 273 |
-
"rest": 30,
|
| 274 |
-
"calories": 6,
|
| 275 |
-
"category": "fullbody",
|
| 276 |
-
"originalName": "How to Do:HALF BENDING PUSHING FORWARD"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": ":eye Levantamento",
|
| 280 |
-
"originalTitle": "How to Do:EYE LIFT",
|
| 281 |
-
"emoji": "✨",
|
| 282 |
-
"youtubeId": "ozhBaD5eJx8",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/ozhBaD5eJx8",
|
| 284 |
-
"duration": "0:36",
|
| 285 |
-
"durationInSeconds": 36,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/ozhBaD5eJx8/maxresdefault.jpg",
|
| 287 |
-
"sets": 3,
|
| 288 |
-
"reps": "12",
|
| 289 |
-
"rest": 30,
|
| 290 |
-
"calories": 5,
|
| 291 |
-
"category": "fullbody",
|
| 292 |
-
"originalName": "How to Do:EYE LIFT"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": ":marilyn",
|
| 296 |
-
"originalTitle": "How to Do:MARILYN",
|
| 297 |
-
"emoji": "✨",
|
| 298 |
-
"youtubeId": "a3HAjKcyy9c",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/a3HAjKcyy9c",
|
| 300 |
-
"duration": "0:31",
|
| 301 |
-
"durationInSeconds": 31,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/a3HAjKcyy9c/maxresdefault.jpg",
|
| 303 |
-
"sets": 3,
|
| 304 |
-
"reps": "12",
|
| 305 |
-
"rest": 30,
|
| 306 |
-
"calories": 5,
|
| 307 |
-
"category": "fullbody",
|
| 308 |
-
"originalName": "How to Do:MARILYN"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": ":lion",
|
| 312 |
-
"originalTitle": "How to Do:LION",
|
| 313 |
-
"emoji": "✨",
|
| 314 |
-
"youtubeId": "Xv5JtCbB4bI",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/Xv5JtCbB4bI",
|
| 316 |
-
"duration": "0:41",
|
| 317 |
-
"durationInSeconds": 41,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/Xv5JtCbB4bI/maxresdefault.jpg",
|
| 319 |
-
"sets": 3,
|
| 320 |
-
"reps": "12",
|
| 321 |
-
"rest": 30,
|
| 322 |
-
"calories": 6,
|
| 323 |
-
"category": "fullbody",
|
| 324 |
-
"originalName": "How to Do:LION"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": ":floor Slides",
|
| 328 |
-
"originalTitle": "How to Do:FLOOR SLIDES",
|
| 329 |
-
"emoji": "✨",
|
| 330 |
-
"youtubeId": "Cft0lko4M4s",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/Cft0lko4M4s",
|
| 332 |
-
"duration": "0:52",
|
| 333 |
-
"durationInSeconds": 52,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/Cft0lko4M4s/maxresdefault.jpg",
|
| 335 |
-
"sets": 3,
|
| 336 |
-
"reps": "40s",
|
| 337 |
-
"rest": 30,
|
| 338 |
-
"calories": 8,
|
| 339 |
-
"category": "fullbody",
|
| 340 |
-
"originalName": "How to Do:FLOOR SLIDES"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": ":\"aeiou\"",
|
| 344 |
-
"originalTitle": "How to Do:\"AEIOU\"",
|
| 345 |
-
"emoji": "✨",
|
| 346 |
-
"youtubeId": "WvDXjfM9gDk",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/WvDXjfM9gDk",
|
| 348 |
-
"duration": "0:34",
|
| 349 |
-
"durationInSeconds": 34,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/WvDXjfM9gDk/maxresdefault.jpg",
|
| 351 |
-
"sets": 3,
|
| 352 |
-
"reps": "12",
|
| 353 |
-
"rest": 30,
|
| 354 |
-
"calories": 5,
|
| 355 |
-
"category": "fullbody",
|
| 356 |
-
"originalName": "How to Do:\"AEIOU\""
|
| 357 |
-
},
|
| 358 |
-
{
|
| 359 |
-
"name": ":offset Empurrar-ups",
|
| 360 |
-
"originalTitle": "How to Do:OFFSET PUSH-UPS",
|
| 361 |
-
"emoji": "✨",
|
| 362 |
-
"youtubeId": "32yYCbAQo5A",
|
| 363 |
-
"embedUrl": "https://www.youtube.com/embed/32yYCbAQo5A",
|
| 364 |
-
"duration": "0:45",
|
| 365 |
-
"durationInSeconds": 45,
|
| 366 |
-
"thumbnail": "https://img.youtube.com/vi/32yYCbAQo5A/maxresdefault.jpg",
|
| 367 |
-
"sets": 3,
|
| 368 |
-
"reps": "12",
|
| 369 |
-
"rest": 30,
|
| 370 |
-
"calories": 7,
|
| 371 |
-
"category": "fullbody",
|
| 372 |
-
"originalName": "How to Do:OFFSET PUSH-UPS"
|
| 373 |
-
},
|
| 374 |
-
{
|
| 375 |
-
"name": ":sentado Em & Outs",
|
| 376 |
-
"originalTitle": "How to Do:SEATED IN & OUTS",
|
| 377 |
-
"emoji": "✨",
|
| 378 |
-
"youtubeId": "d1CaYcMApDw",
|
| 379 |
-
"embedUrl": "https://www.youtube.com/embed/d1CaYcMApDw",
|
| 380 |
-
"duration": "0:46",
|
| 381 |
-
"durationInSeconds": 46,
|
| 382 |
-
"thumbnail": "https://img.youtube.com/vi/d1CaYcMApDw/maxresdefault.jpg",
|
| 383 |
-
"sets": 3,
|
| 384 |
-
"reps": "12",
|
| 385 |
-
"rest": 30,
|
| 386 |
-
"calories": 7,
|
| 387 |
-
"category": "fullbody",
|
| 388 |
-
"originalName": "How to Do:SEATED IN & OUTS"
|
| 389 |
-
},
|
| 390 |
-
{
|
| 391 |
-
"name": ":air Cycling",
|
| 392 |
-
"originalTitle": "How to Do:AIR CYCLING",
|
| 393 |
-
"emoji": "✨",
|
| 394 |
-
"youtubeId": "YRnePgJ7fLQ",
|
| 395 |
-
"embedUrl": "https://www.youtube.com/embed/YRnePgJ7fLQ",
|
| 396 |
-
"duration": "0:46",
|
| 397 |
-
"durationInSeconds": 46,
|
| 398 |
-
"thumbnail": "https://img.youtube.com/vi/YRnePgJ7fLQ/maxresdefault.jpg",
|
| 399 |
-
"sets": 3,
|
| 400 |
-
"reps": "12",
|
| 401 |
-
"rest": 30,
|
| 402 |
-
"calories": 7,
|
| 403 |
-
"category": "fullbody",
|
| 404 |
-
"originalName": "How to Do:AIR CYCLING"
|
| 405 |
-
},
|
| 406 |
-
{
|
| 407 |
-
"name": ":tiger Flexão Empurrar-ups",
|
| 408 |
-
"originalTitle": "How to Do:TIGER BEND PUSH-UPS",
|
| 409 |
-
"emoji": "✨",
|
| 410 |
-
"youtubeId": "i-nQPot8ass",
|
| 411 |
-
"embedUrl": "https://www.youtube.com/embed/i-nQPot8ass",
|
| 412 |
-
"duration": "0:46",
|
| 413 |
-
"durationInSeconds": 46,
|
| 414 |
-
"thumbnail": "https://img.youtube.com/vi/i-nQPot8ass/maxresdefault.jpg",
|
| 415 |
-
"sets": 3,
|
| 416 |
-
"reps": "12",
|
| 417 |
-
"rest": 30,
|
| 418 |
-
"calories": 7,
|
| 419 |
-
"category": "fullbody",
|
| 420 |
-
"originalName": "How to Do:TIGER BEND PUSH-UPS"
|
| 421 |
-
},
|
| 422 |
-
{
|
| 423 |
-
"name": ":lateral-para-lateral Turns",
|
| 424 |
-
"originalTitle": "How to Do:SIDE-TO-SIDE TURNS",
|
| 425 |
-
"emoji": "✨",
|
| 426 |
-
"youtubeId": "cqCtbELMH4I",
|
| 427 |
-
"embedUrl": "https://www.youtube.com/embed/cqCtbELMH4I",
|
| 428 |
-
"duration": "0:38",
|
| 429 |
-
"durationInSeconds": 38,
|
| 430 |
-
"thumbnail": "https://img.youtube.com/vi/cqCtbELMH4I/maxresdefault.jpg",
|
| 431 |
-
"sets": 3,
|
| 432 |
-
"reps": "12",
|
| 433 |
-
"rest": 30,
|
| 434 |
-
"calories": 6,
|
| 435 |
-
"category": "fullbody",
|
| 436 |
-
"originalName": "How to Do:SIDE-TO-SIDE TURNS"
|
| 437 |
-
},
|
| 438 |
-
{
|
| 439 |
-
"name": ":cross Touch E Reach",
|
| 440 |
-
"originalTitle": "How to Do:CROSS TOUCH AND REACH",
|
| 441 |
-
"emoji": "✨",
|
| 442 |
-
"youtubeId": "tTrk6Kzo2OA",
|
| 443 |
-
"embedUrl": "https://www.youtube.com/embed/tTrk6Kzo2OA",
|
| 444 |
-
"duration": "0:53",
|
| 445 |
-
"durationInSeconds": 53,
|
| 446 |
-
"thumbnail": "https://img.youtube.com/vi/tTrk6Kzo2OA/maxresdefault.jpg",
|
| 447 |
-
"sets": 3,
|
| 448 |
-
"reps": "40s",
|
| 449 |
-
"rest": 30,
|
| 450 |
-
"calories": 8,
|
| 451 |
-
"category": "fullbody",
|
| 452 |
-
"originalName": "How to Do:CROSS TOUCH AND REACH"
|
| 453 |
-
},
|
| 454 |
-
{
|
| 455 |
-
"name": ":quick Feet",
|
| 456 |
-
"originalTitle": "How to Do:QUICK FEET",
|
| 457 |
-
"emoji": "✨",
|
| 458 |
-
"youtubeId": "fz59j4a3QMQ",
|
| 459 |
-
"embedUrl": "https://www.youtube.com/embed/fz59j4a3QMQ",
|
| 460 |
-
"duration": "0:46",
|
| 461 |
-
"durationInSeconds": 46,
|
| 462 |
-
"thumbnail": "https://img.youtube.com/vi/fz59j4a3QMQ/maxresdefault.jpg",
|
| 463 |
-
"sets": 3,
|
| 464 |
-
"reps": "12",
|
| 465 |
-
"rest": 30,
|
| 466 |
-
"calories": 7,
|
| 467 |
-
"category": "fullbody",
|
| 468 |
-
"originalName": "How to Do:QUICK FEET"
|
| 469 |
-
},
|
| 470 |
-
{
|
| 471 |
-
"name": ":para Frente Flexão",
|
| 472 |
-
"originalTitle": "How to Do:FORWARD BEND",
|
| 473 |
-
"emoji": "✨",
|
| 474 |
-
"youtubeId": "IrCe1H0OOMA",
|
| 475 |
-
"embedUrl": "https://www.youtube.com/embed/IrCe1H0OOMA",
|
| 476 |
-
"duration": "0:42",
|
| 477 |
-
"durationInSeconds": 42,
|
| 478 |
-
"thumbnail": "https://img.youtube.com/vi/IrCe1H0OOMA/maxresdefault.jpg",
|
| 479 |
-
"sets": 3,
|
| 480 |
-
"reps": "12",
|
| 481 |
-
"rest": 30,
|
| 482 |
-
"calories": 6,
|
| 483 |
-
"category": "fullbody",
|
| 484 |
-
"originalName": "How to Do:FORWARD BEND"
|
| 485 |
-
},
|
| 486 |
-
{
|
| 487 |
-
"name": ":lateral-para-lateral Tilts",
|
| 488 |
-
"originalTitle": "How to Do:SIDE-TO-SIDE TILTS",
|
| 489 |
-
"emoji": "✨",
|
| 490 |
-
"youtubeId": "0jzWXtnipPY",
|
| 491 |
-
"embedUrl": "https://www.youtube.com/embed/0jzWXtnipPY",
|
| 492 |
-
"duration": "0:43",
|
| 493 |
-
"durationInSeconds": 43,
|
| 494 |
-
"thumbnail": "https://img.youtube.com/vi/0jzWXtnipPY/maxresdefault.jpg",
|
| 495 |
-
"sets": 3,
|
| 496 |
-
"reps": "12",
|
| 497 |
-
"rest": 30,
|
| 498 |
-
"calories": 6,
|
| 499 |
-
"category": "fullbody",
|
| 500 |
-
"originalName": "How to Do:SIDE-TO-SIDE TILTS"
|
| 501 |
-
},
|
| 502 |
-
{
|
| 503 |
-
"name": ":empurrar-para Cima Com Toe Tap",
|
| 504 |
-
"originalTitle": "How to Do:PUSH-UP WITH TOE TAP",
|
| 505 |
-
"emoji": "✨",
|
| 506 |
-
"youtubeId": "YrlXZPNDo3A",
|
| 507 |
-
"embedUrl": "https://www.youtube.com/embed/YrlXZPNDo3A",
|
| 508 |
-
"duration": "0:48",
|
| 509 |
-
"durationInSeconds": 48,
|
| 510 |
-
"thumbnail": "https://img.youtube.com/vi/YrlXZPNDo3A/maxresdefault.jpg",
|
| 511 |
-
"sets": 3,
|
| 512 |
-
"reps": "12",
|
| 513 |
-
"rest": 30,
|
| 514 |
-
"calories": 7,
|
| 515 |
-
"category": "fullbody",
|
| 516 |
-
"originalName": "How to Do:PUSH-UP WITH TOE TAP"
|
| 517 |
-
},
|
| 518 |
-
{
|
| 519 |
-
"name": ":para Cima & Para Baixo Nods",
|
| 520 |
-
"originalTitle": "How to Do:UP & DOWN NODS",
|
| 521 |
-
"emoji": "✨",
|
| 522 |
-
"youtubeId": "8QyMRoSZM8c",
|
| 523 |
-
"embedUrl": "https://www.youtube.com/embed/8QyMRoSZM8c",
|
| 524 |
-
"duration": "0:41",
|
| 525 |
-
"durationInSeconds": 41,
|
| 526 |
-
"thumbnail": "https://img.youtube.com/vi/8QyMRoSZM8c/maxresdefault.jpg",
|
| 527 |
-
"sets": 3,
|
| 528 |
-
"reps": "12",
|
| 529 |
-
"rest": 30,
|
| 530 |
-
"calories": 6,
|
| 531 |
-
"category": "fullbody",
|
| 532 |
-
"originalName": "How to Do:UP & DOWN NODS"
|
| 533 |
-
},
|
| 534 |
-
{
|
| 535 |
-
"name": ":claps Over Head",
|
| 536 |
-
"originalTitle": "How to Do:CLAPS OVER HEAD",
|
| 537 |
-
"emoji": "✨",
|
| 538 |
-
"youtubeId": "2i80fjp5saU",
|
| 539 |
-
"embedUrl": "https://www.youtube.com/embed/2i80fjp5saU",
|
| 540 |
-
"duration": "0:38",
|
| 541 |
-
"durationInSeconds": 38,
|
| 542 |
-
"thumbnail": "https://img.youtube.com/vi/2i80fjp5saU/maxresdefault.jpg",
|
| 543 |
-
"sets": 3,
|
| 544 |
-
"reps": "12",
|
| 545 |
-
"rest": 30,
|
| 546 |
-
"calories": 6,
|
| 547 |
-
"category": "fullbody",
|
| 548 |
-
"originalName": "How to Do:CLAPS OVER HEAD"
|
| 549 |
-
},
|
| 550 |
-
{
|
| 551 |
-
"name": ":diamond Empurrar-ups",
|
| 552 |
-
"originalTitle": "How to Do:DIAMOND PUSH-UPS",
|
| 553 |
-
"emoji": "✨",
|
| 554 |
-
"youtubeId": "UCmqw3kKZ38",
|
| 555 |
-
"embedUrl": "https://www.youtube.com/embed/UCmqw3kKZ38",
|
| 556 |
-
"duration": "0:52",
|
| 557 |
-
"durationInSeconds": 52,
|
| 558 |
-
"thumbnail": "https://img.youtube.com/vi/UCmqw3kKZ38/maxresdefault.jpg",
|
| 559 |
-
"sets": 3,
|
| 560 |
-
"reps": "40s",
|
| 561 |
-
"rest": 30,
|
| 562 |
-
"calories": 8,
|
| 563 |
-
"category": "fullbody",
|
| 564 |
-
"originalName": "How to Do:DIAMOND PUSH-UPS"
|
| 565 |
-
},
|
| 566 |
-
{
|
| 567 |
-
"name": ":punches",
|
| 568 |
-
"originalTitle": "How to Do:PUNCHES",
|
| 569 |
-
"emoji": "✨",
|
| 570 |
-
"youtubeId": "reeBHtZJ1ts",
|
| 571 |
-
"embedUrl": "https://www.youtube.com/embed/reeBHtZJ1ts",
|
| 572 |
-
"duration": "0:37",
|
| 573 |
-
"durationInSeconds": 37,
|
| 574 |
-
"thumbnail": "https://img.youtube.com/vi/reeBHtZJ1ts/maxresdefault.jpg",
|
| 575 |
-
"sets": 3,
|
| 576 |
-
"reps": "12",
|
| 577 |
-
"rest": 30,
|
| 578 |
-
"calories": 6,
|
| 579 |
-
"category": "fullbody",
|
| 580 |
-
"originalName": "How to Do:PUNCHES"
|
| 581 |
-
},
|
| 582 |
-
{
|
| 583 |
-
"name": ":parede Empurrar-ups",
|
| 584 |
-
"originalTitle": "How to Do:WALL PUSH-UPS",
|
| 585 |
-
"emoji": "✨",
|
| 586 |
-
"youtubeId": "EOf3cGIQpA4",
|
| 587 |
-
"embedUrl": "https://www.youtube.com/embed/EOf3cGIQpA4",
|
| 588 |
-
"duration": "0:52",
|
| 589 |
-
"durationInSeconds": 52,
|
| 590 |
-
"thumbnail": "https://img.youtube.com/vi/EOf3cGIQpA4/maxresdefault.jpg",
|
| 591 |
-
"sets": 3,
|
| 592 |
-
"reps": "40s",
|
| 593 |
-
"rest": 30,
|
| 594 |
-
"calories": 8,
|
| 595 |
-
"category": "fullbody",
|
| 596 |
-
"originalName": "How to Do:WALL PUSH-UPS"
|
| 597 |
-
},
|
| 598 |
-
{
|
| 599 |
-
"name": ":modified Empurrar-para Cima Baixo Manter",
|
| 600 |
-
"originalTitle": "How to Do:MODIFIED PUSH-UP LOW HOLD",
|
| 601 |
-
"emoji": "✨",
|
| 602 |
-
"youtubeId": "fobiVgoeeZA",
|
| 603 |
-
"embedUrl": "https://www.youtube.com/embed/fobiVgoeeZA",
|
| 604 |
-
"duration": "0:50",
|
| 605 |
-
"durationInSeconds": 50,
|
| 606 |
-
"thumbnail": "https://img.youtube.com/vi/fobiVgoeeZA/maxresdefault.jpg",
|
| 607 |
-
"sets": 3,
|
| 608 |
-
"reps": "40s",
|
| 609 |
-
"rest": 30,
|
| 610 |
-
"calories": 8,
|
| 611 |
-
"category": "fullbody",
|
| 612 |
-
"originalName": "How to Do:MODIFIED PUSH-UP LOW HOLD"
|
| 613 |
-
},
|
| 614 |
-
{
|
| 615 |
-
"name": ":alternado Hooks",
|
| 616 |
-
"originalTitle": "How to Do:ALTERNATING HOOKS",
|
| 617 |
-
"emoji": "✨",
|
| 618 |
-
"youtubeId": "wiyvVpEKOsc",
|
| 619 |
-
"embedUrl": "https://www.youtube.com/embed/wiyvVpEKOsc",
|
| 620 |
-
"duration": "0:54",
|
| 621 |
-
"durationInSeconds": 54,
|
| 622 |
-
"thumbnail": "https://img.youtube.com/vi/wiyvVpEKOsc/maxresdefault.jpg",
|
| 623 |
-
"sets": 3,
|
| 624 |
-
"reps": "40s",
|
| 625 |
-
"rest": 30,
|
| 626 |
-
"calories": 8,
|
| 627 |
-
"category": "fullbody",
|
| 628 |
-
"originalName": "How to Do:ALTERNATING HOOKS"
|
| 629 |
-
},
|
| 630 |
-
{
|
| 631 |
-
"name": ":toy Soldiers",
|
| 632 |
-
"originalTitle": "How to Do:TOY SOLDIERS",
|
| 633 |
-
"emoji": "✨",
|
| 634 |
-
"youtubeId": "6NVowqZQiYQ",
|
| 635 |
-
"embedUrl": "https://www.youtube.com/embed/6NVowqZQiYQ",
|
| 636 |
-
"duration": "0:48",
|
| 637 |
-
"durationInSeconds": 48,
|
| 638 |
-
"thumbnail": "https://img.youtube.com/vi/6NVowqZQiYQ/maxresdefault.jpg",
|
| 639 |
-
"sets": 3,
|
| 640 |
-
"reps": "12",
|
| 641 |
-
"rest": 30,
|
| 642 |
-
"calories": 7,
|
| 643 |
-
"category": "fullbody",
|
| 644 |
-
"originalName": "How to Do:TOY SOLDIERS"
|
| 645 |
-
},
|
| 646 |
-
{
|
| 647 |
-
"name": ":em & Outs",
|
| 648 |
-
"originalTitle": "How to Do:IN & OUTS",
|
| 649 |
-
"emoji": "✨",
|
| 650 |
-
"youtubeId": "clsucWwp5Oc",
|
| 651 |
-
"embedUrl": "https://www.youtube.com/embed/clsucWwp5Oc",
|
| 652 |
-
"duration": "0:31",
|
| 653 |
-
"durationInSeconds": 31,
|
| 654 |
-
"thumbnail": "https://img.youtube.com/vi/clsucWwp5Oc/maxresdefault.jpg",
|
| 655 |
-
"sets": 3,
|
| 656 |
-
"reps": "12",
|
| 657 |
-
"rest": 30,
|
| 658 |
-
"calories": 5,
|
| 659 |
-
"category": "fullbody",
|
| 660 |
-
"originalName": "How to Do:IN & OUTS"
|
| 661 |
-
},
|
| 662 |
-
{
|
| 663 |
-
"name": ":inchworms",
|
| 664 |
-
"originalTitle": "How to Do:INCHWORMS",
|
| 665 |
-
"emoji": "✨",
|
| 666 |
-
"youtubeId": "ZY2ji_Ho0dA",
|
| 667 |
-
"embedUrl": "https://www.youtube.com/embed/ZY2ji_Ho0dA",
|
| 668 |
-
"duration": "0:53",
|
| 669 |
-
"durationInSeconds": 53,
|
| 670 |
-
"thumbnail": "https://img.youtube.com/vi/ZY2ji_Ho0dA/maxresdefault.jpg",
|
| 671 |
-
"sets": 3,
|
| 672 |
-
"reps": "40s",
|
| 673 |
-
"rest": 30,
|
| 674 |
-
"calories": 8,
|
| 675 |
-
"category": "fullbody",
|
| 676 |
-
"originalName": "How to Do:INCHWORMS"
|
| 677 |
-
},
|
| 678 |
-
{
|
| 679 |
-
"name": ":floor Y Raises",
|
| 680 |
-
"originalTitle": "How to Do:FLOOR Y RAISES",
|
| 681 |
-
"emoji": "✨",
|
| 682 |
-
"youtubeId": "lUGi7NilqWA",
|
| 683 |
-
"embedUrl": "https://www.youtube.com/embed/lUGi7NilqWA",
|
| 684 |
-
"duration": "0:53",
|
| 685 |
-
"durationInSeconds": 53,
|
| 686 |
-
"thumbnail": "https://img.youtube.com/vi/lUGi7NilqWA/maxresdefault.jpg",
|
| 687 |
-
"sets": 3,
|
| 688 |
-
"reps": "40s",
|
| 689 |
-
"rest": 30,
|
| 690 |
-
"calories": 8,
|
| 691 |
-
"category": "fullbody",
|
| 692 |
-
"originalName": "How to Do:FLOOR Y RAISES"
|
| 693 |
-
},
|
| 694 |
-
{
|
| 695 |
-
"name": ":reverse Snow Angels",
|
| 696 |
-
"originalTitle": "How to Do:REVERSE SNOW ANGELS",
|
| 697 |
-
"emoji": "✨",
|
| 698 |
-
"youtubeId": "0qLP2RNKX4A",
|
| 699 |
-
"embedUrl": "https://www.youtube.com/embed/0qLP2RNKX4A",
|
| 700 |
-
"duration": "0:53",
|
| 701 |
-
"durationInSeconds": 53,
|
| 702 |
-
"thumbnail": "https://img.youtube.com/vi/0qLP2RNKX4A/maxresdefault.jpg",
|
| 703 |
-
"sets": 3,
|
| 704 |
-
"reps": "40s",
|
| 705 |
-
"rest": 30,
|
| 706 |
-
"calories": 8,
|
| 707 |
-
"category": "fullbody",
|
| 708 |
-
"originalName": "How to Do:REVERSE SNOW ANGELS"
|
| 709 |
-
},
|
| 710 |
-
{
|
| 711 |
-
"name": ":spiderman Empurrar-ups",
|
| 712 |
-
"originalTitle": "How to Do:SPIDERMAN PUSH-UPS",
|
| 713 |
-
"emoji": "✨",
|
| 714 |
-
"youtubeId": "YmonBKorAIw",
|
| 715 |
-
"embedUrl": "https://www.youtube.com/embed/YmonBKorAIw",
|
| 716 |
-
"duration": "0:51",
|
| 717 |
-
"durationInSeconds": 51,
|
| 718 |
-
"thumbnail": "https://img.youtube.com/vi/YmonBKorAIw/maxresdefault.jpg",
|
| 719 |
-
"sets": 3,
|
| 720 |
-
"reps": "40s",
|
| 721 |
-
"rest": 30,
|
| 722 |
-
"calories": 8,
|
| 723 |
-
"category": "fullbody",
|
| 724 |
-
"originalName": "How to Do:SPIDERMAN PUSH-UPS"
|
| 725 |
-
},
|
| 726 |
-
{
|
| 727 |
-
"name": ":empurrar-ups",
|
| 728 |
-
"originalTitle": "How to Do:PUSH-UPS",
|
| 729 |
-
"emoji": "✨",
|
| 730 |
-
"youtubeId": "R08gYyypGto",
|
| 731 |
-
"embedUrl": "https://www.youtube.com/embed/R08gYyypGto",
|
| 732 |
-
"duration": "0:48",
|
| 733 |
-
"durationInSeconds": 48,
|
| 734 |
-
"thumbnail": "https://img.youtube.com/vi/R08gYyypGto/maxresdefault.jpg",
|
| 735 |
-
"sets": 3,
|
| 736 |
-
"reps": "12",
|
| 737 |
-
"rest": 30,
|
| 738 |
-
"calories": 7,
|
| 739 |
-
"category": "fullbody",
|
| 740 |
-
"originalName": "How to Do:PUSH-UPS"
|
| 741 |
-
},
|
| 742 |
-
{
|
| 743 |
-
"name": ":empurrar-para Cima & Rotation",
|
| 744 |
-
"originalTitle": "How to Do:PUSH-UP & ROTATION",
|
| 745 |
-
"emoji": "✨",
|
| 746 |
-
"youtubeId": "Plv5CIclPtQ",
|
| 747 |
-
"embedUrl": "https://www.youtube.com/embed/Plv5CIclPtQ",
|
| 748 |
-
"duration": "0:55",
|
| 749 |
-
"durationInSeconds": 55,
|
| 750 |
-
"thumbnail": "https://img.youtube.com/vi/Plv5CIclPtQ/maxresdefault.jpg",
|
| 751 |
-
"sets": 3,
|
| 752 |
-
"reps": "40s",
|
| 753 |
-
"rest": 30,
|
| 754 |
-
"calories": 8,
|
| 755 |
-
"category": "fullbody",
|
| 756 |
-
"originalName": "How to Do:PUSH-UP & ROTATION"
|
| 757 |
-
},
|
| 758 |
-
{
|
| 759 |
-
"name": ":incline Empurrar-ups",
|
| 760 |
-
"originalTitle": "How to Do:INCLINE PUSH-UPS",
|
| 761 |
-
"emoji": "✨",
|
| 762 |
-
"youtubeId": "3WUUeM07i_Q",
|
| 763 |
-
"embedUrl": "https://www.youtube.com/embed/3WUUeM07i_Q",
|
| 764 |
-
"duration": "0:48",
|
| 765 |
-
"durationInSeconds": 48,
|
| 766 |
-
"thumbnail": "https://img.youtube.com/vi/3WUUeM07i_Q/maxresdefault.jpg",
|
| 767 |
-
"sets": 3,
|
| 768 |
-
"reps": "12",
|
| 769 |
-
"rest": 30,
|
| 770 |
-
"calories": 7,
|
| 771 |
-
"category": "fullbody",
|
| 772 |
-
"originalName": "How to Do:INCLINE PUSH-UPS"
|
| 773 |
-
},
|
| 774 |
-
{
|
| 775 |
-
"name": ":box Empurrar-ups",
|
| 776 |
-
"originalTitle": "How to Do:BOX PUSH-UPS",
|
| 777 |
-
"emoji": "✨",
|
| 778 |
-
"youtubeId": "dcJVA2sBPqw",
|
| 779 |
-
"embedUrl": "https://www.youtube.com/embed/dcJVA2sBPqw",
|
| 780 |
-
"duration": "0:59",
|
| 781 |
-
"durationInSeconds": 59,
|
| 782 |
-
"thumbnail": "https://img.youtube.com/vi/dcJVA2sBPqw/maxresdefault.jpg",
|
| 783 |
-
"sets": 3,
|
| 784 |
-
"reps": "40s",
|
| 785 |
-
"rest": 30,
|
| 786 |
-
"calories": 9,
|
| 787 |
-
"category": "fullbody",
|
| 788 |
-
"originalName": "How to Do:BOX PUSH-UPS"
|
| 789 |
-
},
|
| 790 |
-
{
|
| 791 |
-
"name": ":reverse Empurrar-ups",
|
| 792 |
-
"originalTitle": "How to Do:REVERSE PUSH-UPS",
|
| 793 |
-
"emoji": "✨",
|
| 794 |
-
"youtubeId": "XRpbVcpx-Yc",
|
| 795 |
-
"embedUrl": "https://www.youtube.com/embed/XRpbVcpx-Yc",
|
| 796 |
-
"duration": "1:00",
|
| 797 |
-
"durationInSeconds": 60,
|
| 798 |
-
"thumbnail": "https://img.youtube.com/vi/XRpbVcpx-Yc/maxresdefault.jpg",
|
| 799 |
-
"sets": 3,
|
| 800 |
-
"reps": "40s",
|
| 801 |
-
"rest": 30,
|
| 802 |
-
"calories": 9,
|
| 803 |
-
"category": "fullbody",
|
| 804 |
-
"originalName": "How to Do:REVERSE PUSH-UPS"
|
| 805 |
-
},
|
| 806 |
-
{
|
| 807 |
-
"name": ":decline Empurrar-ups",
|
| 808 |
-
"originalTitle": "How to Do:DECLINE PUSH-UPS",
|
| 809 |
-
"emoji": "✨",
|
| 810 |
-
"youtubeId": "OjPfLfLsw3c",
|
| 811 |
-
"embedUrl": "https://www.youtube.com/embed/OjPfLfLsw3c",
|
| 812 |
-
"duration": "0:51",
|
| 813 |
-
"durationInSeconds": 51,
|
| 814 |
-
"thumbnail": "https://img.youtube.com/vi/OjPfLfLsw3c/maxresdefault.jpg",
|
| 815 |
-
"sets": 3,
|
| 816 |
-
"reps": "40s",
|
| 817 |
-
"rest": 30,
|
| 818 |
-
"calories": 8,
|
| 819 |
-
"category": "fullbody",
|
| 820 |
-
"originalName": "How to Do:DECLINE PUSH-UPS"
|
| 821 |
-
},
|
| 822 |
-
{
|
| 823 |
-
"name": ":staggered Empurrar-ups",
|
| 824 |
-
"originalTitle": "How to Do:STAGGERED PUSH-UPS",
|
| 825 |
-
"emoji": "✨",
|
| 826 |
-
"youtubeId": "JWNTTiAQMhc",
|
| 827 |
-
"embedUrl": "https://www.youtube.com/embed/JWNTTiAQMhc",
|
| 828 |
-
"duration": "0:59",
|
| 829 |
-
"durationInSeconds": 59,
|
| 830 |
-
"thumbnail": "https://img.youtube.com/vi/JWNTTiAQMhc/maxresdefault.jpg",
|
| 831 |
-
"sets": 3,
|
| 832 |
-
"reps": "40s",
|
| 833 |
-
"rest": 30,
|
| 834 |
-
"calories": 9,
|
| 835 |
-
"category": "fullbody",
|
| 836 |
-
"originalName": "How to Do:STAGGERED PUSH-UPS"
|
| 837 |
-
},
|
| 838 |
-
{
|
| 839 |
-
"name": ":hindu Empurrar-ups",
|
| 840 |
-
"originalTitle": "How to Do:HINDU PUSH-UPS",
|
| 841 |
-
"emoji": "✨",
|
| 842 |
-
"youtubeId": "HE0ijmUc6Og",
|
| 843 |
-
"embedUrl": "https://www.youtube.com/embed/HE0ijmUc6Og",
|
| 844 |
-
"duration": "1:03",
|
| 845 |
-
"durationInSeconds": 63,
|
| 846 |
-
"thumbnail": "https://img.youtube.com/vi/HE0ijmUc6Og/maxresdefault.jpg",
|
| 847 |
-
"sets": 3,
|
| 848 |
-
"reps": "40s",
|
| 849 |
-
"rest": 30,
|
| 850 |
-
"calories": 9,
|
| 851 |
-
"category": "fullbody",
|
| 852 |
-
"originalName": "How to Do:HINDU PUSH-UPS"
|
| 853 |
-
},
|
| 854 |
-
{
|
| 855 |
-
"name": "Heels Para Heavens",
|
| 856 |
-
"originalTitle": "How to Do: HEELS TO THE HEAVENS",
|
| 857 |
-
"emoji": "✨",
|
| 858 |
-
"youtubeId": "wdS2U6z0JGY",
|
| 859 |
-
"embedUrl": "https://www.youtube.com/embed/wdS2U6z0JGY",
|
| 860 |
-
"duration": "0:40",
|
| 861 |
-
"durationInSeconds": 40,
|
| 862 |
-
"thumbnail": "https://img.youtube.com/vi/wdS2U6z0JGY/maxresdefault.jpg",
|
| 863 |
-
"sets": 3,
|
| 864 |
-
"reps": "12",
|
| 865 |
-
"rest": 30,
|
| 866 |
-
"calories": 6,
|
| 867 |
-
"category": "fullbody",
|
| 868 |
-
"originalName": "How to Do: HEELS TO THE HEAVENS"
|
| 869 |
-
},
|
| 870 |
-
{
|
| 871 |
-
"name": ":one Para Baixo Two Ups",
|
| 872 |
-
"originalTitle": "How to Do:ONE DOWN TWO UPS",
|
| 873 |
-
"emoji": "✨",
|
| 874 |
-
"youtubeId": "f9c28wuQyQM",
|
| 875 |
-
"embedUrl": "https://www.youtube.com/embed/f9c28wuQyQM",
|
| 876 |
-
"duration": "0:42",
|
| 877 |
-
"durationInSeconds": 42,
|
| 878 |
-
"thumbnail": "https://img.youtube.com/vi/f9c28wuQyQM/maxresdefault.jpg",
|
| 879 |
-
"sets": 3,
|
| 880 |
-
"reps": "12",
|
| 881 |
-
"rest": 30,
|
| 882 |
-
"calories": 6,
|
| 883 |
-
"category": "fullbody",
|
| 884 |
-
"originalName": "How to Do:ONE DOWN TWO UPS"
|
| 885 |
-
},
|
| 886 |
-
{
|
| 887 |
-
"name": "V-manter",
|
| 888 |
-
"originalTitle": "How to Do: V-HOLD",
|
| 889 |
-
"emoji": "✨",
|
| 890 |
-
"youtubeId": "WGwI629aTAY",
|
| 891 |
-
"embedUrl": "https://www.youtube.com/embed/WGwI629aTAY",
|
| 892 |
-
"duration": "0:40",
|
| 893 |
-
"durationInSeconds": 40,
|
| 894 |
-
"thumbnail": "https://img.youtube.com/vi/WGwI629aTAY/maxresdefault.jpg",
|
| 895 |
-
"sets": 3,
|
| 896 |
-
"reps": "12",
|
| 897 |
-
"rest": 30,
|
| 898 |
-
"calories": 6,
|
| 899 |
-
"category": "fullbody",
|
| 900 |
-
"originalName": "How to Do: V-HOLD"
|
| 901 |
-
},
|
| 902 |
-
{
|
| 903 |
-
"name": ":sit-ups",
|
| 904 |
-
"originalTitle": "How to Do:SIT-UPS",
|
| 905 |
-
"emoji": "✨",
|
| 906 |
-
"youtubeId": "swOyWKk7Oko",
|
| 907 |
-
"embedUrl": "https://www.youtube.com/embed/swOyWKk7Oko",
|
| 908 |
-
"duration": "0:46",
|
| 909 |
-
"durationInSeconds": 46,
|
| 910 |
-
"thumbnail": "https://img.youtube.com/vi/swOyWKk7Oko/maxresdefault.jpg",
|
| 911 |
-
"sets": 3,
|
| 912 |
-
"reps": "12",
|
| 913 |
-
"rest": 30,
|
| 914 |
-
"calories": 7,
|
| 915 |
-
"category": "fullbody",
|
| 916 |
-
"originalName": "How to Do:SIT-UPS"
|
| 917 |
-
},
|
| 918 |
-
{
|
| 919 |
-
"name": "Heel Touch",
|
| 920 |
-
"originalTitle": "How to Do: HEEL TOUCH",
|
| 921 |
-
"emoji": "✨",
|
| 922 |
-
"youtubeId": "9bR-elyolBQ",
|
| 923 |
-
"embedUrl": "https://www.youtube.com/embed/9bR-elyolBQ",
|
| 924 |
-
"duration": "0:51",
|
| 925 |
-
"durationInSeconds": 51,
|
| 926 |
-
"thumbnail": "https://img.youtube.com/vi/9bR-elyolBQ/maxresdefault.jpg",
|
| 927 |
-
"sets": 3,
|
| 928 |
-
"reps": "40s",
|
| 929 |
-
"rest": 30,
|
| 930 |
-
"calories": 8,
|
| 931 |
-
"category": "fullbody",
|
| 932 |
-
"originalName": "How to Do: HEEL TOUCH"
|
| 933 |
-
},
|
| 934 |
-
{
|
| 935 |
-
"name": ":half Bending Pushing Para Frente",
|
| 936 |
-
"originalTitle": "How to Do:HALF BENDING PUSHING FORWARD",
|
| 937 |
-
"emoji": "✨",
|
| 938 |
-
"youtubeId": "kfav5nf61Qc",
|
| 939 |
-
"embedUrl": "https://www.youtube.com/embed/kfav5nf61Qc",
|
| 940 |
-
"duration": "1:09",
|
| 941 |
-
"durationInSeconds": 69,
|
| 942 |
-
"thumbnail": "https://img.youtube.com/vi/kfav5nf61Qc/maxresdefault.jpg",
|
| 943 |
-
"sets": 3,
|
| 944 |
-
"reps": "40s",
|
| 945 |
-
"rest": 30,
|
| 946 |
-
"calories": 10,
|
| 947 |
-
"category": "fullbody",
|
| 948 |
-
"originalName": "How to Do:HALF BENDING PUSHING FORWARD"
|
| 949 |
-
},
|
| 950 |
-
{
|
| 951 |
-
"name": ":havyk Raises",
|
| 952 |
-
"originalTitle": "How to Do:HAVYK RAISES",
|
| 953 |
-
"emoji": "✨",
|
| 954 |
-
"youtubeId": "RS_LTIX12Hc",
|
| 955 |
-
"embedUrl": "https://www.youtube.com/embed/RS_LTIX12Hc",
|
| 956 |
-
"duration": "1:10",
|
| 957 |
-
"durationInSeconds": 70,
|
| 958 |
-
"thumbnail": "https://img.youtube.com/vi/RS_LTIX12Hc/maxresdefault.jpg",
|
| 959 |
-
"sets": 3,
|
| 960 |
-
"reps": "40s",
|
| 961 |
-
"rest": 30,
|
| 962 |
-
"calories": 11,
|
| 963 |
-
"category": "fullbody",
|
| 964 |
-
"originalName": "How to Do:HAVYK RAISES"
|
| 965 |
-
},
|
| 966 |
-
{
|
| 967 |
-
"name": ":pendulum Swings",
|
| 968 |
-
"originalTitle": "How to Do:PENDULUM SWINGS",
|
| 969 |
-
"emoji": "✨",
|
| 970 |
-
"youtubeId": "grwqv2ZM0qI",
|
| 971 |
-
"embedUrl": "https://www.youtube.com/embed/grwqv2ZM0qI",
|
| 972 |
-
"duration": "1:14",
|
| 973 |
-
"durationInSeconds": 74,
|
| 974 |
-
"thumbnail": "https://img.youtube.com/vi/grwqv2ZM0qI/maxresdefault.jpg",
|
| 975 |
-
"sets": 3,
|
| 976 |
-
"reps": "40s",
|
| 977 |
-
"rest": 30,
|
| 978 |
-
"calories": 11,
|
| 979 |
-
"category": "fullbody",
|
| 980 |
-
"originalName": "How to Do:PENDULUM SWINGS"
|
| 981 |
-
},
|
| 982 |
-
{
|
| 983 |
-
"name": ":reverse Empurrar-ups",
|
| 984 |
-
"originalTitle": "How to Do:REVERSE PUSH-UPS",
|
| 985 |
-
"emoji": "✨",
|
| 986 |
-
"youtubeId": "pok_Gj8TnAs",
|
| 987 |
-
"embedUrl": "https://www.youtube.com/embed/pok_Gj8TnAs",
|
| 988 |
-
"duration": "1:25",
|
| 989 |
-
"durationInSeconds": 85,
|
| 990 |
-
"thumbnail": "https://img.youtube.com/vi/pok_Gj8TnAs/maxresdefault.jpg",
|
| 991 |
-
"sets": 3,
|
| 992 |
-
"reps": "40s",
|
| 993 |
-
"rest": 30,
|
| 994 |
-
"calories": 13,
|
| 995 |
-
"category": "fullbody",
|
| 996 |
-
"originalName": "How to Do:REVERSE PUSH-UPS"
|
| 997 |
-
},
|
| 998 |
-
{
|
| 999 |
-
"name": ":empurrar-para Cima Com Toe Tap",
|
| 1000 |
-
"originalTitle": "How to Do:PUSH-UP WITH TOE TAP",
|
| 1001 |
-
"emoji": "✨",
|
| 1002 |
-
"youtubeId": "2qgSgCHyzm4",
|
| 1003 |
-
"embedUrl": "https://www.youtube.com/embed/2qgSgCHyzm4",
|
| 1004 |
-
"duration": "1:10",
|
| 1005 |
-
"durationInSeconds": 70,
|
| 1006 |
-
"thumbnail": "https://img.youtube.com/vi/2qgSgCHyzm4/maxresdefault.jpg",
|
| 1007 |
-
"sets": 3,
|
| 1008 |
-
"reps": "40s",
|
| 1009 |
-
"rest": 30,
|
| 1010 |
-
"calories": 11,
|
| 1011 |
-
"category": "fullbody",
|
| 1012 |
-
"originalName": "How to Do:PUSH-UP WITH TOE TAP"
|
| 1013 |
-
},
|
| 1014 |
-
{
|
| 1015 |
-
"name": ":spiderman Empurrar-ups",
|
| 1016 |
-
"originalTitle": "How to Do:SPIDERMAN PUSH-UPS",
|
| 1017 |
-
"emoji": "✨",
|
| 1018 |
-
"youtubeId": "yJq7NCTmiaI",
|
| 1019 |
-
"embedUrl": "https://www.youtube.com/embed/yJq7NCTmiaI",
|
| 1020 |
-
"duration": "1:01",
|
| 1021 |
-
"durationInSeconds": 61,
|
| 1022 |
-
"thumbnail": "https://img.youtube.com/vi/yJq7NCTmiaI/maxresdefault.jpg",
|
| 1023 |
-
"sets": 3,
|
| 1024 |
-
"reps": "40s",
|
| 1025 |
-
"rest": 30,
|
| 1026 |
-
"calories": 9,
|
| 1027 |
-
"category": "fullbody",
|
| 1028 |
-
"originalName": "How to Do:SPIDERMAN PUSH-UPS"
|
| 1029 |
-
},
|
| 1030 |
-
{
|
| 1031 |
-
"name": ":tiger Flexão Empurrar-ups",
|
| 1032 |
-
"originalTitle": "How to Do:TIGER BEND PUSH-UPS",
|
| 1033 |
-
"emoji": "✨",
|
| 1034 |
-
"youtubeId": "E-mF0ZvEHG4",
|
| 1035 |
-
"embedUrl": "https://www.youtube.com/embed/E-mF0ZvEHG4",
|
| 1036 |
-
"duration": "0:57",
|
| 1037 |
-
"durationInSeconds": 57,
|
| 1038 |
-
"thumbnail": "https://img.youtube.com/vi/E-mF0ZvEHG4/maxresdefault.jpg",
|
| 1039 |
-
"sets": 3,
|
| 1040 |
-
"reps": "40s",
|
| 1041 |
-
"rest": 30,
|
| 1042 |
-
"calories": 9,
|
| 1043 |
-
"category": "fullbody",
|
| 1044 |
-
"originalName": "How to Do:TIGER BEND PUSH-UPS"
|
| 1045 |
-
},
|
| 1046 |
-
{
|
| 1047 |
-
"name": ":para Cima & Para Baixo Nods",
|
| 1048 |
-
"originalTitle": "How to Do:UP & DOWN NODS",
|
| 1049 |
-
"emoji": "✨",
|
| 1050 |
-
"youtubeId": "ueOtPco-h_I",
|
| 1051 |
-
"embedUrl": "https://www.youtube.com/embed/ueOtPco-h_I",
|
| 1052 |
-
"duration": "0:56",
|
| 1053 |
-
"durationInSeconds": 56,
|
| 1054 |
-
"thumbnail": "https://img.youtube.com/vi/ueOtPco-h_I/maxresdefault.jpg",
|
| 1055 |
-
"sets": 3,
|
| 1056 |
-
"reps": "40s",
|
| 1057 |
-
"rest": 30,
|
| 1058 |
-
"calories": 8,
|
| 1059 |
-
"category": "fullbody",
|
| 1060 |
-
"originalName": "How to Do:UP & DOWN NODS"
|
| 1061 |
-
},
|
| 1062 |
-
{
|
| 1063 |
-
"name": ":body Saw",
|
| 1064 |
-
"originalTitle": "How to Do:BODY SAW",
|
| 1065 |
-
"emoji": "✨",
|
| 1066 |
-
"youtubeId": "53dYRlnPJ-4",
|
| 1067 |
-
"embedUrl": "https://www.youtube.com/embed/53dYRlnPJ-4",
|
| 1068 |
-
"duration": "0:51",
|
| 1069 |
-
"durationInSeconds": 51,
|
| 1070 |
-
"thumbnail": "https://img.youtube.com/vi/53dYRlnPJ-4/maxresdefault.jpg",
|
| 1071 |
-
"sets": 3,
|
| 1072 |
-
"reps": "40s",
|
| 1073 |
-
"rest": 30,
|
| 1074 |
-
"calories": 8,
|
| 1075 |
-
"category": "fullbody",
|
| 1076 |
-
"originalName": "How to Do:BODY SAW"
|
| 1077 |
-
},
|
| 1078 |
-
{
|
| 1079 |
-
"name": "Moscas Reversas",
|
| 1080 |
-
"originalTitle": "Como fazer: MOSCAS REVERSAS",
|
| 1081 |
-
"emoji": "✨",
|
| 1082 |
-
"youtubeId": "l3biDXAh3F4",
|
| 1083 |
-
"embedUrl": "https://www.youtube.com/embed/l3biDXAh3F4",
|
| 1084 |
-
"duration": "1:24",
|
| 1085 |
-
"durationInSeconds": 84,
|
| 1086 |
-
"thumbnail": "https://img.youtube.com/vi/l3biDXAh3F4/maxresdefault.jpg",
|
| 1087 |
-
"sets": 3,
|
| 1088 |
-
"reps": "40s",
|
| 1089 |
-
"rest": 30,
|
| 1090 |
-
"calories": 13,
|
| 1091 |
-
"category": "fullbody",
|
| 1092 |
-
"originalName": "Como fazer: MOSCAS REVERSAS"
|
| 1093 |
-
},
|
| 1094 |
-
{
|
| 1095 |
-
"name": "Havyk Raises",
|
| 1096 |
-
"originalTitle": "Como fazer: HAVYK RAISES",
|
| 1097 |
-
"emoji": "✨",
|
| 1098 |
-
"youtubeId": "EzkBwre5YBA",
|
| 1099 |
-
"embedUrl": "https://www.youtube.com/embed/EzkBwre5YBA",
|
| 1100 |
-
"duration": "1:16",
|
| 1101 |
-
"durationInSeconds": 76,
|
| 1102 |
-
"thumbnail": "https://img.youtube.com/vi/EzkBwre5YBA/maxresdefault.jpg",
|
| 1103 |
-
"sets": 3,
|
| 1104 |
-
"reps": "40s",
|
| 1105 |
-
"rest": 30,
|
| 1106 |
-
"calories": 11,
|
| 1107 |
-
"category": "fullbody",
|
| 1108 |
-
"originalName": "Como fazer: HAVYK RAISES"
|
| 1109 |
-
},
|
| 1110 |
-
{
|
| 1111 |
-
"name": ":toe Tap",
|
| 1112 |
-
"originalTitle": "How to Do:TOE TAP",
|
| 1113 |
-
"emoji": "✨",
|
| 1114 |
-
"youtubeId": "tPCYZu7Seug",
|
| 1115 |
-
"embedUrl": "https://www.youtube.com/embed/tPCYZu7Seug",
|
| 1116 |
-
"duration": "1:00",
|
| 1117 |
-
"durationInSeconds": 60,
|
| 1118 |
-
"thumbnail": "https://img.youtube.com/vi/tPCYZu7Seug/maxresdefault.jpg",
|
| 1119 |
-
"sets": 3,
|
| 1120 |
-
"reps": "40s",
|
| 1121 |
-
"rest": 30,
|
| 1122 |
-
"calories": 9,
|
| 1123 |
-
"category": "fullbody",
|
| 1124 |
-
"originalName": "How to Do:TOE TAP"
|
| 1125 |
-
},
|
| 1126 |
-
{
|
| 1127 |
-
"name": ":para Frente Flexão",
|
| 1128 |
-
"originalTitle": "How to Do:FORWARD BEND",
|
| 1129 |
-
"emoji": "✨",
|
| 1130 |
-
"youtubeId": "MKyJujOc2vo",
|
| 1131 |
-
"embedUrl": "https://www.youtube.com/embed/MKyJujOc2vo",
|
| 1132 |
-
"duration": "0:52",
|
| 1133 |
-
"durationInSeconds": 52,
|
| 1134 |
-
"thumbnail": "https://img.youtube.com/vi/MKyJujOc2vo/maxresdefault.jpg",
|
| 1135 |
-
"sets": 3,
|
| 1136 |
-
"reps": "40s",
|
| 1137 |
-
"rest": 30,
|
| 1138 |
-
"calories": 8,
|
| 1139 |
-
"category": "fullbody",
|
| 1140 |
-
"originalName": "How to Do:FORWARD BEND"
|
| 1141 |
-
},
|
| 1142 |
-
{
|
| 1143 |
-
"name": ":lateral-para-lateral Turns",
|
| 1144 |
-
"originalTitle": "How to Do:SIDE-TO-SIDE TURNS",
|
| 1145 |
-
"emoji": "✨",
|
| 1146 |
-
"youtubeId": "IOre9odo0MQ",
|
| 1147 |
-
"embedUrl": "https://www.youtube.com/embed/IOre9odo0MQ",
|
| 1148 |
-
"duration": "0:52",
|
| 1149 |
-
"durationInSeconds": 52,
|
| 1150 |
-
"thumbnail": "https://img.youtube.com/vi/IOre9odo0MQ/maxresdefault.jpg",
|
| 1151 |
-
"sets": 3,
|
| 1152 |
-
"reps": "40s",
|
| 1153 |
-
"rest": 30,
|
| 1154 |
-
"calories": 8,
|
| 1155 |
-
"category": "fullbody",
|
| 1156 |
-
"originalName": "How to Do:SIDE-TO-SIDE TURNS"
|
| 1157 |
-
},
|
| 1158 |
-
{
|
| 1159 |
-
"name": ":lateral-para-lateral Tilts",
|
| 1160 |
-
"originalTitle": "How to Do:SIDE-TO-SIDE TILTS",
|
| 1161 |
-
"emoji": "✨",
|
| 1162 |
-
"youtubeId": "dnSR6569vYY",
|
| 1163 |
-
"embedUrl": "https://www.youtube.com/embed/dnSR6569vYY",
|
| 1164 |
-
"duration": "0:56",
|
| 1165 |
-
"durationInSeconds": 56,
|
| 1166 |
-
"thumbnail": "https://img.youtube.com/vi/dnSR6569vYY/maxresdefault.jpg",
|
| 1167 |
-
"sets": 3,
|
| 1168 |
-
"reps": "40s",
|
| 1169 |
-
"rest": 30,
|
| 1170 |
-
"calories": 8,
|
| 1171 |
-
"category": "fullbody",
|
| 1172 |
-
"originalName": "How to Do:SIDE-TO-SIDE TILTS"
|
| 1173 |
-
},
|
| 1174 |
-
{
|
| 1175 |
-
"name": ":modified Empurrar-para Cima Baixo Manter",
|
| 1176 |
-
"originalTitle": "How to Do:MODIFIED PUSH-UP LOW HOLD",
|
| 1177 |
-
"emoji": "✨",
|
| 1178 |
-
"youtubeId": "5pWXG3RY6Zw",
|
| 1179 |
-
"embedUrl": "https://www.youtube.com/embed/5pWXG3RY6Zw",
|
| 1180 |
-
"duration": "1:05",
|
| 1181 |
-
"durationInSeconds": 65,
|
| 1182 |
-
"thumbnail": "https://img.youtube.com/vi/5pWXG3RY6Zw/maxresdefault.jpg",
|
| 1183 |
-
"sets": 3,
|
| 1184 |
-
"reps": "40s",
|
| 1185 |
-
"rest": 30,
|
| 1186 |
-
"calories": 10,
|
| 1187 |
-
"category": "fullbody",
|
| 1188 |
-
"originalName": "How to Do:MODIFIED PUSH-UP LOW HOLD"
|
| 1189 |
-
},
|
| 1190 |
-
{
|
| 1191 |
-
"name": ":windshield Wipers",
|
| 1192 |
-
"originalTitle": "How to Do:WINDSHIELD WIPERS",
|
| 1193 |
-
"emoji": "✨",
|
| 1194 |
-
"youtubeId": "7_DUUwW5DIU",
|
| 1195 |
-
"embedUrl": "https://www.youtube.com/embed/7_DUUwW5DIU",
|
| 1196 |
-
"duration": "1:29",
|
| 1197 |
-
"durationInSeconds": 89,
|
| 1198 |
-
"thumbnail": "https://img.youtube.com/vi/7_DUUwW5DIU/maxresdefault.jpg",
|
| 1199 |
-
"sets": 3,
|
| 1200 |
-
"reps": "40s",
|
| 1201 |
-
"rest": 30,
|
| 1202 |
-
"calories": 13,
|
| 1203 |
-
"category": "fullbody",
|
| 1204 |
-
"originalName": "How to Do:WINDSHIELD WIPERS"
|
| 1205 |
-
},
|
| 1206 |
-
{
|
| 1207 |
-
"name": ":floor Slides",
|
| 1208 |
-
"originalTitle": "How to Do:FLOOR SLIDES",
|
| 1209 |
-
"emoji": "✨",
|
| 1210 |
-
"youtubeId": "m0Tk_6o3KEQ",
|
| 1211 |
-
"embedUrl": "https://www.youtube.com/embed/m0Tk_6o3KEQ",
|
| 1212 |
-
"duration": "1:10",
|
| 1213 |
-
"durationInSeconds": 70,
|
| 1214 |
-
"thumbnail": "https://img.youtube.com/vi/m0Tk_6o3KEQ/maxresdefault.jpg",
|
| 1215 |
-
"sets": 3,
|
| 1216 |
-
"reps": "40s",
|
| 1217 |
-
"rest": 30,
|
| 1218 |
-
"calories": 11,
|
| 1219 |
-
"category": "fullbody",
|
| 1220 |
-
"originalName": "How to Do:FLOOR SLIDES"
|
| 1221 |
-
},
|
| 1222 |
-
{
|
| 1223 |
-
"name": ":quick Feet",
|
| 1224 |
-
"originalTitle": "How to Do:QUICK FEET",
|
| 1225 |
-
"emoji": "✨",
|
| 1226 |
-
"youtubeId": "dC4ygsR_lUU",
|
| 1227 |
-
"embedUrl": "https://www.youtube.com/embed/dC4ygsR_lUU",
|
| 1228 |
-
"duration": "1:04",
|
| 1229 |
-
"durationInSeconds": 64,
|
| 1230 |
-
"thumbnail": "https://img.youtube.com/vi/dC4ygsR_lUU/maxresdefault.jpg",
|
| 1231 |
-
"sets": 3,
|
| 1232 |
-
"reps": "40s",
|
| 1233 |
-
"rest": 30,
|
| 1234 |
-
"calories": 10,
|
| 1235 |
-
"category": "fullbody",
|
| 1236 |
-
"originalName": "How to Do:QUICK FEET"
|
| 1237 |
-
},
|
| 1238 |
-
{
|
| 1239 |
-
"name": ":hindu Empurrar-ups",
|
| 1240 |
-
"originalTitle": "How to Do:HINDU PUSH-UPS",
|
| 1241 |
-
"emoji": "✨",
|
| 1242 |
-
"youtubeId": "DedCmh1NR4c",
|
| 1243 |
-
"embedUrl": "https://www.youtube.com/embed/DedCmh1NR4c",
|
| 1244 |
-
"duration": "1:17",
|
| 1245 |
-
"durationInSeconds": 77,
|
| 1246 |
-
"thumbnail": "https://img.youtube.com/vi/DedCmh1NR4c/maxresdefault.jpg",
|
| 1247 |
-
"sets": 3,
|
| 1248 |
-
"reps": "40s",
|
| 1249 |
-
"rest": 30,
|
| 1250 |
-
"calories": 12,
|
| 1251 |
-
"category": "fullbody",
|
| 1252 |
-
"originalName": "How to Do:HINDU PUSH-UPS"
|
| 1253 |
-
},
|
| 1254 |
-
{
|
| 1255 |
-
"name": ":air Cycling",
|
| 1256 |
-
"originalTitle": "How to Do:AIR CYCLING",
|
| 1257 |
-
"emoji": "✨",
|
| 1258 |
-
"youtubeId": "2OQOmS-5Klo",
|
| 1259 |
-
"embedUrl": "https://www.youtube.com/embed/2OQOmS-5Klo",
|
| 1260 |
-
"duration": "0:55",
|
| 1261 |
-
"durationInSeconds": 55,
|
| 1262 |
-
"thumbnail": "https://img.youtube.com/vi/2OQOmS-5Klo/maxresdefault.jpg",
|
| 1263 |
-
"sets": 3,
|
| 1264 |
-
"reps": "40s",
|
| 1265 |
-
"rest": 30,
|
| 1266 |
-
"calories": 8,
|
| 1267 |
-
"category": "fullbody",
|
| 1268 |
-
"originalName": "How to Do:AIR CYCLING"
|
| 1269 |
-
},
|
| 1270 |
-
{
|
| 1271 |
-
"name": ":claps Over Head",
|
| 1272 |
-
"originalTitle": "How to Do:CLAPS OVER HEAD",
|
| 1273 |
-
"emoji": "✨",
|
| 1274 |
-
"youtubeId": "C19KjmUad_I",
|
| 1275 |
-
"embedUrl": "https://www.youtube.com/embed/C19KjmUad_I",
|
| 1276 |
-
"duration": "0:49",
|
| 1277 |
-
"durationInSeconds": 49,
|
| 1278 |
-
"thumbnail": "https://img.youtube.com/vi/C19KjmUad_I/maxresdefault.jpg",
|
| 1279 |
-
"sets": 3,
|
| 1280 |
-
"reps": "12",
|
| 1281 |
-
"rest": 30,
|
| 1282 |
-
"calories": 7,
|
| 1283 |
-
"category": "fullbody",
|
| 1284 |
-
"originalName": "How to Do:CLAPS OVER HEAD"
|
| 1285 |
-
},
|
| 1286 |
-
{
|
| 1287 |
-
"name": ":reverse Snow Angels",
|
| 1288 |
-
"originalTitle": "How to Do:REVERSE SNOW ANGELS",
|
| 1289 |
-
"emoji": "✨",
|
| 1290 |
-
"youtubeId": "UBVJg7RbuHU",
|
| 1291 |
-
"embedUrl": "https://www.youtube.com/embed/UBVJg7RbuHU",
|
| 1292 |
-
"duration": "1:09",
|
| 1293 |
-
"durationInSeconds": 69,
|
| 1294 |
-
"thumbnail": "https://img.youtube.com/vi/UBVJg7RbuHU/maxresdefault.jpg",
|
| 1295 |
-
"sets": 3,
|
| 1296 |
-
"reps": "40s",
|
| 1297 |
-
"rest": 30,
|
| 1298 |
-
"calories": 10,
|
| 1299 |
-
"category": "fullbody",
|
| 1300 |
-
"originalName": "How to Do:REVERSE SNOW ANGELS"
|
| 1301 |
-
},
|
| 1302 |
-
{
|
| 1303 |
-
"name": ":floor Y Raises",
|
| 1304 |
-
"originalTitle": "How to Do:FLOOR Y RAISES",
|
| 1305 |
-
"emoji": "✨",
|
| 1306 |
-
"youtubeId": "YKAqmu4ERLE",
|
| 1307 |
-
"embedUrl": "https://www.youtube.com/embed/YKAqmu4ERLE",
|
| 1308 |
-
"duration": "1:14",
|
| 1309 |
-
"durationInSeconds": 74,
|
| 1310 |
-
"thumbnail": "https://img.youtube.com/vi/YKAqmu4ERLE/maxresdefault.jpg",
|
| 1311 |
-
"sets": 3,
|
| 1312 |
-
"reps": "40s",
|
| 1313 |
-
"rest": 30,
|
| 1314 |
-
"calories": 11,
|
| 1315 |
-
"category": "fullbody",
|
| 1316 |
-
"originalName": "How to Do:FLOOR Y RAISES"
|
| 1317 |
-
},
|
| 1318 |
-
{
|
| 1319 |
-
"name": ":one Para Baixo Two Ups",
|
| 1320 |
-
"originalTitle": "How to Do:ONE DOWN TWO UPS",
|
| 1321 |
-
"emoji": "✨",
|
| 1322 |
-
"youtubeId": "I74qLIG0XWY",
|
| 1323 |
-
"embedUrl": "https://www.youtube.com/embed/I74qLIG0XWY",
|
| 1324 |
-
"duration": "0:51",
|
| 1325 |
-
"durationInSeconds": 51,
|
| 1326 |
-
"thumbnail": "https://img.youtube.com/vi/I74qLIG0XWY/maxresdefault.jpg",
|
| 1327 |
-
"sets": 3,
|
| 1328 |
-
"reps": "40s",
|
| 1329 |
-
"rest": 30,
|
| 1330 |
-
"calories": 8,
|
| 1331 |
-
"category": "fullbody",
|
| 1332 |
-
"originalName": "How to Do:ONE DOWN TWO UPS"
|
| 1333 |
-
},
|
| 1334 |
-
{
|
| 1335 |
-
"name": ":sit-ups",
|
| 1336 |
-
"originalTitle": "How to Do:SIT-UPS",
|
| 1337 |
-
"emoji": "✨",
|
| 1338 |
-
"youtubeId": "Jc1DHXiJAdc",
|
| 1339 |
-
"embedUrl": "https://www.youtube.com/embed/Jc1DHXiJAdc",
|
| 1340 |
-
"duration": "1:25",
|
| 1341 |
-
"durationInSeconds": 85,
|
| 1342 |
-
"thumbnail": "https://img.youtube.com/vi/Jc1DHXiJAdc/maxresdefault.jpg",
|
| 1343 |
-
"sets": 3,
|
| 1344 |
-
"reps": "40s",
|
| 1345 |
-
"rest": 30,
|
| 1346 |
-
"calories": 13,
|
| 1347 |
-
"category": "fullbody",
|
| 1348 |
-
"originalName": "How to Do:SIT-UPS"
|
| 1349 |
-
},
|
| 1350 |
-
{
|
| 1351 |
-
"name": "Alternado Hooks",
|
| 1352 |
-
"originalTitle": "How to Do: ALTERNATING HOOKS",
|
| 1353 |
-
"emoji": "✨",
|
| 1354 |
-
"youtubeId": "RJJ7ksD1UJ4",
|
| 1355 |
-
"embedUrl": "https://www.youtube.com/embed/RJJ7ksD1UJ4",
|
| 1356 |
-
"duration": "1:23",
|
| 1357 |
-
"durationInSeconds": 83,
|
| 1358 |
-
"thumbnail": "https://img.youtube.com/vi/RJJ7ksD1UJ4/maxresdefault.jpg",
|
| 1359 |
-
"sets": 3,
|
| 1360 |
-
"reps": "40s",
|
| 1361 |
-
"rest": 30,
|
| 1362 |
-
"calories": 12,
|
| 1363 |
-
"category": "fullbody",
|
| 1364 |
-
"originalName": "How to Do: ALTERNATING HOOKS"
|
| 1365 |
-
},
|
| 1366 |
-
{
|
| 1367 |
-
"name": "Punches",
|
| 1368 |
-
"originalTitle": "How to Do: PUNCHES",
|
| 1369 |
-
"emoji": "✨",
|
| 1370 |
-
"youtubeId": "piogI3uC1r4",
|
| 1371 |
-
"embedUrl": "https://www.youtube.com/embed/piogI3uC1r4",
|
| 1372 |
-
"duration": "1:00",
|
| 1373 |
-
"durationInSeconds": 60,
|
| 1374 |
-
"thumbnail": "https://img.youtube.com/vi/piogI3uC1r4/maxresdefault.jpg",
|
| 1375 |
-
"sets": 3,
|
| 1376 |
-
"reps": "40s",
|
| 1377 |
-
"rest": 30,
|
| 1378 |
-
"calories": 9,
|
| 1379 |
-
"category": "fullbody",
|
| 1380 |
-
"originalName": "How to Do: PUNCHES"
|
| 1381 |
-
},
|
| 1382 |
-
{
|
| 1383 |
-
"name": "Claps Over Head",
|
| 1384 |
-
"originalTitle": "How to Do: CLAPS OVER HEAD",
|
| 1385 |
-
"emoji": "✨",
|
| 1386 |
-
"youtubeId": "-pmAAVV8c0c",
|
| 1387 |
-
"embedUrl": "https://www.youtube.com/embed/-pmAAVV8c0c",
|
| 1388 |
-
"duration": "0:51",
|
| 1389 |
-
"durationInSeconds": 51,
|
| 1390 |
-
"thumbnail": "https://img.youtube.com/vi/-pmAAVV8c0c/maxresdefault.jpg",
|
| 1391 |
-
"sets": 3,
|
| 1392 |
-
"reps": "40s",
|
| 1393 |
-
"rest": 30,
|
| 1394 |
-
"calories": 8,
|
| 1395 |
-
"category": "fullbody",
|
| 1396 |
-
"originalName": "How to Do: CLAPS OVER HEAD"
|
| 1397 |
-
},
|
| 1398 |
-
{
|
| 1399 |
-
"name": "Heels Para Heavens",
|
| 1400 |
-
"originalTitle": "How to Do: HEELS TO THE HEAVENS",
|
| 1401 |
-
"emoji": "✨",
|
| 1402 |
-
"youtubeId": "ameO_UeSvA4",
|
| 1403 |
-
"embedUrl": "https://www.youtube.com/embed/ameO_UeSvA4",
|
| 1404 |
-
"duration": "1:12",
|
| 1405 |
-
"durationInSeconds": 72,
|
| 1406 |
-
"thumbnail": "https://img.youtube.com/vi/ameO_UeSvA4/maxresdefault.jpg",
|
| 1407 |
-
"sets": 3,
|
| 1408 |
-
"reps": "40s",
|
| 1409 |
-
"rest": 30,
|
| 1410 |
-
"calories": 11,
|
| 1411 |
-
"category": "fullbody",
|
| 1412 |
-
"originalName": "How to Do: HEELS TO THE HEAVENS"
|
| 1413 |
-
},
|
| 1414 |
-
{
|
| 1415 |
-
"name": "V-manter",
|
| 1416 |
-
"originalTitle": "How to Do: V-HOLD",
|
| 1417 |
-
"emoji": "✨",
|
| 1418 |
-
"youtubeId": "Xsi17eYdNN0",
|
| 1419 |
-
"embedUrl": "https://www.youtube.com/embed/Xsi17eYdNN0",
|
| 1420 |
-
"duration": "1:01",
|
| 1421 |
-
"durationInSeconds": 61,
|
| 1422 |
-
"thumbnail": "https://img.youtube.com/vi/Xsi17eYdNN0/maxresdefault.jpg",
|
| 1423 |
-
"sets": 3,
|
| 1424 |
-
"reps": "40s",
|
| 1425 |
-
"rest": 30,
|
| 1426 |
-
"calories": 9,
|
| 1427 |
-
"category": "fullbody",
|
| 1428 |
-
"originalName": "How to Do: V-HOLD"
|
| 1429 |
-
},
|
| 1430 |
-
{
|
| 1431 |
-
"name": "Sentado Em E Out",
|
| 1432 |
-
"originalTitle": "How to Do: SEATED IN AND OUT",
|
| 1433 |
-
"emoji": "✨",
|
| 1434 |
-
"youtubeId": "RNUs5NEeEiA",
|
| 1435 |
-
"embedUrl": "https://www.youtube.com/embed/RNUs5NEeEiA",
|
| 1436 |
-
"duration": "1:14",
|
| 1437 |
-
"durationInSeconds": 74,
|
| 1438 |
-
"thumbnail": "https://img.youtube.com/vi/RNUs5NEeEiA/maxresdefault.jpg",
|
| 1439 |
-
"sets": 3,
|
| 1440 |
-
"reps": "40s",
|
| 1441 |
-
"rest": 30,
|
| 1442 |
-
"calories": 11,
|
| 1443 |
-
"category": "fullbody",
|
| 1444 |
-
"originalName": "How to Do: SEATED IN AND OUT"
|
| 1445 |
-
},
|
| 1446 |
-
{
|
| 1447 |
-
"name": "Cross Touch E Reach",
|
| 1448 |
-
"originalTitle": "How to Do: CROSS TOUCH AND REACH",
|
| 1449 |
-
"emoji": "✨",
|
| 1450 |
-
"youtubeId": "rQfQIAIliSY",
|
| 1451 |
-
"embedUrl": "https://www.youtube.com/embed/rQfQIAIliSY",
|
| 1452 |
-
"duration": "1:21",
|
| 1453 |
-
"durationInSeconds": 81,
|
| 1454 |
-
"thumbnail": "https://img.youtube.com/vi/rQfQIAIliSY/maxresdefault.jpg",
|
| 1455 |
-
"sets": 3,
|
| 1456 |
-
"reps": "40s",
|
| 1457 |
-
"rest": 30,
|
| 1458 |
-
"calories": 12,
|
| 1459 |
-
"category": "fullbody",
|
| 1460 |
-
"originalName": "How to Do: CROSS TOUCH AND REACH"
|
| 1461 |
-
},
|
| 1462 |
-
{
|
| 1463 |
-
"name": "Box Empurrar-ups",
|
| 1464 |
-
"originalTitle": "How to Do: BOX PUSH-UPS",
|
| 1465 |
-
"emoji": "✨",
|
| 1466 |
-
"youtubeId": "M8POM9zPmkg",
|
| 1467 |
-
"embedUrl": "https://www.youtube.com/embed/M8POM9zPmkg",
|
| 1468 |
-
"duration": "1:14",
|
| 1469 |
-
"durationInSeconds": 74,
|
| 1470 |
-
"thumbnail": "https://img.youtube.com/vi/M8POM9zPmkg/maxresdefault.jpg",
|
| 1471 |
-
"sets": 3,
|
| 1472 |
-
"reps": "40s",
|
| 1473 |
-
"rest": 30,
|
| 1474 |
-
"calories": 11,
|
| 1475 |
-
"category": "fullbody",
|
| 1476 |
-
"originalName": "How to Do: BOX PUSH-UPS"
|
| 1477 |
-
},
|
| 1478 |
-
{
|
| 1479 |
-
"name": "Em & Outs",
|
| 1480 |
-
"originalTitle": "How to Do: IN & OUTS",
|
| 1481 |
-
"emoji": "✨",
|
| 1482 |
-
"youtubeId": "F010W7ft-Ws",
|
| 1483 |
-
"embedUrl": "https://www.youtube.com/embed/F010W7ft-Ws",
|
| 1484 |
-
"duration": "0:46",
|
| 1485 |
-
"durationInSeconds": 46,
|
| 1486 |
-
"thumbnail": "https://img.youtube.com/vi/F010W7ft-Ws/maxresdefault.jpg",
|
| 1487 |
-
"sets": 3,
|
| 1488 |
-
"reps": "12",
|
| 1489 |
-
"rest": 30,
|
| 1490 |
-
"calories": 7,
|
| 1491 |
-
"category": "fullbody",
|
| 1492 |
-
"originalName": "How to Do: IN & OUTS"
|
| 1493 |
-
},
|
| 1494 |
-
{
|
| 1495 |
-
"name": "Staggered Empurrar-ups",
|
| 1496 |
-
"originalTitle": "How to Do: STAGGERED PUSH-UPS",
|
| 1497 |
-
"emoji": "✨",
|
| 1498 |
-
"youtubeId": "xuOckEGWgJo",
|
| 1499 |
-
"embedUrl": "https://www.youtube.com/embed/xuOckEGWgJo",
|
| 1500 |
-
"duration": "1:10",
|
| 1501 |
-
"durationInSeconds": 70,
|
| 1502 |
-
"thumbnail": "https://img.youtube.com/vi/xuOckEGWgJo/maxresdefault.jpg",
|
| 1503 |
-
"sets": 3,
|
| 1504 |
-
"reps": "40s",
|
| 1505 |
-
"rest": 30,
|
| 1506 |
-
"calories": 11,
|
| 1507 |
-
"category": "fullbody",
|
| 1508 |
-
"originalName": "How to Do: STAGGERED PUSH-UPS"
|
| 1509 |
-
},
|
| 1510 |
-
{
|
| 1511 |
-
"name": "Diamond Empurrar-ups",
|
| 1512 |
-
"originalTitle": "How to Do: DIAMOND PUSH-UPS",
|
| 1513 |
-
"emoji": "✨",
|
| 1514 |
-
"youtubeId": "36HgbeFenxs",
|
| 1515 |
-
"embedUrl": "https://www.youtube.com/embed/36HgbeFenxs",
|
| 1516 |
-
"duration": "1:24",
|
| 1517 |
-
"durationInSeconds": 84,
|
| 1518 |
-
"thumbnail": "https://img.youtube.com/vi/36HgbeFenxs/maxresdefault.jpg",
|
| 1519 |
-
"sets": 3,
|
| 1520 |
-
"reps": "40s",
|
| 1521 |
-
"rest": 30,
|
| 1522 |
-
"calories": 13,
|
| 1523 |
-
"category": "fullbody",
|
| 1524 |
-
"originalName": "How to Do: DIAMOND PUSH-UPS"
|
| 1525 |
-
},
|
| 1526 |
-
{
|
| 1527 |
-
"name": "Inchworms",
|
| 1528 |
-
"originalTitle": "How to Do: INCHWORMS",
|
| 1529 |
-
"emoji": "✨",
|
| 1530 |
-
"youtubeId": "gZOSJjZiLI4",
|
| 1531 |
-
"embedUrl": "https://www.youtube.com/embed/gZOSJjZiLI4",
|
| 1532 |
-
"duration": "0:59",
|
| 1533 |
-
"durationInSeconds": 59,
|
| 1534 |
-
"thumbnail": "https://img.youtube.com/vi/gZOSJjZiLI4/maxresdefault.jpg",
|
| 1535 |
-
"sets": 3,
|
| 1536 |
-
"reps": "40s",
|
| 1537 |
-
"rest": 30,
|
| 1538 |
-
"calories": 9,
|
| 1539 |
-
"category": "fullbody",
|
| 1540 |
-
"originalName": "How to Do: INCHWORMS"
|
| 1541 |
-
},
|
| 1542 |
-
{
|
| 1543 |
-
"name": "Toy Soldiers",
|
| 1544 |
-
"originalTitle": "How to Do: TOY SOLDIERS",
|
| 1545 |
-
"emoji": "✨",
|
| 1546 |
-
"youtubeId": "J5R36QbhWf0",
|
| 1547 |
-
"embedUrl": "https://www.youtube.com/embed/J5R36QbhWf0",
|
| 1548 |
-
"duration": "1:08",
|
| 1549 |
-
"durationInSeconds": 68,
|
| 1550 |
-
"thumbnail": "https://img.youtube.com/vi/J5R36QbhWf0/maxresdefault.jpg",
|
| 1551 |
-
"sets": 3,
|
| 1552 |
-
"reps": "40s",
|
| 1553 |
-
"rest": 30,
|
| 1554 |
-
"calories": 10,
|
| 1555 |
-
"category": "fullbody",
|
| 1556 |
-
"originalName": "How to Do: TOY SOLDIERS"
|
| 1557 |
-
},
|
| 1558 |
-
{
|
| 1559 |
-
"name": "Heel Touch",
|
| 1560 |
-
"originalTitle": "How to Do: HEEL TOUCH",
|
| 1561 |
-
"emoji": "✨",
|
| 1562 |
-
"youtubeId": "HwLOdOmXcrI",
|
| 1563 |
-
"embedUrl": "https://www.youtube.com/embed/HwLOdOmXcrI",
|
| 1564 |
-
"duration": "1:03",
|
| 1565 |
-
"durationInSeconds": 63,
|
| 1566 |
-
"thumbnail": "https://img.youtube.com/vi/HwLOdOmXcrI/maxresdefault.jpg",
|
| 1567 |
-
"sets": 3,
|
| 1568 |
-
"reps": "40s",
|
| 1569 |
-
"rest": 30,
|
| 1570 |
-
"calories": 9,
|
| 1571 |
-
"category": "fullbody",
|
| 1572 |
-
"originalName": "How to Do: HEEL TOUCH"
|
| 1573 |
-
},
|
| 1574 |
-
{
|
| 1575 |
-
"name": "Decline Empurrar-ups",
|
| 1576 |
-
"originalTitle": "How to Do: DECLINE PUSH-UPS",
|
| 1577 |
-
"emoji": "✨",
|
| 1578 |
-
"youtubeId": "VCfB2oUZzAA",
|
| 1579 |
-
"embedUrl": "https://www.youtube.com/embed/VCfB2oUZzAA",
|
| 1580 |
-
"duration": "0:57",
|
| 1581 |
-
"durationInSeconds": 57,
|
| 1582 |
-
"thumbnail": "https://img.youtube.com/vi/VCfB2oUZzAA/maxresdefault.jpg",
|
| 1583 |
-
"sets": 3,
|
| 1584 |
-
"reps": "40s",
|
| 1585 |
-
"rest": 30,
|
| 1586 |
-
"calories": 9,
|
| 1587 |
-
"category": "fullbody",
|
| 1588 |
-
"originalName": "How to Do: DECLINE PUSH-UPS"
|
| 1589 |
-
},
|
| 1590 |
-
{
|
| 1591 |
-
"name": "Incline Empurrar-ups",
|
| 1592 |
-
"originalTitle": "How to Do: INCLINE PUSH-UPS",
|
| 1593 |
-
"emoji": "✨",
|
| 1594 |
-
"youtubeId": "UT03_KPhoR8",
|
| 1595 |
-
"embedUrl": "https://www.youtube.com/embed/UT03_KPhoR8",
|
| 1596 |
-
"duration": "1:08",
|
| 1597 |
-
"durationInSeconds": 68,
|
| 1598 |
-
"thumbnail": "https://img.youtube.com/vi/UT03_KPhoR8/maxresdefault.jpg",
|
| 1599 |
-
"sets": 3,
|
| 1600 |
-
"reps": "40s",
|
| 1601 |
-
"rest": 30,
|
| 1602 |
-
"calories": 10,
|
| 1603 |
-
"category": "fullbody",
|
| 1604 |
-
"originalName": "How to Do: INCLINE PUSH-UPS"
|
| 1605 |
-
},
|
| 1606 |
-
{
|
| 1607 |
-
"name": "Empurrar-para Cima & Rotation",
|
| 1608 |
-
"originalTitle": "How to Do: PUSH-UP & ROTATION",
|
| 1609 |
-
"emoji": "✨",
|
| 1610 |
-
"youtubeId": "NTwhw_HxxdA",
|
| 1611 |
-
"embedUrl": "https://www.youtube.com/embed/NTwhw_HxxdA",
|
| 1612 |
-
"duration": "1:19",
|
| 1613 |
-
"durationInSeconds": 79,
|
| 1614 |
-
"thumbnail": "https://img.youtube.com/vi/NTwhw_HxxdA/maxresdefault.jpg",
|
| 1615 |
-
"sets": 3,
|
| 1616 |
-
"reps": "40s",
|
| 1617 |
-
"rest": 30,
|
| 1618 |
-
"calories": 12,
|
| 1619 |
-
"category": "fullbody",
|
| 1620 |
-
"originalName": "How to Do: PUSH-UP & ROTATION"
|
| 1621 |
-
},
|
| 1622 |
-
{
|
| 1623 |
-
"name": "Suba Na Cadeira",
|
| 1624 |
-
"originalTitle": "Como fazer: SUBA NA CADEIRA",
|
| 1625 |
-
"emoji": "✨",
|
| 1626 |
-
"youtubeId": "z3otsAzOb-g",
|
| 1627 |
-
"embedUrl": "https://www.youtube.com/embed/z3otsAzOb-g",
|
| 1628 |
-
"duration": "0:50",
|
| 1629 |
-
"durationInSeconds": 50,
|
| 1630 |
-
"thumbnail": "https://img.youtube.com/vi/z3otsAzOb-g/maxresdefault.jpg",
|
| 1631 |
-
"sets": 3,
|
| 1632 |
-
"reps": "40s",
|
| 1633 |
-
"rest": 30,
|
| 1634 |
-
"calories": 8,
|
| 1635 |
-
"category": "fullbody",
|
| 1636 |
-
"originalName": "Como fazer: SUBA NA CADEIRA"
|
| 1637 |
-
},
|
| 1638 |
-
{
|
| 1639 |
-
"name": "Parede Empurrar-ups",
|
| 1640 |
-
"originalTitle": "How to Do: WALL PUSH-UPS",
|
| 1641 |
-
"emoji": "✨",
|
| 1642 |
-
"youtubeId": "P7lSsHQZqBc",
|
| 1643 |
-
"embedUrl": "https://www.youtube.com/embed/P7lSsHQZqBc",
|
| 1644 |
-
"duration": "1:08",
|
| 1645 |
-
"durationInSeconds": 68,
|
| 1646 |
-
"thumbnail": "https://img.youtube.com/vi/P7lSsHQZqBc/maxresdefault.jpg",
|
| 1647 |
-
"sets": 3,
|
| 1648 |
-
"reps": "40s",
|
| 1649 |
-
"rest": 30,
|
| 1650 |
-
"calories": 10,
|
| 1651 |
-
"category": "fullbody",
|
| 1652 |
-
"originalName": "How to Do: WALL PUSH-UPS"
|
| 1653 |
-
}
|
| 1654 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/glutes.js
DELETED
|
@@ -1,1030 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: glutes
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 64
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_GLUTES = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Postura Fácil Da Borboleta",
|
| 8 |
-
"originalTitle": "How to Do: EASY BUTTERFLY POSE",
|
| 9 |
-
"emoji": "🍑",
|
| 10 |
-
"youtubeId": "pjAm2Jl9vMA",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/pjAm2Jl9vMA",
|
| 12 |
-
"duration": "1:06",
|
| 13 |
-
"durationInSeconds": 66,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/pjAm2Jl9vMA/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "40s",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 9,
|
| 19 |
-
"category": "glutes",
|
| 20 |
-
"originalName": "How to Do: EASY BUTTERFLY POSE"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": "Postura Da Borboleta",
|
| 24 |
-
"originalTitle": "How to Do: BUTTERFLY POSE",
|
| 25 |
-
"emoji": "🍑",
|
| 26 |
-
"youtubeId": "seRyFNh7boQ",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/seRyFNh7boQ",
|
| 28 |
-
"duration": "1:06",
|
| 29 |
-
"durationInSeconds": 66,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/seRyFNh7boQ/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "40s",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 9,
|
| 35 |
-
"category": "glutes",
|
| 36 |
-
"originalName": "How to Do: BUTTERFLY POSE"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": ":sentado Borboleta Alongamento",
|
| 40 |
-
"originalTitle": "How to Do:SEATED BUTTERFLY STRETCH",
|
| 41 |
-
"emoji": "🍑",
|
| 42 |
-
"youtubeId": "QehQaZvvquA",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/QehQaZvvquA",
|
| 44 |
-
"duration": "0:48",
|
| 45 |
-
"durationInSeconds": 48,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/QehQaZvvquA/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "12",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 6,
|
| 51 |
-
"category": "glutes",
|
| 52 |
-
"originalName": "How to Do:SEATED BUTTERFLY STRETCH"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": ":halter Quadril Hinge",
|
| 56 |
-
"originalTitle": "How to Do:DUMBBELL HIP HINGE",
|
| 57 |
-
"emoji": "🍑",
|
| 58 |
-
"youtubeId": "yac3o7xnA4s",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/yac3o7xnA4s",
|
| 60 |
-
"duration": "0:52",
|
| 61 |
-
"durationInSeconds": 52,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/yac3o7xnA4s/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "40s",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 7,
|
| 67 |
-
"category": "glutes",
|
| 68 |
-
"originalName": "How to Do:DUMBBELL HIP HINGE"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":halter Hidrante",
|
| 72 |
-
"originalTitle": "How to Do:DUMBBELL FIRE HYDRANT",
|
| 73 |
-
"emoji": "🍑",
|
| 74 |
-
"youtubeId": "kVpYYhzJTqE",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/kVpYYhzJTqE",
|
| 76 |
-
"duration": "0:45",
|
| 77 |
-
"durationInSeconds": 45,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/kVpYYhzJTqE/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "12",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 6,
|
| 83 |
-
"category": "glutes",
|
| 84 |
-
"originalName": "How to Do:DUMBBELL FIRE HYDRANT"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":halter Bumbum Ponte",
|
| 88 |
-
"originalTitle": "How to Do:DUMBBELL BUTT BRIDGE",
|
| 89 |
-
"emoji": "🍑",
|
| 90 |
-
"youtubeId": "6gGzYaD9Cb4",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/6gGzYaD9Cb4",
|
| 92 |
-
"duration": "0:47",
|
| 93 |
-
"durationInSeconds": 47,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/6gGzYaD9Cb4/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "12",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 6,
|
| 99 |
-
"category": "glutes",
|
| 100 |
-
"originalName": "How to Do:DUMBBELL BUTT BRIDGE"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":borboleta Ponte",
|
| 104 |
-
"originalTitle": "How to Do:BUTTERFLY BRIDGE",
|
| 105 |
-
"emoji": "🍑",
|
| 106 |
-
"youtubeId": "sJC_fMOVZVw",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/sJC_fMOVZVw",
|
| 108 |
-
"duration": "0:47",
|
| 109 |
-
"durationInSeconds": 47,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/sJC_fMOVZVw/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "12",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 6,
|
| 115 |
-
"category": "glutes",
|
| 116 |
-
"originalName": "How to Do:BUTTERFLY BRIDGE"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": ":halter Quadril Ponte & Perna Levantamento",
|
| 120 |
-
"originalTitle": "How to Do:DUMBBELL HIP BRIDGE & LEG LIFT",
|
| 121 |
-
"emoji": "🍑",
|
| 122 |
-
"youtubeId": "o_g6vKfkREI",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/o_g6vKfkREI",
|
| 124 |
-
"duration": "0:51",
|
| 125 |
-
"durationInSeconds": 51,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/o_g6vKfkREI/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "40s",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 7,
|
| 131 |
-
"category": "glutes",
|
| 132 |
-
"originalName": "How to Do:DUMBBELL HIP BRIDGE & LEG LIFT"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": ":halter Unilateral Perna Quadril Thrust",
|
| 136 |
-
"originalTitle": "How to Do:DUMBBELL SINGLE LEG HIP THRUST",
|
| 137 |
-
"emoji": "🍑",
|
| 138 |
-
"youtubeId": "Jw_rJ6l3aRY",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/Jw_rJ6l3aRY",
|
| 140 |
-
"duration": "0:50",
|
| 141 |
-
"durationInSeconds": 50,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/Jw_rJ6l3aRY/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "40s",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 7,
|
| 147 |
-
"category": "glutes",
|
| 148 |
-
"originalName": "How to Do:DUMBBELL SINGLE LEG HIP THRUST"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": ":halter Kickbacks",
|
| 152 |
-
"originalTitle": "How to Do:DUMBBELL KICKBACKS",
|
| 153 |
-
"emoji": "🍑",
|
| 154 |
-
"youtubeId": "3ao9J4vvEXA",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/3ao9J4vvEXA",
|
| 156 |
-
"duration": "0:51",
|
| 157 |
-
"durationInSeconds": 51,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/3ao9J4vvEXA/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "40s",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 7,
|
| 163 |
-
"category": "glutes",
|
| 164 |
-
"originalName": "How to Do:DUMBBELL KICKBACKS"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":halter Coice De Glúteo",
|
| 168 |
-
"originalTitle": "How to Do:DUMBBELL DONKEY KICKS",
|
| 169 |
-
"emoji": "🍑",
|
| 170 |
-
"youtubeId": "pd3KyzQS5nc",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/pd3KyzQS5nc",
|
| 172 |
-
"duration": "0:47",
|
| 173 |
-
"durationInSeconds": 47,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/pd3KyzQS5nc/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "12",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 6,
|
| 179 |
-
"category": "glutes",
|
| 180 |
-
"originalName": "How to Do:DUMBBELL DONKEY KICKS"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":halter Quadril Thrust",
|
| 184 |
-
"originalTitle": "How to Do:DUMBBELL HIP THRUST",
|
| 185 |
-
"emoji": "🍑",
|
| 186 |
-
"youtubeId": "VcVATdt9Mfc",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/VcVATdt9Mfc",
|
| 188 |
-
"duration": "0:48",
|
| 189 |
-
"durationInSeconds": 48,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/VcVATdt9Mfc/maxresdefault.jpg",
|
| 191 |
-
"sets": 3,
|
| 192 |
-
"reps": "12",
|
| 193 |
-
"rest": 30,
|
| 194 |
-
"calories": 6,
|
| 195 |
-
"category": "glutes",
|
| 196 |
-
"originalName": "How to Do:DUMBBELL HIP THRUST"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":em Pé Quadril Circle",
|
| 200 |
-
"originalTitle": "How to Do:STANDING HIP CIRCLE",
|
| 201 |
-
"emoji": "🍑",
|
| 202 |
-
"youtubeId": "4-OTUubpEMU",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/4-OTUubpEMU",
|
| 204 |
-
"duration": "0:47",
|
| 205 |
-
"durationInSeconds": 47,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/4-OTUubpEMU/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "12",
|
| 209 |
-
"rest": 30,
|
| 210 |
-
"calories": 6,
|
| 211 |
-
"category": "glutes",
|
| 212 |
-
"originalName": "How to Do:STANDING HIP CIRCLE"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ":halter Em Pé Quadril Abduction",
|
| 216 |
-
"originalTitle": "How to Do:DUMBBELL STANDING HIP ABDUCTION",
|
| 217 |
-
"emoji": "🍑",
|
| 218 |
-
"youtubeId": "d4XF8LD_ZVQ",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/d4XF8LD_ZVQ",
|
| 220 |
-
"duration": "0:45",
|
| 221 |
-
"durationInSeconds": 45,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/d4XF8LD_ZVQ/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "12",
|
| 225 |
-
"rest": 30,
|
| 226 |
-
"calories": 6,
|
| 227 |
-
"category": "glutes",
|
| 228 |
-
"originalName": "How to Do:DUMBBELL STANDING HIP ABDUCTION"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": ":hidrante Pulsação",
|
| 232 |
-
"originalTitle": "How to Do:FIRE HYDRANT PULSE",
|
| 233 |
-
"emoji": "🍑",
|
| 234 |
-
"youtubeId": "uILAw7D7fxE",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/uILAw7D7fxE",
|
| 236 |
-
"duration": "0:45",
|
| 237 |
-
"durationInSeconds": 45,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/uILAw7D7fxE/maxresdefault.jpg",
|
| 239 |
-
"sets": 3,
|
| 240 |
-
"reps": "12",
|
| 241 |
-
"rest": 30,
|
| 242 |
-
"calories": 6,
|
| 243 |
-
"category": "glutes",
|
| 244 |
-
"originalName": "How to Do:FIRE HYDRANT PULSE"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": ":Coice De Glúteo Pulsação",
|
| 248 |
-
"originalTitle": "How to Do:DONKEY KICKS PULSE",
|
| 249 |
-
"emoji": "🍑",
|
| 250 |
-
"youtubeId": "QaTh15GsgHk",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/QaTh15GsgHk",
|
| 252 |
-
"duration": "0:49",
|
| 253 |
-
"durationInSeconds": 49,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/QaTh15GsgHk/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "12",
|
| 257 |
-
"rest": 30,
|
| 258 |
-
"calories": 7,
|
| 259 |
-
"category": "glutes",
|
| 260 |
-
"originalName": "How to Do:DONKEY KICKS PULSE"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": ":glúteo Kickback Pulsação",
|
| 264 |
-
"originalTitle": "How to Do:GLUTE KICKBACK PULSE",
|
| 265 |
-
"emoji": "🍑",
|
| 266 |
-
"youtubeId": "Lxdu7Nlp6KE",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/Lxdu7Nlp6KE",
|
| 268 |
-
"duration": "0:51",
|
| 269 |
-
"durationInSeconds": 51,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/Lxdu7Nlp6KE/maxresdefault.jpg",
|
| 271 |
-
"sets": 3,
|
| 272 |
-
"reps": "40s",
|
| 273 |
-
"rest": 30,
|
| 274 |
-
"calories": 7,
|
| 275 |
-
"category": "glutes",
|
| 276 |
-
"originalName": "How to Do:GLUTE KICKBACK PULSE"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": ":glúteo Alongamento",
|
| 280 |
-
"originalTitle": "How to Do:GLUTE STRETCH",
|
| 281 |
-
"emoji": "🍑",
|
| 282 |
-
"youtubeId": "vSKSU8KDc38",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/vSKSU8KDc38",
|
| 284 |
-
"duration": "0:38",
|
| 285 |
-
"durationInSeconds": 38,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/vSKSU8KDc38/maxresdefault.jpg",
|
| 287 |
-
"sets": 3,
|
| 288 |
-
"reps": "12",
|
| 289 |
-
"rest": 30,
|
| 290 |
-
"calories": 5,
|
| 291 |
-
"category": "glutes",
|
| 292 |
-
"originalName": "How to Do:GLUTE STRETCH"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": ":parede Em Pé Glúteo Kickbacks",
|
| 296 |
-
"originalTitle": "How to Do:WALL STANDING GLUTE KICKBACKS",
|
| 297 |
-
"emoji": "🍑",
|
| 298 |
-
"youtubeId": "qzqDHSDTc0U",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/qzqDHSDTc0U",
|
| 300 |
-
"duration": "0:46",
|
| 301 |
-
"durationInSeconds": 46,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/qzqDHSDTc0U/maxresdefault.jpg",
|
| 303 |
-
"sets": 3,
|
| 304 |
-
"reps": "12",
|
| 305 |
-
"rest": 30,
|
| 306 |
-
"calories": 6,
|
| 307 |
-
"category": "glutes",
|
| 308 |
-
"originalName": "How to Do:WALL STANDING GLUTE KICKBACKS"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": ":parede Glúteo Kickback Manter",
|
| 312 |
-
"originalTitle": "How to Do:WALL GLUTE KICKBACK HOLD",
|
| 313 |
-
"emoji": "🍑",
|
| 314 |
-
"youtubeId": "jWDHafNF3kQ",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/jWDHafNF3kQ",
|
| 316 |
-
"duration": "0:38",
|
| 317 |
-
"durationInSeconds": 38,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/jWDHafNF3kQ/maxresdefault.jpg",
|
| 319 |
-
"sets": 3,
|
| 320 |
-
"reps": "12",
|
| 321 |
-
"rest": 30,
|
| 322 |
-
"calories": 5,
|
| 323 |
-
"category": "glutes",
|
| 324 |
-
"originalName": "How to Do:WALL GLUTE KICKBACK HOLD"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": ":glúteo Kickback Crossover Com Perna",
|
| 328 |
-
"originalTitle": "How to Do:GLUTE KICKBACK CROSSOVER WITH LEG",
|
| 329 |
-
"emoji": "🍑",
|
| 330 |
-
"youtubeId": "e25jpcjeyAQ",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/e25jpcjeyAQ",
|
| 332 |
-
"duration": "0:54",
|
| 333 |
-
"durationInSeconds": 54,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/e25jpcjeyAQ/maxresdefault.jpg",
|
| 335 |
-
"sets": 3,
|
| 336 |
-
"reps": "40s",
|
| 337 |
-
"rest": 30,
|
| 338 |
-
"calories": 7,
|
| 339 |
-
"category": "glutes",
|
| 340 |
-
"originalName": "How to Do:GLUTE KICKBACK CROSSOVER WITH LEG"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": ":lateral Deitado Kickback",
|
| 344 |
-
"originalTitle": "How to Do:SIDE LYING KICKBACK",
|
| 345 |
-
"emoji": "🍑",
|
| 346 |
-
"youtubeId": "OXC39VmkhcE",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/OXC39VmkhcE",
|
| 348 |
-
"duration": "0:52",
|
| 349 |
-
"durationInSeconds": 52,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/OXC39VmkhcE/maxresdefault.jpg",
|
| 351 |
-
"sets": 3,
|
| 352 |
-
"reps": "40s",
|
| 353 |
-
"rest": 30,
|
| 354 |
-
"calories": 7,
|
| 355 |
-
"category": "glutes",
|
| 356 |
-
"originalName": "How to Do:SIDE LYING KICKBACK"
|
| 357 |
-
},
|
| 358 |
-
{
|
| 359 |
-
"name": ":ponte",
|
| 360 |
-
"originalTitle": "How to Do:BRIDGE",
|
| 361 |
-
"emoji": "🍑",
|
| 362 |
-
"youtubeId": "-KKADnBsPzw",
|
| 363 |
-
"embedUrl": "https://www.youtube.com/embed/-KKADnBsPzw",
|
| 364 |
-
"duration": "0:36",
|
| 365 |
-
"durationInSeconds": 36,
|
| 366 |
-
"thumbnail": "https://img.youtube.com/vi/-KKADnBsPzw/maxresdefault.jpg",
|
| 367 |
-
"sets": 3,
|
| 368 |
-
"reps": "12",
|
| 369 |
-
"rest": 30,
|
| 370 |
-
"calories": 5,
|
| 371 |
-
"category": "glutes",
|
| 372 |
-
"originalName": "How to Do:BRIDGE"
|
| 373 |
-
},
|
| 374 |
-
{
|
| 375 |
-
"name": ":banco Glúteo Chute Costas",
|
| 376 |
-
"originalTitle": "How to Do:BENCH GLUTE KICK BACK",
|
| 377 |
-
"emoji": "🍑",
|
| 378 |
-
"youtubeId": "Mi4H6YUVMCQ",
|
| 379 |
-
"embedUrl": "https://www.youtube.com/embed/Mi4H6YUVMCQ",
|
| 380 |
-
"duration": "0:49",
|
| 381 |
-
"durationInSeconds": 49,
|
| 382 |
-
"thumbnail": "https://img.youtube.com/vi/Mi4H6YUVMCQ/maxresdefault.jpg",
|
| 383 |
-
"sets": 3,
|
| 384 |
-
"reps": "12",
|
| 385 |
-
"rest": 30,
|
| 386 |
-
"calories": 7,
|
| 387 |
-
"category": "glutes",
|
| 388 |
-
"originalName": "How to Do:BENCH GLUTE KICK BACK"
|
| 389 |
-
},
|
| 390 |
-
{
|
| 391 |
-
"name": ":pilates Concha",
|
| 392 |
-
"originalTitle": "How to Do:PILATES CLAMSHELL",
|
| 393 |
-
"emoji": "🍑",
|
| 394 |
-
"youtubeId": "mYMardCrLSk",
|
| 395 |
-
"embedUrl": "https://www.youtube.com/embed/mYMardCrLSk",
|
| 396 |
-
"duration": "0:50",
|
| 397 |
-
"durationInSeconds": 50,
|
| 398 |
-
"thumbnail": "https://img.youtube.com/vi/mYMardCrLSk/maxresdefault.jpg",
|
| 399 |
-
"sets": 3,
|
| 400 |
-
"reps": "40s",
|
| 401 |
-
"rest": 30,
|
| 402 |
-
"calories": 7,
|
| 403 |
-
"category": "glutes",
|
| 404 |
-
"originalName": "How to Do:PILATES CLAMSHELL"
|
| 405 |
-
},
|
| 406 |
-
{
|
| 407 |
-
"name": ":bumbum Kicks",
|
| 408 |
-
"originalTitle": "How to Do:BUTT KICKS",
|
| 409 |
-
"emoji": "🍑",
|
| 410 |
-
"youtubeId": "vXVPvY1UbJI",
|
| 411 |
-
"embedUrl": "https://www.youtube.com/embed/vXVPvY1UbJI",
|
| 412 |
-
"duration": "0:45",
|
| 413 |
-
"durationInSeconds": 45,
|
| 414 |
-
"thumbnail": "https://img.youtube.com/vi/vXVPvY1UbJI/maxresdefault.jpg",
|
| 415 |
-
"sets": 3,
|
| 416 |
-
"reps": "12",
|
| 417 |
-
"rest": 30,
|
| 418 |
-
"calories": 6,
|
| 419 |
-
"category": "glutes",
|
| 420 |
-
"originalName": "How to Do:BUTT KICKS"
|
| 421 |
-
},
|
| 422 |
-
{
|
| 423 |
-
"name": ":quadril Hinge",
|
| 424 |
-
"originalTitle": "How to Do:HIP HINGE",
|
| 425 |
-
"emoji": "🍑",
|
| 426 |
-
"youtubeId": "VyFDPMOy-eA",
|
| 427 |
-
"embedUrl": "https://www.youtube.com/embed/VyFDPMOy-eA",
|
| 428 |
-
"duration": "0:51",
|
| 429 |
-
"durationInSeconds": 51,
|
| 430 |
-
"thumbnail": "https://img.youtube.com/vi/VyFDPMOy-eA/maxresdefault.jpg",
|
| 431 |
-
"sets": 3,
|
| 432 |
-
"reps": "40s",
|
| 433 |
-
"rest": 30,
|
| 434 |
-
"calories": 7,
|
| 435 |
-
"category": "glutes",
|
| 436 |
-
"originalName": "How to Do:HIP HINGE"
|
| 437 |
-
},
|
| 438 |
-
{
|
| 439 |
-
"name": ":em Pé Glúteo Kickbacks",
|
| 440 |
-
"originalTitle": "How to Do:STANDING GLUTE KICKBACKS",
|
| 441 |
-
"emoji": "🍑",
|
| 442 |
-
"youtubeId": "GucHQvB4Bbk",
|
| 443 |
-
"embedUrl": "https://www.youtube.com/embed/GucHQvB4Bbk",
|
| 444 |
-
"duration": "0:46",
|
| 445 |
-
"durationInSeconds": 46,
|
| 446 |
-
"thumbnail": "https://img.youtube.com/vi/GucHQvB4Bbk/maxresdefault.jpg",
|
| 447 |
-
"sets": 3,
|
| 448 |
-
"reps": "12",
|
| 449 |
-
"rest": 30,
|
| 450 |
-
"calories": 6,
|
| 451 |
-
"category": "glutes",
|
| 452 |
-
"originalName": "How to Do:STANDING GLUTE KICKBACKS"
|
| 453 |
-
},
|
| 454 |
-
{
|
| 455 |
-
"name": ":glúteo Chute Costas",
|
| 456 |
-
"originalTitle": "How to Do:GLUTE KICK BACK",
|
| 457 |
-
"emoji": "🍑",
|
| 458 |
-
"youtubeId": "58msQFam5Ew",
|
| 459 |
-
"embedUrl": "https://www.youtube.com/embed/58msQFam5Ew",
|
| 460 |
-
"duration": "0:43",
|
| 461 |
-
"durationInSeconds": 43,
|
| 462 |
-
"thumbnail": "https://img.youtube.com/vi/58msQFam5Ew/maxresdefault.jpg",
|
| 463 |
-
"sets": 3,
|
| 464 |
-
"reps": "12",
|
| 465 |
-
"rest": 30,
|
| 466 |
-
"calories": 6,
|
| 467 |
-
"category": "glutes",
|
| 468 |
-
"originalName": "How to Do:GLUTE KICK BACK"
|
| 469 |
-
},
|
| 470 |
-
{
|
| 471 |
-
"name": ":em Pé Glúteo Kickbacks",
|
| 472 |
-
"originalTitle": "How to Do:STANDING GLUTE KICKBACKS",
|
| 473 |
-
"emoji": "🍑",
|
| 474 |
-
"youtubeId": "pn2EZjEE_ZU",
|
| 475 |
-
"embedUrl": "https://www.youtube.com/embed/pn2EZjEE_ZU",
|
| 476 |
-
"duration": "0:49",
|
| 477 |
-
"durationInSeconds": 49,
|
| 478 |
-
"thumbnail": "https://img.youtube.com/vi/pn2EZjEE_ZU/maxresdefault.jpg",
|
| 479 |
-
"sets": 3,
|
| 480 |
-
"reps": "12",
|
| 481 |
-
"rest": 30,
|
| 482 |
-
"calories": 7,
|
| 483 |
-
"category": "glutes",
|
| 484 |
-
"originalName": "How to Do:STANDING GLUTE KICKBACKS"
|
| 485 |
-
},
|
| 486 |
-
{
|
| 487 |
-
"name": ":deitado Borboleta Alongamento",
|
| 488 |
-
"originalTitle": "How to Do:LYING BUTTERFLY STRETCH",
|
| 489 |
-
"emoji": "🍑",
|
| 490 |
-
"youtubeId": "bzfY0Zr3sUE",
|
| 491 |
-
"embedUrl": "https://www.youtube.com/embed/bzfY0Zr3sUE",
|
| 492 |
-
"duration": "0:39",
|
| 493 |
-
"durationInSeconds": 39,
|
| 494 |
-
"thumbnail": "https://img.youtube.com/vi/bzfY0Zr3sUE/maxresdefault.jpg",
|
| 495 |
-
"sets": 3,
|
| 496 |
-
"reps": "12",
|
| 497 |
-
"rest": 30,
|
| 498 |
-
"calories": 5,
|
| 499 |
-
"category": "glutes",
|
| 500 |
-
"originalName": "How to Do:LYING BUTTERFLY STRETCH"
|
| 501 |
-
},
|
| 502 |
-
{
|
| 503 |
-
"name": "Tríceps Kickbacks",
|
| 504 |
-
"originalTitle": "Como fazer: TRÍCEPS KICKBACKS",
|
| 505 |
-
"emoji": "🍑",
|
| 506 |
-
"youtubeId": "f3E7eEq2c6c",
|
| 507 |
-
"embedUrl": "https://www.youtube.com/embed/f3E7eEq2c6c",
|
| 508 |
-
"duration": "0:50",
|
| 509 |
-
"durationInSeconds": 50,
|
| 510 |
-
"thumbnail": "https://img.youtube.com/vi/f3E7eEq2c6c/maxresdefault.jpg",
|
| 511 |
-
"sets": 3,
|
| 512 |
-
"reps": "40s",
|
| 513 |
-
"rest": 30,
|
| 514 |
-
"calories": 7,
|
| 515 |
-
"category": "glutes",
|
| 516 |
-
"originalName": "Como fazer: TRÍCEPS KICKBACKS"
|
| 517 |
-
},
|
| 518 |
-
{
|
| 519 |
-
"name": ":quadril Ponte & Perna Levantamento",
|
| 520 |
-
"originalTitle": "How to Do:HIP BRIDGE & LEG LIFT",
|
| 521 |
-
"emoji": "🍑",
|
| 522 |
-
"youtubeId": "_pDhLWYEC18",
|
| 523 |
-
"embedUrl": "https://www.youtube.com/embed/_pDhLWYEC18",
|
| 524 |
-
"duration": "0:50",
|
| 525 |
-
"durationInSeconds": 50,
|
| 526 |
-
"thumbnail": "https://img.youtube.com/vi/_pDhLWYEC18/maxresdefault.jpg",
|
| 527 |
-
"sets": 3,
|
| 528 |
-
"reps": "40s",
|
| 529 |
-
"rest": 30,
|
| 530 |
-
"calories": 7,
|
| 531 |
-
"category": "glutes",
|
| 532 |
-
"originalName": "How to Do:HIP BRIDGE & LEG LIFT"
|
| 533 |
-
},
|
| 534 |
-
{
|
| 535 |
-
"name": ":glúteo Chute Costas",
|
| 536 |
-
"originalTitle": "How to Do:GLUTE KICK BACK",
|
| 537 |
-
"emoji": "🍑",
|
| 538 |
-
"youtubeId": "D4gxkgZQkAg",
|
| 539 |
-
"embedUrl": "https://www.youtube.com/embed/D4gxkgZQkAg",
|
| 540 |
-
"duration": "0:48",
|
| 541 |
-
"durationInSeconds": 48,
|
| 542 |
-
"thumbnail": "https://img.youtube.com/vi/D4gxkgZQkAg/maxresdefault.jpg",
|
| 543 |
-
"sets": 3,
|
| 544 |
-
"reps": "12",
|
| 545 |
-
"rest": 30,
|
| 546 |
-
"calories": 6,
|
| 547 |
-
"category": "glutes",
|
| 548 |
-
"originalName": "How to Do:GLUTE KICK BACK"
|
| 549 |
-
},
|
| 550 |
-
{
|
| 551 |
-
"name": ":Coice De Glúteo",
|
| 552 |
-
"originalTitle": "How to Do:DONKEY KICKS",
|
| 553 |
-
"emoji": "🍑",
|
| 554 |
-
"youtubeId": "4ranVQDqlaU",
|
| 555 |
-
"embedUrl": "https://www.youtube.com/embed/4ranVQDqlaU",
|
| 556 |
-
"duration": "0:51",
|
| 557 |
-
"durationInSeconds": 51,
|
| 558 |
-
"thumbnail": "https://img.youtube.com/vi/4ranVQDqlaU/maxresdefault.jpg",
|
| 559 |
-
"sets": 3,
|
| 560 |
-
"reps": "40s",
|
| 561 |
-
"rest": 30,
|
| 562 |
-
"calories": 7,
|
| 563 |
-
"category": "glutes",
|
| 564 |
-
"originalName": "How to Do:DONKEY KICKS"
|
| 565 |
-
},
|
| 566 |
-
{
|
| 567 |
-
"name": ":hidrante",
|
| 568 |
-
"originalTitle": "How to Do:FIRE HYDRANT",
|
| 569 |
-
"emoji": "🍑",
|
| 570 |
-
"youtubeId": "7LnuhLi-78I",
|
| 571 |
-
"embedUrl": "https://www.youtube.com/embed/7LnuhLi-78I",
|
| 572 |
-
"duration": "0:46",
|
| 573 |
-
"durationInSeconds": 46,
|
| 574 |
-
"thumbnail": "https://img.youtube.com/vi/7LnuhLi-78I/maxresdefault.jpg",
|
| 575 |
-
"sets": 3,
|
| 576 |
-
"reps": "12",
|
| 577 |
-
"rest": 30,
|
| 578 |
-
"calories": 6,
|
| 579 |
-
"category": "glutes",
|
| 580 |
-
"originalName": "How to Do:FIRE HYDRANT"
|
| 581 |
-
},
|
| 582 |
-
{
|
| 583 |
-
"name": ":froggy Glúteo Lifts",
|
| 584 |
-
"originalTitle": "How to Do:FROGGY GLUTE LIFTS",
|
| 585 |
-
"emoji": "🍑",
|
| 586 |
-
"youtubeId": "wl10q6aqy-4",
|
| 587 |
-
"embedUrl": "https://www.youtube.com/embed/wl10q6aqy-4",
|
| 588 |
-
"duration": "0:46",
|
| 589 |
-
"durationInSeconds": 46,
|
| 590 |
-
"thumbnail": "https://img.youtube.com/vi/wl10q6aqy-4/maxresdefault.jpg",
|
| 591 |
-
"sets": 3,
|
| 592 |
-
"reps": "12",
|
| 593 |
-
"rest": 30,
|
| 594 |
-
"calories": 6,
|
| 595 |
-
"category": "glutes",
|
| 596 |
-
"originalName": "How to Do:FROGGY GLUTE LIFTS"
|
| 597 |
-
},
|
| 598 |
-
{
|
| 599 |
-
"name": "Bumbum Ponte",
|
| 600 |
-
"originalTitle": "How to Do: BUTT BRIDGE",
|
| 601 |
-
"emoji": "🍑",
|
| 602 |
-
"youtubeId": "9qo48CYN06w",
|
| 603 |
-
"embedUrl": "https://www.youtube.com/embed/9qo48CYN06w",
|
| 604 |
-
"duration": "0:47",
|
| 605 |
-
"durationInSeconds": 47,
|
| 606 |
-
"thumbnail": "https://img.youtube.com/vi/9qo48CYN06w/maxresdefault.jpg",
|
| 607 |
-
"sets": 3,
|
| 608 |
-
"reps": "12",
|
| 609 |
-
"rest": 30,
|
| 610 |
-
"calories": 6,
|
| 611 |
-
"category": "glutes",
|
| 612 |
-
"originalName": "How to Do: BUTT BRIDGE"
|
| 613 |
-
},
|
| 614 |
-
{
|
| 615 |
-
"name": ":lateral Pontes",
|
| 616 |
-
"originalTitle": "How to Do:SIDE BRIDGES",
|
| 617 |
-
"emoji": "🍑",
|
| 618 |
-
"youtubeId": "7ytbYd4CK3o",
|
| 619 |
-
"embedUrl": "https://www.youtube.com/embed/7ytbYd4CK3o",
|
| 620 |
-
"duration": "0:46",
|
| 621 |
-
"durationInSeconds": 46,
|
| 622 |
-
"thumbnail": "https://img.youtube.com/vi/7ytbYd4CK3o/maxresdefault.jpg",
|
| 623 |
-
"sets": 3,
|
| 624 |
-
"reps": "12",
|
| 625 |
-
"rest": 30,
|
| 626 |
-
"calories": 6,
|
| 627 |
-
"category": "glutes",
|
| 628 |
-
"originalName": "How to Do:SIDE BRIDGES"
|
| 629 |
-
},
|
| 630 |
-
{
|
| 631 |
-
"name": ":glúteo Kickback Pulsação",
|
| 632 |
-
"originalTitle": "How to Do:GLUTE KICKBACK PULSE",
|
| 633 |
-
"emoji": "🍑",
|
| 634 |
-
"youtubeId": "iWKyLz2CBRk",
|
| 635 |
-
"embedUrl": "https://www.youtube.com/embed/iWKyLz2CBRk",
|
| 636 |
-
"duration": "1:22",
|
| 637 |
-
"durationInSeconds": 82,
|
| 638 |
-
"thumbnail": "https://img.youtube.com/vi/iWKyLz2CBRk/maxresdefault.jpg",
|
| 639 |
-
"sets": 3,
|
| 640 |
-
"reps": "40s",
|
| 641 |
-
"rest": 30,
|
| 642 |
-
"calories": 11,
|
| 643 |
-
"category": "glutes",
|
| 644 |
-
"originalName": "How to Do:GLUTE KICKBACK PULSE"
|
| 645 |
-
},
|
| 646 |
-
{
|
| 647 |
-
"name": ":parede Glúteo Kickback Manter",
|
| 648 |
-
"originalTitle": "How to Do:WALL GLUTE KICKBACK HOLD",
|
| 649 |
-
"emoji": "🍑",
|
| 650 |
-
"youtubeId": "s0r8vzfQHpU",
|
| 651 |
-
"embedUrl": "https://www.youtube.com/embed/s0r8vzfQHpU",
|
| 652 |
-
"duration": "1:14",
|
| 653 |
-
"durationInSeconds": 74,
|
| 654 |
-
"thumbnail": "https://img.youtube.com/vi/s0r8vzfQHpU/maxresdefault.jpg",
|
| 655 |
-
"sets": 3,
|
| 656 |
-
"reps": "40s",
|
| 657 |
-
"rest": 30,
|
| 658 |
-
"calories": 10,
|
| 659 |
-
"category": "glutes",
|
| 660 |
-
"originalName": "How to Do:WALL GLUTE KICKBACK HOLD"
|
| 661 |
-
},
|
| 662 |
-
{
|
| 663 |
-
"name": ":parede Em Pé Glúteo Kickbacks",
|
| 664 |
-
"originalTitle": "How to Do:WALL STANDING GLUTE KICKBACKS",
|
| 665 |
-
"emoji": "🍑",
|
| 666 |
-
"youtubeId": "ACdGRnbfd5g",
|
| 667 |
-
"embedUrl": "https://www.youtube.com/embed/ACdGRnbfd5g",
|
| 668 |
-
"duration": "1:18",
|
| 669 |
-
"durationInSeconds": 78,
|
| 670 |
-
"thumbnail": "https://img.youtube.com/vi/ACdGRnbfd5g/maxresdefault.jpg",
|
| 671 |
-
"sets": 3,
|
| 672 |
-
"reps": "40s",
|
| 673 |
-
"rest": 30,
|
| 674 |
-
"calories": 10,
|
| 675 |
-
"category": "glutes",
|
| 676 |
-
"originalName": "How to Do:WALL STANDING GLUTE KICKBACKS"
|
| 677 |
-
},
|
| 678 |
-
{
|
| 679 |
-
"name": ":sentado Borboleta Alongamento",
|
| 680 |
-
"originalTitle": "How to Do:SEATED BUTTERFLY STRETCH",
|
| 681 |
-
"emoji": "🍑",
|
| 682 |
-
"youtubeId": "N-xrg7jYVW0",
|
| 683 |
-
"embedUrl": "https://www.youtube.com/embed/N-xrg7jYVW0",
|
| 684 |
-
"duration": "1:00",
|
| 685 |
-
"durationInSeconds": 60,
|
| 686 |
-
"thumbnail": "https://img.youtube.com/vi/N-xrg7jYVW0/maxresdefault.jpg",
|
| 687 |
-
"sets": 3,
|
| 688 |
-
"reps": "40s",
|
| 689 |
-
"rest": 30,
|
| 690 |
-
"calories": 8,
|
| 691 |
-
"category": "glutes",
|
| 692 |
-
"originalName": "How to Do:SEATED BUTTERFLY STRETCH"
|
| 693 |
-
},
|
| 694 |
-
{
|
| 695 |
-
"name": ":glúteo Kickback Crossover Com Perna",
|
| 696 |
-
"originalTitle": "How to Do:GLUTE KICKBACK CROSSOVER WITH LEG",
|
| 697 |
-
"emoji": "🍑",
|
| 698 |
-
"youtubeId": "Qw45SQRsf6o",
|
| 699 |
-
"embedUrl": "https://www.youtube.com/embed/Qw45SQRsf6o",
|
| 700 |
-
"duration": "1:16",
|
| 701 |
-
"durationInSeconds": 76,
|
| 702 |
-
"thumbnail": "https://img.youtube.com/vi/Qw45SQRsf6o/maxresdefault.jpg",
|
| 703 |
-
"sets": 3,
|
| 704 |
-
"reps": "40s",
|
| 705 |
-
"rest": 30,
|
| 706 |
-
"calories": 10,
|
| 707 |
-
"category": "glutes",
|
| 708 |
-
"originalName": "How to Do:GLUTE KICKBACK CROSSOVER WITH LEG"
|
| 709 |
-
},
|
| 710 |
-
{
|
| 711 |
-
"name": "Retrocesso De Glúteos Em Pé",
|
| 712 |
-
"originalTitle": "Como fazer: RETROCESSO DE GLÚTEOS EM PÉ",
|
| 713 |
-
"emoji": "🍑",
|
| 714 |
-
"youtubeId": "x38_i24TBKo",
|
| 715 |
-
"embedUrl": "https://www.youtube.com/embed/x38_i24TBKo",
|
| 716 |
-
"duration": "1:03",
|
| 717 |
-
"durationInSeconds": 63,
|
| 718 |
-
"thumbnail": "https://img.youtube.com/vi/x38_i24TBKo/maxresdefault.jpg",
|
| 719 |
-
"sets": 3,
|
| 720 |
-
"reps": "40s",
|
| 721 |
-
"rest": 30,
|
| 722 |
-
"calories": 8,
|
| 723 |
-
"category": "glutes",
|
| 724 |
-
"originalName": "Como fazer: RETROCESSO DE GLÚTEOS EM PÉ"
|
| 725 |
-
},
|
| 726 |
-
{
|
| 727 |
-
"name": ":quadril Hinge",
|
| 728 |
-
"originalTitle": "How to Do:HIP HINGE",
|
| 729 |
-
"emoji": "🍑",
|
| 730 |
-
"youtubeId": "8lTPa0eFcGg",
|
| 731 |
-
"embedUrl": "https://www.youtube.com/embed/8lTPa0eFcGg",
|
| 732 |
-
"duration": "1:21",
|
| 733 |
-
"durationInSeconds": 81,
|
| 734 |
-
"thumbnail": "https://img.youtube.com/vi/8lTPa0eFcGg/maxresdefault.jpg",
|
| 735 |
-
"sets": 3,
|
| 736 |
-
"reps": "40s",
|
| 737 |
-
"rest": 30,
|
| 738 |
-
"calories": 11,
|
| 739 |
-
"category": "glutes",
|
| 740 |
-
"originalName": "How to Do:HIP HINGE"
|
| 741 |
-
},
|
| 742 |
-
{
|
| 743 |
-
"name": ":em Pé Quadril Circle",
|
| 744 |
-
"originalTitle": "How to Do:STANDING HIP CIRCLE",
|
| 745 |
-
"emoji": "🍑",
|
| 746 |
-
"youtubeId": "8vDGZlWPa4I",
|
| 747 |
-
"embedUrl": "https://www.youtube.com/embed/8vDGZlWPa4I",
|
| 748 |
-
"duration": "1:07",
|
| 749 |
-
"durationInSeconds": 67,
|
| 750 |
-
"thumbnail": "https://img.youtube.com/vi/8vDGZlWPa4I/maxresdefault.jpg",
|
| 751 |
-
"sets": 3,
|
| 752 |
-
"reps": "40s",
|
| 753 |
-
"rest": 30,
|
| 754 |
-
"calories": 9,
|
| 755 |
-
"category": "glutes",
|
| 756 |
-
"originalName": "How to Do:STANDING HIP CIRCLE"
|
| 757 |
-
},
|
| 758 |
-
{
|
| 759 |
-
"name": ":halter Quadril Hinge",
|
| 760 |
-
"originalTitle": "How to Do:DUMBBELL HIP HINGE",
|
| 761 |
-
"emoji": "🍑",
|
| 762 |
-
"youtubeId": "8zI-lh7zdMg",
|
| 763 |
-
"embedUrl": "https://www.youtube.com/embed/8zI-lh7zdMg",
|
| 764 |
-
"duration": "1:10",
|
| 765 |
-
"durationInSeconds": 70,
|
| 766 |
-
"thumbnail": "https://img.youtube.com/vi/8zI-lh7zdMg/maxresdefault.jpg",
|
| 767 |
-
"sets": 3,
|
| 768 |
-
"reps": "40s",
|
| 769 |
-
"rest": 30,
|
| 770 |
-
"calories": 9,
|
| 771 |
-
"category": "glutes",
|
| 772 |
-
"originalName": "How to Do:DUMBBELL HIP HINGE"
|
| 773 |
-
},
|
| 774 |
-
{
|
| 775 |
-
"name": ":pilates Concha",
|
| 776 |
-
"originalTitle": "How to Do:PILATES CLAMSHELL",
|
| 777 |
-
"emoji": "🍑",
|
| 778 |
-
"youtubeId": "Iu7KgVTLGIg",
|
| 779 |
-
"embedUrl": "https://www.youtube.com/embed/Iu7KgVTLGIg",
|
| 780 |
-
"duration": "1:04",
|
| 781 |
-
"durationInSeconds": 64,
|
| 782 |
-
"thumbnail": "https://img.youtube.com/vi/Iu7KgVTLGIg/maxresdefault.jpg",
|
| 783 |
-
"sets": 3,
|
| 784 |
-
"reps": "40s",
|
| 785 |
-
"rest": 30,
|
| 786 |
-
"calories": 9,
|
| 787 |
-
"category": "glutes",
|
| 788 |
-
"originalName": "How to Do:PILATES CLAMSHELL"
|
| 789 |
-
},
|
| 790 |
-
{
|
| 791 |
-
"name": ":froggy Glúteo Lifts",
|
| 792 |
-
"originalTitle": "How to Do:FROGGY GLUTE LIFTS",
|
| 793 |
-
"emoji": "🍑",
|
| 794 |
-
"youtubeId": "FLvOCG1a2a4",
|
| 795 |
-
"embedUrl": "https://www.youtube.com/embed/FLvOCG1a2a4",
|
| 796 |
-
"duration": "1:11",
|
| 797 |
-
"durationInSeconds": 71,
|
| 798 |
-
"thumbnail": "https://img.youtube.com/vi/FLvOCG1a2a4/maxresdefault.jpg",
|
| 799 |
-
"sets": 3,
|
| 800 |
-
"reps": "40s",
|
| 801 |
-
"rest": 30,
|
| 802 |
-
"calories": 9,
|
| 803 |
-
"category": "glutes",
|
| 804 |
-
"originalName": "How to Do:FROGGY GLUTE LIFTS"
|
| 805 |
-
},
|
| 806 |
-
{
|
| 807 |
-
"name": ":lateral Pontes",
|
| 808 |
-
"originalTitle": "How to Do:SIDE BRIDGES",
|
| 809 |
-
"emoji": "🍑",
|
| 810 |
-
"youtubeId": "alFy6jqzjL8",
|
| 811 |
-
"embedUrl": "https://www.youtube.com/embed/alFy6jqzjL8",
|
| 812 |
-
"duration": "1:10",
|
| 813 |
-
"durationInSeconds": 70,
|
| 814 |
-
"thumbnail": "https://img.youtube.com/vi/alFy6jqzjL8/maxresdefault.jpg",
|
| 815 |
-
"sets": 3,
|
| 816 |
-
"reps": "40s",
|
| 817 |
-
"rest": 30,
|
| 818 |
-
"calories": 9,
|
| 819 |
-
"category": "glutes",
|
| 820 |
-
"originalName": "How to Do:SIDE BRIDGES"
|
| 821 |
-
},
|
| 822 |
-
{
|
| 823 |
-
"name": ":Coice De Trícepss",
|
| 824 |
-
"originalTitle": "How to Do:TRICEPS KICKBACKS",
|
| 825 |
-
"emoji": "🍑",
|
| 826 |
-
"youtubeId": "lAt2UAxKvSk",
|
| 827 |
-
"embedUrl": "https://www.youtube.com/embed/lAt2UAxKvSk",
|
| 828 |
-
"duration": "1:17",
|
| 829 |
-
"durationInSeconds": 77,
|
| 830 |
-
"thumbnail": "https://img.youtube.com/vi/lAt2UAxKvSk/maxresdefault.jpg",
|
| 831 |
-
"sets": 3,
|
| 832 |
-
"reps": "40s",
|
| 833 |
-
"rest": 30,
|
| 834 |
-
"calories": 10,
|
| 835 |
-
"category": "glutes",
|
| 836 |
-
"originalName": "How to Do:TRICEPS KICKBACKS"
|
| 837 |
-
},
|
| 838 |
-
{
|
| 839 |
-
"name": "Bumbum Kicks",
|
| 840 |
-
"originalTitle": "How to Do: BUTT KICKS",
|
| 841 |
-
"emoji": "🍑",
|
| 842 |
-
"youtubeId": "OQtrZe-6uns",
|
| 843 |
-
"embedUrl": "https://www.youtube.com/embed/OQtrZe-6uns",
|
| 844 |
-
"duration": "1:07",
|
| 845 |
-
"durationInSeconds": 67,
|
| 846 |
-
"thumbnail": "https://img.youtube.com/vi/OQtrZe-6uns/maxresdefault.jpg",
|
| 847 |
-
"sets": 3,
|
| 848 |
-
"reps": "40s",
|
| 849 |
-
"rest": 30,
|
| 850 |
-
"calories": 9,
|
| 851 |
-
"category": "glutes",
|
| 852 |
-
"originalName": "How to Do: BUTT KICKS"
|
| 853 |
-
},
|
| 854 |
-
{
|
| 855 |
-
"name": "Glúteo Alongamento",
|
| 856 |
-
"originalTitle": "How to Do: GLUTE STRETCH",
|
| 857 |
-
"emoji": "🍑",
|
| 858 |
-
"youtubeId": "Gste7GKLBzw",
|
| 859 |
-
"embedUrl": "https://www.youtube.com/embed/Gste7GKLBzw",
|
| 860 |
-
"duration": "0:54",
|
| 861 |
-
"durationInSeconds": 54,
|
| 862 |
-
"thumbnail": "https://img.youtube.com/vi/Gste7GKLBzw/maxresdefault.jpg",
|
| 863 |
-
"sets": 3,
|
| 864 |
-
"reps": "40s",
|
| 865 |
-
"rest": 30,
|
| 866 |
-
"calories": 7,
|
| 867 |
-
"category": "glutes",
|
| 868 |
-
"originalName": "How to Do: GLUTE STRETCH"
|
| 869 |
-
},
|
| 870 |
-
{
|
| 871 |
-
"name": "Lateral Deitado Kickback",
|
| 872 |
-
"originalTitle": "How to Do: SIDE LYING KICKBACK",
|
| 873 |
-
"emoji": "🍑",
|
| 874 |
-
"youtubeId": "oXAYPmKW-QI",
|
| 875 |
-
"embedUrl": "https://www.youtube.com/embed/oXAYPmKW-QI",
|
| 876 |
-
"duration": "1:20",
|
| 877 |
-
"durationInSeconds": 80,
|
| 878 |
-
"thumbnail": "https://img.youtube.com/vi/oXAYPmKW-QI/maxresdefault.jpg",
|
| 879 |
-
"sets": 3,
|
| 880 |
-
"reps": "40s",
|
| 881 |
-
"rest": 30,
|
| 882 |
-
"calories": 11,
|
| 883 |
-
"category": "glutes",
|
| 884 |
-
"originalName": "How to Do: SIDE LYING KICKBACK"
|
| 885 |
-
},
|
| 886 |
-
{
|
| 887 |
-
"name": "Glúteo Chute Costas",
|
| 888 |
-
"originalTitle": "How to Do: GLUTE KICK BACK",
|
| 889 |
-
"emoji": "🍑",
|
| 890 |
-
"youtubeId": "x_08WvdRY-I",
|
| 891 |
-
"embedUrl": "https://www.youtube.com/embed/x_08WvdRY-I",
|
| 892 |
-
"duration": "1:08",
|
| 893 |
-
"durationInSeconds": 68,
|
| 894 |
-
"thumbnail": "https://img.youtube.com/vi/x_08WvdRY-I/maxresdefault.jpg",
|
| 895 |
-
"sets": 3,
|
| 896 |
-
"reps": "40s",
|
| 897 |
-
"rest": 30,
|
| 898 |
-
"calories": 9,
|
| 899 |
-
"category": "glutes",
|
| 900 |
-
"originalName": "How to Do: GLUTE KICK BACK"
|
| 901 |
-
},
|
| 902 |
-
{
|
| 903 |
-
"name": "Banco Glúteo Chute Costas",
|
| 904 |
-
"originalTitle": "How to Do: BENCH GLUTE KICK BACK",
|
| 905 |
-
"emoji": "🍑",
|
| 906 |
-
"youtubeId": "MI-jYzIv6JM",
|
| 907 |
-
"embedUrl": "https://www.youtube.com/embed/MI-jYzIv6JM",
|
| 908 |
-
"duration": "1:14",
|
| 909 |
-
"durationInSeconds": 74,
|
| 910 |
-
"thumbnail": "https://img.youtube.com/vi/MI-jYzIv6JM/maxresdefault.jpg",
|
| 911 |
-
"sets": 3,
|
| 912 |
-
"reps": "40s",
|
| 913 |
-
"rest": 30,
|
| 914 |
-
"calories": 10,
|
| 915 |
-
"category": "glutes",
|
| 916 |
-
"originalName": "How to Do: BENCH GLUTE KICK BACK"
|
| 917 |
-
},
|
| 918 |
-
{
|
| 919 |
-
"name": "Coice De Glúteo",
|
| 920 |
-
"originalTitle": "How to Do: DONKEY KICKS",
|
| 921 |
-
"emoji": "🍑",
|
| 922 |
-
"youtubeId": "Sc8e7yCYvPQ",
|
| 923 |
-
"embedUrl": "https://www.youtube.com/embed/Sc8e7yCYvPQ",
|
| 924 |
-
"duration": "1:14",
|
| 925 |
-
"durationInSeconds": 74,
|
| 926 |
-
"thumbnail": "https://img.youtube.com/vi/Sc8e7yCYvPQ/maxresdefault.jpg",
|
| 927 |
-
"sets": 3,
|
| 928 |
-
"reps": "40s",
|
| 929 |
-
"rest": 30,
|
| 930 |
-
"calories": 10,
|
| 931 |
-
"category": "glutes",
|
| 932 |
-
"originalName": "How to Do: DONKEY KICKS"
|
| 933 |
-
},
|
| 934 |
-
{
|
| 935 |
-
"name": "Em Pé Glúteo Kickbacks",
|
| 936 |
-
"originalTitle": "How to Do: STANDING GLUTE KICKBACKS",
|
| 937 |
-
"emoji": "🍑",
|
| 938 |
-
"youtubeId": "HypzhX00s6E",
|
| 939 |
-
"embedUrl": "https://www.youtube.com/embed/HypzhX00s6E",
|
| 940 |
-
"duration": "1:08",
|
| 941 |
-
"durationInSeconds": 68,
|
| 942 |
-
"thumbnail": "https://img.youtube.com/vi/HypzhX00s6E/maxresdefault.jpg",
|
| 943 |
-
"sets": 3,
|
| 944 |
-
"reps": "40s",
|
| 945 |
-
"rest": 30,
|
| 946 |
-
"calories": 9,
|
| 947 |
-
"category": "glutes",
|
| 948 |
-
"originalName": "How to Do: STANDING GLUTE KICKBACKS"
|
| 949 |
-
},
|
| 950 |
-
{
|
| 951 |
-
"name": "Quadril Ponte & Perna Levantamento",
|
| 952 |
-
"originalTitle": "How to Do: HIP BRIDGE & LEG LIFT",
|
| 953 |
-
"emoji": "🍑",
|
| 954 |
-
"youtubeId": "NQZfLEakvhw",
|
| 955 |
-
"embedUrl": "https://www.youtube.com/embed/NQZfLEakvhw",
|
| 956 |
-
"duration": "1:07",
|
| 957 |
-
"durationInSeconds": 67,
|
| 958 |
-
"thumbnail": "https://img.youtube.com/vi/NQZfLEakvhw/maxresdefault.jpg",
|
| 959 |
-
"sets": 3,
|
| 960 |
-
"reps": "40s",
|
| 961 |
-
"rest": 30,
|
| 962 |
-
"calories": 9,
|
| 963 |
-
"category": "glutes",
|
| 964 |
-
"originalName": "How to Do: HIP BRIDGE & LEG LIFT"
|
| 965 |
-
},
|
| 966 |
-
{
|
| 967 |
-
"name": "Hidrante",
|
| 968 |
-
"originalTitle": "How to Do: FIRE HYDRANT",
|
| 969 |
-
"emoji": "🍑",
|
| 970 |
-
"youtubeId": "5u6klvw1oh0",
|
| 971 |
-
"embedUrl": "https://www.youtube.com/embed/5u6klvw1oh0",
|
| 972 |
-
"duration": "1:15",
|
| 973 |
-
"durationInSeconds": 75,
|
| 974 |
-
"thumbnail": "https://img.youtube.com/vi/5u6klvw1oh0/maxresdefault.jpg",
|
| 975 |
-
"sets": 3,
|
| 976 |
-
"reps": "40s",
|
| 977 |
-
"rest": 30,
|
| 978 |
-
"calories": 10,
|
| 979 |
-
"category": "glutes",
|
| 980 |
-
"originalName": "How to Do: FIRE HYDRANT"
|
| 981 |
-
},
|
| 982 |
-
{
|
| 983 |
-
"name": "Bumbum Ponte",
|
| 984 |
-
"originalTitle": "How to Do: BUTT BRIDGE",
|
| 985 |
-
"emoji": "🍑",
|
| 986 |
-
"youtubeId": "SfHqMoDVDk0",
|
| 987 |
-
"embedUrl": "https://www.youtube.com/embed/SfHqMoDVDk0",
|
| 988 |
-
"duration": "0:58",
|
| 989 |
-
"durationInSeconds": 58,
|
| 990 |
-
"thumbnail": "https://img.youtube.com/vi/SfHqMoDVDk0/maxresdefault.jpg",
|
| 991 |
-
"sets": 3,
|
| 992 |
-
"reps": "40s",
|
| 993 |
-
"rest": 30,
|
| 994 |
-
"calories": 8,
|
| 995 |
-
"category": "glutes",
|
| 996 |
-
"originalName": "How to Do: BUTT BRIDGE"
|
| 997 |
-
},
|
| 998 |
-
{
|
| 999 |
-
"name": "Ponte",
|
| 1000 |
-
"originalTitle": "How to Do: BRIDGE",
|
| 1001 |
-
"emoji": "🍑",
|
| 1002 |
-
"youtubeId": "A9J-1LHgnSw",
|
| 1003 |
-
"embedUrl": "https://www.youtube.com/embed/A9J-1LHgnSw",
|
| 1004 |
-
"duration": "0:50",
|
| 1005 |
-
"durationInSeconds": 50,
|
| 1006 |
-
"thumbnail": "https://img.youtube.com/vi/A9J-1LHgnSw/maxresdefault.jpg",
|
| 1007 |
-
"sets": 3,
|
| 1008 |
-
"reps": "40s",
|
| 1009 |
-
"rest": 30,
|
| 1010 |
-
"calories": 7,
|
| 1011 |
-
"category": "glutes",
|
| 1012 |
-
"originalName": "How to Do: BRIDGE"
|
| 1013 |
-
},
|
| 1014 |
-
{
|
| 1015 |
-
"name": "Glúteo Chute Costas",
|
| 1016 |
-
"originalTitle": "How to Do: GLUTE KICK BACK",
|
| 1017 |
-
"emoji": "🍑",
|
| 1018 |
-
"youtubeId": "AQVtOKnvvs0",
|
| 1019 |
-
"embedUrl": "https://www.youtube.com/embed/AQVtOKnvvs0",
|
| 1020 |
-
"duration": "1:00",
|
| 1021 |
-
"durationInSeconds": 60,
|
| 1022 |
-
"thumbnail": "https://img.youtube.com/vi/AQVtOKnvvs0/maxresdefault.jpg",
|
| 1023 |
-
"sets": 3,
|
| 1024 |
-
"reps": "40s",
|
| 1025 |
-
"rest": 30,
|
| 1026 |
-
"calories": 8,
|
| 1027 |
-
"category": "glutes",
|
| 1028 |
-
"originalName": "How to Do: GLUTE KICK BACK"
|
| 1029 |
-
}
|
| 1030 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/legs.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
public/exercises-chunks/mobility.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: mobility
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 1
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_MOBILITY = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Parede Em Pé Thoracic Esquerda",
|
| 8 |
-
"originalTitle": "How to Do: WALL STANDING THORACIC LEFT",
|
| 9 |
-
"emoji": "🤸♀️",
|
| 10 |
-
"youtubeId": "vrN34L25mBk",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/vrN34L25mBk",
|
| 12 |
-
"duration": "1:02",
|
| 13 |
-
"durationInSeconds": 62,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/vrN34L25mBk/maxresdefault.jpg",
|
| 15 |
-
"sets": 2,
|
| 16 |
-
"reps": "45s",
|
| 17 |
-
"rest": 15,
|
| 18 |
-
"calories": 3,
|
| 19 |
-
"category": "mobility",
|
| 20 |
-
"originalName": "How to Do: WALL STANDING THORACIC LEFT"
|
| 21 |
-
}
|
| 22 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/waist.js
DELETED
|
@@ -1,262 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: waist
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 16
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_WAIST = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Half Barco Torção",
|
| 8 |
-
"originalTitle": "How to Do: HALF BOAT TWIST",
|
| 9 |
-
"emoji": "⏳",
|
| 10 |
-
"youtubeId": "PSZgJiFIrHQ",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/PSZgJiFIrHQ",
|
| 12 |
-
"duration": "1:02",
|
| 13 |
-
"durationInSeconds": 62,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/PSZgJiFIrHQ/maxresdefault.jpg",
|
| 15 |
-
"sets": 3,
|
| 16 |
-
"reps": "40s",
|
| 17 |
-
"rest": 30,
|
| 18 |
-
"calories": 7,
|
| 19 |
-
"category": "waist",
|
| 20 |
-
"originalName": "How to Do: HALF BOAT TWIST"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": ":twisting Piston",
|
| 24 |
-
"originalTitle": "How to Do:TWISTING PISTON",
|
| 25 |
-
"emoji": "⏳",
|
| 26 |
-
"youtubeId": "HilAisRJCgo",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/HilAisRJCgo",
|
| 28 |
-
"duration": "0:47",
|
| 29 |
-
"durationInSeconds": 47,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/HilAisRJCgo/maxresdefault.jpg",
|
| 31 |
-
"sets": 3,
|
| 32 |
-
"reps": "12",
|
| 33 |
-
"rest": 30,
|
| 34 |
-
"calories": 5,
|
| 35 |
-
"category": "waist",
|
| 36 |
-
"originalName": "How to Do:TWISTING PISTON"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": ":sentado Lateral Flexão",
|
| 40 |
-
"originalTitle": "How to Do:SEATED SIDE BEND",
|
| 41 |
-
"emoji": "⏳",
|
| 42 |
-
"youtubeId": "jKcHh78Y_JE",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/jKcHh78Y_JE",
|
| 44 |
-
"duration": "0:40",
|
| 45 |
-
"durationInSeconds": 40,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/jKcHh78Y_JE/maxresdefault.jpg",
|
| 47 |
-
"sets": 3,
|
| 48 |
-
"reps": "12",
|
| 49 |
-
"rest": 30,
|
| 50 |
-
"calories": 5,
|
| 51 |
-
"category": "waist",
|
| 52 |
-
"originalName": "How to Do:SEATED SIDE BEND"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": ":sentado Spinal Torção",
|
| 56 |
-
"originalTitle": "How to Do:SEATED SPINAL TWIST",
|
| 57 |
-
"emoji": "⏳",
|
| 58 |
-
"youtubeId": "4YlCtaTdtgA",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/4YlCtaTdtgA",
|
| 60 |
-
"duration": "0:51",
|
| 61 |
-
"durationInSeconds": 51,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/4YlCtaTdtgA/maxresdefault.jpg",
|
| 63 |
-
"sets": 3,
|
| 64 |
-
"reps": "40s",
|
| 65 |
-
"rest": 30,
|
| 66 |
-
"calories": 6,
|
| 67 |
-
"category": "waist",
|
| 68 |
-
"originalName": "How to Do:SEATED SPINAL TWIST"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": ":torso Torção",
|
| 72 |
-
"originalTitle": "How to Do:TORSO TWIST",
|
| 73 |
-
"emoji": "⏳",
|
| 74 |
-
"youtubeId": "HMKbmG1L7vc",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/HMKbmG1L7vc",
|
| 76 |
-
"duration": "0:37",
|
| 77 |
-
"durationInSeconds": 37,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/HMKbmG1L7vc/maxresdefault.jpg",
|
| 79 |
-
"sets": 3,
|
| 80 |
-
"reps": "12",
|
| 81 |
-
"rest": 30,
|
| 82 |
-
"calories": 4,
|
| 83 |
-
"category": "waist",
|
| 84 |
-
"originalName": "How to Do:TORSO TWIST"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": ":em Pé Lateral Flexão",
|
| 88 |
-
"originalTitle": "How to Do:STANDING SIDE BEND",
|
| 89 |
-
"emoji": "⏳",
|
| 90 |
-
"youtubeId": "RfuiraEgKcY",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/RfuiraEgKcY",
|
| 92 |
-
"duration": "0:48",
|
| 93 |
-
"durationInSeconds": 48,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/RfuiraEgKcY/maxresdefault.jpg",
|
| 95 |
-
"sets": 3,
|
| 96 |
-
"reps": "12",
|
| 97 |
-
"rest": 30,
|
| 98 |
-
"calories": 6,
|
| 99 |
-
"category": "waist",
|
| 100 |
-
"originalName": "How to Do:STANDING SIDE BEND"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": ":sit-para Cima Torção",
|
| 104 |
-
"originalTitle": "How to Do:SIT-UP TWIST",
|
| 105 |
-
"emoji": "⏳",
|
| 106 |
-
"youtubeId": "_xzyH6NP_9k",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/_xzyH6NP_9k",
|
| 108 |
-
"duration": "0:53",
|
| 109 |
-
"durationInSeconds": 53,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/_xzyH6NP_9k/maxresdefault.jpg",
|
| 111 |
-
"sets": 3,
|
| 112 |
-
"reps": "40s",
|
| 113 |
-
"rest": 30,
|
| 114 |
-
"calories": 6,
|
| 115 |
-
"category": "waist",
|
| 116 |
-
"originalName": "How to Do:SIT-UP TWIST"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": "Deitado Torção Alongamento",
|
| 120 |
-
"originalTitle": "How to Do: LYING TWIST STRETCH",
|
| 121 |
-
"emoji": "⏳",
|
| 122 |
-
"youtubeId": "ZI-j_POtzlU",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/ZI-j_POtzlU",
|
| 124 |
-
"duration": "0:38",
|
| 125 |
-
"durationInSeconds": 38,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/ZI-j_POtzlU/maxresdefault.jpg",
|
| 127 |
-
"sets": 3,
|
| 128 |
-
"reps": "12",
|
| 129 |
-
"rest": 30,
|
| 130 |
-
"calories": 4,
|
| 131 |
-
"category": "waist",
|
| 132 |
-
"originalName": "How to Do: LYING TWIST STRETCH"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": "Reclined Oblíquo Torção",
|
| 136 |
-
"originalTitle": "How to Do: RECLINED OBLIQUE TWIST",
|
| 137 |
-
"emoji": "⏳",
|
| 138 |
-
"youtubeId": "XKW5jru5pGo",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/XKW5jru5pGo",
|
| 140 |
-
"duration": "0:49",
|
| 141 |
-
"durationInSeconds": 49,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/XKW5jru5pGo/maxresdefault.jpg",
|
| 143 |
-
"sets": 3,
|
| 144 |
-
"reps": "12",
|
| 145 |
-
"rest": 30,
|
| 146 |
-
"calories": 6,
|
| 147 |
-
"category": "waist",
|
| 148 |
-
"originalName": "How to Do: RECLINED OBLIQUE TWIST"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": "Torção Fazer Torso",
|
| 152 |
-
"originalTitle": "Como fazer: TORÇÃO DO TORSO",
|
| 153 |
-
"emoji": "⏳",
|
| 154 |
-
"youtubeId": "f4Qah0bQTIo",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/f4Qah0bQTIo",
|
| 156 |
-
"duration": "1:03",
|
| 157 |
-
"durationInSeconds": 63,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/f4Qah0bQTIo/maxresdefault.jpg",
|
| 159 |
-
"sets": 3,
|
| 160 |
-
"reps": "40s",
|
| 161 |
-
"rest": 30,
|
| 162 |
-
"calories": 7,
|
| 163 |
-
"category": "waist",
|
| 164 |
-
"originalName": "Como fazer: TORÇÃO DO TORSO"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": ":sentado Lateral Flexão",
|
| 168 |
-
"originalTitle": "How to Do:SEATED SIDE BEND",
|
| 169 |
-
"emoji": "⏳",
|
| 170 |
-
"youtubeId": "KS5j-mvDLh0",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/KS5j-mvDLh0",
|
| 172 |
-
"duration": "0:58",
|
| 173 |
-
"durationInSeconds": 58,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/KS5j-mvDLh0/maxresdefault.jpg",
|
| 175 |
-
"sets": 3,
|
| 176 |
-
"reps": "40s",
|
| 177 |
-
"rest": 30,
|
| 178 |
-
"calories": 7,
|
| 179 |
-
"category": "waist",
|
| 180 |
-
"originalName": "How to Do:SEATED SIDE BEND"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": ":sit-para Cima Torção",
|
| 184 |
-
"originalTitle": "How to Do:SIT-UP TWIST",
|
| 185 |
-
"emoji": "⏳",
|
| 186 |
-
"youtubeId": "z942YS7nKQA",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/z942YS7nKQA",
|
| 188 |
-
"duration": "1:30",
|
| 189 |
-
"durationInSeconds": 90,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/z942YS7nKQA/maxresdefault.jpg",
|
| 191 |
-
"sets": 3,
|
| 192 |
-
"reps": "40s",
|
| 193 |
-
"rest": 30,
|
| 194 |
-
"calories": 11,
|
| 195 |
-
"category": "waist",
|
| 196 |
-
"originalName": "How to Do:SIT-UP TWIST"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": ":em Pé Lateral Flexão",
|
| 200 |
-
"originalTitle": "How to Do:STANDING SIDE BEND",
|
| 201 |
-
"emoji": "⏳",
|
| 202 |
-
"youtubeId": "fHyCshP7U1Y",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/fHyCshP7U1Y",
|
| 204 |
-
"duration": "0:57",
|
| 205 |
-
"durationInSeconds": 57,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/fHyCshP7U1Y/maxresdefault.jpg",
|
| 207 |
-
"sets": 3,
|
| 208 |
-
"reps": "40s",
|
| 209 |
-
"rest": 30,
|
| 210 |
-
"calories": 7,
|
| 211 |
-
"category": "waist",
|
| 212 |
-
"originalName": "How to Do:STANDING SIDE BEND"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": ":sentado Spinal Torção",
|
| 216 |
-
"originalTitle": "How to Do:SEATED SPINAL TWIST",
|
| 217 |
-
"emoji": "⏳",
|
| 218 |
-
"youtubeId": "T1ocAPNFJJY",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/T1ocAPNFJJY",
|
| 220 |
-
"duration": "0:49",
|
| 221 |
-
"durationInSeconds": 49,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/T1ocAPNFJJY/maxresdefault.jpg",
|
| 223 |
-
"sets": 3,
|
| 224 |
-
"reps": "12",
|
| 225 |
-
"rest": 30,
|
| 226 |
-
"calories": 6,
|
| 227 |
-
"category": "waist",
|
| 228 |
-
"originalName": "How to Do:SEATED SPINAL TWIST"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": "Alongamento Com Torção Deitada",
|
| 232 |
-
"originalTitle": "Como fazer: Alongamento com torção deitada",
|
| 233 |
-
"emoji": "⏳",
|
| 234 |
-
"youtubeId": "6c6Zk3SBzrk",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/6c6Zk3SBzrk",
|
| 236 |
-
"duration": "1:06",
|
| 237 |
-
"durationInSeconds": 66,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/6c6Zk3SBzrk/maxresdefault.jpg",
|
| 239 |
-
"sets": 3,
|
| 240 |
-
"reps": "40s",
|
| 241 |
-
"rest": 30,
|
| 242 |
-
"calories": 8,
|
| 243 |
-
"category": "waist",
|
| 244 |
-
"originalName": "Como fazer: Alongamento com torção deitada"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": "Reclined Oblíquo Torção",
|
| 248 |
-
"originalTitle": "How to Do: RECLINED OBLIQUE TWIST",
|
| 249 |
-
"emoji": "⏳",
|
| 250 |
-
"youtubeId": "F_S53B3cKoU",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/F_S53B3cKoU",
|
| 252 |
-
"duration": "1:09",
|
| 253 |
-
"durationInSeconds": 69,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/F_S53B3cKoU/maxresdefault.jpg",
|
| 255 |
-
"sets": 3,
|
| 256 |
-
"reps": "40s",
|
| 257 |
-
"rest": 30,
|
| 258 |
-
"calories": 8,
|
| 259 |
-
"category": "waist",
|
| 260 |
-
"originalName": "How to Do: RECLINED OBLIQUE TWIST"
|
| 261 |
-
}
|
| 262 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-chunks/yoga.js
DELETED
|
@@ -1,918 +0,0 @@
|
|
| 1 |
-
// 🏋️ Exercises Chunk: yoga
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Total exercises: 57
|
| 4 |
-
|
| 5 |
-
export const EXERCISES_YOGA = [
|
| 6 |
-
{
|
| 7 |
-
"name": "Half Moon Pose",
|
| 8 |
-
"originalTitle": "How to Do: HALF MOON POSE",
|
| 9 |
-
"emoji": "🧘♀️",
|
| 10 |
-
"youtubeId": "TznRHywkPwU",
|
| 11 |
-
"embedUrl": "https://www.youtube.com/embed/TznRHywkPwU",
|
| 12 |
-
"duration": "1:12",
|
| 13 |
-
"durationInSeconds": 72,
|
| 14 |
-
"thumbnail": "https://img.youtube.com/vi/TznRHywkPwU/maxresdefault.jpg",
|
| 15 |
-
"sets": 2,
|
| 16 |
-
"reps": "45s",
|
| 17 |
-
"rest": 15,
|
| 18 |
-
"calories": 5,
|
| 19 |
-
"category": "yoga",
|
| 20 |
-
"originalName": "How to Do: HALF MOON POSE"
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"name": "Guerreiro Iii",
|
| 24 |
-
"originalTitle": "How to Do: WARRIOR III",
|
| 25 |
-
"emoji": "🧘♀️",
|
| 26 |
-
"youtubeId": "ySy_k5R3lHg",
|
| 27 |
-
"embedUrl": "https://www.youtube.com/embed/ySy_k5R3lHg",
|
| 28 |
-
"duration": "1:09",
|
| 29 |
-
"durationInSeconds": 69,
|
| 30 |
-
"thumbnail": "https://img.youtube.com/vi/ySy_k5R3lHg/maxresdefault.jpg",
|
| 31 |
-
"sets": 2,
|
| 32 |
-
"reps": "45s",
|
| 33 |
-
"rest": 15,
|
| 34 |
-
"calories": 5,
|
| 35 |
-
"category": "yoga",
|
| 36 |
-
"originalName": "How to Do: WARRIOR III"
|
| 37 |
-
},
|
| 38 |
-
{
|
| 39 |
-
"name": "Reverse Guerreiro",
|
| 40 |
-
"originalTitle": "How to Do: REVERSE WARRIOR",
|
| 41 |
-
"emoji": "🧘♀️",
|
| 42 |
-
"youtubeId": "8LmWu5XnEWc",
|
| 43 |
-
"embedUrl": "https://www.youtube.com/embed/8LmWu5XnEWc",
|
| 44 |
-
"duration": "1:43",
|
| 45 |
-
"durationInSeconds": 103,
|
| 46 |
-
"thumbnail": "https://img.youtube.com/vi/8LmWu5XnEWc/maxresdefault.jpg",
|
| 47 |
-
"sets": 2,
|
| 48 |
-
"reps": "45s",
|
| 49 |
-
"rest": 15,
|
| 50 |
-
"calories": 7,
|
| 51 |
-
"category": "yoga",
|
| 52 |
-
"originalName": "How to Do: REVERSE WARRIOR"
|
| 53 |
-
},
|
| 54 |
-
{
|
| 55 |
-
"name": "Guerreiro Ii",
|
| 56 |
-
"originalTitle": "How to Do: WARRIOR II",
|
| 57 |
-
"emoji": "🧘♀️",
|
| 58 |
-
"youtubeId": "YSjBJDkA6zg",
|
| 59 |
-
"embedUrl": "https://www.youtube.com/embed/YSjBJDkA6zg",
|
| 60 |
-
"duration": "1:20",
|
| 61 |
-
"durationInSeconds": 80,
|
| 62 |
-
"thumbnail": "https://img.youtube.com/vi/YSjBJDkA6zg/maxresdefault.jpg",
|
| 63 |
-
"sets": 2,
|
| 64 |
-
"reps": "45s",
|
| 65 |
-
"rest": 15,
|
| 66 |
-
"calories": 5,
|
| 67 |
-
"category": "yoga",
|
| 68 |
-
"originalName": "How to Do: WARRIOR II"
|
| 69 |
-
},
|
| 70 |
-
{
|
| 71 |
-
"name": "Humble Guerreiro",
|
| 72 |
-
"originalTitle": "How to Do: HUMBLE WARRIOR",
|
| 73 |
-
"emoji": "🧘♀️",
|
| 74 |
-
"youtubeId": "a6ANkE4emF8",
|
| 75 |
-
"embedUrl": "https://www.youtube.com/embed/a6ANkE4emF8",
|
| 76 |
-
"duration": "1:42",
|
| 77 |
-
"durationInSeconds": 102,
|
| 78 |
-
"thumbnail": "https://img.youtube.com/vi/a6ANkE4emF8/maxresdefault.jpg",
|
| 79 |
-
"sets": 2,
|
| 80 |
-
"reps": "45s",
|
| 81 |
-
"rest": 15,
|
| 82 |
-
"calories": 7,
|
| 83 |
-
"category": "yoga",
|
| 84 |
-
"originalName": "How to Do: HUMBLE WARRIOR"
|
| 85 |
-
},
|
| 86 |
-
{
|
| 87 |
-
"name": "Revolved Triângulo Pose",
|
| 88 |
-
"originalTitle": "How to Do: REVOLVED TRIANGLE POSE",
|
| 89 |
-
"emoji": "🧘♀️",
|
| 90 |
-
"youtubeId": "Tbz3FVAjVtI",
|
| 91 |
-
"embedUrl": "https://www.youtube.com/embed/Tbz3FVAjVtI",
|
| 92 |
-
"duration": "1:16",
|
| 93 |
-
"durationInSeconds": 76,
|
| 94 |
-
"thumbnail": "https://img.youtube.com/vi/Tbz3FVAjVtI/maxresdefault.jpg",
|
| 95 |
-
"sets": 2,
|
| 96 |
-
"reps": "45s",
|
| 97 |
-
"rest": 15,
|
| 98 |
-
"calories": 5,
|
| 99 |
-
"category": "yoga",
|
| 100 |
-
"originalName": "How to Do: REVOLVED TRIANGLE POSE"
|
| 101 |
-
},
|
| 102 |
-
{
|
| 103 |
-
"name": "Sphinx Pose",
|
| 104 |
-
"originalTitle": "How to Do: SPHINX POSE",
|
| 105 |
-
"emoji": "🧘♀️",
|
| 106 |
-
"youtubeId": "7a_WhOoegHE",
|
| 107 |
-
"embedUrl": "https://www.youtube.com/embed/7a_WhOoegHE",
|
| 108 |
-
"duration": "1:02",
|
| 109 |
-
"durationInSeconds": 62,
|
| 110 |
-
"thumbnail": "https://img.youtube.com/vi/7a_WhOoegHE/maxresdefault.jpg",
|
| 111 |
-
"sets": 2,
|
| 112 |
-
"reps": "45s",
|
| 113 |
-
"rest": 15,
|
| 114 |
-
"calories": 4,
|
| 115 |
-
"category": "yoga",
|
| 116 |
-
"originalName": "How to Do: SPHINX POSE"
|
| 117 |
-
},
|
| 118 |
-
{
|
| 119 |
-
"name": "Happy Baby Pose",
|
| 120 |
-
"originalTitle": "How to Do: HAPPY BABY POSE",
|
| 121 |
-
"emoji": "🧘♀️",
|
| 122 |
-
"youtubeId": "z-BjiGQZe4s",
|
| 123 |
-
"embedUrl": "https://www.youtube.com/embed/z-BjiGQZe4s",
|
| 124 |
-
"duration": "1:04",
|
| 125 |
-
"durationInSeconds": 64,
|
| 126 |
-
"thumbnail": "https://img.youtube.com/vi/z-BjiGQZe4s/maxresdefault.jpg",
|
| 127 |
-
"sets": 2,
|
| 128 |
-
"reps": "45s",
|
| 129 |
-
"rest": 15,
|
| 130 |
-
"calories": 4,
|
| 131 |
-
"category": "yoga",
|
| 132 |
-
"originalName": "How to Do: HAPPY BABY POSE"
|
| 133 |
-
},
|
| 134 |
-
{
|
| 135 |
-
"name": "Walk Dog",
|
| 136 |
-
"originalTitle": "How to Do: WALK THE DOG",
|
| 137 |
-
"emoji": "🧘♀️",
|
| 138 |
-
"youtubeId": "PCgS48SiR2k",
|
| 139 |
-
"embedUrl": "https://www.youtube.com/embed/PCgS48SiR2k",
|
| 140 |
-
"duration": "1:04",
|
| 141 |
-
"durationInSeconds": 64,
|
| 142 |
-
"thumbnail": "https://img.youtube.com/vi/PCgS48SiR2k/maxresdefault.jpg",
|
| 143 |
-
"sets": 2,
|
| 144 |
-
"reps": "45s",
|
| 145 |
-
"rest": 15,
|
| 146 |
-
"calories": 4,
|
| 147 |
-
"category": "yoga",
|
| 148 |
-
"originalName": "How to Do: WALK THE DOG"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"name": "Garland Pose",
|
| 152 |
-
"originalTitle": "How to Do: GARLAND POSE",
|
| 153 |
-
"emoji": "🧘♀️",
|
| 154 |
-
"youtubeId": "_xJPi7yuelw",
|
| 155 |
-
"embedUrl": "https://www.youtube.com/embed/_xJPi7yuelw",
|
| 156 |
-
"duration": "1:09",
|
| 157 |
-
"durationInSeconds": 69,
|
| 158 |
-
"thumbnail": "https://img.youtube.com/vi/_xJPi7yuelw/maxresdefault.jpg",
|
| 159 |
-
"sets": 2,
|
| 160 |
-
"reps": "45s",
|
| 161 |
-
"rest": 15,
|
| 162 |
-
"calories": 5,
|
| 163 |
-
"category": "yoga",
|
| 164 |
-
"originalName": "How to Do: GARLAND POSE"
|
| 165 |
-
},
|
| 166 |
-
{
|
| 167 |
-
"name": "Revolved Cadeira Pose",
|
| 168 |
-
"originalTitle": "How to Do: REVOLVED CHAIR POSE",
|
| 169 |
-
"emoji": "🧘♀️",
|
| 170 |
-
"youtubeId": "pQOK2-E-5sM",
|
| 171 |
-
"embedUrl": "https://www.youtube.com/embed/pQOK2-E-5sM",
|
| 172 |
-
"duration": "1:09",
|
| 173 |
-
"durationInSeconds": 69,
|
| 174 |
-
"thumbnail": "https://img.youtube.com/vi/pQOK2-E-5sM/maxresdefault.jpg",
|
| 175 |
-
"sets": 2,
|
| 176 |
-
"reps": "45s",
|
| 177 |
-
"rest": 15,
|
| 178 |
-
"calories": 5,
|
| 179 |
-
"category": "yoga",
|
| 180 |
-
"originalName": "How to Do: REVOLVED CHAIR POSE"
|
| 181 |
-
},
|
| 182 |
-
{
|
| 183 |
-
"name": "Goddess Pose",
|
| 184 |
-
"originalTitle": "How to Do: GODDESS POSE",
|
| 185 |
-
"emoji": "🧘♀️",
|
| 186 |
-
"youtubeId": "AhX3PujoRgo",
|
| 187 |
-
"embedUrl": "https://www.youtube.com/embed/AhX3PujoRgo",
|
| 188 |
-
"duration": "1:11",
|
| 189 |
-
"durationInSeconds": 71,
|
| 190 |
-
"thumbnail": "https://img.youtube.com/vi/AhX3PujoRgo/maxresdefault.jpg",
|
| 191 |
-
"sets": 2,
|
| 192 |
-
"reps": "45s",
|
| 193 |
-
"rest": 15,
|
| 194 |
-
"calories": 5,
|
| 195 |
-
"category": "yoga",
|
| 196 |
-
"originalName": "How to Do: GODDESS POSE"
|
| 197 |
-
},
|
| 198 |
-
{
|
| 199 |
-
"name": "Upward Facing Dog",
|
| 200 |
-
"originalTitle": "How to Do: UPWARD FACING DOG",
|
| 201 |
-
"emoji": "🧘♀️",
|
| 202 |
-
"youtubeId": "OJ9j9D0lNBg",
|
| 203 |
-
"embedUrl": "https://www.youtube.com/embed/OJ9j9D0lNBg",
|
| 204 |
-
"duration": "1:10",
|
| 205 |
-
"durationInSeconds": 70,
|
| 206 |
-
"thumbnail": "https://img.youtube.com/vi/OJ9j9D0lNBg/maxresdefault.jpg",
|
| 207 |
-
"sets": 2,
|
| 208 |
-
"reps": "45s",
|
| 209 |
-
"rest": 15,
|
| 210 |
-
"calories": 5,
|
| 211 |
-
"category": "yoga",
|
| 212 |
-
"originalName": "How to Do: UPWARD FACING DOG"
|
| 213 |
-
},
|
| 214 |
-
{
|
| 215 |
-
"name": "Palm Árvore Pose",
|
| 216 |
-
"originalTitle": "How to Do: PALM TREE POSE",
|
| 217 |
-
"emoji": "🧘♀️",
|
| 218 |
-
"youtubeId": "V_bSLebtVJs",
|
| 219 |
-
"embedUrl": "https://www.youtube.com/embed/V_bSLebtVJs",
|
| 220 |
-
"duration": "1:07",
|
| 221 |
-
"durationInSeconds": 67,
|
| 222 |
-
"thumbnail": "https://img.youtube.com/vi/V_bSLebtVJs/maxresdefault.jpg",
|
| 223 |
-
"sets": 2,
|
| 224 |
-
"reps": "45s",
|
| 225 |
-
"rest": 15,
|
| 226 |
-
"calories": 4,
|
| 227 |
-
"category": "yoga",
|
| 228 |
-
"originalName": "How to Do: PALM TREE POSE"
|
| 229 |
-
},
|
| 230 |
-
{
|
| 231 |
-
"name": "Half Circle Pose",
|
| 232 |
-
"originalTitle": "How to Do: HALF CIRCLE POSE",
|
| 233 |
-
"emoji": "🧘♀️",
|
| 234 |
-
"youtubeId": "fTUxoLumSH0",
|
| 235 |
-
"embedUrl": "https://www.youtube.com/embed/fTUxoLumSH0",
|
| 236 |
-
"duration": "1:11",
|
| 237 |
-
"durationInSeconds": 71,
|
| 238 |
-
"thumbnail": "https://img.youtube.com/vi/fTUxoLumSH0/maxresdefault.jpg",
|
| 239 |
-
"sets": 2,
|
| 240 |
-
"reps": "45s",
|
| 241 |
-
"rest": 15,
|
| 242 |
-
"calories": 5,
|
| 243 |
-
"category": "yoga",
|
| 244 |
-
"originalName": "How to Do: HALF CIRCLE POSE"
|
| 245 |
-
},
|
| 246 |
-
{
|
| 247 |
-
"name": "Sentado Gato E Vaca",
|
| 248 |
-
"originalTitle": "How to Do: SEATED CAT COW",
|
| 249 |
-
"emoji": "🧘♀️",
|
| 250 |
-
"youtubeId": "PMxA3xlFpAk",
|
| 251 |
-
"embedUrl": "https://www.youtube.com/embed/PMxA3xlFpAk",
|
| 252 |
-
"duration": "1:00",
|
| 253 |
-
"durationInSeconds": 60,
|
| 254 |
-
"thumbnail": "https://img.youtube.com/vi/PMxA3xlFpAk/maxresdefault.jpg",
|
| 255 |
-
"sets": 2,
|
| 256 |
-
"reps": "45s",
|
| 257 |
-
"rest": 15,
|
| 258 |
-
"calories": 4,
|
| 259 |
-
"category": "yoga",
|
| 260 |
-
"originalName": "How to Do: SEATED CAT COW"
|
| 261 |
-
},
|
| 262 |
-
{
|
| 263 |
-
"name": "Half Plough Pose",
|
| 264 |
-
"originalTitle": "How to Do: HALF PLOUGH POSE",
|
| 265 |
-
"emoji": "🧘♀️",
|
| 266 |
-
"youtubeId": "rHlaMiHXdPI",
|
| 267 |
-
"embedUrl": "https://www.youtube.com/embed/rHlaMiHXdPI",
|
| 268 |
-
"duration": "1:11",
|
| 269 |
-
"durationInSeconds": 71,
|
| 270 |
-
"thumbnail": "https://img.youtube.com/vi/rHlaMiHXdPI/maxresdefault.jpg",
|
| 271 |
-
"sets": 2,
|
| 272 |
-
"reps": "45s",
|
| 273 |
-
"rest": 15,
|
| 274 |
-
"calories": 5,
|
| 275 |
-
"category": "yoga",
|
| 276 |
-
"originalName": "How to Do: HALF PLOUGH POSE"
|
| 277 |
-
},
|
| 278 |
-
{
|
| 279 |
-
"name": "Thunderbolt Pose",
|
| 280 |
-
"originalTitle": "How to Do: THUNDERBOLT POSE",
|
| 281 |
-
"emoji": "🧘♀️",
|
| 282 |
-
"youtubeId": "uPZZMuYA5zc",
|
| 283 |
-
"embedUrl": "https://www.youtube.com/embed/uPZZMuYA5zc",
|
| 284 |
-
"duration": "1:07",
|
| 285 |
-
"durationInSeconds": 67,
|
| 286 |
-
"thumbnail": "https://img.youtube.com/vi/uPZZMuYA5zc/maxresdefault.jpg",
|
| 287 |
-
"sets": 2,
|
| 288 |
-
"reps": "45s",
|
| 289 |
-
"rest": 15,
|
| 290 |
-
"calories": 4,
|
| 291 |
-
"category": "yoga",
|
| 292 |
-
"originalName": "How to Do: THUNDERBOLT POSE"
|
| 293 |
-
},
|
| 294 |
-
{
|
| 295 |
-
"name": "Locust Pose",
|
| 296 |
-
"originalTitle": "How to Do: LOCUST POSE",
|
| 297 |
-
"emoji": "🧘♀️",
|
| 298 |
-
"youtubeId": "4I5EFtmDAiY",
|
| 299 |
-
"embedUrl": "https://www.youtube.com/embed/4I5EFtmDAiY",
|
| 300 |
-
"duration": "0:50",
|
| 301 |
-
"durationInSeconds": 50,
|
| 302 |
-
"thumbnail": "https://img.youtube.com/vi/4I5EFtmDAiY/maxresdefault.jpg",
|
| 303 |
-
"sets": 2,
|
| 304 |
-
"reps": "45s",
|
| 305 |
-
"rest": 15,
|
| 306 |
-
"calories": 3,
|
| 307 |
-
"category": "yoga",
|
| 308 |
-
"originalName": "How to Do: LOCUST POSE"
|
| 309 |
-
},
|
| 310 |
-
{
|
| 311 |
-
"name": "Half Locust Pose",
|
| 312 |
-
"originalTitle": "How to Do: HALF LOCUST POSE",
|
| 313 |
-
"emoji": "🧘♀️",
|
| 314 |
-
"youtubeId": "GYpJBJ1s77Y",
|
| 315 |
-
"embedUrl": "https://www.youtube.com/embed/GYpJBJ1s77Y",
|
| 316 |
-
"duration": "1:04",
|
| 317 |
-
"durationInSeconds": 64,
|
| 318 |
-
"thumbnail": "https://img.youtube.com/vi/GYpJBJ1s77Y/maxresdefault.jpg",
|
| 319 |
-
"sets": 2,
|
| 320 |
-
"reps": "45s",
|
| 321 |
-
"rest": 15,
|
| 322 |
-
"calories": 4,
|
| 323 |
-
"category": "yoga",
|
| 324 |
-
"originalName": "How to Do: HALF LOCUST POSE"
|
| 325 |
-
},
|
| 326 |
-
{
|
| 327 |
-
"name": "Tiger Pose",
|
| 328 |
-
"originalTitle": "How to Do: TIGER POSE",
|
| 329 |
-
"emoji": "🧘♀️",
|
| 330 |
-
"youtubeId": "poN4_v25CAI",
|
| 331 |
-
"embedUrl": "https://www.youtube.com/embed/poN4_v25CAI",
|
| 332 |
-
"duration": "1:08",
|
| 333 |
-
"durationInSeconds": 68,
|
| 334 |
-
"thumbnail": "https://img.youtube.com/vi/poN4_v25CAI/maxresdefault.jpg",
|
| 335 |
-
"sets": 2,
|
| 336 |
-
"reps": "45s",
|
| 337 |
-
"rest": 15,
|
| 338 |
-
"calories": 5,
|
| 339 |
-
"category": "yoga",
|
| 340 |
-
"originalName": "How to Do: TIGER POSE"
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"name": "Baixo Barco Pose",
|
| 344 |
-
"originalTitle": "How to Do: LOW BOAT POSE",
|
| 345 |
-
"emoji": "🧘♀️",
|
| 346 |
-
"youtubeId": "pqL9RYhYJAE",
|
| 347 |
-
"embedUrl": "https://www.youtube.com/embed/pqL9RYhYJAE",
|
| 348 |
-
"duration": "1:04",
|
| 349 |
-
"durationInSeconds": 64,
|
| 350 |
-
"thumbnail": "https://img.youtube.com/vi/pqL9RYhYJAE/maxresdefault.jpg",
|
| 351 |
-
"sets": 2,
|
| 352 |
-
"reps": "45s",
|
| 353 |
-
"rest": 15,
|
| 354 |
-
"calories": 4,
|
| 355 |
-
"category": "yoga",
|
| 356 |
-
"originalName": "How to Do: LOW BOAT POSE"
|
| 357 |
-
},
|
| 358 |
-
{
|
| 359 |
-
"name": "Gate Pose",
|
| 360 |
-
"originalTitle": "How to Do: GATE POSE",
|
| 361 |
-
"emoji": "🧘♀️",
|
| 362 |
-
"youtubeId": "4CmVrMBtKuE",
|
| 363 |
-
"embedUrl": "https://www.youtube.com/embed/4CmVrMBtKuE",
|
| 364 |
-
"duration": "1:06",
|
| 365 |
-
"durationInSeconds": 66,
|
| 366 |
-
"thumbnail": "https://img.youtube.com/vi/4CmVrMBtKuE/maxresdefault.jpg",
|
| 367 |
-
"sets": 2,
|
| 368 |
-
"reps": "45s",
|
| 369 |
-
"rest": 15,
|
| 370 |
-
"calories": 4,
|
| 371 |
-
"category": "yoga",
|
| 372 |
-
"originalName": "How to Do: GATE POSE"
|
| 373 |
-
},
|
| 374 |
-
{
|
| 375 |
-
"name": "Lumbar Gato E Vaca",
|
| 376 |
-
"originalTitle": "How to Do: LUMBAR CAT COW",
|
| 377 |
-
"emoji": "🧘♀️",
|
| 378 |
-
"youtubeId": "o3H3RJ4SwbQ",
|
| 379 |
-
"embedUrl": "https://www.youtube.com/embed/o3H3RJ4SwbQ",
|
| 380 |
-
"duration": "1:08",
|
| 381 |
-
"durationInSeconds": 68,
|
| 382 |
-
"thumbnail": "https://img.youtube.com/vi/o3H3RJ4SwbQ/maxresdefault.jpg",
|
| 383 |
-
"sets": 2,
|
| 384 |
-
"reps": "45s",
|
| 385 |
-
"rest": 15,
|
| 386 |
-
"calories": 5,
|
| 387 |
-
"category": "yoga",
|
| 388 |
-
"originalName": "How to Do: LUMBAR CAT COW"
|
| 389 |
-
},
|
| 390 |
-
{
|
| 391 |
-
"name": "Árvore Pose",
|
| 392 |
-
"originalTitle": "How to Do: TREE POSE",
|
| 393 |
-
"emoji": "🧘♀️",
|
| 394 |
-
"youtubeId": "sxymAjTuUx0",
|
| 395 |
-
"embedUrl": "https://www.youtube.com/embed/sxymAjTuUx0",
|
| 396 |
-
"duration": "1:04",
|
| 397 |
-
"durationInSeconds": 64,
|
| 398 |
-
"thumbnail": "https://img.youtube.com/vi/sxymAjTuUx0/maxresdefault.jpg",
|
| 399 |
-
"sets": 2,
|
| 400 |
-
"reps": "45s",
|
| 401 |
-
"rest": 15,
|
| 402 |
-
"calories": 4,
|
| 403 |
-
"category": "yoga",
|
| 404 |
-
"originalName": "How to Do: TREE POSE"
|
| 405 |
-
},
|
| 406 |
-
{
|
| 407 |
-
"name": "Corpse Pose",
|
| 408 |
-
"originalTitle": "How to Do: CORPSE POSE",
|
| 409 |
-
"emoji": "🧘♀️",
|
| 410 |
-
"youtubeId": "Ns8TW7y-abA",
|
| 411 |
-
"embedUrl": "https://www.youtube.com/embed/Ns8TW7y-abA",
|
| 412 |
-
"duration": "1:13",
|
| 413 |
-
"durationInSeconds": 73,
|
| 414 |
-
"thumbnail": "https://img.youtube.com/vi/Ns8TW7y-abA/maxresdefault.jpg",
|
| 415 |
-
"sets": 2,
|
| 416 |
-
"reps": "45s",
|
| 417 |
-
"rest": 15,
|
| 418 |
-
"calories": 5,
|
| 419 |
-
"category": "yoga",
|
| 420 |
-
"originalName": "How to Do: CORPSE POSE"
|
| 421 |
-
},
|
| 422 |
-
{
|
| 423 |
-
"name": "Bow Pose",
|
| 424 |
-
"originalTitle": "How to Do: BOW POSE",
|
| 425 |
-
"emoji": "🧘♀️",
|
| 426 |
-
"youtubeId": "inetVHah2NE",
|
| 427 |
-
"embedUrl": "https://www.youtube.com/embed/inetVHah2NE",
|
| 428 |
-
"duration": "0:57",
|
| 429 |
-
"durationInSeconds": 57,
|
| 430 |
-
"thumbnail": "https://img.youtube.com/vi/inetVHah2NE/maxresdefault.jpg",
|
| 431 |
-
"sets": 2,
|
| 432 |
-
"reps": "45s",
|
| 433 |
-
"rest": 15,
|
| 434 |
-
"calories": 4,
|
| 435 |
-
"category": "yoga",
|
| 436 |
-
"originalName": "How to Do: BOW POSE"
|
| 437 |
-
},
|
| 438 |
-
{
|
| 439 |
-
"name": "Lizard Pose",
|
| 440 |
-
"originalTitle": "How to Do: LIZARD POSE",
|
| 441 |
-
"emoji": "🧘♀️",
|
| 442 |
-
"youtubeId": "x8VZ3-rx2HE",
|
| 443 |
-
"embedUrl": "https://www.youtube.com/embed/x8VZ3-rx2HE",
|
| 444 |
-
"duration": "1:06",
|
| 445 |
-
"durationInSeconds": 66,
|
| 446 |
-
"thumbnail": "https://img.youtube.com/vi/x8VZ3-rx2HE/maxresdefault.jpg",
|
| 447 |
-
"sets": 2,
|
| 448 |
-
"reps": "45s",
|
| 449 |
-
"rest": 15,
|
| 450 |
-
"calories": 4,
|
| 451 |
-
"category": "yoga",
|
| 452 |
-
"originalName": "How to Do: LIZARD POSE"
|
| 453 |
-
},
|
| 454 |
-
{
|
| 455 |
-
"name": "Sage Marichi's Pose Iii",
|
| 456 |
-
"originalTitle": "How to Do: SAGE MARICHI'S POSE III",
|
| 457 |
-
"emoji": "🧘♀️",
|
| 458 |
-
"youtubeId": "bGzlOXYDkxg",
|
| 459 |
-
"embedUrl": "https://www.youtube.com/embed/bGzlOXYDkxg",
|
| 460 |
-
"duration": "1:13",
|
| 461 |
-
"durationInSeconds": 73,
|
| 462 |
-
"thumbnail": "https://img.youtube.com/vi/bGzlOXYDkxg/maxresdefault.jpg",
|
| 463 |
-
"sets": 2,
|
| 464 |
-
"reps": "45s",
|
| 465 |
-
"rest": 15,
|
| 466 |
-
"calories": 5,
|
| 467 |
-
"category": "yoga",
|
| 468 |
-
"originalName": "How to Do: SAGE MARICHI'S POSE III"
|
| 469 |
-
},
|
| 470 |
-
{
|
| 471 |
-
"name": "Barco Pose",
|
| 472 |
-
"originalTitle": "How to Do: BOAT POSE",
|
| 473 |
-
"emoji": "🧘♀️",
|
| 474 |
-
"youtubeId": "0-N8ty8OMts",
|
| 475 |
-
"embedUrl": "https://www.youtube.com/embed/0-N8ty8OMts",
|
| 476 |
-
"duration": "0:58",
|
| 477 |
-
"durationInSeconds": 58,
|
| 478 |
-
"thumbnail": "https://img.youtube.com/vi/0-N8ty8OMts/maxresdefault.jpg",
|
| 479 |
-
"sets": 2,
|
| 480 |
-
"reps": "45s",
|
| 481 |
-
"rest": 15,
|
| 482 |
-
"calories": 4,
|
| 483 |
-
"category": "yoga",
|
| 484 |
-
"originalName": "How to Do: BOAT POSE"
|
| 485 |
-
},
|
| 486 |
-
{
|
| 487 |
-
"name": "Pombo Pose",
|
| 488 |
-
"originalTitle": "How to Do: PIGEON POSE",
|
| 489 |
-
"emoji": "🧘♀️",
|
| 490 |
-
"youtubeId": "M9VNeCErXq8",
|
| 491 |
-
"embedUrl": "https://www.youtube.com/embed/M9VNeCErXq8",
|
| 492 |
-
"duration": "1:16",
|
| 493 |
-
"durationInSeconds": 76,
|
| 494 |
-
"thumbnail": "https://img.youtube.com/vi/M9VNeCErXq8/maxresdefault.jpg",
|
| 495 |
-
"sets": 2,
|
| 496 |
-
"reps": "45s",
|
| 497 |
-
"rest": 15,
|
| 498 |
-
"calories": 5,
|
| 499 |
-
"category": "yoga",
|
| 500 |
-
"originalName": "How to Do: PIGEON POSE"
|
| 501 |
-
},
|
| 502 |
-
{
|
| 503 |
-
"name": "Fish Pose",
|
| 504 |
-
"originalTitle": "How to Do: FISH POSE",
|
| 505 |
-
"emoji": "🧘♀️",
|
| 506 |
-
"youtubeId": "e3gBrBFM-3M",
|
| 507 |
-
"embedUrl": "https://www.youtube.com/embed/e3gBrBFM-3M",
|
| 508 |
-
"duration": "0:55",
|
| 509 |
-
"durationInSeconds": 55,
|
| 510 |
-
"thumbnail": "https://img.youtube.com/vi/e3gBrBFM-3M/maxresdefault.jpg",
|
| 511 |
-
"sets": 2,
|
| 512 |
-
"reps": "45s",
|
| 513 |
-
"rest": 15,
|
| 514 |
-
"calories": 4,
|
| 515 |
-
"category": "yoga",
|
| 516 |
-
"originalName": "How to Do: FISH POSE"
|
| 517 |
-
},
|
| 518 |
-
{
|
| 519 |
-
"name": "Guerreiro I",
|
| 520 |
-
"originalTitle": "How to Do: WARRIOR I",
|
| 521 |
-
"emoji": "🧘♀️",
|
| 522 |
-
"youtubeId": "98h26Ayke0s",
|
| 523 |
-
"embedUrl": "https://www.youtube.com/embed/98h26Ayke0s",
|
| 524 |
-
"duration": "1:23",
|
| 525 |
-
"durationInSeconds": 83,
|
| 526 |
-
"thumbnail": "https://img.youtube.com/vi/98h26Ayke0s/maxresdefault.jpg",
|
| 527 |
-
"sets": 2,
|
| 528 |
-
"reps": "45s",
|
| 529 |
-
"rest": 15,
|
| 530 |
-
"calories": 6,
|
| 531 |
-
"category": "yoga",
|
| 532 |
-
"originalName": "How to Do: WARRIOR I"
|
| 533 |
-
},
|
| 534 |
-
{
|
| 535 |
-
"name": ":downward Facing Dog",
|
| 536 |
-
"originalTitle": "How to Do:DOWNWARD FACING DOG",
|
| 537 |
-
"emoji": "🧘♀️",
|
| 538 |
-
"youtubeId": "ahBd-oI76Zs",
|
| 539 |
-
"embedUrl": "https://www.youtube.com/embed/ahBd-oI76Zs",
|
| 540 |
-
"duration": "0:39",
|
| 541 |
-
"durationInSeconds": 39,
|
| 542 |
-
"thumbnail": "https://img.youtube.com/vi/ahBd-oI76Zs/maxresdefault.jpg",
|
| 543 |
-
"sets": 2,
|
| 544 |
-
"reps": "30s",
|
| 545 |
-
"rest": 15,
|
| 546 |
-
"calories": 3,
|
| 547 |
-
"category": "yoga",
|
| 548 |
-
"originalName": "How to Do:DOWNWARD FACING DOG"
|
| 549 |
-
},
|
| 550 |
-
{
|
| 551 |
-
"name": ":wrists & Ankles Alongamento",
|
| 552 |
-
"originalTitle": "How to Do:WRISTS & ANKLES STRETCH",
|
| 553 |
-
"emoji": "🧘♀️",
|
| 554 |
-
"youtubeId": "oVyhNRtXIio",
|
| 555 |
-
"embedUrl": "https://www.youtube.com/embed/oVyhNRtXIio",
|
| 556 |
-
"duration": "0:38",
|
| 557 |
-
"durationInSeconds": 38,
|
| 558 |
-
"thumbnail": "https://img.youtube.com/vi/oVyhNRtXIio/maxresdefault.jpg",
|
| 559 |
-
"sets": 2,
|
| 560 |
-
"reps": "30s",
|
| 561 |
-
"rest": 15,
|
| 562 |
-
"calories": 3,
|
| 563 |
-
"category": "yoga",
|
| 564 |
-
"originalName": "How to Do:WRISTS & ANKLES STRETCH"
|
| 565 |
-
},
|
| 566 |
-
{
|
| 567 |
-
"name": ":triângulo Pose",
|
| 568 |
-
"originalTitle": "How to Do:TRIANGLE POSE",
|
| 569 |
-
"emoji": "🧘♀️",
|
| 570 |
-
"youtubeId": "qOYy5m3rr1s",
|
| 571 |
-
"embedUrl": "https://www.youtube.com/embed/qOYy5m3rr1s",
|
| 572 |
-
"duration": "0:56",
|
| 573 |
-
"durationInSeconds": 56,
|
| 574 |
-
"thumbnail": "https://img.youtube.com/vi/qOYy5m3rr1s/maxresdefault.jpg",
|
| 575 |
-
"sets": 2,
|
| 576 |
-
"reps": "45s",
|
| 577 |
-
"rest": 15,
|
| 578 |
-
"calories": 4,
|
| 579 |
-
"category": "yoga",
|
| 580 |
-
"originalName": "How to Do:TRIANGLE POSE"
|
| 581 |
-
},
|
| 582 |
-
{
|
| 583 |
-
"name": ":levator Scapulae Alongamento",
|
| 584 |
-
"originalTitle": "How to Do:LEVATOR SCAPULAE STRETCH",
|
| 585 |
-
"emoji": "🧘♀️",
|
| 586 |
-
"youtubeId": "wnD-FX2lEYs",
|
| 587 |
-
"embedUrl": "https://www.youtube.com/embed/wnD-FX2lEYs",
|
| 588 |
-
"duration": "0:40",
|
| 589 |
-
"durationInSeconds": 40,
|
| 590 |
-
"thumbnail": "https://img.youtube.com/vi/wnD-FX2lEYs/maxresdefault.jpg",
|
| 591 |
-
"sets": 2,
|
| 592 |
-
"reps": "30s",
|
| 593 |
-
"rest": 15,
|
| 594 |
-
"calories": 3,
|
| 595 |
-
"category": "yoga",
|
| 596 |
-
"originalName": "How to Do:LEVATOR SCAPULAE STRETCH"
|
| 597 |
-
},
|
| 598 |
-
{
|
| 599 |
-
"name": ":downward Facing Dog Sobre Parede",
|
| 600 |
-
"originalTitle": "How to Do:DOWNWARD FACING DOG ON THE WALL",
|
| 601 |
-
"emoji": "🧘♀️",
|
| 602 |
-
"youtubeId": "rto2xsfqWx8",
|
| 603 |
-
"embedUrl": "https://www.youtube.com/embed/rto2xsfqWx8",
|
| 604 |
-
"duration": "0:43",
|
| 605 |
-
"durationInSeconds": 43,
|
| 606 |
-
"thumbnail": "https://img.youtube.com/vi/rto2xsfqWx8/maxresdefault.jpg",
|
| 607 |
-
"sets": 2,
|
| 608 |
-
"reps": "45s",
|
| 609 |
-
"rest": 15,
|
| 610 |
-
"calories": 3,
|
| 611 |
-
"category": "yoga",
|
| 612 |
-
"originalName": "How to Do:DOWNWARD FACING DOG ON THE WALL"
|
| 613 |
-
},
|
| 614 |
-
{
|
| 615 |
-
"name": ":leaning Stretcher Raises",
|
| 616 |
-
"originalTitle": "How to Do:LEANING STRETCHER RAISES",
|
| 617 |
-
"emoji": "🧘♀️",
|
| 618 |
-
"youtubeId": "qQ-StR-AXzM",
|
| 619 |
-
"embedUrl": "https://www.youtube.com/embed/qQ-StR-AXzM",
|
| 620 |
-
"duration": "0:40",
|
| 621 |
-
"durationInSeconds": 40,
|
| 622 |
-
"thumbnail": "https://img.youtube.com/vi/qQ-StR-AXzM/maxresdefault.jpg",
|
| 623 |
-
"sets": 2,
|
| 624 |
-
"reps": "30s",
|
| 625 |
-
"rest": 15,
|
| 626 |
-
"calories": 3,
|
| 627 |
-
"category": "yoga",
|
| 628 |
-
"originalName": "How to Do:LEANING STRETCHER RAISES"
|
| 629 |
-
},
|
| 630 |
-
{
|
| 631 |
-
"name": ":adductor Alongamento Em Em Pé",
|
| 632 |
-
"originalTitle": "How to Do:ADDUCTOR STRETCH IN STANDING",
|
| 633 |
-
"emoji": "🧘♀️",
|
| 634 |
-
"youtubeId": "MjFb2MyaNjs",
|
| 635 |
-
"embedUrl": "https://www.youtube.com/embed/MjFb2MyaNjs",
|
| 636 |
-
"duration": "0:56",
|
| 637 |
-
"durationInSeconds": 56,
|
| 638 |
-
"thumbnail": "https://img.youtube.com/vi/MjFb2MyaNjs/maxresdefault.jpg",
|
| 639 |
-
"sets": 2,
|
| 640 |
-
"reps": "45s",
|
| 641 |
-
"rest": 15,
|
| 642 |
-
"calories": 4,
|
| 643 |
-
"category": "yoga",
|
| 644 |
-
"originalName": "How to Do:ADDUCTOR STRETCH IN STANDING"
|
| 645 |
-
},
|
| 646 |
-
{
|
| 647 |
-
"name": ":lateral-deitado Floor Alongamento",
|
| 648 |
-
"originalTitle": "How to Do:SIDE-LYING FLOOR STRETCH",
|
| 649 |
-
"emoji": "🧘♀️",
|
| 650 |
-
"youtubeId": "DMlSdmsHEeI",
|
| 651 |
-
"embedUrl": "https://www.youtube.com/embed/DMlSdmsHEeI",
|
| 652 |
-
"duration": "0:35",
|
| 653 |
-
"durationInSeconds": 35,
|
| 654 |
-
"thumbnail": "https://img.youtube.com/vi/DMlSdmsHEeI/maxresdefault.jpg",
|
| 655 |
-
"sets": 2,
|
| 656 |
-
"reps": "30s",
|
| 657 |
-
"rest": 15,
|
| 658 |
-
"calories": 2,
|
| 659 |
-
"category": "yoga",
|
| 660 |
-
"originalName": "How to Do:SIDE-LYING FLOOR STRETCH"
|
| 661 |
-
},
|
| 662 |
-
{
|
| 663 |
-
"name": ":gato E Vaca Pose",
|
| 664 |
-
"originalTitle": "How to Do:CAT COW POSE",
|
| 665 |
-
"emoji": "🧘♀️",
|
| 666 |
-
"youtubeId": "w_UKcI1Ftn8",
|
| 667 |
-
"embedUrl": "https://www.youtube.com/embed/w_UKcI1Ftn8",
|
| 668 |
-
"duration": "0:50",
|
| 669 |
-
"durationInSeconds": 50,
|
| 670 |
-
"thumbnail": "https://img.youtube.com/vi/w_UKcI1Ftn8/maxresdefault.jpg",
|
| 671 |
-
"sets": 2,
|
| 672 |
-
"reps": "45s",
|
| 673 |
-
"rest": 15,
|
| 674 |
-
"calories": 3,
|
| 675 |
-
"category": "yoga",
|
| 676 |
-
"originalName": "How to Do:CAT COW POSE"
|
| 677 |
-
},
|
| 678 |
-
{
|
| 679 |
-
"name": "Cobra Alongamento",
|
| 680 |
-
"originalTitle": "How to Do: COBRA STRETCH",
|
| 681 |
-
"emoji": "🧘♀️",
|
| 682 |
-
"youtubeId": "z21McHHOpAg",
|
| 683 |
-
"embedUrl": "https://www.youtube.com/embed/z21McHHOpAg",
|
| 684 |
-
"duration": "0:30",
|
| 685 |
-
"durationInSeconds": 30,
|
| 686 |
-
"thumbnail": "https://img.youtube.com/vi/z21McHHOpAg/maxresdefault.jpg",
|
| 687 |
-
"sets": 2,
|
| 688 |
-
"reps": "30s",
|
| 689 |
-
"rest": 15,
|
| 690 |
-
"calories": 2,
|
| 691 |
-
"category": "yoga",
|
| 692 |
-
"originalName": "How to Do: COBRA STRETCH"
|
| 693 |
-
},
|
| 694 |
-
{
|
| 695 |
-
"name": "Cobras",
|
| 696 |
-
"originalTitle": "How to Do: COBRAS",
|
| 697 |
-
"emoji": "🧘♀️",
|
| 698 |
-
"youtubeId": "q46qN4ypiFo",
|
| 699 |
-
"embedUrl": "https://www.youtube.com/embed/q46qN4ypiFo",
|
| 700 |
-
"duration": "0:52",
|
| 701 |
-
"durationInSeconds": 52,
|
| 702 |
-
"thumbnail": "https://img.youtube.com/vi/q46qN4ypiFo/maxresdefault.jpg",
|
| 703 |
-
"sets": 2,
|
| 704 |
-
"reps": "45s",
|
| 705 |
-
"rest": 15,
|
| 706 |
-
"calories": 3,
|
| 707 |
-
"category": "yoga",
|
| 708 |
-
"originalName": "How to Do: COBRAS"
|
| 709 |
-
},
|
| 710 |
-
{
|
| 711 |
-
"name": "Postura Da Crianç",
|
| 712 |
-
"originalTitle": "How to Do: CHILD POSE",
|
| 713 |
-
"emoji": "🧘♀️",
|
| 714 |
-
"youtubeId": "DMwRPGMPB10",
|
| 715 |
-
"embedUrl": "https://www.youtube.com/embed/DMwRPGMPB10",
|
| 716 |
-
"duration": "0:41",
|
| 717 |
-
"durationInSeconds": 41,
|
| 718 |
-
"thumbnail": "https://img.youtube.com/vi/DMwRPGMPB10/maxresdefault.jpg",
|
| 719 |
-
"sets": 2,
|
| 720 |
-
"reps": "45s",
|
| 721 |
-
"rest": 15,
|
| 722 |
-
"calories": 3,
|
| 723 |
-
"category": "yoga",
|
| 724 |
-
"originalName": "How to Do: CHILD POSE"
|
| 725 |
-
},
|
| 726 |
-
{
|
| 727 |
-
"name": ":lateral-deitado Floor Alongamento",
|
| 728 |
-
"originalTitle": "How to Do:SIDE-LYING FLOOR STRETCH",
|
| 729 |
-
"emoji": "🧘♀️",
|
| 730 |
-
"youtubeId": "G3JP3uXBf5Y",
|
| 731 |
-
"embedUrl": "https://www.youtube.com/embed/G3JP3uXBf5Y",
|
| 732 |
-
"duration": "0:51",
|
| 733 |
-
"durationInSeconds": 51,
|
| 734 |
-
"thumbnail": "https://img.youtube.com/vi/G3JP3uXBf5Y/maxresdefault.jpg",
|
| 735 |
-
"sets": 2,
|
| 736 |
-
"reps": "45s",
|
| 737 |
-
"rest": 15,
|
| 738 |
-
"calories": 3,
|
| 739 |
-
"category": "yoga",
|
| 740 |
-
"originalName": "How to Do:SIDE-LYING FLOOR STRETCH"
|
| 741 |
-
},
|
| 742 |
-
{
|
| 743 |
-
"name": ":downward Facing Dog Sobre Parede",
|
| 744 |
-
"originalTitle": "How to Do:DOWNWARD FACING DOG ON THE WALL",
|
| 745 |
-
"emoji": "🧘♀️",
|
| 746 |
-
"youtubeId": "0rMcC-P79F4",
|
| 747 |
-
"embedUrl": "https://www.youtube.com/embed/0rMcC-P79F4",
|
| 748 |
-
"duration": "0:58",
|
| 749 |
-
"durationInSeconds": 58,
|
| 750 |
-
"thumbnail": "https://img.youtube.com/vi/0rMcC-P79F4/maxresdefault.jpg",
|
| 751 |
-
"sets": 2,
|
| 752 |
-
"reps": "45s",
|
| 753 |
-
"rest": 15,
|
| 754 |
-
"calories": 4,
|
| 755 |
-
"category": "yoga",
|
| 756 |
-
"originalName": "How to Do:DOWNWARD FACING DOG ON THE WALL"
|
| 757 |
-
},
|
| 758 |
-
{
|
| 759 |
-
"name": ":levator Scapulae Alongamento",
|
| 760 |
-
"originalTitle": "How to Do:LEVATOR SCAPULAE STRETCH",
|
| 761 |
-
"emoji": "🧘♀️",
|
| 762 |
-
"youtubeId": "qmHPk-kjIpQ",
|
| 763 |
-
"embedUrl": "https://www.youtube.com/embed/qmHPk-kjIpQ",
|
| 764 |
-
"duration": "0:53",
|
| 765 |
-
"durationInSeconds": 53,
|
| 766 |
-
"thumbnail": "https://img.youtube.com/vi/qmHPk-kjIpQ/maxresdefault.jpg",
|
| 767 |
-
"sets": 2,
|
| 768 |
-
"reps": "45s",
|
| 769 |
-
"rest": 15,
|
| 770 |
-
"calories": 4,
|
| 771 |
-
"category": "yoga",
|
| 772 |
-
"originalName": "How to Do:LEVATOR SCAPULAE STRETCH"
|
| 773 |
-
},
|
| 774 |
-
{
|
| 775 |
-
"name": ":triângulo Pose",
|
| 776 |
-
"originalTitle": "How to Do:TRIANGLE POSE",
|
| 777 |
-
"emoji": "🧘♀️",
|
| 778 |
-
"youtubeId": "-dcRVM2sZH0",
|
| 779 |
-
"embedUrl": "https://www.youtube.com/embed/-dcRVM2sZH0",
|
| 780 |
-
"duration": "1:33",
|
| 781 |
-
"durationInSeconds": 93,
|
| 782 |
-
"thumbnail": "https://img.youtube.com/vi/-dcRVM2sZH0/maxresdefault.jpg",
|
| 783 |
-
"sets": 2,
|
| 784 |
-
"reps": "45s",
|
| 785 |
-
"rest": 15,
|
| 786 |
-
"calories": 6,
|
| 787 |
-
"category": "yoga",
|
| 788 |
-
"originalName": "How to Do:TRIANGLE POSE"
|
| 789 |
-
},
|
| 790 |
-
{
|
| 791 |
-
"name": ":wrists & Ankles Alongamento",
|
| 792 |
-
"originalTitle": "How to Do:WRISTS & ANKLES STRETCH",
|
| 793 |
-
"emoji": "🧘♀️",
|
| 794 |
-
"youtubeId": "IcrulcMBD1U",
|
| 795 |
-
"embedUrl": "https://www.youtube.com/embed/IcrulcMBD1U",
|
| 796 |
-
"duration": "0:55",
|
| 797 |
-
"durationInSeconds": 55,
|
| 798 |
-
"thumbnail": "https://img.youtube.com/vi/IcrulcMBD1U/maxresdefault.jpg",
|
| 799 |
-
"sets": 2,
|
| 800 |
-
"reps": "45s",
|
| 801 |
-
"rest": 15,
|
| 802 |
-
"calories": 4,
|
| 803 |
-
"category": "yoga",
|
| 804 |
-
"originalName": "How to Do:WRISTS & ANKLES STRETCH"
|
| 805 |
-
},
|
| 806 |
-
{
|
| 807 |
-
"name": ":leaning Stretcher Raises",
|
| 808 |
-
"originalTitle": "How to Do:LEANING STRETCHER RAISES",
|
| 809 |
-
"emoji": "🧘♀️",
|
| 810 |
-
"youtubeId": "SoAnlaUG5lw",
|
| 811 |
-
"embedUrl": "https://www.youtube.com/embed/SoAnlaUG5lw",
|
| 812 |
-
"duration": "1:12",
|
| 813 |
-
"durationInSeconds": 72,
|
| 814 |
-
"thumbnail": "https://img.youtube.com/vi/SoAnlaUG5lw/maxresdefault.jpg",
|
| 815 |
-
"sets": 2,
|
| 816 |
-
"reps": "45s",
|
| 817 |
-
"rest": 15,
|
| 818 |
-
"calories": 5,
|
| 819 |
-
"category": "yoga",
|
| 820 |
-
"originalName": "How to Do:LEANING STRETCHER RAISES"
|
| 821 |
-
},
|
| 822 |
-
{
|
| 823 |
-
"name": "Alongamento Em Posição De Borboleta Deitada",
|
| 824 |
-
"originalTitle": "Como fazer: Alongamento em posição de borboleta deitada",
|
| 825 |
-
"emoji": "🧘♀️",
|
| 826 |
-
"youtubeId": "AWWF4nimzhk",
|
| 827 |
-
"embedUrl": "https://www.youtube.com/embed/AWWF4nimzhk",
|
| 828 |
-
"duration": "0:58",
|
| 829 |
-
"durationInSeconds": 58,
|
| 830 |
-
"thumbnail": "https://img.youtube.com/vi/AWWF4nimzhk/maxresdefault.jpg",
|
| 831 |
-
"sets": 2,
|
| 832 |
-
"reps": "45s",
|
| 833 |
-
"rest": 15,
|
| 834 |
-
"calories": 4,
|
| 835 |
-
"category": "yoga",
|
| 836 |
-
"originalName": "Como fazer: Alongamento em posição de borboleta deitada"
|
| 837 |
-
},
|
| 838 |
-
{
|
| 839 |
-
"name": "Cobras",
|
| 840 |
-
"originalTitle": "How to Do: COBRAS",
|
| 841 |
-
"emoji": "🧘♀️",
|
| 842 |
-
"youtubeId": "W0hXxvY8yp0",
|
| 843 |
-
"embedUrl": "https://www.youtube.com/embed/W0hXxvY8yp0",
|
| 844 |
-
"duration": "0:49",
|
| 845 |
-
"durationInSeconds": 49,
|
| 846 |
-
"thumbnail": "https://img.youtube.com/vi/W0hXxvY8yp0/maxresdefault.jpg",
|
| 847 |
-
"sets": 2,
|
| 848 |
-
"reps": "45s",
|
| 849 |
-
"rest": 15,
|
| 850 |
-
"calories": 3,
|
| 851 |
-
"category": "yoga",
|
| 852 |
-
"originalName": "How to Do: COBRAS"
|
| 853 |
-
},
|
| 854 |
-
{
|
| 855 |
-
"name": "Adductor Alongamento Em Em Pé",
|
| 856 |
-
"originalTitle": "How to Do: ADDUCTOR STRETCH IN STANDING",
|
| 857 |
-
"emoji": "🧘♀️",
|
| 858 |
-
"youtubeId": "9Hv2TztJwGI",
|
| 859 |
-
"embedUrl": "https://www.youtube.com/embed/9Hv2TztJwGI",
|
| 860 |
-
"duration": "1:13",
|
| 861 |
-
"durationInSeconds": 73,
|
| 862 |
-
"thumbnail": "https://img.youtube.com/vi/9Hv2TztJwGI/maxresdefault.jpg",
|
| 863 |
-
"sets": 2,
|
| 864 |
-
"reps": "45s",
|
| 865 |
-
"rest": 15,
|
| 866 |
-
"calories": 5,
|
| 867 |
-
"category": "yoga",
|
| 868 |
-
"originalName": "How to Do: ADDUCTOR STRETCH IN STANDING"
|
| 869 |
-
},
|
| 870 |
-
{
|
| 871 |
-
"name": "Gato E Vaca Pose",
|
| 872 |
-
"originalTitle": "How to Do: CAT COW POSE",
|
| 873 |
-
"emoji": "🧘♀️",
|
| 874 |
-
"youtubeId": "L-T0HejuQdo",
|
| 875 |
-
"embedUrl": "https://www.youtube.com/embed/L-T0HejuQdo",
|
| 876 |
-
"duration": "1:08",
|
| 877 |
-
"durationInSeconds": 68,
|
| 878 |
-
"thumbnail": "https://img.youtube.com/vi/L-T0HejuQdo/maxresdefault.jpg",
|
| 879 |
-
"sets": 2,
|
| 880 |
-
"reps": "45s",
|
| 881 |
-
"rest": 15,
|
| 882 |
-
"calories": 5,
|
| 883 |
-
"category": "yoga",
|
| 884 |
-
"originalName": "How to Do: CAT COW POSE"
|
| 885 |
-
},
|
| 886 |
-
{
|
| 887 |
-
"name": "Child's Pose",
|
| 888 |
-
"originalTitle": "How to Do: CHILD'S POSE",
|
| 889 |
-
"emoji": "🧘♀️",
|
| 890 |
-
"youtubeId": "74oEGdu4_dI",
|
| 891 |
-
"embedUrl": "https://www.youtube.com/embed/74oEGdu4_dI",
|
| 892 |
-
"duration": "1:01",
|
| 893 |
-
"durationInSeconds": 61,
|
| 894 |
-
"thumbnail": "https://img.youtube.com/vi/74oEGdu4_dI/maxresdefault.jpg",
|
| 895 |
-
"sets": 2,
|
| 896 |
-
"reps": "45s",
|
| 897 |
-
"rest": 15,
|
| 898 |
-
"calories": 4,
|
| 899 |
-
"category": "yoga",
|
| 900 |
-
"originalName": "How to Do: CHILD'S POSE"
|
| 901 |
-
},
|
| 902 |
-
{
|
| 903 |
-
"name": "Cobra Alongamento",
|
| 904 |
-
"originalTitle": "How to Do: COBRA STRETCH",
|
| 905 |
-
"emoji": "🧘♀️",
|
| 906 |
-
"youtubeId": "9Z7IO95Np2g",
|
| 907 |
-
"embedUrl": "https://www.youtube.com/embed/9Z7IO95Np2g",
|
| 908 |
-
"duration": "0:46",
|
| 909 |
-
"durationInSeconds": 46,
|
| 910 |
-
"thumbnail": "https://img.youtube.com/vi/9Z7IO95Np2g/maxresdefault.jpg",
|
| 911 |
-
"sets": 2,
|
| 912 |
-
"reps": "45s",
|
| 913 |
-
"rest": 15,
|
| 914 |
-
"calories": 3,
|
| 915 |
-
"category": "yoga",
|
| 916 |
-
"originalName": "How to Do: COBRA STRETCH"
|
| 917 |
-
}
|
| 918 |
-
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-database-loader.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
| 1 |
-
// 🚀 Exercises Database - Dynamic Loader
|
| 2 |
-
// Auto-generated by split-exercises-database.js
|
| 3 |
-
// Carrega exercícios sob demanda para reduzir bundle inicial
|
| 4 |
-
|
| 5 |
-
// Cache de chunks carregados
|
| 6 |
-
const loadedChunks = new Map();
|
| 7 |
-
|
| 8 |
-
// Lista de categorias disponíveis
|
| 9 |
-
export const AVAILABLE_CATEGORIES = ["legs","mobility","arms","fullbody","face","yoga","abs","waist","back","glutes","cardio","chest"];
|
| 10 |
-
|
| 11 |
-
/**
|
| 12 |
-
* 📦 Carrega categoria de exercícios sob demanda
|
| 13 |
-
* @param {string} category - Nome da categoria
|
| 14 |
-
* @returns {Promise<Object>} - Dados da categoria
|
| 15 |
-
*/
|
| 16 |
-
export async function loadExerciseCategory(category) {
|
| 17 |
-
// Verifica se já está no cache
|
| 18 |
-
if (loadedChunks.has(category)) {
|
| 19 |
-
return loadedChunks.get(category);
|
| 20 |
-
}
|
| 21 |
-
|
| 22 |
-
try {
|
| 23 |
-
// Importação dinâmica do chunk
|
| 24 |
-
const module = await import(`./exercises-chunks/${category}.js`);
|
| 25 |
-
const categoryData = module[`EXERCISES_${category.toUpperCase()}`];
|
| 26 |
-
|
| 27 |
-
// Salva no cache
|
| 28 |
-
loadedChunks.set(category, categoryData);
|
| 29 |
-
|
| 30 |
-
console.log(`✅ [ExerciseLoader] Categoria "${category}" carregada (${categoryData.exercises.length} exercícios)`);
|
| 31 |
-
|
| 32 |
-
return categoryData;
|
| 33 |
-
} catch (error) {
|
| 34 |
-
console.error(`❌ [ExerciseLoader] Erro ao carregar categoria "${category}":`, error);
|
| 35 |
-
throw error;
|
| 36 |
-
}
|
| 37 |
-
}
|
| 38 |
-
|
| 39 |
-
/**
|
| 40 |
-
* 📚 Carrega múltiplas categorias em paralelo
|
| 41 |
-
* @param {string[]} categories - Array de categorias
|
| 42 |
-
* @returns {Promise<Object>} - Objeto com todas as categorias
|
| 43 |
-
*/
|
| 44 |
-
export async function loadMultipleCategories(categories) {
|
| 45 |
-
const promises = categories.map(cat => loadExerciseCategory(cat));
|
| 46 |
-
const results = await Promise.all(promises);
|
| 47 |
-
|
| 48 |
-
const combined = {};
|
| 49 |
-
categories.forEach((cat, index) => {
|
| 50 |
-
combined[cat] = results[index];
|
| 51 |
-
});
|
| 52 |
-
|
| 53 |
-
return combined;
|
| 54 |
-
}
|
| 55 |
-
|
| 56 |
-
/**
|
| 57 |
-
* 🔥 Preload de categorias mais usadas
|
| 58 |
-
* Carrega em background para melhorar UX
|
| 59 |
-
* @param {string[]} categories - Categorias para preload
|
| 60 |
-
*/
|
| 61 |
-
export function preloadCategories(categories) {
|
| 62 |
-
if ('requestIdleCallback' in window) {
|
| 63 |
-
requestIdleCallback(() => {
|
| 64 |
-
loadMultipleCategories(categories);
|
| 65 |
-
});
|
| 66 |
-
} else {
|
| 67 |
-
setTimeout(() => {
|
| 68 |
-
loadMultipleCategories(categories);
|
| 69 |
-
}, 2000);
|
| 70 |
-
}
|
| 71 |
-
}
|
| 72 |
-
|
| 73 |
-
/**
|
| 74 |
-
* 🧹 Limpa cache de categorias (libera memória)
|
| 75 |
-
*/
|
| 76 |
-
export function clearCache() {
|
| 77 |
-
loadedChunks.clear();
|
| 78 |
-
console.log('🧹 [ExerciseLoader] Cache limpo');
|
| 79 |
-
}
|
| 80 |
-
|
| 81 |
-
/**
|
| 82 |
-
* 📊 Retorna estatísticas do loader
|
| 83 |
-
*/
|
| 84 |
-
export function getLoaderStats() {
|
| 85 |
-
return {
|
| 86 |
-
categoriesLoaded: loadedChunks.size,
|
| 87 |
-
categoriesAvailable: AVAILABLE_CATEGORIES.length,
|
| 88 |
-
cacheSize: loadedChunks.size
|
| 89 |
-
};
|
| 90 |
-
}
|
| 91 |
-
|
| 92 |
-
// 🚀 COMPATIBILIDADE: Carrega todas as categorias se EXERCISES_DATABASE for acessado
|
| 93 |
-
let _allExercisesCache = null;
|
| 94 |
-
|
| 95 |
-
export async function getAllExercises() {
|
| 96 |
-
if (_allExercisesCache) {
|
| 97 |
-
return _allExercisesCache;
|
| 98 |
-
}
|
| 99 |
-
|
| 100 |
-
_allExercisesCache = await loadMultipleCategories(AVAILABLE_CATEGORIES);
|
| 101 |
-
return _allExercisesCache;
|
| 102 |
-
}
|
| 103 |
-
|
| 104 |
-
// Export para compatibilidade com código antigo
|
| 105 |
-
export const EXERCISES_DATABASE_LOADER = {
|
| 106 |
-
loadCategory: loadExerciseCategory,
|
| 107 |
-
loadMultiple: loadMultipleCategories,
|
| 108 |
-
preload: preloadCategories,
|
| 109 |
-
getAll: getAllExercises,
|
| 110 |
-
clearCache,
|
| 111 |
-
getStats: getLoaderStats,
|
| 112 |
-
availableCategories: AVAILABLE_CATEGORIES
|
| 113 |
-
};
|
| 114 |
-
|
| 115 |
-
console.log('✅ [ExerciseLoader] Sistema de lazy loading inicializado');
|
| 116 |
-
console.log(`📦 [ExerciseLoader] ${AVAILABLE_CATEGORIES.length} categorias disponíveis`);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/exercises-database.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
public/exercises-database.min.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
public/index.html
CHANGED
|
@@ -636,6 +636,16 @@
|
|
| 636 |
</div>
|
| 637 |
</div>
|
| 638 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 639 |
<!-- Achievements -->
|
| 640 |
<div class="achievements-section">
|
| 641 |
<h3>Conquistas 🏆</h3>
|
|
@@ -791,9 +801,6 @@
|
|
| 791 |
<!-- ⚡ Performance Utilities (loaded first for optimization) -->
|
| 792 |
<script type="module" src="utils-performance.js"></script>
|
| 793 |
|
| 794 |
-
<!-- Exercise Database - Load before main app -->
|
| 795 |
-
<script src="exercises-database.js"></script>
|
| 796 |
-
|
| 797 |
<!-- Main App Script -->
|
| 798 |
<script src="app.js" defer></script>
|
| 799 |
</body>
|
|
|
|
| 636 |
</div>
|
| 637 |
</div>
|
| 638 |
|
| 639 |
+
<!-- Weekly Activity Chart -->
|
| 640 |
+
<div class="activity-chart-section">
|
| 641 |
+
<h3>Atividade Semanal 📈</h3>
|
| 642 |
+
<div class="weekly-chart">
|
| 643 |
+
<div class="chart-bars" id="weeklyChart">
|
| 644 |
+
<!-- Chart will be rendered here -->
|
| 645 |
+
</div>
|
| 646 |
+
</div>
|
| 647 |
+
</div>
|
| 648 |
+
|
| 649 |
<!-- Achievements -->
|
| 650 |
<div class="achievements-section">
|
| 651 |
<h3>Conquistas 🏆</h3>
|
|
|
|
| 801 |
<!-- ⚡ Performance Utilities (loaded first for optimization) -->
|
| 802 |
<script type="module" src="utils-performance.js"></script>
|
| 803 |
|
|
|
|
|
|
|
|
|
|
| 804 |
<!-- Main App Script -->
|
| 805 |
<script src="app.js" defer></script>
|
| 806 |
</body>
|
public/lazy-loader.js
DELETED
|
@@ -1,149 +0,0 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* 🚀 LAZY LOADER - CARREGAMENTO SOB DEMANDA
|
| 3 |
-
*
|
| 4 |
-
* Carrega módulos apenas quando necessários para:
|
| 5 |
-
* - Reduzir tempo de carregamento inicial
|
| 6 |
-
* - Economizar banda
|
| 7 |
-
* - Melhorar performance percebida
|
| 8 |
-
*
|
| 9 |
-
* @version 4.0.0
|
| 10 |
-
*/
|
| 11 |
-
|
| 12 |
-
class LazyLoader {
|
| 13 |
-
constructor() {
|
| 14 |
-
this.loadedModules = new Map();
|
| 15 |
-
this.loadingPromises = new Map();
|
| 16 |
-
console.log('🚀 [LazyLoader] Inicializado');
|
| 17 |
-
}
|
| 18 |
-
|
| 19 |
-
/**
|
| 20 |
-
* 📦 Carrega módulo sob demanda
|
| 21 |
-
* @param {string} moduleName - Nome do módulo
|
| 22 |
-
* @param {string} modulePath - Caminho do módulo
|
| 23 |
-
* @returns {Promise} Módulo carregado
|
| 24 |
-
*/
|
| 25 |
-
async loadModule(moduleName, modulePath) {
|
| 26 |
-
// Se já está carregado, retorna cache
|
| 27 |
-
if (this.loadedModules.has(moduleName)) {
|
| 28 |
-
console.log(`✅ [LazyLoader] ${moduleName} (cache)`);
|
| 29 |
-
return this.loadedModules.get(moduleName);
|
| 30 |
-
}
|
| 31 |
-
|
| 32 |
-
// Se já está carregando, retorna promise existente
|
| 33 |
-
if (this.loadingPromises.has(moduleName)) {
|
| 34 |
-
console.log(`⏳ [LazyLoader] ${moduleName} (aguardando...)`);
|
| 35 |
-
return this.loadingPromises.get(moduleName);
|
| 36 |
-
}
|
| 37 |
-
|
| 38 |
-
// Inicia carregamento
|
| 39 |
-
console.log(`📥 [LazyLoader] Carregando ${moduleName}...`);
|
| 40 |
-
const loadPromise = this._loadModuleScript(modulePath)
|
| 41 |
-
.then(module => {
|
| 42 |
-
this.loadedModules.set(moduleName, module);
|
| 43 |
-
this.loadingPromises.delete(moduleName);
|
| 44 |
-
console.log(`✅ [LazyLoader] ${moduleName} carregado`);
|
| 45 |
-
return module;
|
| 46 |
-
})
|
| 47 |
-
.catch(error => {
|
| 48 |
-
this.loadingPromises.delete(moduleName);
|
| 49 |
-
console.error(`❌ [LazyLoader] Erro ao carregar ${moduleName}:`, error);
|
| 50 |
-
throw error;
|
| 51 |
-
});
|
| 52 |
-
|
| 53 |
-
this.loadingPromises.set(moduleName, loadPromise);
|
| 54 |
-
return loadPromise;
|
| 55 |
-
}
|
| 56 |
-
|
| 57 |
-
/**
|
| 58 |
-
* 🔗 Carrega script do módulo
|
| 59 |
-
*/
|
| 60 |
-
async _loadModuleScript(modulePath) {
|
| 61 |
-
return new Promise((resolve, reject) => {
|
| 62 |
-
// Verifica se é ES Module
|
| 63 |
-
if (modulePath.endsWith('.js')) {
|
| 64 |
-
import(modulePath)
|
| 65 |
-
.then(module => resolve(module))
|
| 66 |
-
.catch(error => reject(error));
|
| 67 |
-
} else {
|
| 68 |
-
// Fallback para script tag
|
| 69 |
-
const script = document.createElement('script');
|
| 70 |
-
script.src = modulePath;
|
| 71 |
-
script.type = 'module';
|
| 72 |
-
script.onload = () => resolve(window[modulePath]);
|
| 73 |
-
script.onerror = () => reject(new Error(`Failed to load ${modulePath}`));
|
| 74 |
-
document.head.appendChild(script);
|
| 75 |
-
}
|
| 76 |
-
});
|
| 77 |
-
}
|
| 78 |
-
|
| 79 |
-
/**
|
| 80 |
-
* 📋 Lista módulos carregados
|
| 81 |
-
*/
|
| 82 |
-
getLoadedModules() {
|
| 83 |
-
return Array.from(this.loadedModules.keys());
|
| 84 |
-
}
|
| 85 |
-
|
| 86 |
-
/**
|
| 87 |
-
* 🗑️ Limpa cache de módulo
|
| 88 |
-
*/
|
| 89 |
-
unloadModule(moduleName) {
|
| 90 |
-
this.loadedModules.delete(moduleName);
|
| 91 |
-
console.log(`🗑️ [LazyLoader] ${moduleName} removido do cache`);
|
| 92 |
-
}
|
| 93 |
-
|
| 94 |
-
/**
|
| 95 |
-
* 🧹 Limpa todos os módulos
|
| 96 |
-
*/
|
| 97 |
-
clearAll() {
|
| 98 |
-
this.loadedModules.clear();
|
| 99 |
-
this.loadingPromises.clear();
|
| 100 |
-
console.log('🧹 [LazyLoader] Cache limpo');
|
| 101 |
-
}
|
| 102 |
-
}
|
| 103 |
-
|
| 104 |
-
// Instância global
|
| 105 |
-
window.lazyLoader = new LazyLoader();
|
| 106 |
-
|
| 107 |
-
// Configurações de módulos
|
| 108 |
-
const MODULE_CONFIG = {
|
| 109 |
-
'ExerciseSelector': './modules/ExerciseSelector.js',
|
| 110 |
-
'NotificationManager': './modules/NotificationManager.js',
|
| 111 |
-
'StorageManager': './modules/StorageManager.js',
|
| 112 |
-
'PerformanceMonitor': './modules/PerformanceMonitor.js'
|
| 113 |
-
};
|
| 114 |
-
|
| 115 |
-
/**
|
| 116 |
-
* 🎯 Carrega módulo por nome
|
| 117 |
-
*/
|
| 118 |
-
window.loadModule = async function(moduleName) {
|
| 119 |
-
const modulePath = MODULE_CONFIG[moduleName];
|
| 120 |
-
|
| 121 |
-
if (!modulePath) {
|
| 122 |
-
throw new Error(`Módulo ${moduleName} não encontrado na configuração`);
|
| 123 |
-
}
|
| 124 |
-
|
| 125 |
-
return window.lazyLoader.loadModule(moduleName, modulePath);
|
| 126 |
-
};
|
| 127 |
-
|
| 128 |
-
/**
|
| 129 |
-
* ⚡ Preload de módulos críticos
|
| 130 |
-
* Carrega em idle time para não bloquear UI
|
| 131 |
-
*/
|
| 132 |
-
if ('requestIdleCallback' in window) {
|
| 133 |
-
requestIdleCallback(() => {
|
| 134 |
-
console.log('⚡ [LazyLoader] Preload de módulos críticos...');
|
| 135 |
-
|
| 136 |
-
// Preload dos módulos mais usados
|
| 137 |
-
window.loadModule('StorageManager').catch(() => {});
|
| 138 |
-
window.loadModule('PerformanceMonitor').catch(() => {});
|
| 139 |
-
}, { timeout: 2000 });
|
| 140 |
-
} else {
|
| 141 |
-
// Fallback para navegadores sem requestIdleCallback
|
| 142 |
-
setTimeout(() => {
|
| 143 |
-
window.loadModule('StorageManager').catch(() => {});
|
| 144 |
-
window.loadModule('PerformanceMonitor').catch(() => {});
|
| 145 |
-
}, 2000);
|
| 146 |
-
}
|
| 147 |
-
|
| 148 |
-
console.log('✅ [LazyLoader] Sistema configurado');
|
| 149 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/lazy-loader.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
class LazyLoader{constructor(){this.loadedModules=new Map();this.loadingPromises=new Map();}async loadModule(moduleName,modulePath){if(this.loadedModules.has(moduleName)){`);return this.loadedModules.get(moduleName);}if(this.loadingPromises.has(moduleName)){`);return this.loadingPromises.get(moduleName);}const loadPromise=this._loadModuleScript(modulePath).then(module=>{this.loadedModules.set(moduleName,module);this.loadingPromises.delete(moduleName);return module;}).catch(error=>{this.loadingPromises.delete(moduleName);console.error(`❌[LazyLoader]Erro ao carregar ${moduleName}:`,error);throw error;});this.loadingPromises.set(moduleName,loadPromise);return loadPromise;}async _loadModuleScript(modulePath){return new Promise((resolve,reject)=>{if(modulePath.endsWith('.js')){import(modulePath).then(module=> resolve(module)).catch(error=> reject(error));}else{const script=document.createElement('script');script.src=modulePath;script.type='module';script.onload=()=> resolve(window[modulePath]);script.onerror=()=> reject(new Error(`Failed to load ${modulePath}`));document.head.appendChild(script);}});}getLoadedModules(){return Array.from(this.loadedModules.keys());}unloadModule(moduleName){this.loadedModules.delete(moduleName);}clearAll(){this.loadedModules.clear();this.loadingPromises.clear();}}window.lazyLoader=new LazyLoader();const MODULE_CONFIG={'ExerciseSelector':'./modules/ExerciseSelector.js','NotificationManager':'./modules/NotificationManager.js','StorageManager':'./modules/StorageManager.js','PerformanceMonitor':'./modules/PerformanceMonitor.js'};window.loadModule=async function(moduleName){const modulePath=MODULE_CONFIG[moduleName];if(!modulePath){throw new Error(`Módulo ${moduleName}não encontrado na configuração`);}return window.lazyLoader.loadModule(moduleName,modulePath);};if('requestIdleCallback' in window){requestIdleCallback(()=>{window.loadModule('StorageManager').catch(()=>{});window.loadModule('PerformanceMonitor').catch(()=>{});},{timeout:2000});}else{setTimeout(()=>{window.loadModule('StorageManager').catch(()=>{});window.loadModule('PerformanceMonitor').catch(()=>{});},2000);}
|
|
|
|
|
|
public/lazy-video.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* Lazy Video Loader
|
| 3 |
+
*
|
| 4 |
+
* Optimized video loading system that:
|
| 5 |
+
* 1. Only loads videos when they're about to be viewed
|
| 6 |
+
* 2. Uses Intersection Observer for efficient detection
|
| 7 |
+
* 3. Provides loading states and error handling
|
| 8 |
+
* 4. Caches loaded videos for instant replay
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
class LazyVideoLoader {
|
| 12 |
+
constructor(options = {}) {
|
| 13 |
+
this.options = {
|
| 14 |
+
rootMargin: '50px',
|
| 15 |
+
threshold: 0.1,
|
| 16 |
+
cacheSize: 5, // Keep 5 videos cached
|
| 17 |
+
...options
|
| 18 |
+
};
|
| 19 |
+
|
| 20 |
+
this.videoCache = new Map();
|
| 21 |
+
this.loadingQueue = new Set();
|
| 22 |
+
this.observer = null;
|
| 23 |
+
|
| 24 |
+
this.init();
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
init() {
|
| 28 |
+
// Create Intersection Observer
|
| 29 |
+
if ('IntersectionObserver' in window) {
|
| 30 |
+
this.observer = new IntersectionObserver(
|
| 31 |
+
(entries) => this.handleIntersection(entries),
|
| 32 |
+
{
|
| 33 |
+
rootMargin: this.options.rootMargin,
|
| 34 |
+
threshold: this.options.threshold
|
| 35 |
+
}
|
| 36 |
+
);
|
| 37 |
+
}
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
handleIntersection(entries) {
|
| 41 |
+
entries.forEach(entry => {
|
| 42 |
+
if (entry.isIntersecting) {
|
| 43 |
+
const video = entry.target;
|
| 44 |
+
this.loadVideo(video);
|
| 45 |
+
this.observer.unobserve(video);
|
| 46 |
+
}
|
| 47 |
+
});
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
observe(videoElement) {
|
| 51 |
+
if (this.observer) {
|
| 52 |
+
this.observer.observe(videoElement);
|
| 53 |
+
} else {
|
| 54 |
+
// Fallback: load immediately if IntersectionObserver not supported
|
| 55 |
+
this.loadVideo(videoElement);
|
| 56 |
+
}
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
async loadVideo(videoElement) {
|
| 60 |
+
const src = videoElement.dataset.src;
|
| 61 |
+
|
| 62 |
+
if (!src || this.loadingQueue.has(src)) {
|
| 63 |
+
return;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
// Check cache first
|
| 67 |
+
if (this.videoCache.has(src)) {
|
| 68 |
+
videoElement.src = this.videoCache.get(src);
|
| 69 |
+
videoElement.load();
|
| 70 |
+
return;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
this.loadingQueue.add(src);
|
| 74 |
+
|
| 75 |
+
try {
|
| 76 |
+
// Show loading state
|
| 77 |
+
this.showLoading(videoElement);
|
| 78 |
+
|
| 79 |
+
// Preload the video
|
| 80 |
+
const blob = await this.fetchVideo(src);
|
| 81 |
+
const url = URL.createObjectURL(blob);
|
| 82 |
+
|
| 83 |
+
// Cache the video
|
| 84 |
+
this.cacheVideo(src, url);
|
| 85 |
+
|
| 86 |
+
// Set video source
|
| 87 |
+
videoElement.src = url;
|
| 88 |
+
videoElement.load();
|
| 89 |
+
|
| 90 |
+
// Hide loading state
|
| 91 |
+
this.hideLoading(videoElement);
|
| 92 |
+
|
| 93 |
+
} catch (error) {
|
| 94 |
+
console.error('Error loading video:', error);
|
| 95 |
+
this.showError(videoElement);
|
| 96 |
+
} finally {
|
| 97 |
+
this.loadingQueue.delete(src);
|
| 98 |
+
}
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
async fetchVideo(src) {
|
| 102 |
+
const response = await fetch(src);
|
| 103 |
+
|
| 104 |
+
if (!response.ok) {
|
| 105 |
+
throw new Error(`Failed to load video: ${response.status}`);
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
return await response.blob();
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
cacheVideo(src, url) {
|
| 112 |
+
// Implement LRU cache
|
| 113 |
+
if (this.videoCache.size >= this.options.cacheSize) {
|
| 114 |
+
// Remove oldest cached video
|
| 115 |
+
const firstKey = this.videoCache.keys().next().value;
|
| 116 |
+
const oldUrl = this.videoCache.get(firstKey);
|
| 117 |
+
URL.revokeObjectURL(oldUrl); // Free memory
|
| 118 |
+
this.videoCache.delete(firstKey);
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
this.videoCache.set(src, url);
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
showLoading(videoElement) {
|
| 125 |
+
const container = videoElement.parentElement;
|
| 126 |
+
if (container) {
|
| 127 |
+
container.classList.add('video-loading');
|
| 128 |
+
|
| 129 |
+
// Add loading spinner if not exists
|
| 130 |
+
if (!container.querySelector('.video-loader')) {
|
| 131 |
+
const loader = document.createElement('div');
|
| 132 |
+
loader.className = 'video-loader';
|
| 133 |
+
loader.innerHTML = '<div class="spinner"></div>';
|
| 134 |
+
container.appendChild(loader);
|
| 135 |
+
}
|
| 136 |
+
}
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
hideLoading(videoElement) {
|
| 140 |
+
const container = videoElement.parentElement;
|
| 141 |
+
if (container) {
|
| 142 |
+
container.classList.remove('video-loading');
|
| 143 |
+
const loader = container.querySelector('.video-loader');
|
| 144 |
+
if (loader) {
|
| 145 |
+
loader.remove();
|
| 146 |
+
}
|
| 147 |
+
}
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
showError(videoElement) {
|
| 151 |
+
const container = videoElement.parentElement;
|
| 152 |
+
if (container) {
|
| 153 |
+
container.classList.add('video-error');
|
| 154 |
+
container.classList.remove('video-loading');
|
| 155 |
+
|
| 156 |
+
const loader = container.querySelector('.video-loader');
|
| 157 |
+
if (loader) {
|
| 158 |
+
loader.remove();
|
| 159 |
+
}
|
| 160 |
+
}
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
preloadVideo(src) {
|
| 164 |
+
// Preload a video in the background
|
| 165 |
+
if (!this.videoCache.has(src) && !this.loadingQueue.has(src)) {
|
| 166 |
+
this.loadingQueue.add(src);
|
| 167 |
+
|
| 168 |
+
this.fetchVideo(src)
|
| 169 |
+
.then(blob => {
|
| 170 |
+
const url = URL.createObjectURL(blob);
|
| 171 |
+
this.cacheVideo(src, url);
|
| 172 |
+
})
|
| 173 |
+
.catch(err => console.error('Preload failed:', err))
|
| 174 |
+
.finally(() => this.loadingQueue.delete(src));
|
| 175 |
+
}
|
| 176 |
+
}
|
| 177 |
+
|
| 178 |
+
clearCache() {
|
| 179 |
+
// Clear all cached videos
|
| 180 |
+
this.videoCache.forEach(url => URL.revokeObjectURL(url));
|
| 181 |
+
this.videoCache.clear();
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
destroy() {
|
| 185 |
+
if (this.observer) {
|
| 186 |
+
this.observer.disconnect();
|
| 187 |
+
}
|
| 188 |
+
this.clearCache();
|
| 189 |
+
}
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
// Global instance
|
| 193 |
+
if (typeof window !== 'undefined') {
|
| 194 |
+
window.lazyVideoLoader = new LazyVideoLoader({
|
| 195 |
+
rootMargin: '100px', // Start loading when video is 100px from viewport
|
| 196 |
+
threshold: 0.1,
|
| 197 |
+
cacheSize: 5
|
| 198 |
+
});
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
// Export for module systems
|
| 202 |
+
if (typeof module !== 'undefined' && module.exports) {
|
| 203 |
+
module.exports = LazyVideoLoader;
|
| 204 |
+
}
|
| 205 |
+
|
public/modules/AchievementManager.js
DELETED
|
@@ -1,446 +0,0 @@
|
|
| 1 |
-
// 🏆 Achievement Manager - Sistema completo de conquistas e badges
|
| 2 |
-
export class AchievementManager {
|
| 3 |
-
constructor() {
|
| 4 |
-
this.achievements = this.loadAchievements();
|
| 5 |
-
this.unlockedAchievements = this.loadUnlocked();
|
| 6 |
-
|
| 7 |
-
// Definição de todas as conquistas disponíveis
|
| 8 |
-
this.availableAchievements = this.defineAchievements();
|
| 9 |
-
}
|
| 10 |
-
|
| 11 |
-
// Definir todas as conquistas
|
| 12 |
-
defineAchievements() {
|
| 13 |
-
return {
|
| 14 |
-
// Conquistas de treinos
|
| 15 |
-
'first_workout': {
|
| 16 |
-
id: 'first_workout',
|
| 17 |
-
name: 'Primeiro Passo',
|
| 18 |
-
description: 'Complete seu primeiro treino',
|
| 19 |
-
icon: '🎯',
|
| 20 |
-
category: 'workout',
|
| 21 |
-
points: 10
|
| 22 |
-
},
|
| 23 |
-
'workout_5': {
|
| 24 |
-
id: 'workout_5',
|
| 25 |
-
name: 'Aquecendo',
|
| 26 |
-
description: 'Complete 5 treinos',
|
| 27 |
-
icon: '🔥',
|
| 28 |
-
category: 'workout',
|
| 29 |
-
points: 25
|
| 30 |
-
},
|
| 31 |
-
'workout_10': {
|
| 32 |
-
id: 'workout_10',
|
| 33 |
-
name: 'Dedicado',
|
| 34 |
-
description: 'Complete 10 treinos',
|
| 35 |
-
icon: '💪',
|
| 36 |
-
category: 'workout',
|
| 37 |
-
points: 50
|
| 38 |
-
},
|
| 39 |
-
'workout_25': {
|
| 40 |
-
id: 'workout_25',
|
| 41 |
-
name: 'Guerreiro',
|
| 42 |
-
description: 'Complete 25 treinos',
|
| 43 |
-
icon: '⚡',
|
| 44 |
-
category: 'workout',
|
| 45 |
-
points: 100
|
| 46 |
-
},
|
| 47 |
-
'workout_50': {
|
| 48 |
-
id: 'workout_50',
|
| 49 |
-
name: 'Incansável',
|
| 50 |
-
description: 'Complete 50 treinos',
|
| 51 |
-
icon: '🦾',
|
| 52 |
-
category: 'workout',
|
| 53 |
-
points: 200
|
| 54 |
-
},
|
| 55 |
-
'workout_100': {
|
| 56 |
-
id: 'workout_100',
|
| 57 |
-
name: 'Lenda',
|
| 58 |
-
description: 'Complete 100 treinos',
|
| 59 |
-
icon: '👑',
|
| 60 |
-
category: 'workout',
|
| 61 |
-
points: 500
|
| 62 |
-
},
|
| 63 |
-
|
| 64 |
-
// Conquistas de streak
|
| 65 |
-
'streak_3': {
|
| 66 |
-
id: 'streak_3',
|
| 67 |
-
name: 'Consistência',
|
| 68 |
-
description: 'Treine 3 dias seguidos',
|
| 69 |
-
icon: '📅',
|
| 70 |
-
category: 'streak',
|
| 71 |
-
points: 15
|
| 72 |
-
},
|
| 73 |
-
'streak_7': {
|
| 74 |
-
id: 'streak_7',
|
| 75 |
-
name: 'Semana Perfeita',
|
| 76 |
-
description: 'Treine 7 dias seguidos',
|
| 77 |
-
icon: '🔷',
|
| 78 |
-
category: 'streak',
|
| 79 |
-
points: 50
|
| 80 |
-
},
|
| 81 |
-
'streak_14': {
|
| 82 |
-
id: 'streak_14',
|
| 83 |
-
name: 'Duas Semanas',
|
| 84 |
-
description: 'Treine 14 dias seguidos',
|
| 85 |
-
icon: '💎',
|
| 86 |
-
category: 'streak',
|
| 87 |
-
points: 100
|
| 88 |
-
},
|
| 89 |
-
'streak_30': {
|
| 90 |
-
id: 'streak_30',
|
| 91 |
-
name: 'Mês Completo',
|
| 92 |
-
description: 'Treine 30 dias seguidos',
|
| 93 |
-
icon: '⭐',
|
| 94 |
-
category: 'streak',
|
| 95 |
-
points: 250
|
| 96 |
-
},
|
| 97 |
-
|
| 98 |
-
// Conquistas de calorias
|
| 99 |
-
'calories_500': {
|
| 100 |
-
id: 'calories_500',
|
| 101 |
-
name: 'Queimando',
|
| 102 |
-
description: 'Queime 500 calorias total',
|
| 103 |
-
icon: '🔥',
|
| 104 |
-
category: 'calories',
|
| 105 |
-
points: 20
|
| 106 |
-
},
|
| 107 |
-
'calories_1000': {
|
| 108 |
-
id: 'calories_1000',
|
| 109 |
-
name: 'Forno',
|
| 110 |
-
description: 'Queime 1000 calorias total',
|
| 111 |
-
icon: '🌋',
|
| 112 |
-
category: 'calories',
|
| 113 |
-
points: 50
|
| 114 |
-
},
|
| 115 |
-
'calories_5000': {
|
| 116 |
-
id: 'calories_5000',
|
| 117 |
-
name: 'Inferno',
|
| 118 |
-
description: 'Queime 5000 calorias total',
|
| 119 |
-
icon: '☄️',
|
| 120 |
-
category: 'calories',
|
| 121 |
-
points: 150
|
| 122 |
-
},
|
| 123 |
-
'calories_500_day': {
|
| 124 |
-
id: 'calories_500_day',
|
| 125 |
-
name: 'Dia Intenso',
|
| 126 |
-
description: 'Queime 500 calorias em um dia',
|
| 127 |
-
icon: '💥',
|
| 128 |
-
category: 'calories',
|
| 129 |
-
points: 30
|
| 130 |
-
},
|
| 131 |
-
|
| 132 |
-
// Conquistas de tempo
|
| 133 |
-
'minutes_60': {
|
| 134 |
-
id: 'minutes_60',
|
| 135 |
-
name: 'Hora de Glória',
|
| 136 |
-
description: 'Acumule 60 minutos de treino',
|
| 137 |
-
icon: '⏰',
|
| 138 |
-
category: 'time',
|
| 139 |
-
points: 20
|
| 140 |
-
},
|
| 141 |
-
'minutes_300': {
|
| 142 |
-
id: 'minutes_300',
|
| 143 |
-
name: 'Maratonista',
|
| 144 |
-
description: 'Acumule 300 minutos de treino',
|
| 145 |
-
icon: '⏱️',
|
| 146 |
-
category: 'time',
|
| 147 |
-
points: 75
|
| 148 |
-
},
|
| 149 |
-
'minutes_1000': {
|
| 150 |
-
id: 'minutes_1000',
|
| 151 |
-
name: 'Ultra Endurance',
|
| 152 |
-
description: 'Acumule 1000 minutos de treino',
|
| 153 |
-
icon: '🏃♀️',
|
| 154 |
-
category: 'time',
|
| 155 |
-
points: 200
|
| 156 |
-
},
|
| 157 |
-
|
| 158 |
-
// Conquistas de peso
|
| 159 |
-
'weight_1kg': {
|
| 160 |
-
id: 'weight_1kg',
|
| 161 |
-
name: 'Primeiro Quilo',
|
| 162 |
-
description: 'Perca 1 kg',
|
| 163 |
-
icon: '📉',
|
| 164 |
-
category: 'weight',
|
| 165 |
-
points: 25
|
| 166 |
-
},
|
| 167 |
-
'weight_3kg': {
|
| 168 |
-
id: 'weight_3kg',
|
| 169 |
-
name: 'Evolução Visível',
|
| 170 |
-
description: 'Perca 3 kg',
|
| 171 |
-
icon: '📊',
|
| 172 |
-
category: 'weight',
|
| 173 |
-
points: 75
|
| 174 |
-
},
|
| 175 |
-
'weight_5kg': {
|
| 176 |
-
id: 'weight_5kg',
|
| 177 |
-
name: 'Transformação',
|
| 178 |
-
description: 'Perca 5 kg',
|
| 179 |
-
icon: '🎊',
|
| 180 |
-
category: 'weight',
|
| 181 |
-
points: 150
|
| 182 |
-
},
|
| 183 |
-
'weight_10kg': {
|
| 184 |
-
id: 'weight_10kg',
|
| 185 |
-
name: 'Nova Pessoa',
|
| 186 |
-
description: 'Perca 10 kg',
|
| 187 |
-
icon: '🌟',
|
| 188 |
-
category: 'weight',
|
| 189 |
-
points: 300
|
| 190 |
-
},
|
| 191 |
-
'weight_goal': {
|
| 192 |
-
id: 'weight_goal',
|
| 193 |
-
name: 'Meta Alcançada',
|
| 194 |
-
description: 'Alcance seu peso meta',
|
| 195 |
-
icon: '🏆',
|
| 196 |
-
category: 'weight',
|
| 197 |
-
points: 500
|
| 198 |
-
},
|
| 199 |
-
|
| 200 |
-
// Conquistas especiais
|
| 201 |
-
'complete_30day': {
|
| 202 |
-
id: 'complete_30day',
|
| 203 |
-
name: 'Plano Completo',
|
| 204 |
-
description: 'Complete o plano de 30 dias',
|
| 205 |
-
icon: '🎖️',
|
| 206 |
-
category: 'special',
|
| 207 |
-
points: 250
|
| 208 |
-
},
|
| 209 |
-
'early_bird': {
|
| 210 |
-
id: 'early_bird',
|
| 211 |
-
name: 'Madrugador',
|
| 212 |
-
description: 'Treine antes das 7h',
|
| 213 |
-
icon: '🌅',
|
| 214 |
-
category: 'special',
|
| 215 |
-
points: 30
|
| 216 |
-
},
|
| 217 |
-
'night_owl': {
|
| 218 |
-
id: 'night_owl',
|
| 219 |
-
name: 'Coruja',
|
| 220 |
-
description: 'Treine depois das 22h',
|
| 221 |
-
icon: '🦉',
|
| 222 |
-
category: 'special',
|
| 223 |
-
points: 30
|
| 224 |
-
},
|
| 225 |
-
'weekend_warrior': {
|
| 226 |
-
id: 'weekend_warrior',
|
| 227 |
-
name: 'Guerreiro de Fim de Semana',
|
| 228 |
-
description: 'Treine em um sábado e domingo',
|
| 229 |
-
icon: '🎉',
|
| 230 |
-
category: 'special',
|
| 231 |
-
points: 40
|
| 232 |
-
},
|
| 233 |
-
'water_master': {
|
| 234 |
-
id: 'water_master',
|
| 235 |
-
name: 'Hidratação Perfeita',
|
| 236 |
-
description: 'Beba 8 copos de água por 7 dias',
|
| 237 |
-
icon: '💧',
|
| 238 |
-
category: 'special',
|
| 239 |
-
points: 50
|
| 240 |
-
}
|
| 241 |
-
};
|
| 242 |
-
}
|
| 243 |
-
|
| 244 |
-
// Carregar conquistas desbloqueadas
|
| 245 |
-
loadUnlocked() {
|
| 246 |
-
try {
|
| 247 |
-
const data = localStorage.getItem('unlockedAchievements');
|
| 248 |
-
return data ? JSON.parse(data) : [];
|
| 249 |
-
} catch (e) {
|
| 250 |
-
console.error('Error loading achievements:', e);
|
| 251 |
-
return [];
|
| 252 |
-
}
|
| 253 |
-
}
|
| 254 |
-
|
| 255 |
-
// Salvar conquistas
|
| 256 |
-
saveUnlocked() {
|
| 257 |
-
try {
|
| 258 |
-
localStorage.setItem('unlockedAchievements', JSON.stringify(this.unlockedAchievements));
|
| 259 |
-
return true;
|
| 260 |
-
} catch (e) {
|
| 261 |
-
console.error('Error saving achievements:', e);
|
| 262 |
-
return false;
|
| 263 |
-
}
|
| 264 |
-
}
|
| 265 |
-
|
| 266 |
-
// Carregar dados de conquistas
|
| 267 |
-
loadAchievements() {
|
| 268 |
-
return this.loadUnlocked();
|
| 269 |
-
}
|
| 270 |
-
|
| 271 |
-
// Verificar se conquista está desbloqueada
|
| 272 |
-
isUnlocked(achievementId) {
|
| 273 |
-
return this.unlockedAchievements.includes(achievementId);
|
| 274 |
-
}
|
| 275 |
-
|
| 276 |
-
// Desbloquear conquista
|
| 277 |
-
unlock(achievementId) {
|
| 278 |
-
if (this.isUnlocked(achievementId)) {
|
| 279 |
-
return false; // Já desbloqueada
|
| 280 |
-
}
|
| 281 |
-
|
| 282 |
-
const achievement = this.availableAchievements[achievementId];
|
| 283 |
-
if (!achievement) {
|
| 284 |
-
return false; // Conquista não existe
|
| 285 |
-
}
|
| 286 |
-
|
| 287 |
-
this.unlockedAchievements.push(achievementId);
|
| 288 |
-
this.saveUnlocked();
|
| 289 |
-
|
| 290 |
-
return {
|
| 291 |
-
unlocked: true,
|
| 292 |
-
achievement: achievement
|
| 293 |
-
};
|
| 294 |
-
}
|
| 295 |
-
|
| 296 |
-
// Verificar e desbloquear conquistas automaticamente
|
| 297 |
-
checkAchievements(progress) {
|
| 298 |
-
const newAchievements = [];
|
| 299 |
-
|
| 300 |
-
// Conquistas de treinos
|
| 301 |
-
if (progress.workoutsCompleted === 1) {
|
| 302 |
-
const result = this.unlock('first_workout');
|
| 303 |
-
if (result) newAchievements.push(result.achievement);
|
| 304 |
-
}
|
| 305 |
-
if (progress.workoutsCompleted === 5) {
|
| 306 |
-
const result = this.unlock('workout_5');
|
| 307 |
-
if (result) newAchievements.push(result.achievement);
|
| 308 |
-
}
|
| 309 |
-
if (progress.workoutsCompleted === 10) {
|
| 310 |
-
const result = this.unlock('workout_10');
|
| 311 |
-
if (result) newAchievements.push(result.achievement);
|
| 312 |
-
}
|
| 313 |
-
if (progress.workoutsCompleted === 25) {
|
| 314 |
-
const result = this.unlock('workout_25');
|
| 315 |
-
if (result) newAchievements.push(result.achievement);
|
| 316 |
-
}
|
| 317 |
-
if (progress.workoutsCompleted === 50) {
|
| 318 |
-
const result = this.unlock('workout_50');
|
| 319 |
-
if (result) newAchievements.push(result.achievement);
|
| 320 |
-
}
|
| 321 |
-
if (progress.workoutsCompleted === 100) {
|
| 322 |
-
const result = this.unlock('workout_100');
|
| 323 |
-
if (result) newAchievements.push(result.achievement);
|
| 324 |
-
}
|
| 325 |
-
|
| 326 |
-
// Conquistas de streak
|
| 327 |
-
if (progress.streak >= 3) {
|
| 328 |
-
const result = this.unlock('streak_3');
|
| 329 |
-
if (result) newAchievements.push(result.achievement);
|
| 330 |
-
}
|
| 331 |
-
if (progress.streak >= 7) {
|
| 332 |
-
const result = this.unlock('streak_7');
|
| 333 |
-
if (result) newAchievements.push(result.achievement);
|
| 334 |
-
}
|
| 335 |
-
if (progress.streak >= 14) {
|
| 336 |
-
const result = this.unlock('streak_14');
|
| 337 |
-
if (result) newAchievements.push(result.achievement);
|
| 338 |
-
}
|
| 339 |
-
if (progress.streak >= 30) {
|
| 340 |
-
const result = this.unlock('streak_30');
|
| 341 |
-
if (result) newAchievements.push(result.achievement);
|
| 342 |
-
}
|
| 343 |
-
|
| 344 |
-
// Conquistas de calorias
|
| 345 |
-
if (progress.totalCalories >= 500) {
|
| 346 |
-
const result = this.unlock('calories_500');
|
| 347 |
-
if (result) newAchievements.push(result.achievement);
|
| 348 |
-
}
|
| 349 |
-
if (progress.totalCalories >= 1000) {
|
| 350 |
-
const result = this.unlock('calories_1000');
|
| 351 |
-
if (result) newAchievements.push(result.achievement);
|
| 352 |
-
}
|
| 353 |
-
if (progress.totalCalories >= 5000) {
|
| 354 |
-
const result = this.unlock('calories_5000');
|
| 355 |
-
if (result) newAchievements.push(result.achievement);
|
| 356 |
-
}
|
| 357 |
-
if (progress.dailyCalories >= 500) {
|
| 358 |
-
const result = this.unlock('calories_500_day');
|
| 359 |
-
if (result) newAchievements.push(result.achievement);
|
| 360 |
-
}
|
| 361 |
-
|
| 362 |
-
// Conquistas de tempo
|
| 363 |
-
if (progress.totalMinutes >= 60) {
|
| 364 |
-
const result = this.unlock('minutes_60');
|
| 365 |
-
if (result) newAchievements.push(result.achievement);
|
| 366 |
-
}
|
| 367 |
-
if (progress.totalMinutes >= 300) {
|
| 368 |
-
const result = this.unlock('minutes_300');
|
| 369 |
-
if (result) newAchievements.push(result.achievement);
|
| 370 |
-
}
|
| 371 |
-
if (progress.totalMinutes >= 1000) {
|
| 372 |
-
const result = this.unlock('minutes_1000');
|
| 373 |
-
if (result) newAchievements.push(result.achievement);
|
| 374 |
-
}
|
| 375 |
-
|
| 376 |
-
return newAchievements;
|
| 377 |
-
}
|
| 378 |
-
|
| 379 |
-
// Verificar conquistas de peso
|
| 380 |
-
checkWeightAchievements(initialWeight, currentWeight, goalWeight) {
|
| 381 |
-
const newAchievements = [];
|
| 382 |
-
const weightLost = initialWeight - currentWeight;
|
| 383 |
-
|
| 384 |
-
if (weightLost >= 1) {
|
| 385 |
-
const result = this.unlock('weight_1kg');
|
| 386 |
-
if (result) newAchievements.push(result.achievement);
|
| 387 |
-
}
|
| 388 |
-
if (weightLost >= 3) {
|
| 389 |
-
const result = this.unlock('weight_3kg');
|
| 390 |
-
if (result) newAchievements.push(result.achievement);
|
| 391 |
-
}
|
| 392 |
-
if (weightLost >= 5) {
|
| 393 |
-
const result = this.unlock('weight_5kg');
|
| 394 |
-
if (result) newAchievements.push(result.achievement);
|
| 395 |
-
}
|
| 396 |
-
if (weightLost >= 10) {
|
| 397 |
-
const result = this.unlock('weight_10kg');
|
| 398 |
-
if (result) newAchievements.push(result.achievement);
|
| 399 |
-
}
|
| 400 |
-
if (currentWeight <= goalWeight) {
|
| 401 |
-
const result = this.unlock('weight_goal');
|
| 402 |
-
if (result) newAchievements.push(result.achievement);
|
| 403 |
-
}
|
| 404 |
-
|
| 405 |
-
return newAchievements;
|
| 406 |
-
}
|
| 407 |
-
|
| 408 |
-
// Obter todas as conquistas
|
| 409 |
-
getAllAchievements() {
|
| 410 |
-
return Object.values(this.availableAchievements);
|
| 411 |
-
}
|
| 412 |
-
|
| 413 |
-
// Obter conquistas desbloqueadas
|
| 414 |
-
getUnlockedAchievements() {
|
| 415 |
-
return this.unlockedAchievements.map(id => this.availableAchievements[id]).filter(Boolean);
|
| 416 |
-
}
|
| 417 |
-
|
| 418 |
-
// Obter conquistas bloqueadas
|
| 419 |
-
getLockedAchievements() {
|
| 420 |
-
return this.getAllAchievements().filter(a => !this.isUnlocked(a.id));
|
| 421 |
-
}
|
| 422 |
-
|
| 423 |
-
// Obter progresso geral (%)
|
| 424 |
-
getProgress() {
|
| 425 |
-
const total = this.getAllAchievements().length;
|
| 426 |
-
const unlocked = this.unlockedAchievements.length;
|
| 427 |
-
return Math.round((unlocked / total) * 100);
|
| 428 |
-
}
|
| 429 |
-
|
| 430 |
-
// Obter pontos totais
|
| 431 |
-
getTotalPoints() {
|
| 432 |
-
return this.getUnlockedAchievements().reduce((sum, a) => sum + a.points, 0);
|
| 433 |
-
}
|
| 434 |
-
|
| 435 |
-
// Obter conquistas por categoria
|
| 436 |
-
getByCategory(category) {
|
| 437 |
-
return this.getAllAchievements().filter(a => a.category === category);
|
| 438 |
-
}
|
| 439 |
-
|
| 440 |
-
// Resetar todas as conquistas
|
| 441 |
-
reset() {
|
| 442 |
-
this.unlockedAchievements = [];
|
| 443 |
-
return this.saveUnlocked();
|
| 444 |
-
}
|
| 445 |
-
}
|
| 446 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/modules/AchievementManager.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
export class AchievementManager{constructor(){this.achievements=this.loadAchievements();this.unlockedAchievements=this.loadUnlocked();this.availableAchievements=this.defineAchievements();}defineAchievements(){return{'first_workout':{id:'first_workout',name:'Primeiro Passo',description:'Complete seu primeiro treino',icon:'🎯',category:'workout',points:10},'workout_5':{id:'workout_5',name:'Aquecendo',description:'Complete 5 treinos',icon:'🔥',category:'workout',points:25},'workout_10':{id:'workout_10',name:'Dedicado',description:'Complete 10 treinos',icon:'💪',category:'workout',points:50},'workout_25':{id:'workout_25',name:'Guerreiro',description:'Complete 25 treinos',icon:'⚡',category:'workout',points:100},'workout_50':{id:'workout_50',name:'Incansável',description:'Complete 50 treinos',icon:'🦾',category:'workout',points:200},'workout_100':{id:'workout_100',name:'Lenda',description:'Complete 100 treinos',icon:'👑',category:'workout',points:500},'streak_3':{id:'streak_3',name:'Consistência',description:'Treine 3 dias seguidos',icon:'📅',category:'streak',points:15},'streak_7':{id:'streak_7',name:'Semana Perfeita',description:'Treine 7 dias seguidos',icon:'🔷',category:'streak',points:50},'streak_14':{id:'streak_14',name:'Duas Semanas',description:'Treine 14 dias seguidos',icon:'💎',category:'streak',points:100},'streak_30':{id:'streak_30',name:'Mês Completo',description:'Treine 30 dias seguidos',icon:'⭐',category:'streak',points:250},'calories_500':{id:'calories_500',name:'Queimando',description:'Queime 500 calorias total',icon:'🔥',category:'calories',points:20},'calories_1000':{id:'calories_1000',name:'Forno',description:'Queime 1000 calorias total',icon:'🌋',category:'calories',points:50},'calories_5000':{id:'calories_5000',name:'Inferno',description:'Queime 5000 calorias total',icon:'☄️',category:'calories',points:150},'calories_500_day':{id:'calories_500_day',name:'Dia Intenso',description:'Queime 500 calorias em um dia',icon:'💥',category:'calories',points:30},'minutes_60':{id:'minutes_60',name:'Hora de Glória',description:'Acumule 60 minutos de treino',icon:'⏰',category:'time',points:20},'minutes_300':{id:'minutes_300',name:'Maratonista',description:'Acumule 300 minutos de treino',icon:'⏱️',category:'time',points:75},'minutes_1000':{id:'minutes_1000',name:'Ultra Endurance',description:'Acumule 1000 minutos de treino',icon:'🏃♀️',category:'time',points:200},'weight_1kg':{id:'weight_1kg',name:'Primeiro Quilo',description:'Perca 1 kg',icon:'📉',category:'weight',points:25},'weight_3kg':{id:'weight_3kg',name:'Evolução Visível',description:'Perca 3 kg',icon:'📊',category:'weight',points:75},'weight_5kg':{id:'weight_5kg',name:'Transformação',description:'Perca 5 kg',icon:'🎊',category:'weight',points:150},'weight_10kg':{id:'weight_10kg',name:'Nova Pessoa',description:'Perca 10 kg',icon:'🌟',category:'weight',points:300},'weight_goal':{id:'weight_goal',name:'Meta Alcançada',description:'Alcance seu peso meta',icon:'🏆',category:'weight',points:500},'complete_30day':{id:'complete_30day',name:'Plano Completo',description:'Complete o plano de 30 dias',icon:'🎖️',category:'special',points:250},'early_bird':{id:'early_bird',name:'Madrugador',description:'Treine antes das 7h',icon:'🌅',category:'special',points:30},'night_owl':{id:'night_owl',name:'Coruja',description:'Treine depois das 22h',icon:'🦉',category:'special',points:30},'weekend_warrior':{id:'weekend_warrior',name:'Guerreiro de Fim de Semana',description:'Treine em um sábado e domingo',icon:'🎉',category:'special',points:40},'water_master':{id:'water_master',name:'Hidratação Perfeita',description:'Beba 8 copos de água por 7 dias',icon:'💧',category:'special',points:50}};}loadUnlocked(){try{const data=localStorage.getItem('unlockedAchievements');return data ? JSON.parse(data):[];}catch(e){console.error('Error loading achievements:',e);return[];}}saveUnlocked(){try{localStorage.setItem('unlockedAchievements',JSON.stringify(this.unlockedAchievements));return true;}catch(e){console.error('Error saving achievements:',e);return false;}}loadAchievements(){return this.loadUnlocked();}isUnlocked(achievementId){return this.unlockedAchievements.includes(achievementId);}unlock(achievementId){if(this.isUnlocked(achievementId)){return false;}const achievement=this.availableAchievements[achievementId];if(!achievement){return false;}this.unlockedAchievements.push(achievementId);this.saveUnlocked();return{unlocked:true,achievement:achievement};}checkAchievements(progress){const newAchievements=[];if(progress.workoutsCompleted===1){const result=this.unlock('first_workout');if(result)newAchievements.push(result.achievement);}if(progress.workoutsCompleted===5){const result=this.unlock('workout_5');if(result)newAchievements.push(result.achievement);}if(progress.workoutsCompleted===10){const result=this.unlock('workout_10');if(result)newAchievements.push(result.achievement);}if(progress.workoutsCompleted===25){const result=this.unlock('workout_25');if(result)newAchievements.push(result.achievement);}if(progress.workoutsCompleted===50){const result=this.unlock('workout_50');if(result)newAchievements.push(result.achievement);}if(progress.workoutsCompleted===100){const result=this.unlock('workout_100');if(result)newAchievements.push(result.achievement);}if(progress.streak >=3){const result=this.unlock('streak_3');if(result)newAchievements.push(result.achievement);}if(progress.streak >=7){const result=this.unlock('streak_7');if(result)newAchievements.push(result.achievement);}if(progress.streak >=14){const result=this.unlock('streak_14');if(result)newAchievements.push(result.achievement);}if(progress.streak >=30){const result=this.unlock('streak_30');if(result)newAchievements.push(result.achievement);}if(progress.totalCalories >=500){const result=this.unlock('calories_500');if(result)newAchievements.push(result.achievement);}if(progress.totalCalories >=1000){const result=this.unlock('calories_1000');if(result)newAchievements.push(result.achievement);}if(progress.totalCalories >=5000){const result=this.unlock('calories_5000');if(result)newAchievements.push(result.achievement);}if(progress.dailyCalories >=500){const result=this.unlock('calories_500_day');if(result)newAchievements.push(result.achievement);}if(progress.totalMinutes >=60){const result=this.unlock('minutes_60');if(result)newAchievements.push(result.achievement);}if(progress.totalMinutes >=300){const result=this.unlock('minutes_300');if(result)newAchievements.push(result.achievement);}if(progress.totalMinutes >=1000){const result=this.unlock('minutes_1000');if(result)newAchievements.push(result.achievement);}return newAchievements;}checkWeightAchievements(initialWeight,currentWeight,goalWeight){const newAchievements=[];const weightLost=initialWeight-currentWeight;if(weightLost >=1){const result=this.unlock('weight_1kg');if(result)newAchievements.push(result.achievement);}if(weightLost >=3){const result=this.unlock('weight_3kg');if(result)newAchievements.push(result.achievement);}if(weightLost >=5){const result=this.unlock('weight_5kg');if(result)newAchievements.push(result.achievement);}if(weightLost >=10){const result=this.unlock('weight_10kg');if(result)newAchievements.push(result.achievement);}if(currentWeight <=goalWeight){const result=this.unlock('weight_goal');if(result)newAchievements.push(result.achievement);}return newAchievements;}getAllAchievements(){return Object.values(this.availableAchievements);}getUnlockedAchievements(){return this.unlockedAchievements.map(id=> this.availableAchievements[id]).filter(Boolean);}getLockedAchievements(){return this.getAllAchievements().filter(a=> !this.isUnlocked(a.id));}getProgress(){const total=this.getAllAchievements().length;const unlocked=this.unlockedAchievements.length;return Math.round((unlocked/total)*100);}getTotalPoints(){return this.getUnlockedAchievements().reduce((sum,a)=> sum+a.points,0);}getByCategory(category){return this.getAllAchievements().filter(a=> a.category===category);}reset(){this.unlockedAchievements=[];return this.saveUnlocked();}}
|
|
|
|
|
|
public/modules/AudioManager.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
| 1 |
-
// 🔊 Audio Manager - Sistema completo de áudio e sons
|
| 2 |
-
export class AudioManager {
|
| 3 |
-
constructor() {
|
| 4 |
-
this.soundEnabled = localStorage.getItem('soundEnabled') !== 'false';
|
| 5 |
-
this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
| 6 |
-
this.audioLoaded = false;
|
| 7 |
-
|
| 8 |
-
// URLs de áudio com fallback
|
| 9 |
-
this.AUDIO_BASE_URL = 'songs/';
|
| 10 |
-
this.AUDIO_BASE_URL_FALLBACK = 'https://huggingface.co/datasets/RaiSantos/k30/resolve/main/';
|
| 11 |
-
|
| 12 |
-
// Sons disponíveis
|
| 13 |
-
this.sounds = {
|
| 14 |
-
backgroundYoga: this.createAudioWithFallback('background_yoga.mp3'),
|
| 15 |
-
startYoga: this.createAudioWithFallback('start_yoga.mp3'),
|
| 16 |
-
countdown: this.createAudioWithFallback('td_countdown.mp3'),
|
| 17 |
-
motivational: this.createAudioWithFallback('td_di_2.ogg')
|
| 18 |
-
};
|
| 19 |
-
|
| 20 |
-
this.setupAudio();
|
| 21 |
-
}
|
| 22 |
-
|
| 23 |
-
// Criar áudio com fallback para CDN
|
| 24 |
-
createAudioWithFallback(filename) {
|
| 25 |
-
const audio = new Audio(this.AUDIO_BASE_URL + filename);
|
| 26 |
-
|
| 27 |
-
// Fallback: Se áudio local falhar, tenta Hugging Face CDN
|
| 28 |
-
audio.addEventListener('error', () => {
|
| 29 |
-
if (audio.src.includes(this.AUDIO_BASE_URL)) {
|
| 30 |
-
audio.src = this.AUDIO_BASE_URL_FALLBACK + filename;
|
| 31 |
-
}
|
| 32 |
-
}, { once: true });
|
| 33 |
-
|
| 34 |
-
return audio;
|
| 35 |
-
}
|
| 36 |
-
|
| 37 |
-
// Configurar áudios
|
| 38 |
-
setupAudio() {
|
| 39 |
-
// Música de fundo em loop
|
| 40 |
-
this.sounds.backgroundYoga.loop = true;
|
| 41 |
-
this.sounds.backgroundYoga.volume = 0.3;
|
| 42 |
-
}
|
| 43 |
-
|
| 44 |
-
// Garantir que áudio está carregado
|
| 45 |
-
ensureAudioLoaded() {
|
| 46 |
-
if (this.audioLoaded) return;
|
| 47 |
-
|
| 48 |
-
// Preload audio on first interaction
|
| 49 |
-
Object.values(this.sounds).forEach(sound => {
|
| 50 |
-
sound.load();
|
| 51 |
-
});
|
| 52 |
-
this.audioLoaded = true;
|
| 53 |
-
}
|
| 54 |
-
|
| 55 |
-
// Som de UI fofo e satisfatório (Web Audio API)
|
| 56 |
-
playCuteSound(type) {
|
| 57 |
-
if (!this.soundEnabled) return;
|
| 58 |
-
|
| 59 |
-
const oscillator = this.audioContext.createOscillator();
|
| 60 |
-
const gainNode = this.audioContext.createGain();
|
| 61 |
-
|
| 62 |
-
oscillator.connect(gainNode);
|
| 63 |
-
gainNode.connect(this.audioContext.destination);
|
| 64 |
-
|
| 65 |
-
// Diferentes sons para diferentes ações
|
| 66 |
-
switch(type) {
|
| 67 |
-
case 'click':
|
| 68 |
-
oscillator.frequency.setValueAtTime(800, this.audioContext.currentTime);
|
| 69 |
-
oscillator.frequency.exponentialRampToValueAtTime(400, this.audioContext.currentTime + 0.1);
|
| 70 |
-
gainNode.gain.setValueAtTime(0.1, this.audioContext.currentTime);
|
| 71 |
-
gainNode.gain.exponentialRampToValueAtTime(0.01, this.audioContext.currentTime + 0.1);
|
| 72 |
-
oscillator.type = 'sine';
|
| 73 |
-
break;
|
| 74 |
-
case 'success':
|
| 75 |
-
oscillator.frequency.setValueAtTime(523.25, this.audioContext.currentTime);
|
| 76 |
-
oscillator.frequency.setValueAtTime(659.25, this.audioContext.currentTime + 0.1);
|
| 77 |
-
oscillator.frequency.setValueAtTime(783.99, this.audioContext.currentTime + 0.2);
|
| 78 |
-
gainNode.gain.setValueAtTime(0.15, this.audioContext.currentTime);
|
| 79 |
-
gainNode.gain.exponentialRampToValueAtTime(0.01, this.audioContext.currentTime + 0.3);
|
| 80 |
-
oscillator.type = 'triangle';
|
| 81 |
-
break;
|
| 82 |
-
case 'error':
|
| 83 |
-
oscillator.frequency.setValueAtTime(200, this.audioContext.currentTime);
|
| 84 |
-
oscillator.frequency.exponentialRampToValueAtTime(100, this.audioContext.currentTime + 0.2);
|
| 85 |
-
gainNode.gain.setValueAtTime(0.1, this.audioContext.currentTime);
|
| 86 |
-
gainNode.gain.exponentialRampToValueAtTime(0.01, this.audioContext.currentTime + 0.2);
|
| 87 |
-
oscillator.type = 'sawtooth';
|
| 88 |
-
break;
|
| 89 |
-
case 'notification':
|
| 90 |
-
oscillator.frequency.setValueAtTime(880, this.audioContext.currentTime);
|
| 91 |
-
oscillator.frequency.setValueAtTime(1046.5, this.audioContext.currentTime + 0.1);
|
| 92 |
-
gainNode.gain.setValueAtTime(0.12, this.audioContext.currentTime);
|
| 93 |
-
gainNode.gain.exponentialRampToValueAtTime(0.01, this.audioContext.currentTime + 0.2);
|
| 94 |
-
oscillator.type = 'sine';
|
| 95 |
-
break;
|
| 96 |
-
default:
|
| 97 |
-
oscillator.frequency.setValueAtTime(440, this.audioContext.currentTime);
|
| 98 |
-
gainNode.gain.setValueAtTime(0.1, this.audioContext.currentTime);
|
| 99 |
-
gainNode.gain.exponentialRampToValueAtTime(0.01, this.audioContext.currentTime + 0.1);
|
| 100 |
-
oscillator.type = 'sine';
|
| 101 |
-
}
|
| 102 |
-
|
| 103 |
-
oscillator.start(this.audioContext.currentTime);
|
| 104 |
-
oscillator.stop(this.audioContext.currentTime + 0.3);
|
| 105 |
-
}
|
| 106 |
-
|
| 107 |
-
// Tocar som específico
|
| 108 |
-
playSound(soundName) {
|
| 109 |
-
if (!this.soundEnabled) return;
|
| 110 |
-
if (!this.sounds[soundName]) return;
|
| 111 |
-
|
| 112 |
-
this.ensureAudioLoaded();
|
| 113 |
-
|
| 114 |
-
const sound = this.sounds[soundName];
|
| 115 |
-
sound.currentTime = 0;
|
| 116 |
-
sound.play().catch(e => console.log('Audio play failed:', e));
|
| 117 |
-
}
|
| 118 |
-
|
| 119 |
-
// Parar som específico
|
| 120 |
-
stopSound(soundName) {
|
| 121 |
-
if (!this.sounds[soundName]) return;
|
| 122 |
-
|
| 123 |
-
const sound = this.sounds[soundName];
|
| 124 |
-
sound.pause();
|
| 125 |
-
sound.currentTime = 0;
|
| 126 |
-
}
|
| 127 |
-
|
| 128 |
-
// Parar todos os sons
|
| 129 |
-
stopAllSounds() {
|
| 130 |
-
Object.values(this.sounds).forEach(sound => {
|
| 131 |
-
sound.pause();
|
| 132 |
-
sound.currentTime = 0;
|
| 133 |
-
});
|
| 134 |
-
}
|
| 135 |
-
|
| 136 |
-
// Alternar som ligado/desligado
|
| 137 |
-
toggleSound() {
|
| 138 |
-
this.soundEnabled = !this.soundEnabled;
|
| 139 |
-
localStorage.setItem('soundEnabled', this.soundEnabled);
|
| 140 |
-
|
| 141 |
-
if (!this.soundEnabled) {
|
| 142 |
-
this.stopAllSounds();
|
| 143 |
-
}
|
| 144 |
-
|
| 145 |
-
return this.soundEnabled;
|
| 146 |
-
}
|
| 147 |
-
|
| 148 |
-
// Verificar se som está ligado
|
| 149 |
-
isSoundEnabled() {
|
| 150 |
-
return this.soundEnabled;
|
| 151 |
-
}
|
| 152 |
-
|
| 153 |
-
// Ajustar volume geral
|
| 154 |
-
setVolume(volume) {
|
| 155 |
-
const vol = Math.max(0, Math.min(1, volume));
|
| 156 |
-
Object.values(this.sounds).forEach(sound => {
|
| 157 |
-
sound.volume = vol;
|
| 158 |
-
});
|
| 159 |
-
}
|
| 160 |
-
|
| 161 |
-
// Ajustar volume de som específico
|
| 162 |
-
setSoundVolume(soundName, volume) {
|
| 163 |
-
if (!this.sounds[soundName]) return;
|
| 164 |
-
|
| 165 |
-
const vol = Math.max(0, Math.min(1, volume));
|
| 166 |
-
this.sounds[soundName].volume = vol;
|
| 167 |
-
}
|
| 168 |
-
|
| 169 |
-
// Destruir (cleanup)
|
| 170 |
-
destroy() {
|
| 171 |
-
this.stopAllSounds();
|
| 172 |
-
Object.values(this.sounds).forEach(sound => {
|
| 173 |
-
sound.src = '';
|
| 174 |
-
sound.load();
|
| 175 |
-
});
|
| 176 |
-
}
|
| 177 |
-
}
|
| 178 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/modules/AudioManager.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
export class AudioManager{constructor(){this.soundEnabled=localStorage.getItem('soundEnabled')!=='false';this.audioContext=new(window.AudioContext || window.webkitAudioContext)();this.audioLoaded=false;this.AUDIO_BASE_URL='songs/';this.AUDIO_BASE_URL_FALLBACK='https:this.sounds={backgroundYoga:this.createAudioWithFallback('background_yoga.mp3'),startYoga:this.createAudioWithFallback('start_yoga.mp3'),countdown:this.createAudioWithFallback('td_countdown.mp3'),motivational:this.createAudioWithFallback('td_di_2.ogg')};this.setupAudio();}createAudioWithFallback(filename){const audio=new Audio(this.AUDIO_BASE_URL+filename);audio.addEventListener('error',()=>{if(audio.src.includes(this.AUDIO_BASE_URL)){audio.src=this.AUDIO_BASE_URL_FALLBACK+filename;}},{once:true});return audio;}setupAudio(){this.sounds.backgroundYoga.loop=true;this.sounds.backgroundYoga.volume=0.3;}ensureAudioLoaded(){if(this.audioLoaded)return;Object.values(this.sounds).forEach(sound=>{sound.load();});this.audioLoaded=true;}playCuteSound(type){if(!this.soundEnabled)return;const oscillator=this.audioContext.createOscillator();const gainNode=this.audioContext.createGain();oscillator.connect(gainNode);gainNode.connect(this.audioContext.destination);switch(type){case 'click':oscillator.frequency.setValueAtTime(800,this.audioContext.currentTime);oscillator.frequency.exponentialRampToValueAtTime(400,this.audioContext.currentTime+0.1);gainNode.gain.setValueAtTime(0.1,this.audioContext.currentTime);gainNode.gain.exponentialRampToValueAtTime(0.01,this.audioContext.currentTime+0.1);oscillator.type='sine';break;case 'success':oscillator.frequency.setValueAtTime(523.25,this.audioContext.currentTime);oscillator.frequency.setValueAtTime(659.25,this.audioContext.currentTime+0.1);oscillator.frequency.setValueAtTime(783.99,this.audioContext.currentTime+0.2);gainNode.gain.setValueAtTime(0.15,this.audioContext.currentTime);gainNode.gain.exponentialRampToValueAtTime(0.01,this.audioContext.currentTime+0.3);oscillator.type='triangle';break;case 'error':oscillator.frequency.setValueAtTime(200,this.audioContext.currentTime);oscillator.frequency.exponentialRampToValueAtTime(100,this.audioContext.currentTime+0.2);gainNode.gain.setValueAtTime(0.1,this.audioContext.currentTime);gainNode.gain.exponentialRampToValueAtTime(0.01,this.audioContext.currentTime+0.2);oscillator.type='sawtooth';break;case 'notification':oscillator.frequency.setValueAtTime(880,this.audioContext.currentTime);oscillator.frequency.setValueAtTime(1046.5,this.audioContext.currentTime+0.1);gainNode.gain.setValueAtTime(0.12,this.audioContext.currentTime);gainNode.gain.exponentialRampToValueAtTime(0.01,this.audioContext.currentTime+0.2);oscillator.type='sine';break;default:oscillator.frequency.setValueAtTime(440,this.audioContext.currentTime);gainNode.gain.setValueAtTime(0.1,this.audioContext.currentTime);gainNode.gain.exponentialRampToValueAtTime(0.01,this.audioContext.currentTime+0.1);oscillator.type='sine';}oscillator.start(this.audioContext.currentTime);oscillator.stop(this.audioContext.currentTime+0.3);}playSound(soundName){if(!this.soundEnabled)return;if(!this.sounds[soundName])return;this.ensureAudioLoaded();const sound=this.sounds[soundName];sound.currentTime=0;sound.play().catch(e=>);}stopSound(soundName){if(!this.sounds[soundName])return;const sound=this.sounds[soundName];sound.pause();sound.currentTime=0;}stopAllSounds(){Object.values(this.sounds).forEach(sound=>{sound.pause();sound.currentTime=0;});}toggleSound(){this.soundEnabled=!this.soundEnabled;localStorage.setItem('soundEnabled',this.soundEnabled);if(!this.soundEnabled){this.stopAllSounds();}return this.soundEnabled;}isSoundEnabled(){return this.soundEnabled;}setVolume(volume){const vol=Math.max(0,Math.min(1,volume));Object.values(this.sounds).forEach(sound=>{sound.volume=vol;});}setSoundVolume(soundName,volume){if(!this.sounds[soundName])return;const vol=Math.max(0,Math.min(1,volume));this.sounds[soundName].volume=vol;}destroy(){this.stopAllSounds();Object.values(this.sounds).forEach(sound=>{sound.src='';sound.load();});}}
|
|
|
|
|
|
public/modules/CalendarGenerator.js
DELETED
|
@@ -1,323 +0,0 @@
|
|
| 1 |
-
// 📅 Calendar Generator - Geração de plano periodizado de 30 dias
|
| 2 |
-
export class CalendarGenerator {
|
| 3 |
-
constructor() {
|
| 4 |
-
this.scientificParams = null;
|
| 5 |
-
this.currentWorkoutPlan = null;
|
| 6 |
-
}
|
| 7 |
-
|
| 8 |
-
// 🔬 Calcular parâmetros científicos do perfil
|
| 9 |
-
calculateScientificParameters(profile) {
|
| 10 |
-
const { age, weight, height, goal, activityLevel } = profile;
|
| 11 |
-
|
| 12 |
-
// Frequência cardíaca máxima (Fórmula de Tanaka)
|
| 13 |
-
const fcMax = Math.round(208 - (0.7 * age));
|
| 14 |
-
|
| 15 |
-
// Zonas de frequência cardíaca (% FCmax)
|
| 16 |
-
const zones = {
|
| 17 |
-
recovery: { min: Math.round(fcMax * 0.50), max: Math.round(fcMax * 0.60), name: 'Recuperação' },
|
| 18 |
-
fatBurn: { min: Math.round(fcMax * 0.60), max: Math.round(fcMax * 0.70), name: 'Queima de Gordura' },
|
| 19 |
-
cardio: { min: Math.round(fcMax * 0.70), max: Math.round(fcMax * 0.80), name: 'Cardio' },
|
| 20 |
-
hiit: { min: Math.round(fcMax * 0.80), max: Math.round(fcMax * 0.95), name: 'Alta Intensidade' }
|
| 21 |
-
};
|
| 22 |
-
|
| 23 |
-
// Volume semanal recomendado (minutos)
|
| 24 |
-
const activityMinutes = {
|
| 25 |
-
'sedentary': 150,
|
| 26 |
-
'light': 180,
|
| 27 |
-
'moderate': 210,
|
| 28 |
-
'active': 240,
|
| 29 |
-
'very-active': 270
|
| 30 |
-
};
|
| 31 |
-
const weeklyVolumeMinutes = activityMinutes[activityLevel] || 180;
|
| 32 |
-
|
| 33 |
-
// Periodização: 4 semanas de intensidade progressiva
|
| 34 |
-
const weeklyIntensity = [
|
| 35 |
-
{ week: 1, name: 'Adaptação', load: 0.70, volume: 1.0 },
|
| 36 |
-
{ week: 2, name: 'Desenvolvimento', load: 0.80, volume: 1.1 },
|
| 37 |
-
{ week: 3, name: 'Intensificação', load: 0.90, volume: 1.2 },
|
| 38 |
-
{ week: 4, name: 'Deload', load: 0.65, volume: 0.8 },
|
| 39 |
-
{ week: 5, name: 'Pico', load: 0.85, volume: 1.0 }
|
| 40 |
-
];
|
| 41 |
-
|
| 42 |
-
// Distribuição de foco por objetivo
|
| 43 |
-
const focusDistribution = this.getFocusDistribution(goal);
|
| 44 |
-
|
| 45 |
-
// Déficit calórico diário (para perda de peso)
|
| 46 |
-
const dailyDeficit = goal.includes('lose-weight') ? 500 : 0;
|
| 47 |
-
|
| 48 |
-
return {
|
| 49 |
-
fcMax,
|
| 50 |
-
zones,
|
| 51 |
-
weeklyVolumeMinutes,
|
| 52 |
-
weeklyIntensity,
|
| 53 |
-
focusDistribution,
|
| 54 |
-
dailyDeficit
|
| 55 |
-
};
|
| 56 |
-
}
|
| 57 |
-
|
| 58 |
-
// 🎯 Obter distribuição de foco por objetivo
|
| 59 |
-
getFocusDistribution(goal) {
|
| 60 |
-
const distributions = {
|
| 61 |
-
'lose-weight': {
|
| 62 |
-
cardio: 0.40, // 40% cardio
|
| 63 |
-
strength: 0.25, // 25% força
|
| 64 |
-
core: 0.20, // 20% core
|
| 65 |
-
flexibility: 0.15 // 15% flexibilidade
|
| 66 |
-
},
|
| 67 |
-
'gain-muscle': {
|
| 68 |
-
strength: 0.50, // 50% força
|
| 69 |
-
hypertrophy: 0.30, // 30% hipertrofia
|
| 70 |
-
cardio: 0.10, // 10% cardio
|
| 71 |
-
flexibility: 0.10 // 10% flexibilidade
|
| 72 |
-
},
|
| 73 |
-
'tone': {
|
| 74 |
-
toning: 0.35, // 35% tonificação
|
| 75 |
-
cardio: 0.30, // 30% cardio
|
| 76 |
-
core: 0.20, // 20% core
|
| 77 |
-
flexibility: 0.15 // 15% flexibilidade
|
| 78 |
-
},
|
| 79 |
-
'health': {
|
| 80 |
-
cardio: 0.30, // 30% cardio
|
| 81 |
-
strength: 0.25, // 25% força
|
| 82 |
-
flexibility: 0.25, // 25% flexibilidade
|
| 83 |
-
balance: 0.20 // 20% equilíbrio
|
| 84 |
-
},
|
| 85 |
-
'maintain': {
|
| 86 |
-
cardio: 0.30,
|
| 87 |
-
strength: 0.30,
|
| 88 |
-
core: 0.20,
|
| 89 |
-
flexibility: 0.20
|
| 90 |
-
}
|
| 91 |
-
};
|
| 92 |
-
|
| 93 |
-
return distributions[goal] || distributions['lose-weight'];
|
| 94 |
-
}
|
| 95 |
-
|
| 96 |
-
// 📅 Gerar plano periodizado de 30 dias
|
| 97 |
-
generatePeriodizedPlan(profile, scientificParams) {
|
| 98 |
-
const plan = [];
|
| 99 |
-
const { weeklyIntensity, focusDistribution, zones, dailyDeficit } = scientificParams;
|
| 100 |
-
|
| 101 |
-
// Gera 30 dias com periodização inteligente
|
| 102 |
-
for (let day = 1; day <= 30; day++) {
|
| 103 |
-
const weekNumber = Math.ceil(day / 7);
|
| 104 |
-
const dayOfWeek = ((day - 1) % 7) + 1; // 1=Segunda, 7=Domingo
|
| 105 |
-
const intensity = weeklyIntensity[Math.min(weekNumber - 1, 4)];
|
| 106 |
-
|
| 107 |
-
const dayPlan = this.generateDayPlan(day, dayOfWeek, weekNumber, intensity, profile, scientificParams);
|
| 108 |
-
plan.push(dayPlan);
|
| 109 |
-
}
|
| 110 |
-
|
| 111 |
-
return plan;
|
| 112 |
-
}
|
| 113 |
-
|
| 114 |
-
// 📋 Gerar plano individual do dia
|
| 115 |
-
generateDayPlan(day, dayOfWeek, weekNumber, intensity, profile, scientificParams) {
|
| 116 |
-
// Descanso no domingo (dia 7, 14, 21, 28)
|
| 117 |
-
if (dayOfWeek === 7 && day !== 30) {
|
| 118 |
-
return {
|
| 119 |
-
day,
|
| 120 |
-
weekNumber,
|
| 121 |
-
focus: 'Recuperação Ativa',
|
| 122 |
-
icon: '🧘♀️',
|
| 123 |
-
category: 'yoga',
|
| 124 |
-
type: 'recovery',
|
| 125 |
-
intensity: 'baixa',
|
| 126 |
-
intensityPercent: null,
|
| 127 |
-
sets: 2,
|
| 128 |
-
reps: '10-15',
|
| 129 |
-
description: 'Yoga, alongamento e recuperação muscular',
|
| 130 |
-
scientificReason: '🔬 Recuperação ativa promove remoção de lactato e reparo muscular',
|
| 131 |
-
targetZone: 'recovery',
|
| 132 |
-
expectedCalories: 50,
|
| 133 |
-
duration: 15
|
| 134 |
-
};
|
| 135 |
-
}
|
| 136 |
-
|
| 137 |
-
// Determina foco do dia baseado em objetivo e distribuição
|
| 138 |
-
const dayType = this.selectDayType(day, dayOfWeek, profile, scientificParams.focusDistribution);
|
| 139 |
-
|
| 140 |
-
// Calcula volumes e intensidades
|
| 141 |
-
const sets = this.calculateSets(intensity.load, dayType);
|
| 142 |
-
const reps = this.calculateReps(dayType, intensity.load);
|
| 143 |
-
const expectedCalories = this.calculateExpectedCalories(dayType, sets, reps, profile.weight);
|
| 144 |
-
const duration = this.calculateDuration(dayType, sets);
|
| 145 |
-
|
| 146 |
-
// Monta informações do dia
|
| 147 |
-
return {
|
| 148 |
-
day,
|
| 149 |
-
focus: dayType.name,
|
| 150 |
-
icon: dayType.icon,
|
| 151 |
-
category: dayType.category,
|
| 152 |
-
secondCategory: dayType.secondCategory,
|
| 153 |
-
doubleWorkout: dayType.doubleWorkout,
|
| 154 |
-
type: dayType.type,
|
| 155 |
-
intensity: intensity.name.toLowerCase(),
|
| 156 |
-
intensityPercent: Math.round(intensity.load * 100),
|
| 157 |
-
sets,
|
| 158 |
-
reps,
|
| 159 |
-
description: dayType.description,
|
| 160 |
-
scientificReason: dayType.scientificReason,
|
| 161 |
-
targetZone: dayType.targetZone,
|
| 162 |
-
expectedCalories,
|
| 163 |
-
duration,
|
| 164 |
-
weekNumber,
|
| 165 |
-
progressiveOverload: {
|
| 166 |
-
week: weekNumber,
|
| 167 |
-
loadPercent: intensity.load,
|
| 168 |
-
volumeMultiplier: intensity.volume
|
| 169 |
-
}
|
| 170 |
-
};
|
| 171 |
-
}
|
| 172 |
-
|
| 173 |
-
// 🎲 Selecionar tipo de treino do dia
|
| 174 |
-
selectDayType(day, dayOfWeek, profile, focusDistribution) {
|
| 175 |
-
const goal = profile.goal;
|
| 176 |
-
|
| 177 |
-
// Para perda de peso
|
| 178 |
-
if (goal.includes('lose-weight')) {
|
| 179 |
-
const types = [
|
| 180 |
-
{ day: [1, 8, 15, 22, 29], name: 'HIIT + Core', icon: '🔥', category: 'cardio', secondCategory: 'abs', doubleWorkout: true, type: 'hiit', targetZone: 'hiit', description: 'Cardio intenso + abdômen', scientificReason: '🔬 HIIT eleva EPOC (consumo de O2 pós-exercício) em até 24h' },
|
| 181 |
-
{ day: [2, 9, 16, 23], name: 'Pernas + Glúteos', icon: '🦵', category: 'legs', secondCategory: 'glutes', doubleWorkout: true, type: 'strength', targetZone: 'cardio', description: 'Treino de membros inferiores', scientificReason: '🔬 Pernas são 40% da massa muscular - maior gasto calórico' },
|
| 182 |
-
{ day: [3, 10, 17, 24], name: 'Cardio Moderado', icon: '❤️', category: 'cardio', type: 'cardio', targetZone: 'fatBurn', description: 'Zona de queima de gordura', scientificReason: '🔬 60-70% FCmax otimiza oxidação lipídica' },
|
| 183 |
-
{ day: [4, 11, 18, 25], name: 'Core + Cintura', icon: '⏳', category: 'abs', secondCategory: 'waist', doubleWorkout: true, type: 'core', targetZone: 'cardio', description: 'Abdômen e oblíquos', scientificReason: '🔬 Core forte melhora postura e reduz circunferência abdominal' },
|
| 184 |
-
{ day: [5, 12, 19, 26], name: 'Corpo Completo', icon: '✨', category: 'fullbody', type: 'metabolic', targetZone: 'cardio', description: 'Treino metabólico', scientificReason: '🔬 Exercícios compostos maximizam gasto energético total' },
|
| 185 |
-
{ day: [6, 13, 20, 27], name: 'Cardio + Braços', icon: '💪', category: 'cardio', secondCategory: 'arms', doubleWorkout: true, type: 'mixed', targetZone: 'cardio', description: 'Cardio + membros superiores', scientificReason: '🔬 Variação de estímulos previne adaptação metabólica' },
|
| 186 |
-
{ day: [30], name: 'Desafio Final', icon: '🏆', category: 'fullbody', type: 'challenge', targetZone: 'hiit', description: 'Teste de evolução completo', scientificReason: '🔬 Avaliação de performance demonstra adaptações neuromusculares' }
|
| 187 |
-
];
|
| 188 |
-
|
| 189 |
-
return types.find(t => t.day.includes(day)) || types[0];
|
| 190 |
-
}
|
| 191 |
-
|
| 192 |
-
// Para ganho de massa
|
| 193 |
-
if (goal === 'gain-muscle') {
|
| 194 |
-
const types = [
|
| 195 |
-
{ day: [1, 8, 15, 22, 29], name: 'Pernas + Glúteos', icon: '🦵', category: 'legs', secondCategory: 'glutes', doubleWorkout: true, type: 'hypertrophy', targetZone: 'cardio', description: 'Hipertrofia de inferiores', scientificReason: '🔬 Leg day estimula GH e testosterona sistêmica' },
|
| 196 |
-
{ day: [2, 9, 16, 23], name: 'Peito + Tríceps', icon: '💪', category: 'fullbody', secondCategory: 'arms', doubleWorkout: true, type: 'push', targetZone: 'fatBurn', description: 'Push - empurrar', scientificReason: '🔬 Exercícios push ativam cadeia anterior' },
|
| 197 |
-
{ day: [3, 10, 17, 24], name: 'Costas + Bíceps', icon: '💪', category: 'back', secondCategory: 'arms', doubleWorkout: true, type: 'pull', targetZone: 'fatBurn', description: 'Pull - puxar', scientificReason: '🔬 Exerc��cios pull corrigem desequilíbrios posturais' },
|
| 198 |
-
{ day: [4, 11, 18, 25], name: 'Ombros + Core', icon: '🔥', category: 'fullbody', secondCategory: 'abs', doubleWorkout: true, type: 'functional', targetZone: 'cardio', description: 'Ombros e estabilização', scientificReason: '🔬 Core forte aumenta transferência de força' },
|
| 199 |
-
{ day: [5, 12, 19, 26], name: 'Pernas Intensas', icon: '🦵', category: 'legs', type: 'strength', targetZone: 'cardio', description: 'Força de pernas', scientificReason: '🔬 Sobrecarga progressiva estimula hipertrofia miofibrilar' },
|
| 200 |
-
{ day: [6, 13, 20, 27], name: 'Corpo Todo', icon: '✨', category: 'fullbody', type: 'compound', targetZone: 'fatBurn', description: 'Compostos multiarticulares', scientificReason: '🔬 Exercícios compostos recrutam múltiplas fibras simultaneamente' },
|
| 201 |
-
{ day: [30], name: 'Teste de Força', icon: '🏆', category: 'fullbody', type: 'maxtest', targetZone: 'cardio', description: 'Teste de força máxima', scientificReason: '🔬 Avaliação 1RM mede ganhos de força neural' }
|
| 202 |
-
];
|
| 203 |
-
|
| 204 |
-
return types.find(t => t.day.includes(day)) || types[0];
|
| 205 |
-
}
|
| 206 |
-
|
| 207 |
-
// Para tonificação
|
| 208 |
-
if (goal === 'tone') {
|
| 209 |
-
const types = [
|
| 210 |
-
{ day: [1, 8, 15, 22, 29], name: 'Core + Cardio', icon: '🔥', category: 'abs', secondCategory: 'cardio', doubleWorkout: true, type: 'toning', targetZone: 'cardio', description: 'Definição de core', scientificReason: '🔬 Alta repetição + baixa carga define sem hipertrofiar' },
|
| 211 |
-
{ day: [2, 9, 16, 23], name: 'Pernas + Glúteos', icon: '🦵', category: 'legs', secondCategory: 'glutes', doubleWorkout: true, type: 'sculpt', targetZone: 'cardio', description: 'Esculpir inferiores', scientificReason: '🔬 12-15 reps otimizam definição muscular' },
|
| 212 |
-
{ day: [3, 10, 17, 24], name: 'Braços + Ombros', icon: '💪', category: 'arms', secondCategory: 'fullbody', doubleWorkout: true, type: 'toning', targetZone: 'fatBurn', description: 'Tonificar superiores', scientificReason: '🔬 Trabalho de resistência local reduz % gordura segmentar' },
|
| 213 |
-
{ day: [4, 11, 18, 25], name: 'Corpo Todo', icon: '✨', category: 'fullbody', type: 'circuit', targetZone: 'cardio', description: 'Circuito metabólico', scientificReason: '🔬 Circuitos mantêm FC elevada - queima + tonificação' },
|
| 214 |
-
{ day: [5, 12, 19, 26], name: 'Core + Cintura', icon: '⏳', category: 'abs', secondCategory: 'waist', doubleWorkout: true, type: 'core', targetZone: 'cardio', description: 'Cintura definida', scientificReason: '🔬 Oblíquos definem silhueta da cintura' },
|
| 215 |
-
{ day: [6, 13, 20, 27], name: 'Yoga + Pilates', icon: '🧘♀️', category: 'yoga', secondCategory: 'back', doubleWorkout: true, type: 'flexibility', targetZone: 'recovery', description: 'Alongar e fortalecer', scientificReason: '🔬 Flexibilidade aumenta amplitude - melhor ativação muscular' },
|
| 216 |
-
{ day: [30], name: 'Treino Completo', icon: '🏆', category: 'fullbody', type: 'complete', targetZone: 'cardio', description: 'Sessão completa final', scientificReason: '🔬 Integração de todos os componentes treinados' }
|
| 217 |
-
];
|
| 218 |
-
|
| 219 |
-
return types.find(t => t.day.includes(day)) || types[0];
|
| 220 |
-
}
|
| 221 |
-
|
| 222 |
-
// Para saúde geral
|
| 223 |
-
const typesHealth = [
|
| 224 |
-
{ day: [1, 8, 15, 22, 29], name: 'Cardio Saúde', icon: '❤️', category: 'cardio', type: 'health', targetZone: 'fatBurn', description: 'Saúde cardiovascular', scientificReason: '🔬 150 min/semana cardio reduz risco cardiovascular em 30%' },
|
| 225 |
-
{ day: [2, 9, 16, 23], name: 'Força Funcional', icon: '💪', category: 'fullbody', type: 'functional', targetZone: 'fatBurn', description: 'Movimentos funcionais', scientificReason: '🔬 Treino funcional melhora ADLs (atividades diárias)' },
|
| 226 |
-
{ day: [3, 10, 17, 24], name: 'Equilíbrio', icon: '🧘♀️', category: 'yoga', type: 'balance', targetZone: 'recovery', description: 'Propriocepção e equilíbrio', scientificReason: '🔬 Treino de equilíbrio reduz quedas em 23%' },
|
| 227 |
-
{ day: [4, 11, 18, 25], name: 'Mobilidade', icon: '🤸♀️', category: 'back', type: 'mobility', targetZone: 'recovery', description: 'Amplitude de movimento', scientificReason: '🔬 Mobilidade previne lesões e dores crônicas' },
|
| 228 |
-
{ day: [5, 12, 19, 26], name: 'Caminhada Ativa', icon: '🚶♀️', category: 'cardio', type: 'walk', targetZone: 'fatBurn', description: 'Baixo impacto', scientificReason: '🔬 Caminhada 30min/dia reduz mortalidade em 20%' },
|
| 229 |
-
{ day: [6, 13, 20, 27], name: 'Yoga Suave', icon: '🧘♀️', category: 'yoga', type: 'gentle', targetZone: 'recovery', description: 'Relaxamento e flexibilidade', scientificReason: '🔬 Yoga reduz cortisol e melhora qualidade de vida' },
|
| 230 |
-
{ day: [30], name: 'Avaliação Saúde', icon: '🏥', category: 'fullbody', type: 'assessment', targetZone: 'fatBurn', description: 'Teste de aptidão', scientificReason: '🔬 Testes funcionais avaliam saúde geral' }
|
| 231 |
-
];
|
| 232 |
-
|
| 233 |
-
return typesHealth.find(t => t.day.includes(day)) || typesHealth[0];
|
| 234 |
-
}
|
| 235 |
-
|
| 236 |
-
// 📊 Calcular séries baseado em carga e tipo
|
| 237 |
-
calculateSets(loadPercent, dayType) {
|
| 238 |
-
const baseSets = {
|
| 239 |
-
'hypertrophy': 4,
|
| 240 |
-
'strength': 5,
|
| 241 |
-
'toning': 3,
|
| 242 |
-
'cardio': 3,
|
| 243 |
-
'hiit': 4,
|
| 244 |
-
'recovery': 2
|
| 245 |
-
}[dayType.type] || 3;
|
| 246 |
-
|
| 247 |
-
if (loadPercent >= 0.85) return baseSets + 1;
|
| 248 |
-
if (loadPercent <= 0.70) return baseSets - 1;
|
| 249 |
-
return baseSets;
|
| 250 |
-
}
|
| 251 |
-
|
| 252 |
-
// 🔢 Calcular repetições baseado em tipo e carga
|
| 253 |
-
calculateReps(dayType, loadPercent) {
|
| 254 |
-
const baseReps = {
|
| 255 |
-
'hypertrophy': '8-12',
|
| 256 |
-
'strength': '4-6',
|
| 257 |
-
'toning': '12-15',
|
| 258 |
-
'cardio': '30s',
|
| 259 |
-
'hiit': '20s on/10s off',
|
| 260 |
-
'recovery': '30-45s',
|
| 261 |
-
'metabolic': '15-20'
|
| 262 |
-
}[dayType.type] || '10-12';
|
| 263 |
-
|
| 264 |
-
return baseReps;
|
| 265 |
-
}
|
| 266 |
-
|
| 267 |
-
// 🔥 Calcular calorias esperadas
|
| 268 |
-
calculateExpectedCalories(dayType, sets, reps, weight) {
|
| 269 |
-
const caloriesPerSetMin = {
|
| 270 |
-
'hiit': 25,
|
| 271 |
-
'strength': 15,
|
| 272 |
-
'cardio': 20,
|
| 273 |
-
'toning': 12,
|
| 274 |
-
'recovery': 5,
|
| 275 |
-
'metabolic': 22
|
| 276 |
-
}[dayType.type] || 15;
|
| 277 |
-
|
| 278 |
-
const weightFactor = weight / 65;
|
| 279 |
-
const totalSets = dayType.doubleWorkout ? sets * 2 * 5 : sets * 5;
|
| 280 |
-
return Math.round(caloriesPerSetMin * totalSets * weightFactor);
|
| 281 |
-
}
|
| 282 |
-
|
| 283 |
-
// ⏱️ Calcular duração estimada
|
| 284 |
-
calculateDuration(dayType, sets) {
|
| 285 |
-
const minutesPerSet = 2;
|
| 286 |
-
const totalSets = dayType.doubleWorkout ? sets * 2 * 5 : sets * 5;
|
| 287 |
-
return Math.round(totalSets * minutesPerSet);
|
| 288 |
-
}
|
| 289 |
-
|
| 290 |
-
// 🧬 Gerar calendário completo de 30 dias
|
| 291 |
-
generate30DayCalendar(profile) {
|
| 292 |
-
if (!profile) return null;
|
| 293 |
-
|
| 294 |
-
const scientificParams = this.calculateScientificParameters(profile);
|
| 295 |
-
const workoutPlan = this.generatePeriodizedPlan(profile, scientificParams);
|
| 296 |
-
|
| 297 |
-
this.scientificParams = scientificParams;
|
| 298 |
-
this.currentWorkoutPlan = workoutPlan;
|
| 299 |
-
|
| 300 |
-
return {
|
| 301 |
-
scientificParams,
|
| 302 |
-
workoutPlan
|
| 303 |
-
};
|
| 304 |
-
}
|
| 305 |
-
|
| 306 |
-
// Obter parâmetros científicos
|
| 307 |
-
getScientificParams() {
|
| 308 |
-
return this.scientificParams;
|
| 309 |
-
}
|
| 310 |
-
|
| 311 |
-
// Obter plano de treino
|
| 312 |
-
getWorkoutPlan() {
|
| 313 |
-
return this.currentWorkoutPlan;
|
| 314 |
-
}
|
| 315 |
-
|
| 316 |
-
// Obter dia específico do plano
|
| 317 |
-
getDayPlan(dayNumber) {
|
| 318 |
-
if (!this.currentWorkoutPlan || dayNumber < 1 || dayNumber > 30) {
|
| 319 |
-
return null;
|
| 320 |
-
}
|
| 321 |
-
return this.currentWorkoutPlan[dayNumber - 1];
|
| 322 |
-
}
|
| 323 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/modules/CalendarGenerator.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
export class CalendarGenerator{constructor(){this.scientificParams=null;this.currentWorkoutPlan=null;}calculateScientificParameters(profile){const{age,weight,height,goal,activityLevel}=profile;const fcMax=Math.round(208-(0.7*age));const zones={recovery:{min:Math.round(fcMax*0.50),max:Math.round(fcMax*0.60),name:'Recuperação'},fatBurn:{min:Math.round(fcMax*0.60),max:Math.round(fcMax*0.70),name:'Queima de Gordura'},cardio:{min:Math.round(fcMax*0.70),max:Math.round(fcMax*0.80),name:'Cardio'},hiit:{min:Math.round(fcMax*0.80),max:Math.round(fcMax*0.95),name:'Alta Intensidade'}};const activityMinutes={'sedentary':150,'light':180,'moderate':210,'active':240,'very-active':270};const weeklyVolumeMinutes=activityMinutes[activityLevel]|| 180;const weeklyIntensity=[{week:1,name:'Adaptação',load:0.70,volume:1.0},{week:2,name:'Desenvolvimento',load:0.80,volume:1.1},{week:3,name:'Intensificação',load:0.90,volume:1.2},{week:4,name:'Deload',load:0.65,volume:0.8},{week:5,name:'Pico',load:0.85,volume:1.0}];const focusDistribution=this.getFocusDistribution(goal);const dailyDeficit=goal.includes('lose-weight')? 500:0;return{fcMax,zones,weeklyVolumeMinutes,weeklyIntensity,focusDistribution,dailyDeficit};}getFocusDistribution(goal){const distributions={'lose-weight':{cardio:0.40,strength:0.25,core:0.20,flexibility:0.15},'gain-muscle':{strength:0.50,hypertrophy:0.30,cardio:0.10,flexibility:0.10},'tone':{toning:0.35,cardio:0.30,core:0.20,flexibility:0.15},'health':{cardio:0.30,strength:0.25,flexibility:0.25,balance:0.20},'maintain':{cardio:0.30,strength:0.30,core:0.20,flexibility:0.20}};return distributions[goal]|| distributions['lose-weight'];}generatePeriodizedPlan(profile,scientificParams){const plan=[];const{weeklyIntensity,focusDistribution,zones,dailyDeficit}=scientificParams;for(let day=1;day <=30;day++){const weekNumber=Math.ceil(day/7);const dayOfWeek=((day-1)% 7)+1;const intensity=weeklyIntensity[Math.min(weekNumber-1,4)];const dayPlan=this.generateDayPlan(day,dayOfWeek,weekNumber,intensity,profile,scientificParams);plan.push(dayPlan);}return plan;}generateDayPlan(day,dayOfWeek,weekNumber,intensity,profile,scientificParams){if(dayOfWeek===7 && day !==30){return{day,weekNumber,focus:'Recuperação Ativa',icon:'🧘♀️',category:'yoga',type:'recovery',intensity:'baixa',intensityPercent:null,sets:2,reps:'10-15',description:'Yoga,alongamento e recuperação muscular',scientificReason:'🔬 Recuperação ativa promove remoção de lactato e reparo muscular',targetZone:'recovery',expectedCalories:50,duration:15};}const dayType=this.selectDayType(day,dayOfWeek,profile,scientificParams.focusDistribution);const sets=this.calculateSets(intensity.load,dayType);const reps=this.calculateReps(dayType,intensity.load);const expectedCalories=this.calculateExpectedCalories(dayType,sets,reps,profile.weight);const duration=this.calculateDuration(dayType,sets);return{day,focus:dayType.name,icon:dayType.icon,category:dayType.category,secondCategory:dayType.secondCategory,doubleWorkout:dayType.doubleWorkout,type:dayType.type,intensity:intensity.name.toLowerCase(),intensityPercent:Math.round(intensity.load*100),sets,reps,description:dayType.description,scientificReason:dayType.scientificReason,targetZone:dayType.targetZone,expectedCalories,duration,weekNumber,progressiveOverload:{week:weekNumber,loadPercent:intensity.load,volumeMultiplier:intensity.volume}};}selectDayType(day,dayOfWeek,profile,focusDistribution){const goal=profile.goal;if(goal.includes('lose-weight')){const types=[{day:[1,8,15,22,29],name:'HIIT+Core',icon:'🔥',category:'cardio',secondCategory:'abs',doubleWorkout:true,type:'hiit',targetZone:'hiit',description:'Cardio intenso+abdômen',scientificReason:'🔬 HIIT eleva EPOC(consumo de O2 pós-exercício)em até 24h'},{day:[2,9,16,23],name:'Pernas+Glúteos',icon:'🦵',category:'legs',secondCategory:'glutes',doubleWorkout:true,type:'strength',targetZone:'cardio',description:'Treino de membros inferiores',scientificReason:'🔬 Pernas são 40% da massa muscular-maior gasto calórico'},{day:[3,10,17,24],name:'Cardio Moderado',icon:'❤️',category:'cardio',type:'cardio',targetZone:'fatBurn',description:'Zona de queima de gordura',scientificReason:'🔬 60-70% FCmax otimiza oxidação lipídica'},{day:[4,11,18,25],name:'Core+Cintura',icon:'⏳',category:'abs',secondCategory:'waist',doubleWorkout:true,type:'core',targetZone:'cardio',description:'Abdômen e oblíquos',scientificReason:'🔬 Core forte melhora postura e reduz circunferência abdominal'},{day:[5,12,19,26],name:'Corpo Completo',icon:'✨',category:'fullbody',type:'metabolic',targetZone:'cardio',description:'Treino metabólico',scientificReason:'🔬 Exercícios compostos maximizam gasto energético total'},{day:[6,13,20,27],name:'Cardio+Braços',icon:'💪',category:'cardio',secondCategory:'arms',doubleWorkout:true,type:'mixed',targetZone:'cardio',description:'Cardio+membros superiores',scientificReason:'🔬 Variação de estímulos previne adaptação metabólica'},{day:[30],name:'Desafio Final',icon:'🏆',category:'fullbody',type:'challenge',targetZone:'hiit',description:'Teste de evolução completo',scientificReason:'🔬 Avaliação de performance demonstra adaptações neuromusculares'}];return types.find(t=> t.day.includes(day))|| types[0];}if(goal==='gain-muscle'){const types=[{day:[1,8,15,22,29],name:'Pernas+Glúteos',icon:'🦵',category:'legs',secondCategory:'glutes',doubleWorkout:true,type:'hypertrophy',targetZone:'cardio',description:'Hipertrofia de inferiores',scientificReason:'🔬 Leg day estimula GH e testosterona sistêmica'},{day:[2,9,16,23],name:'Peito+Tríceps',icon:'💪',category:'fullbody',secondCategory:'arms',doubleWorkout:true,type:'push',targetZone:'fatBurn',description:'Push-empurrar',scientificReason:'🔬 Exercícios push ativam cadeia anterior'},{day:[3,10,17,24],name:'Costas+Bíceps',icon:'💪',category:'back',secondCategory:'arms',doubleWorkout:true,type:'pull',targetZone:'fatBurn',description:'Pull-puxar',scientificReason:'🔬 Exercícios pull corrigem desequilíbrios posturais'},{day:[4,11,18,25],name:'Ombros+Core',icon:'🔥',category:'fullbody',secondCategory:'abs',doubleWorkout:true,type:'functional',targetZone:'cardio',description:'Ombros e estabilização',scientificReason:'🔬 Core forte aumenta transferência de força'},{day:[5,12,19,26],name:'Pernas Intensas',icon:'🦵',category:'legs',type:'strength',targetZone:'cardio',description:'Força de pernas',scientificReason:'🔬 Sobrecarga progressiva estimula hipertrofia miofibrilar'},{day:[6,13,20,27],name:'Corpo Todo',icon:'✨',category:'fullbody',type:'compound',targetZone:'fatBurn',description:'Compostos multiarticulares',scientificReason:'🔬 Exercícios compostos recrutam múltiplas fibras simultaneamente'},{day:[30],name:'Teste de Força',icon:'🏆',category:'fullbody',type:'maxtest',targetZone:'cardio',description:'Teste de força máxima',scientificReason:'🔬 Avaliação 1RM mede ganhos de força neural'}];return types.find(t=> t.day.includes(day))|| types[0];}if(goal==='tone'){const types=[{day:[1,8,15,22,29],name:'Core+Cardio',icon:'🔥',category:'abs',secondCategory:'cardio',doubleWorkout:true,type:'toning',targetZone:'cardio',description:'Definição de core',scientificReason:'🔬 Alta repetição+baixa carga define sem hipertrofiar'},{day:[2,9,16,23],name:'Pernas+Glúteos',icon:'🦵',category:'legs',secondCategory:'glutes',doubleWorkout:true,type:'sculpt',targetZone:'cardio',description:'Esculpir inferiores',scientificReason:'🔬 12-15 reps otimizam definição muscular'},{day:[3,10,17,24],name:'Braços+Ombros',icon:'💪',category:'arms',secondCategory:'fullbody',doubleWorkout:true,type:'toning',targetZone:'fatBurn',description:'Tonificar superiores',scientificReason:'🔬 Trabalho de resistência local reduz % gordura segmentar'},{day:[4,11,18,25],name:'Corpo Todo',icon:'✨',category:'fullbody',type:'circuit',targetZone:'cardio',description:'Circuito metabólico',scientificReason:'🔬 Circuitos mantêm FC elevada-queima+tonificação'},{day:[5,12,19,26],name:'Core+Cintura',icon:'⏳',category:'abs',secondCategory:'waist',doubleWorkout:true,type:'core',targetZone:'cardio',description:'Cintura definida',scientificReason:'🔬 Oblíquos definem silhueta da cintura'},{day:[6,13,20,27],name:'Yoga+Pilates',icon:'🧘♀️',category:'yoga',secondCategory:'back',doubleWorkout:true,type:'flexibility',targetZone:'recovery',description:'Alongar e fortalecer',scientificReason:'🔬 Flexibilidade aumenta amplitude-melhor ativação muscular'},{day:[30],name:'Treino Completo',icon:'🏆',category:'fullbody',type:'complete',targetZone:'cardio',description:'Sessão completa final',scientificReason:'🔬 Integração de todos os componentes treinados'}];return types.find(t=> t.day.includes(day))|| types[0];}const typesHealth=[{day:[1,8,15,22,29],name:'Cardio Saúde',icon:'❤️',category:'cardio',type:'health',targetZone:'fatBurn',description:'Saúde cardiovascular',scientificReason:'🔬 150 min/semana cardio reduz risco cardiovascular em 30%'},{day:[2,9,16,23],name:'Força Funcional',icon:'💪',category:'fullbody',type:'functional',targetZone:'fatBurn',description:'Movimentos funcionais',scientificReason:'🔬 Treino funcional melhora ADLs(atividades diárias)'},{day:[3,10,17,24],name:'Equilíbrio',icon:'🧘♀️',category:'yoga',type:'balance',targetZone:'recovery',description:'Propriocepção e equilíbrio',scientificReason:'🔬 Treino de equilíbrio reduz quedas em 23%'},{day:[4,11,18,25],name:'Mobilidade',icon:'🤸♀️',category:'back',type:'mobility',targetZone:'recovery',description:'Amplitude de movimento',scientificReason:'🔬 Mobilidade previne lesões e dores crônicas'},{day:[5,12,19,26],name:'Caminhada Ativa',icon:'🚶♀️',category:'cardio',type:'walk',targetZone:'fatBurn',description:'Baixo impacto',scientificReason:'🔬 Caminhada 30min/dia reduz mortalidade em 20%'},{day:[6,13,20,27],name:'Yoga Suave',icon:'🧘♀️',category:'yoga',type:'gentle',targetZone:'recovery',description:'Relaxamento e flexibilidade',scientificReason:'🔬 Yoga reduz cortisol e melhora qualidade de vida'},{day:[30],name:'Avaliação Saúde',icon:'🏥',category:'fullbody',type:'assessment',targetZone:'fatBurn',description:'Teste de aptidão',scientificReason:'🔬 Testes funcionais avaliam saúde geral'}];return typesHealth.find(t=> t.day.includes(day))|| typesHealth[0];}calculateSets(loadPercent,dayType){const baseSets={'hypertrophy':4,'strength':5,'toning':3,'cardio':3,'hiit':4,'recovery':2}[dayType.type]|| 3;if(loadPercent >=0.85)return baseSets+1;if(loadPercent <=0.70)return baseSets-1;return baseSets;}calculateReps(dayType,loadPercent){const baseReps={'hypertrophy':'8-12','strength':'4-6','toning':'12-15','cardio':'30s','hiit':'20s on/10s off','recovery':'30-45s','metabolic':'15-20'}[dayType.type]|| '10-12';return baseReps;}calculateExpectedCalories(dayType,sets,reps,weight){const caloriesPerSetMin={'hiit':25,'strength':15,'cardio':20,'toning':12,'recovery':5,'metabolic':22}[dayType.type]|| 15;const weightFactor=weight/65;const totalSets=dayType.doubleWorkout ? sets*2*5:sets*5;return Math.round(caloriesPerSetMin*totalSets*weightFactor);}calculateDuration(dayType,sets){const minutesPerSet=2;const totalSets=dayType.doubleWorkout ? sets*2*5:sets*5;return Math.round(totalSets*minutesPerSet);}generate30DayCalendar(profile){if(!profile)return null;const scientificParams=this.calculateScientificParameters(profile);const workoutPlan=this.generatePeriodizedPlan(profile,scientificParams);this.scientificParams=scientificParams;this.currentWorkoutPlan=workoutPlan;return{scientificParams,workoutPlan};}getScientificParams(){return this.scientificParams;}getWorkoutPlan(){return this.currentWorkoutPlan;}getDayPlan(dayNumber){if(!this.currentWorkoutPlan || dayNumber < 1 || dayNumber > 30){return null;}return this.currentWorkoutPlan[dayNumber-1];}}
|
|
|
|
|
|
public/modules/ExerciseSelector.js
DELETED
|
@@ -1,248 +0,0 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* 🧠 MÓDULO DE SELEÇÃO INTELIGENTE DE EXERCÍCIOS
|
| 3 |
-
*
|
| 4 |
-
* Responsável por:
|
| 5 |
-
* - Carregar base de dados de exercícios
|
| 6 |
-
* - Selecionar exercícios baseado no perfil
|
| 7 |
-
* - Pontuar e ranquear exercícios
|
| 8 |
-
* - Garantir variedade nos treinos
|
| 9 |
-
*
|
| 10 |
-
* @version 4.0.0
|
| 11 |
-
*/
|
| 12 |
-
|
| 13 |
-
export class ExerciseSelector {
|
| 14 |
-
constructor() {
|
| 15 |
-
this.database = null;
|
| 16 |
-
this.loadDatabase();
|
| 17 |
-
}
|
| 18 |
-
|
| 19 |
-
/**
|
| 20 |
-
* Carrega base de dados de exercícios
|
| 21 |
-
*/
|
| 22 |
-
loadDatabase() {
|
| 23 |
-
if (typeof EXERCISES_DATABASE !== 'undefined') {
|
| 24 |
-
this.database = EXERCISES_DATABASE;
|
| 25 |
-
console.log('✅ [ExerciseSelector] Base de dados carregada:',
|
| 26 |
-
Object.keys(this.database).length, 'categorias');
|
| 27 |
-
} else {
|
| 28 |
-
console.warn('⚠️ [ExerciseSelector] Base de dados não encontrada');
|
| 29 |
-
}
|
| 30 |
-
}
|
| 31 |
-
|
| 32 |
-
/**
|
| 33 |
-
* 🎯 Seleciona exercícios inteligentemente
|
| 34 |
-
* @param {Object} dayPlan - Plano do dia
|
| 35 |
-
* @param {Object} userProfile - Perfil do usuário
|
| 36 |
-
* @returns {Array} Lista de exercícios selecionados
|
| 37 |
-
*/
|
| 38 |
-
selectForDay(dayPlan, userProfile) {
|
| 39 |
-
if (!this.database) {
|
| 40 |
-
console.error('❌ [ExerciseSelector] Base de dados não disponível');
|
| 41 |
-
return [];
|
| 42 |
-
}
|
| 43 |
-
|
| 44 |
-
const params = this.calculateSelectionParameters(userProfile, dayPlan);
|
| 45 |
-
|
| 46 |
-
// Buscar exercícios da categoria principal
|
| 47 |
-
const category1Exercises = this.database[dayPlan.category] || [];
|
| 48 |
-
const scored1 = this.scoreExercises(category1Exercises, params, dayPlan.day);
|
| 49 |
-
let selectedExercises = this.selectVaried(scored1, 5, dayPlan.day);
|
| 50 |
-
|
| 51 |
-
// Se treino duplo, adicionar segunda categoria
|
| 52 |
-
if (dayPlan.doubleWorkout && dayPlan.secondCategory) {
|
| 53 |
-
const category2Exercises = this.database[dayPlan.secondCategory] || [];
|
| 54 |
-
const scored2 = this.scoreExercises(category2Exercises, params, dayPlan.day + 1000);
|
| 55 |
-
const selected2 = this.selectVaried(scored2, 5, dayPlan.day + 1000);
|
| 56 |
-
selectedExercises = [...selectedExercises, ...selected2];
|
| 57 |
-
}
|
| 58 |
-
|
| 59 |
-
return selectedExercises;
|
| 60 |
-
}
|
| 61 |
-
|
| 62 |
-
/**
|
| 63 |
-
* 📊 Calcula parâmetros de seleção baseados no perfil
|
| 64 |
-
*/
|
| 65 |
-
calculateSelectionParameters(profile, dayPlan) {
|
| 66 |
-
const age = profile?.age || 30;
|
| 67 |
-
const weight = profile?.weight || 70;
|
| 68 |
-
const goal = profile?.goal || 'lose-weight';
|
| 69 |
-
const fitness = profile?.fitness || 'intermediate';
|
| 70 |
-
|
| 71 |
-
// Preferências por meta
|
| 72 |
-
const goalPreferences = {
|
| 73 |
-
'lose-weight': {
|
| 74 |
-
preferHighCalories: true,
|
| 75 |
-
preferCardio: true,
|
| 76 |
-
intensityMultiplier: 1.2,
|
| 77 |
-
minCalories: 8,
|
| 78 |
-
maxDuration: 90
|
| 79 |
-
},
|
| 80 |
-
'lose-weight-fast': {
|
| 81 |
-
preferHighCalories: true,
|
| 82 |
-
preferCardio: true,
|
| 83 |
-
intensityMultiplier: 1.4,
|
| 84 |
-
minCalories: 10,
|
| 85 |
-
maxDuration: 80
|
| 86 |
-
},
|
| 87 |
-
'gain-muscle': {
|
| 88 |
-
preferHighCalories: false,
|
| 89 |
-
preferCardio: false,
|
| 90 |
-
intensityMultiplier: 0.9,
|
| 91 |
-
minCalories: 5,
|
| 92 |
-
maxDuration: 100,
|
| 93 |
-
preferSets: true
|
| 94 |
-
},
|
| 95 |
-
'tone': {
|
| 96 |
-
preferHighCalories: false,
|
| 97 |
-
preferCardio: false,
|
| 98 |
-
intensityMultiplier: 1.0,
|
| 99 |
-
minCalories: 6,
|
| 100 |
-
maxDuration: 90
|
| 101 |
-
},
|
| 102 |
-
'health': {
|
| 103 |
-
preferHighCalories: false,
|
| 104 |
-
preferCardio: true,
|
| 105 |
-
intensityMultiplier: 0.8,
|
| 106 |
-
minCalories: 4,
|
| 107 |
-
maxDuration: 100
|
| 108 |
-
}
|
| 109 |
-
};
|
| 110 |
-
|
| 111 |
-
const prefs = goalPreferences[goal] || goalPreferences['lose-weight'];
|
| 112 |
-
|
| 113 |
-
// Ajuste por condicionamento
|
| 114 |
-
const fitnessAdjustments = {
|
| 115 |
-
'beginner': { intensityMultiplier: 0.7, maxDuration: 70 },
|
| 116 |
-
'intermediate': { intensityMultiplier: 1.0, maxDuration: 90 },
|
| 117 |
-
'advanced': { intensityMultiplier: 1.3, maxDuration: 120 }
|
| 118 |
-
};
|
| 119 |
-
|
| 120 |
-
const fitnessAdj = fitnessAdjustments[fitness] || fitnessAdjustments['intermediate'];
|
| 121 |
-
|
| 122 |
-
// Ajuste por idade
|
| 123 |
-
const ageMultiplier = age < 25 ? 1.1 : age < 40 ? 1.0 : age < 55 ? 0.9 : 0.8;
|
| 124 |
-
|
| 125 |
-
return {
|
| 126 |
-
...prefs,
|
| 127 |
-
intensityMultiplier: prefs.intensityMultiplier * fitnessAdj.intensityMultiplier * ageMultiplier,
|
| 128 |
-
maxDuration: Math.min(prefs.maxDuration, fitnessAdj.maxDuration),
|
| 129 |
-
age,
|
| 130 |
-
weight,
|
| 131 |
-
goal,
|
| 132 |
-
fitness,
|
| 133 |
-
dayIntensity: dayPlan?.intensityPercent || 70
|
| 134 |
-
};
|
| 135 |
-
}
|
| 136 |
-
|
| 137 |
-
/**
|
| 138 |
-
* 🎯 Pontua exercícios baseado em múltiplos critérios
|
| 139 |
-
*/
|
| 140 |
-
scoreExercises(exercises, params, seed) {
|
| 141 |
-
return exercises.map((exercise, index) => {
|
| 142 |
-
let score = 100;
|
| 143 |
-
|
| 144 |
-
// Preferência por calorias
|
| 145 |
-
if (params.preferHighCalories) {
|
| 146 |
-
score += (exercise.calories || 5) * 2;
|
| 147 |
-
}
|
| 148 |
-
|
| 149 |
-
// Duração adequada
|
| 150 |
-
const duration = exercise.durationInSeconds || 40;
|
| 151 |
-
if (duration >= 30 && duration <= params.maxDuration) {
|
| 152 |
-
score += 20;
|
| 153 |
-
}
|
| 154 |
-
|
| 155 |
-
// Alta intensidade
|
| 156 |
-
if ((exercise.calories || 5) >= params.minCalories) {
|
| 157 |
-
score += 15 * params.intensityMultiplier;
|
| 158 |
-
}
|
| 159 |
-
|
| 160 |
-
// Preferência por séries
|
| 161 |
-
if (params.preferSets && (exercise.sets || 3) >= 3) {
|
| 162 |
-
score += 10;
|
| 163 |
-
}
|
| 164 |
-
|
| 165 |
-
// Variação determinística
|
| 166 |
-
const pseudoRandom = ((seed + index) * 9301 + 49297) % 233280 / 233280;
|
| 167 |
-
score += pseudoRandom * 30;
|
| 168 |
-
|
| 169 |
-
return {
|
| 170 |
-
...exercise,
|
| 171 |
-
score
|
| 172 |
-
};
|
| 173 |
-
}).sort((a, b) => b.score - a.score);
|
| 174 |
-
}
|
| 175 |
-
|
| 176 |
-
/**
|
| 177 |
-
* 🎲 Seleciona exercícios variados
|
| 178 |
-
*/
|
| 179 |
-
selectVaried(scoredExercises, count, seed) {
|
| 180 |
-
const selected = [];
|
| 181 |
-
const usedNames = new Set();
|
| 182 |
-
|
| 183 |
-
// Top 30% dos melhores
|
| 184 |
-
const topCandidates = scoredExercises.slice(0, Math.ceil(scoredExercises.length * 0.3));
|
| 185 |
-
|
| 186 |
-
// Embaralha levemente
|
| 187 |
-
const shuffled = topCandidates.sort((a, b) => {
|
| 188 |
-
const randomA = ((seed + a.score) * 9301) % 233280 / 233280;
|
| 189 |
-
const randomB = ((seed + b.score) * 9301) % 233280 / 233280;
|
| 190 |
-
return (b.score + randomA * 10) - (a.score + randomB * 10);
|
| 191 |
-
});
|
| 192 |
-
|
| 193 |
-
// Seleciona evitando duplicatas
|
| 194 |
-
for (const exercise of shuffled) {
|
| 195 |
-
if (selected.length >= count) break;
|
| 196 |
-
|
| 197 |
-
const simpleName = exercise.name.toLowerCase().substring(0, 20);
|
| 198 |
-
if (!usedNames.has(simpleName)) {
|
| 199 |
-
selected.push(exercise);
|
| 200 |
-
usedNames.add(simpleName);
|
| 201 |
-
}
|
| 202 |
-
}
|
| 203 |
-
|
| 204 |
-
// Completa se necessário
|
| 205 |
-
if (selected.length < count) {
|
| 206 |
-
for (const exercise of scoredExercises) {
|
| 207 |
-
if (selected.length >= count) break;
|
| 208 |
-
if (!selected.includes(exercise)) {
|
| 209 |
-
selected.push(exercise);
|
| 210 |
-
}
|
| 211 |
-
}
|
| 212 |
-
}
|
| 213 |
-
|
| 214 |
-
return selected;
|
| 215 |
-
}
|
| 216 |
-
|
| 217 |
-
/**
|
| 218 |
-
* 📋 Retorna exercícios por categoria (fallback)
|
| 219 |
-
*/
|
| 220 |
-
getByCategory(category) {
|
| 221 |
-
if (!this.database || !this.database[category]) {
|
| 222 |
-
return [];
|
| 223 |
-
}
|
| 224 |
-
return this.database[category];
|
| 225 |
-
}
|
| 226 |
-
|
| 227 |
-
/**
|
| 228 |
-
* 📊 Estatísticas da base de dados
|
| 229 |
-
*/
|
| 230 |
-
getStats() {
|
| 231 |
-
if (!this.database) return null;
|
| 232 |
-
|
| 233 |
-
const stats = {};
|
| 234 |
-
let total = 0;
|
| 235 |
-
|
| 236 |
-
for (const [category, exercises] of Object.entries(this.database)) {
|
| 237 |
-
stats[category] = exercises.length;
|
| 238 |
-
total += exercises.length;
|
| 239 |
-
}
|
| 240 |
-
|
| 241 |
-
return {
|
| 242 |
-
categories: Object.keys(this.database).length,
|
| 243 |
-
total,
|
| 244 |
-
breakdown: stats
|
| 245 |
-
};
|
| 246 |
-
}
|
| 247 |
-
}
|
| 248 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/modules/ExerciseSelector.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
export class ExerciseSelector{constructor(){this.database=null;this.loadDatabase();}loadDatabase(){if(typeof EXERCISES_DATABASE !=='undefined'){this.database=EXERCISES_DATABASE;.length,'categorias');}else{}}selectForDay(dayPlan,userProfile){if(!this.database){console.error('❌[ExerciseSelector]Base de dados não disponível');return[];}const params=this.calculateSelectionParameters(userProfile,dayPlan);const category1Exercises=this.database[dayPlan.category]||[];const scored1=this.scoreExercises(category1Exercises,params,dayPlan.day);let selectedExercises=this.selectVaried(scored1,5,dayPlan.day);if(dayPlan.doubleWorkout && dayPlan.secondCategory){const category2Exercises=this.database[dayPlan.secondCategory]||[];const scored2=this.scoreExercises(category2Exercises,params,dayPlan.day+1000);const selected2=this.selectVaried(scored2,5,dayPlan.day+1000);selectedExercises=[...selectedExercises,...selected2];}return selectedExercises;}calculateSelectionParameters(profile,dayPlan){const age=profile?.age || 30;const weight=profile?.weight || 70;const goal=profile?.goal || 'lose-weight';const fitness=profile?.fitness || 'intermediate';const goalPreferences={'lose-weight':{preferHighCalories:true,preferCardio:true,intensityMultiplier:1.2,minCalories:8,maxDuration:90},'lose-weight-fast':{preferHighCalories:true,preferCardio:true,intensityMultiplier:1.4,minCalories:10,maxDuration:80},'gain-muscle':{preferHighCalories:false,preferCardio:false,intensityMultiplier:0.9,minCalories:5,maxDuration:100,preferSets:true},'tone':{preferHighCalories:false,preferCardio:false,intensityMultiplier:1.0,minCalories:6,maxDuration:90},'health':{preferHighCalories:false,preferCardio:true,intensityMultiplier:0.8,minCalories:4,maxDuration:100}};const prefs=goalPreferences[goal]|| goalPreferences['lose-weight'];const fitnessAdjustments={'beginner':{intensityMultiplier:0.7,maxDuration:70},'intermediate':{intensityMultiplier:1.0,maxDuration:90},'advanced':{intensityMultiplier:1.3,maxDuration:120}};const fitnessAdj=fitnessAdjustments[fitness]|| fitnessAdjustments['intermediate'];const ageMultiplier=age < 25 ? 1.1:age < 40 ? 1.0:age < 55 ? 0.9:0.8;return{...prefs,intensityMultiplier:prefs.intensityMultiplier*fitnessAdj.intensityMultiplier*ageMultiplier,maxDuration:Math.min(prefs.maxDuration,fitnessAdj.maxDuration),age,weight,goal,fitness,dayIntensity:dayPlan?.intensityPercent || 70};}scoreExercises(exercises,params,seed){return exercises.map((exercise,index)=>{let score=100;if(params.preferHighCalories){score+=(exercise.calories || 5)*2;}const duration=exercise.durationInSeconds || 40;if(duration >=30 && duration <=params.maxDuration){score+=20;}if((exercise.calories || 5)>=params.minCalories){score+=15*params.intensityMultiplier;}if(params.preferSets &&(exercise.sets || 3)>=3){score+=10;}const pseudoRandom=((seed+index)*9301+49297)% 233280/233280;score+=pseudoRandom*30;return{...exercise,score};}).sort((a,b)=> b.score-a.score);}selectVaried(scoredExercises,count,seed){const selected=[];const usedNames=new Set();const topCandidates=scoredExercises.slice(0,Math.ceil(scoredExercises.length*0.3));const shuffled=topCandidates.sort((a,b)=>{const randomA=((seed+a.score)*9301)% 233280/233280;const randomB=((seed+b.score)*9301)% 233280/233280;return(b.score+randomA*10)-(a.score+randomB*10);});for(const exercise of shuffled){if(selected.length >=count)break;const simpleName=exercise.name.toLowerCase().substring(0,20);if(!usedNames.has(simpleName)){selected.push(exercise);usedNames.add(simpleName);}}if(selected.length < count){for(const exercise of scoredExercises){if(selected.length >=count)break;if(!selected.includes(exercise)){selected.push(exercise);}}}return selected;}getByCategory(category){if(!this.database || !this.database[category]){return[];}return this.database[category];}getStats(){if(!this.database)return null;const stats={};let total=0;for(const[category,exercises]of Object.entries(this.database)){stats[category]=exercises.length;total+=exercises.length;}return{categories:Object.keys(this.database).length,total,breakdown:stats};}}
|
|
|
|
|
|
public/modules/NotificationManager.js
DELETED
|
@@ -1,217 +0,0 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* 🔔 MÓDULO DE GERENCIAMENTO DE NOTIFICAÇÕES
|
| 3 |
-
*
|
| 4 |
-
* Responsável por:
|
| 5 |
-
* - Solicitar permissão de notificações
|
| 6 |
-
* - Agendar lembretes de treino
|
| 7 |
-
* - Notificações push (PWA)
|
| 8 |
-
* - Notificações motivacionais
|
| 9 |
-
*
|
| 10 |
-
* @version 4.0.0
|
| 11 |
-
*/
|
| 12 |
-
|
| 13 |
-
export class NotificationManager {
|
| 14 |
-
constructor() {
|
| 15 |
-
this.permission = 'default';
|
| 16 |
-
this.scheduledNotifications = new Map();
|
| 17 |
-
this.init();
|
| 18 |
-
}
|
| 19 |
-
|
| 20 |
-
/**
|
| 21 |
-
* Inicializa o gerenciador
|
| 22 |
-
*/
|
| 23 |
-
async init() {
|
| 24 |
-
if ('Notification' in window) {
|
| 25 |
-
this.permission = Notification.permission;
|
| 26 |
-
console.log('🔔 [NotificationManager] Permissão:', this.permission);
|
| 27 |
-
} else {
|
| 28 |
-
console.warn('⚠️ [NotificationManager] Notificações não suportadas');
|
| 29 |
-
}
|
| 30 |
-
}
|
| 31 |
-
|
| 32 |
-
/**
|
| 33 |
-
* 🔓 Solicita permissão para notificações
|
| 34 |
-
*/
|
| 35 |
-
async requestPermission() {
|
| 36 |
-
if (!('Notification' in window)) {
|
| 37 |
-
return false;
|
| 38 |
-
}
|
| 39 |
-
|
| 40 |
-
if (this.permission === 'granted') {
|
| 41 |
-
return true;
|
| 42 |
-
}
|
| 43 |
-
|
| 44 |
-
try {
|
| 45 |
-
const permission = await Notification.requestPermission();
|
| 46 |
-
this.permission = permission;
|
| 47 |
-
console.log('🔔 [NotificationManager] Permissão concedida:', permission);
|
| 48 |
-
return permission === 'granted';
|
| 49 |
-
} catch (error) {
|
| 50 |
-
console.error('❌ [NotificationManager] Erro ao solicitar permissão:', error);
|
| 51 |
-
return false;
|
| 52 |
-
}
|
| 53 |
-
}
|
| 54 |
-
|
| 55 |
-
/**
|
| 56 |
-
* 📬 Envia notificação
|
| 57 |
-
*/
|
| 58 |
-
async send(title, options = {}) {
|
| 59 |
-
if (this.permission !== 'granted') {
|
| 60 |
-
console.warn('⚠️ [NotificationManager] Sem permissão para notificar');
|
| 61 |
-
return false;
|
| 62 |
-
}
|
| 63 |
-
|
| 64 |
-
try {
|
| 65 |
-
const notification = new Notification(title, {
|
| 66 |
-
icon: '/icons/icon-192x192.svg',
|
| 67 |
-
badge: '/icons/icon-72x72.png',
|
| 68 |
-
vibrate: [200, 100, 200],
|
| 69 |
-
...options
|
| 70 |
-
});
|
| 71 |
-
|
| 72 |
-
notification.onclick = () => {
|
| 73 |
-
window.focus();
|
| 74 |
-
notification.close();
|
| 75 |
-
};
|
| 76 |
-
|
| 77 |
-
console.log('✅ [NotificationManager] Notificação enviada:', title);
|
| 78 |
-
return true;
|
| 79 |
-
} catch (error) {
|
| 80 |
-
console.error('❌ [NotificationManager] Erro ao enviar:', error);
|
| 81 |
-
return false;
|
| 82 |
-
}
|
| 83 |
-
}
|
| 84 |
-
|
| 85 |
-
/**
|
| 86 |
-
* ⏰ Agenda lembrete de treino
|
| 87 |
-
*/
|
| 88 |
-
scheduleWorkoutReminder(time, message) {
|
| 89 |
-
const now = new Date();
|
| 90 |
-
const scheduledTime = new Date();
|
| 91 |
-
const [hours, minutes] = time.split(':');
|
| 92 |
-
|
| 93 |
-
scheduledTime.setHours(parseInt(hours));
|
| 94 |
-
scheduledTime.setMinutes(parseInt(minutes));
|
| 95 |
-
scheduledTime.setSeconds(0);
|
| 96 |
-
|
| 97 |
-
// Se já passou hoje, agenda para amanhã
|
| 98 |
-
if (scheduledTime < now) {
|
| 99 |
-
scheduledTime.setDate(scheduledTime.getDate() + 1);
|
| 100 |
-
}
|
| 101 |
-
|
| 102 |
-
const delay = scheduledTime - now;
|
| 103 |
-
const id = `workout-${time}`;
|
| 104 |
-
|
| 105 |
-
// Cancela agendamento anterior se existir
|
| 106 |
-
if (this.scheduledNotifications.has(id)) {
|
| 107 |
-
clearTimeout(this.scheduledNotifications.get(id));
|
| 108 |
-
}
|
| 109 |
-
|
| 110 |
-
// Agenda nova notificação
|
| 111 |
-
const timeoutId = setTimeout(() => {
|
| 112 |
-
this.send('💪 Hora do Treino!', {
|
| 113 |
-
body: message || 'Está na hora de se exercitar!',
|
| 114 |
-
tag: 'workout-reminder',
|
| 115 |
-
requireInteraction: true,
|
| 116 |
-
actions: [
|
| 117 |
-
{ action: 'start', title: 'Começar Treino' },
|
| 118 |
-
{ action: 'snooze', title: 'Lembrar em 10 min' }
|
| 119 |
-
]
|
| 120 |
-
});
|
| 121 |
-
|
| 122 |
-
// Remove do mapa após executar
|
| 123 |
-
this.scheduledNotifications.delete(id);
|
| 124 |
-
|
| 125 |
-
// Reagenda para amanhã
|
| 126 |
-
this.scheduleWorkoutReminder(time, message);
|
| 127 |
-
}, delay);
|
| 128 |
-
|
| 129 |
-
this.scheduledNotifications.set(id, timeoutId);
|
| 130 |
-
console.log(`⏰ [NotificationManager] Lembrete agendado para ${time}`);
|
| 131 |
-
}
|
| 132 |
-
|
| 133 |
-
/**
|
| 134 |
-
* 🎯 Agenda lembretes diários
|
| 135 |
-
*/
|
| 136 |
-
scheduleDailyReminders() {
|
| 137 |
-
const reminders = [
|
| 138 |
-
{ time: '08:00', message: '☀️ Bom dia! Hora do treino matinal!' },
|
| 139 |
-
{ time: '12:00', message: '🌞 Que tal um treino rápido no almoço?' },
|
| 140 |
-
{ time: '18:00', message: '🌆 Hora do treino da tarde! Vamos lá!' },
|
| 141 |
-
{ time: '20:00', message: '🌙 Última chance de treinar hoje!' }
|
| 142 |
-
];
|
| 143 |
-
|
| 144 |
-
reminders.forEach(({ time, message }) => {
|
| 145 |
-
this.scheduleWorkoutReminder(time, message);
|
| 146 |
-
});
|
| 147 |
-
|
| 148 |
-
console.log('✅ [NotificationManager] Lembretes diários configurados');
|
| 149 |
-
}
|
| 150 |
-
|
| 151 |
-
/**
|
| 152 |
-
* 🎉 Notificação de conquista
|
| 153 |
-
*/
|
| 154 |
-
async sendAchievement(achievement, description) {
|
| 155 |
-
return this.send(`🏆 Nova Conquista: ${achievement}`, {
|
| 156 |
-
body: description,
|
| 157 |
-
tag: 'achievement',
|
| 158 |
-
requireInteraction: true
|
| 159 |
-
});
|
| 160 |
-
}
|
| 161 |
-
|
| 162 |
-
/**
|
| 163 |
-
* 🔥 Notificação de streak
|
| 164 |
-
*/
|
| 165 |
-
async sendStreak(days) {
|
| 166 |
-
const messages = {
|
| 167 |
-
3: '🔥 3 dias seguidos! Você está pegando fogo!',
|
| 168 |
-
7: '✨ Uma semana completa! Incrível!',
|
| 169 |
-
14: '💪 2 semanas! Você é imparável!',
|
| 170 |
-
30: '🏆 30 DIAS! VOCÊ É UM CAMPEÃO!',
|
| 171 |
-
60: '👑 60 DIAS! VOCÊ É UMA LENDA!',
|
| 172 |
-
90: '🎖️ 90 DIAS! NÍVEL MASTER ALCANÇADO!'
|
| 173 |
-
};
|
| 174 |
-
|
| 175 |
-
const message = messages[days] || `🔥 ${days} dias seguidos! Continue assim!`;
|
| 176 |
-
|
| 177 |
-
return this.send('Sequência de Treinos', {
|
| 178 |
-
body: message,
|
| 179 |
-
tag: 'streak',
|
| 180 |
-
requireInteraction: true
|
| 181 |
-
});
|
| 182 |
-
}
|
| 183 |
-
|
| 184 |
-
/**
|
| 185 |
-
* 💧 Lembrete de hidratação
|
| 186 |
-
*/
|
| 187 |
-
async sendHydrationReminder() {
|
| 188 |
-
return this.send('💧 Hora de Beber Água!', {
|
| 189 |
-
body: 'Mantenha-se hidratado! Beba um copo de água agora.',
|
| 190 |
-
tag: 'hydration'
|
| 191 |
-
});
|
| 192 |
-
}
|
| 193 |
-
|
| 194 |
-
/**
|
| 195 |
-
* 🗑️ Cancela todos os lembretes
|
| 196 |
-
*/
|
| 197 |
-
cancelAll() {
|
| 198 |
-
this.scheduledNotifications.forEach(timeoutId => {
|
| 199 |
-
clearTimeout(timeoutId);
|
| 200 |
-
});
|
| 201 |
-
this.scheduledNotifications.clear();
|
| 202 |
-
console.log('🗑️ [NotificationManager] Todos os lembretes cancelados');
|
| 203 |
-
}
|
| 204 |
-
|
| 205 |
-
/**
|
| 206 |
-
* 📊 Status das notificações
|
| 207 |
-
*/
|
| 208 |
-
getStatus() {
|
| 209 |
-
return {
|
| 210 |
-
supported: 'Notification' in window,
|
| 211 |
-
permission: this.permission,
|
| 212 |
-
scheduled: this.scheduledNotifications.size,
|
| 213 |
-
active: this.permission === 'granted'
|
| 214 |
-
};
|
| 215 |
-
}
|
| 216 |
-
}
|
| 217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/modules/NotificationManager.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
export class NotificationManager{constructor(){this.permission='default';this.scheduledNotifications=new Map();this.init();}async init(){if('Notification' in window){this.permission=Notification.permission;}else{}}async requestPermission(){if(!('Notification' in window)){return false;}if(this.permission==='granted'){return true;}try{const permission=await Notification.requestPermission();this.permission=permission;return permission==='granted';}catch(error){console.error('❌[NotificationManager]Erro ao solicitar permissão:',error);return false;}}async send(title,options={}){if(this.permission !=='granted'){return false;}try{const notification=new Notification(title,{icon:'/icons/icon-192x192.svg',badge:'/icons/icon-72x72.png',vibrate:[200,100,200],...options});notification.onclick=()=>{window.focus();notification.close();};return true;}catch(error){console.error('❌[NotificationManager]Erro ao enviar:',error);return false;}}scheduleWorkoutReminder(time,message){const now=new Date();const scheduledTime=new Date();const[hours,minutes]=time.split(':');scheduledTime.setHours(parseInt(hours));scheduledTime.setMinutes(parseInt(minutes));scheduledTime.setSeconds(0);if(scheduledTime < now){scheduledTime.setDate(scheduledTime.getDate()+1);}const delay=scheduledTime-now;const id=`workout-${time}`;if(this.scheduledNotifications.has(id)){clearTimeout(this.scheduledNotifications.get(id));}const timeoutId=setTimeout(()=>{this.send('💪 Hora do Treino!',{body:message || 'Está na hora de se exercitar!',tag:'workout-reminder',requireInteraction:true,actions:[{action:'start',title:'Começar Treino'},{action:'snooze',title:'Lembrar em 10 min'}]});this.scheduledNotifications.delete(id);this.scheduleWorkoutReminder(time,message);},delay);this.scheduledNotifications.set(id,timeoutId);}scheduleDailyReminders(){const reminders=[{time:'08:00',message:'☀️ Bom dia! Hora do treino matinal!'},{time:'12:00',message:'🌞 Que tal um treino rápido no almoço?'},{time:'18:00',message:'🌆 Hora do treino da tarde! Vamos lá!'},{time:'20:00',message:'🌙 Última chance de treinar hoje!'}];reminders.forEach(({time,message})=>{this.scheduleWorkoutReminder(time,message);});}async sendAchievement(achievement,description){return this.send(`🏆 Nova Conquista:${achievement}`,{body:description,tag:'achievement',requireInteraction:true});}async sendStreak(days){const messages={3:'🔥 3 dias seguidos! Você está pegando fogo!',7:'✨ Uma semana completa! Incrível!',14:'💪 2 semanas! Você é imparável!',30:'🏆 30 DIAS! VOCÊ É UM CAMPEÃO!',60:'👑 60 DIAS! VOCÊ É UMA LENDA!',90:'🎖️ 90 DIAS! NÍVEL MASTER ALCANÇADO!'};const message=messages[days]|| `🔥 ${days}dias seguidos! Continue assim!`;return this.send('Sequência de Treinos',{body:message,tag:'streak',requireInteraction:true});}async sendHydrationReminder(){return this.send('💧 Hora de Beber Água!',{body:'Mantenha-se hidratado! Beba um copo de água agora.',tag:'hydration'});}cancelAll(){this.scheduledNotifications.forEach(timeoutId=>{clearTimeout(timeoutId);});this.scheduledNotifications.clear();}getStatus(){return{supported:'Notification' in window,permission:this.permission,scheduled:this.scheduledNotifications.size,active:this.permission==='granted'};}}
|
|
|
|
|
|
public/modules/PerformanceMonitor.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* ⚡ MÓDULO DE MONITORAMENTO DE PERFORMANCE
|
| 3 |
-
*
|
| 4 |
-
* Responsável por:
|
| 5 |
-
* - Monitorar Web Vitals (LCP, FID, CLS)
|
| 6 |
-
* - Detectar memory leaks
|
| 7 |
-
* - Rastrear performance de funções
|
| 8 |
-
* - Gerar relatórios
|
| 9 |
-
*
|
| 10 |
-
* @version 4.0.0
|
| 11 |
-
*/
|
| 12 |
-
|
| 13 |
-
export class PerformanceMonitor {
|
| 14 |
-
constructor() {
|
| 15 |
-
this.metrics = {
|
| 16 |
-
lcp: null,
|
| 17 |
-
fid: null,
|
| 18 |
-
cls: null,
|
| 19 |
-
ttfb: null,
|
| 20 |
-
fcp: null
|
| 21 |
-
};
|
| 22 |
-
this.memoryBaseline = null;
|
| 23 |
-
this.init();
|
| 24 |
-
}
|
| 25 |
-
|
| 26 |
-
/**
|
| 27 |
-
* Inicializa monitoramento
|
| 28 |
-
*/
|
| 29 |
-
init() {
|
| 30 |
-
console.log('⚡ [PerformanceMonitor] Inicializado');
|
| 31 |
-
this.observeWebVitals();
|
| 32 |
-
this.monitorMemory();
|
| 33 |
-
}
|
| 34 |
-
|
| 35 |
-
/**
|
| 36 |
-
* 📊 Observa Web Vitals
|
| 37 |
-
*/
|
| 38 |
-
observeWebVitals() {
|
| 39 |
-
// Largest Contentful Paint (LCP)
|
| 40 |
-
if ('PerformanceObserver' in window) {
|
| 41 |
-
try {
|
| 42 |
-
const lcpObserver = new PerformanceObserver((list) => {
|
| 43 |
-
const entries = list.getEntries();
|
| 44 |
-
const lastEntry = entries[entries.length - 1];
|
| 45 |
-
this.metrics.lcp = lastEntry.renderTime || lastEntry.loadTime;
|
| 46 |
-
console.log(`📊 [PerformanceMonitor] LCP: ${this.metrics.lcp.toFixed(2)}ms`);
|
| 47 |
-
});
|
| 48 |
-
lcpObserver.observe({ entryTypes: ['largest-contentful-paint'] });
|
| 49 |
-
|
| 50 |
-
// First Input Delay (FID) / Interaction to Next Paint (INP)
|
| 51 |
-
const fidObserver = new PerformanceObserver((list) => {
|
| 52 |
-
const entries = list.getEntries();
|
| 53 |
-
entries.forEach((entry) => {
|
| 54 |
-
this.metrics.fid = entry.processingStart - entry.startTime;
|
| 55 |
-
console.log(`📊 [PerformanceMonitor] FID: ${this.metrics.fid.toFixed(2)}ms`);
|
| 56 |
-
});
|
| 57 |
-
});
|
| 58 |
-
fidObserver.observe({ entryTypes: ['first-input'] });
|
| 59 |
-
|
| 60 |
-
// Cumulative Layout Shift (CLS)
|
| 61 |
-
let clsValue = 0;
|
| 62 |
-
const clsObserver = new PerformanceObserver((list) => {
|
| 63 |
-
for (const entry of list.getEntries()) {
|
| 64 |
-
if (!entry.hadRecentInput) {
|
| 65 |
-
clsValue += entry.value;
|
| 66 |
-
}
|
| 67 |
-
}
|
| 68 |
-
this.metrics.cls = clsValue;
|
| 69 |
-
console.log(`📊 [PerformanceMonitor] CLS: ${this.metrics.cls.toFixed(4)}`);
|
| 70 |
-
});
|
| 71 |
-
clsObserver.observe({ entryTypes: ['layout-shift'] });
|
| 72 |
-
|
| 73 |
-
} catch (error) {
|
| 74 |
-
console.warn('⚠️ [PerformanceMonitor] Erro ao observar Web Vitals:', error);
|
| 75 |
-
}
|
| 76 |
-
}
|
| 77 |
-
|
| 78 |
-
// Navigation Timing
|
| 79 |
-
window.addEventListener('load', () => {
|
| 80 |
-
const perfData = performance.getEntriesByType('navigation')[0];
|
| 81 |
-
if (perfData) {
|
| 82 |
-
this.metrics.ttfb = perfData.responseStart - perfData.requestStart;
|
| 83 |
-
this.metrics.fcp = perfData.responseEnd - perfData.requestStart;
|
| 84 |
-
|
| 85 |
-
console.log(`📊 [PerformanceMonitor] TTFB: ${this.metrics.ttfb.toFixed(2)}ms`);
|
| 86 |
-
console.log(`📊 [PerformanceMonitor] FCP: ${this.metrics.fcp.toFixed(2)}ms`);
|
| 87 |
-
}
|
| 88 |
-
});
|
| 89 |
-
}
|
| 90 |
-
|
| 91 |
-
/**
|
| 92 |
-
* 🧠 Monitora uso de memória
|
| 93 |
-
*/
|
| 94 |
-
monitorMemory() {
|
| 95 |
-
if (performance.memory) {
|
| 96 |
-
this.memoryBaseline = {
|
| 97 |
-
usedJSHeapSize: performance.memory.usedJSHeapSize,
|
| 98 |
-
totalJSHeapSize: performance.memory.totalJSHeapSize,
|
| 99 |
-
jsHeapSizeLimit: performance.memory.jsHeapSizeLimit
|
| 100 |
-
};
|
| 101 |
-
|
| 102 |
-
// Monitora a cada 30s
|
| 103 |
-
setInterval(() => {
|
| 104 |
-
const current = performance.memory;
|
| 105 |
-
const growth = current.usedJSHeapSize - this.memoryBaseline.usedJSHeapSize;
|
| 106 |
-
const growthMB = (growth / 1024 / 1024).toFixed(2);
|
| 107 |
-
|
| 108 |
-
if (growth > 10 * 1024 * 1024) { // > 10MB
|
| 109 |
-
console.warn(`⚠️ [PerformanceMonitor] Memory leak detectado! Crescimento: ${growthMB}MB`);
|
| 110 |
-
}
|
| 111 |
-
|
| 112 |
-
console.log(`🧠 [PerformanceMonitor] Memória: ${(current.usedJSHeapSize / 1024 / 1024).toFixed(2)}MB`);
|
| 113 |
-
}, 30000);
|
| 114 |
-
}
|
| 115 |
-
}
|
| 116 |
-
|
| 117 |
-
/**
|
| 118 |
-
* ⏱️ Mede performance de função
|
| 119 |
-
*/
|
| 120 |
-
async measure(name, fn) {
|
| 121 |
-
const startTime = performance.now();
|
| 122 |
-
const startMemory = performance.memory?.usedJSHeapSize;
|
| 123 |
-
|
| 124 |
-
try {
|
| 125 |
-
const result = await fn();
|
| 126 |
-
|
| 127 |
-
const endTime = performance.now();
|
| 128 |
-
const endMemory = performance.memory?.usedJSHeapSize;
|
| 129 |
-
|
| 130 |
-
const duration = endTime - startTime;
|
| 131 |
-
const memoryDelta = endMemory ? (endMemory - startMemory) / 1024 : 0;
|
| 132 |
-
|
| 133 |
-
console.log(`⏱️ [PerformanceMonitor] ${name}: ${duration.toFixed(2)}ms, Δ${memoryDelta.toFixed(2)}KB`);
|
| 134 |
-
|
| 135 |
-
return result;
|
| 136 |
-
} catch (error) {
|
| 137 |
-
console.error(`❌ [PerformanceMonitor] Erro em ${name}:`, error);
|
| 138 |
-
throw error;
|
| 139 |
-
}
|
| 140 |
-
}
|
| 141 |
-
|
| 142 |
-
/**
|
| 143 |
-
* 📈 Marca tempo
|
| 144 |
-
*/
|
| 145 |
-
mark(name) {
|
| 146 |
-
performance.mark(name);
|
| 147 |
-
}
|
| 148 |
-
|
| 149 |
-
/**
|
| 150 |
-
* 📊 Mede entre marcas
|
| 151 |
-
*/
|
| 152 |
-
measureBetween(name, startMark, endMark) {
|
| 153 |
-
performance.measure(name, startMark, endMark);
|
| 154 |
-
const measure = performance.getEntriesByName(name)[0];
|
| 155 |
-
console.log(`📊 [PerformanceMonitor] ${name}: ${measure.duration.toFixed(2)}ms`);
|
| 156 |
-
return measure.duration;
|
| 157 |
-
}
|
| 158 |
-
|
| 159 |
-
/**
|
| 160 |
-
* 🎯 Avalia Web Vitals
|
| 161 |
-
*/
|
| 162 |
-
evaluateWebVitals() {
|
| 163 |
-
const scores = {
|
| 164 |
-
lcp: this.evaluateLCP(),
|
| 165 |
-
fid: this.evaluateFID(),
|
| 166 |
-
cls: this.evaluateCLS()
|
| 167 |
-
};
|
| 168 |
-
|
| 169 |
-
const overall = Object.values(scores).filter(s => s === 'good').length;
|
| 170 |
-
const rating = overall === 3 ? 'excellent' : overall === 2 ? 'good' : 'needs-improvement';
|
| 171 |
-
|
| 172 |
-
return {
|
| 173 |
-
scores,
|
| 174 |
-
rating,
|
| 175 |
-
message: this.getRatingMessage(rating)
|
| 176 |
-
};
|
| 177 |
-
}
|
| 178 |
-
|
| 179 |
-
/**
|
| 180 |
-
* Avalia LCP
|
| 181 |
-
*/
|
| 182 |
-
evaluateLCP() {
|
| 183 |
-
if (!this.metrics.lcp) return 'unknown';
|
| 184 |
-
if (this.metrics.lcp < 2500) return 'good';
|
| 185 |
-
if (this.metrics.lcp < 4000) return 'needs-improvement';
|
| 186 |
-
return 'poor';
|
| 187 |
-
}
|
| 188 |
-
|
| 189 |
-
/**
|
| 190 |
-
* Avalia FID
|
| 191 |
-
*/
|
| 192 |
-
evaluateFID() {
|
| 193 |
-
if (!this.metrics.fid) return 'unknown';
|
| 194 |
-
if (this.metrics.fid < 100) return 'good';
|
| 195 |
-
if (this.metrics.fid < 300) return 'needs-improvement';
|
| 196 |
-
return 'poor';
|
| 197 |
-
}
|
| 198 |
-
|
| 199 |
-
/**
|
| 200 |
-
* Avalia CLS
|
| 201 |
-
*/
|
| 202 |
-
evaluateCLS() {
|
| 203 |
-
if (!this.metrics.cls) return 'unknown';
|
| 204 |
-
if (this.metrics.cls < 0.1) return 'good';
|
| 205 |
-
if (this.metrics.cls < 0.25) return 'needs-improvement';
|
| 206 |
-
return 'poor';
|
| 207 |
-
}
|
| 208 |
-
|
| 209 |
-
/**
|
| 210 |
-
* Mensagem de avaliação
|
| 211 |
-
*/
|
| 212 |
-
getRatingMessage(rating) {
|
| 213 |
-
const messages = {
|
| 214 |
-
'excellent': '🌟 Excelente! Todas as métricas estão ótimas!',
|
| 215 |
-
'good': '👍 Bom! A maioria das métricas está OK.',
|
| 216 |
-
'needs-improvement': '⚠️ Precisa melhorar algumas métricas.'
|
| 217 |
-
};
|
| 218 |
-
return messages[rating] || 'Avaliando...';
|
| 219 |
-
}
|
| 220 |
-
|
| 221 |
-
/**
|
| 222 |
-
* 📊 Gera relatório
|
| 223 |
-
*/
|
| 224 |
-
generateReport() {
|
| 225 |
-
const evaluation = this.evaluateWebVitals();
|
| 226 |
-
|
| 227 |
-
return {
|
| 228 |
-
timestamp: new Date().toISOString(),
|
| 229 |
-
metrics: this.metrics,
|
| 230 |
-
evaluation,
|
| 231 |
-
memory: performance.memory ? {
|
| 232 |
-
used: `${(performance.memory.usedJSHeapSize / 1024 / 1024).toFixed(2)}MB`,
|
| 233 |
-
total: `${(performance.memory.totalJSHeapSize / 1024 / 1024).toFixed(2)}MB`,
|
| 234 |
-
limit: `${(performance.memory.jsHeapSizeLimit / 1024 / 1024).toFixed(2)}MB`
|
| 235 |
-
} : null
|
| 236 |
-
};
|
| 237 |
-
}
|
| 238 |
-
|
| 239 |
-
/**
|
| 240 |
-
* 🖨️ Imprime relatório
|
| 241 |
-
*/
|
| 242 |
-
printReport() {
|
| 243 |
-
const report = this.generateReport();
|
| 244 |
-
|
| 245 |
-
console.log('═'.repeat(60));
|
| 246 |
-
console.log('⚡ RELATÓRIO DE PERFORMANCE');
|
| 247 |
-
console.log('═'.repeat(60));
|
| 248 |
-
console.log('📊 Web Vitals:');
|
| 249 |
-
console.log(` LCP: ${report.metrics.lcp?.toFixed(2)}ms (${report.evaluation.scores.lcp})`);
|
| 250 |
-
console.log(` FID: ${report.metrics.fid?.toFixed(2)}ms (${report.evaluation.scores.fid})`);
|
| 251 |
-
console.log(` CLS: ${report.metrics.cls?.toFixed(4)} (${report.evaluation.scores.cls})`);
|
| 252 |
-
console.log(`\n📈 Avaliação: ${report.evaluation.message}`);
|
| 253 |
-
|
| 254 |
-
if (report.memory) {
|
| 255 |
-
console.log(`\n🧠 Memória:`);
|
| 256 |
-
console.log(` Usado: ${report.memory.used}`);
|
| 257 |
-
console.log(` Total: ${report.memory.total}`);
|
| 258 |
-
console.log(` Limite: ${report.memory.limit}`);
|
| 259 |
-
}
|
| 260 |
-
|
| 261 |
-
console.log('═'.repeat(60));
|
| 262 |
-
}
|
| 263 |
-
}
|
| 264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public/modules/PerformanceMonitor.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
export class PerformanceMonitor{constructor(){this.metrics={lcp:null,fid:null,cls:null,ttfb:null,fcp:null};this.memoryBaseline=null;this.init();}init(){this.observeWebVitals();this.monitorMemory();}observeWebVitals(){if('PerformanceObserver' in window){try{const lcpObserver=new PerformanceObserver((list)=>{const entries=list.getEntries();const lastEntry=entries[entries.length-1];this.metrics.lcp=lastEntry.renderTime || lastEntry.loadTime;}ms`);});lcpObserver.observe({entryTypes:['largest-contentful-paint']});const fidObserver=new PerformanceObserver((list)=>{const entries=list.getEntries();entries.forEach((entry)=>{this.metrics.fid=entry.processingStart-entry.startTime;}ms`);});});fidObserver.observe({entryTypes:['first-input']});let clsValue=0;const clsObserver=new PerformanceObserver((list)=>{for(const entry of list.getEntries()){if(!entry.hadRecentInput){clsValue+=entry.value;}}this.metrics.cls=clsValue;}`);});clsObserver.observe({entryTypes:['layout-shift']});}catch(error){}}window.addEventListener('load',()=>{const perfData=performance.getEntriesByType('navigation')[0];if(perfData){this.metrics.ttfb=perfData.responseStart-perfData.requestStart;this.metrics.fcp=perfData.responseEnd-perfData.requestStart;}ms`);}ms`);}});}monitorMemory(){if(performance.memory){this.memoryBaseline={usedJSHeapSize:performance.memory.usedJSHeapSize,totalJSHeapSize:performance.memory.totalJSHeapSize,jsHeapSizeLimit:performance.memory.jsHeapSizeLimit};setInterval(()=>{const current=performance.memory;const growth=current.usedJSHeapSize-this.memoryBaseline.usedJSHeapSize;const growthMB=(growth/1024/1024).toFixed(2);if(growth > 10*1024*1024){}.toFixed(2)}MB`);},30000);}}async measure(name,fn){const startTime=performance.now();const startMemory=performance.memory?.usedJSHeapSize;try{const result=await fn();const endTime=performance.now();const endMemory=performance.memory?.usedJSHeapSize;const duration=endTime-startTime;const memoryDelta=endMemory ?(endMemory-startMemory)/1024:0;}ms,Δ${memoryDelta.toFixed(2)}KB`);return result;}catch(error){console.error(`❌[PerformanceMonitor]Erro em ${name}:`,error);throw error;}}mark(name){performance.mark(name);}measureBetween(name,startMark,endMark){performance.measure(name,startMark,endMark);const measure=performance.getEntriesByName(name)[0];}ms`);return measure.duration;}evaluateWebVitals(){const scores={lcp:this.evaluateLCP(),fid:this.evaluateFID(),cls:this.evaluateCLS()};const overall=Object.values(scores).filter(s=> s==='good').length;const rating=overall===3 ? 'excellent':overall===2 ? 'good':'needs-improvement';return{scores,rating,message:this.getRatingMessage(rating)};}evaluateLCP(){if(!this.metrics.lcp)return 'unknown';if(this.metrics.lcp < 2500)return 'good';if(this.metrics.lcp < 4000)return 'needs-improvement';return 'poor';}evaluateFID(){if(!this.metrics.fid)return 'unknown';if(this.metrics.fid < 100)return 'good';if(this.metrics.fid < 300)return 'needs-improvement';return 'poor';}evaluateCLS(){if(!this.metrics.cls)return 'unknown';if(this.metrics.cls < 0.1)return 'good';if(this.metrics.cls < 0.25)return 'needs-improvement';return 'poor';}getRatingMessage(rating){const messages={'excellent':'🌟 Excelente! Todas as métricas estão ótimas!','good':'👍 Bom! A maioria das métricas está OK.','needs-improvement':'⚠️ Precisa melhorar algumas métricas.'};return messages[rating]|| 'Avaliando...';}generateReport(){const evaluation=this.evaluateWebVitals();return{timestamp:new Date().toISOString(),metrics:this.metrics,evaluation,memory:performance.memory ?{used:`${(performance.memory.usedJSHeapSize/1024/1024).toFixed(2)}MB`,total:`${(performance.memory.totalJSHeapSize/1024/1024).toFixed(2)}MB`,limit:`${(performance.memory.jsHeapSizeLimit/1024/1024).toFixed(2)}MB`}:null};}printReport(){const report=this.generateReport();););}ms(${report.evaluation.scores.lcp})`);}ms(${report.evaluation.scores.fid})`);}(${report.evaluation.scores.cls})`);if(report.memory){});}}
|
|
|
|
|
|
public/modules/ProgressTracker.js
DELETED
|
@@ -1,282 +0,0 @@
|
|
| 1 |
-
// 📊 Progress Tracker - Rastreamento de progresso e estatísticas
|
| 2 |
-
export class ProgressTracker {
|
| 3 |
-
constructor() {
|
| 4 |
-
this.progress = this.loadProgress();
|
| 5 |
-
}
|
| 6 |
-
|
| 7 |
-
// Carregar progresso
|
| 8 |
-
loadProgress() {
|
| 9 |
-
try {
|
| 10 |
-
const data = localStorage.getItem('progress');
|
| 11 |
-
if (!data) {
|
| 12 |
-
return this.getDefaultProgress();
|
| 13 |
-
}
|
| 14 |
-
return JSON.parse(data);
|
| 15 |
-
} catch (e) {
|
| 16 |
-
console.error('Error loading progress:', e);
|
| 17 |
-
return this.getDefaultProgress();
|
| 18 |
-
}
|
| 19 |
-
}
|
| 20 |
-
|
| 21 |
-
// Progresso padrão
|
| 22 |
-
getDefaultProgress() {
|
| 23 |
-
return {
|
| 24 |
-
workoutsCompleted: 0,
|
| 25 |
-
totalCalories: 0,
|
| 26 |
-
totalMinutes: 0,
|
| 27 |
-
streak: 0,
|
| 28 |
-
longestStreak: 0,
|
| 29 |
-
lastWorkoutDate: null,
|
| 30 |
-
workoutHistory: [],
|
| 31 |
-
achievements: [],
|
| 32 |
-
dailyCalories: 0,
|
| 33 |
-
dailyMinutes: 0,
|
| 34 |
-
dailyWorkouts: 0,
|
| 35 |
-
lastResetDate: new Date().toISOString().split('T')[0],
|
| 36 |
-
daysActive: 0,
|
| 37 |
-
waterGlasses: 0,
|
| 38 |
-
memberSince: new Date().toISOString()
|
| 39 |
-
};
|
| 40 |
-
}
|
| 41 |
-
|
| 42 |
-
// Salvar progresso
|
| 43 |
-
saveProgress() {
|
| 44 |
-
try {
|
| 45 |
-
localStorage.setItem('progress', JSON.stringify(this.progress));
|
| 46 |
-
return true;
|
| 47 |
-
} catch (e) {
|
| 48 |
-
console.error('Error saving progress:', e);
|
| 49 |
-
return false;
|
| 50 |
-
}
|
| 51 |
-
}
|
| 52 |
-
|
| 53 |
-
// Adicionar treino completo
|
| 54 |
-
addWorkout(workout) {
|
| 55 |
-
const today = new Date().toISOString().split('T')[0];
|
| 56 |
-
|
| 57 |
-
// Adicionar ao histórico
|
| 58 |
-
const workoutEntry = {
|
| 59 |
-
...workout,
|
| 60 |
-
date: new Date().toISOString(),
|
| 61 |
-
completedAt: new Date().toISOString()
|
| 62 |
-
};
|
| 63 |
-
|
| 64 |
-
this.progress.workoutHistory.push(workoutEntry);
|
| 65 |
-
|
| 66 |
-
// Atualizar estatísticas totais
|
| 67 |
-
this.progress.workoutsCompleted++;
|
| 68 |
-
this.progress.totalCalories += workout.calories || 0;
|
| 69 |
-
this.progress.totalMinutes += workout.minutes || 0;
|
| 70 |
-
|
| 71 |
-
// Atualizar estatísticas diárias
|
| 72 |
-
this.progress.dailyCalories += workout.calories || 0;
|
| 73 |
-
this.progress.dailyMinutes += workout.minutes || 0;
|
| 74 |
-
this.progress.dailyWorkouts++;
|
| 75 |
-
|
| 76 |
-
// Atualizar última data de treino
|
| 77 |
-
this.progress.lastWorkoutDate = today;
|
| 78 |
-
|
| 79 |
-
// Atualizar streak
|
| 80 |
-
this.updateStreak();
|
| 81 |
-
|
| 82 |
-
// Manter apenas últimos 365 treinos
|
| 83 |
-
if (this.progress.workoutHistory.length > 365) {
|
| 84 |
-
this.progress.workoutHistory = this.progress.workoutHistory.slice(-365);
|
| 85 |
-
}
|
| 86 |
-
|
| 87 |
-
return this.saveProgress();
|
| 88 |
-
}
|
| 89 |
-
|
| 90 |
-
// Atualizar streak
|
| 91 |
-
updateStreak() {
|
| 92 |
-
const today = new Date().toISOString().split('T')[0];
|
| 93 |
-
const lastDate = this.progress.lastWorkoutDate;
|
| 94 |
-
|
| 95 |
-
if (!lastDate) {
|
| 96 |
-
this.progress.streak = 1;
|
| 97 |
-
return;
|
| 98 |
-
}
|
| 99 |
-
|
| 100 |
-
const daysSinceLastWorkout = this.getDaysBetween(lastDate, today);
|
| 101 |
-
|
| 102 |
-
if (daysSinceLastWorkout === 0) {
|
| 103 |
-
// Mesmo dia, manter streak
|
| 104 |
-
return;
|
| 105 |
-
} else if (daysSinceLastWorkout === 1) {
|
| 106 |
-
// Dia consecutivo, aumentar streak
|
| 107 |
-
this.progress.streak++;
|
| 108 |
-
} else {
|
| 109 |
-
// Quebrou o streak
|
| 110 |
-
this.progress.streak = 1;
|
| 111 |
-
}
|
| 112 |
-
|
| 113 |
-
// Atualizar longest streak
|
| 114 |
-
if (this.progress.streak > this.progress.longestStreak) {
|
| 115 |
-
this.progress.longestStreak = this.progress.streak;
|
| 116 |
-
}
|
| 117 |
-
}
|
| 118 |
-
|
| 119 |
-
// Calcular dias entre datas
|
| 120 |
-
getDaysBetween(date1, date2) {
|
| 121 |
-
const d1 = new Date(date1);
|
| 122 |
-
const d2 = new Date(date2);
|
| 123 |
-
const diffTime = Math.abs(d2 - d1);
|
| 124 |
-
return Math.floor(diffTime / (1000 * 60 * 60 * 24));
|
| 125 |
-
}
|
| 126 |
-
|
| 127 |
-
// Resetar estatísticas diárias
|
| 128 |
-
resetDaily() {
|
| 129 |
-
const today = new Date().toISOString().split('T')[0];
|
| 130 |
-
|
| 131 |
-
if (this.progress.lastResetDate !== today) {
|
| 132 |
-
this.progress.dailyCalories = 0;
|
| 133 |
-
this.progress.dailyMinutes = 0;
|
| 134 |
-
this.progress.dailyWorkouts = 0;
|
| 135 |
-
this.progress.waterGlasses = 0;
|
| 136 |
-
this.progress.lastResetDate = today;
|
| 137 |
-
this.saveProgress();
|
| 138 |
-
}
|
| 139 |
-
}
|
| 140 |
-
|
| 141 |
-
// Adicionar copo de água
|
| 142 |
-
addWater() {
|
| 143 |
-
if (this.progress.waterGlasses < 8) {
|
| 144 |
-
this.progress.waterGlasses++;
|
| 145 |
-
return this.saveProgress();
|
| 146 |
-
}
|
| 147 |
-
return false;
|
| 148 |
-
}
|
| 149 |
-
|
| 150 |
-
// Remover copo de água
|
| 151 |
-
removeWater() {
|
| 152 |
-
if (this.progress.waterGlasses > 0) {
|
| 153 |
-
this.progress.waterGlasses--;
|
| 154 |
-
return this.saveProgress();
|
| 155 |
-
}
|
| 156 |
-
return false;
|
| 157 |
-
}
|
| 158 |
-
|
| 159 |
-
// Obter progresso diário (0-100%)
|
| 160 |
-
getDailyProgress(targetCalories = 500) {
|
| 161 |
-
return Math.min(100, Math.round((this.progress.dailyCalories / targetCalories) * 100));
|
| 162 |
-
}
|
| 163 |
-
|
| 164 |
-
// Obter estatísticas da semana
|
| 165 |
-
getWeeklyStats() {
|
| 166 |
-
const oneWeekAgo = new Date();
|
| 167 |
-
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
|
| 168 |
-
|
| 169 |
-
const weekWorkouts = this.progress.workoutHistory.filter(w => {
|
| 170 |
-
const workoutDate = new Date(w.date);
|
| 171 |
-
return workoutDate >= oneWeekAgo;
|
| 172 |
-
});
|
| 173 |
-
|
| 174 |
-
return {
|
| 175 |
-
workouts: weekWorkouts.length,
|
| 176 |
-
calories: weekWorkouts.reduce((sum, w) => sum + (w.calories || 0), 0),
|
| 177 |
-
minutes: weekWorkouts.reduce((sum, w) => sum + (w.minutes || 0), 0)
|
| 178 |
-
};
|
| 179 |
-
}
|
| 180 |
-
|
| 181 |
-
// Obter estatísticas do mês
|
| 182 |
-
getMonthlyStats() {
|
| 183 |
-
const oneMonthAgo = new Date();
|
| 184 |
-
oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
|
| 185 |
-
|
| 186 |
-
const monthWorkouts = this.progress.workoutHistory.filter(w => {
|
| 187 |
-
const workoutDate = new Date(w.date);
|
| 188 |
-
return workoutDate >= oneMonthAgo;
|
| 189 |
-
});
|
| 190 |
-
|
| 191 |
-
return {
|
| 192 |
-
workouts: monthWorkouts.length,
|
| 193 |
-
calories: monthWorkouts.reduce((sum, w) => sum + (w.calories || 0), 0),
|
| 194 |
-
minutes: monthWorkouts.reduce((sum, w) => sum + (w.minutes || 0), 0)
|
| 195 |
-
};
|
| 196 |
-
}
|
| 197 |
-
|
| 198 |
-
// Obter categoria favorita
|
| 199 |
-
getFavoriteCategory() {
|
| 200 |
-
const categoryCounts = {};
|
| 201 |
-
|
| 202 |
-
this.progress.workoutHistory.forEach(w => {
|
| 203 |
-
const category = w.category || 'unknown';
|
| 204 |
-
categoryCounts[category] = (categoryCounts[category] || 0) + 1;
|
| 205 |
-
});
|
| 206 |
-
|
| 207 |
-
let maxCount = 0;
|
| 208 |
-
let favorite = null;
|
| 209 |
-
|
| 210 |
-
Object.entries(categoryCounts).forEach(([category, count]) => {
|
| 211 |
-
if (count > maxCount) {
|
| 212 |
-
maxCount = count;
|
| 213 |
-
favorite = category;
|
| 214 |
-
}
|
| 215 |
-
});
|
| 216 |
-
|
| 217 |
-
return favorite;
|
| 218 |
-
}
|
| 219 |
-
|
| 220 |
-
// Obter dias ativos únicos
|
| 221 |
-
getActiveDays() {
|
| 222 |
-
const uniqueDays = new Set();
|
| 223 |
-
|
| 224 |
-
this.progress.workoutHistory.forEach(w => {
|
| 225 |
-
const date = new Date(w.date).toDateString();
|
| 226 |
-
uniqueDays.add(date);
|
| 227 |
-
});
|
| 228 |
-
|
| 229 |
-
return uniqueDays.size;
|
| 230 |
-
}
|
| 231 |
-
|
| 232 |
-
// Adicionar conquista
|
| 233 |
-
addAchievement(achievementId) {
|
| 234 |
-
if (!this.progress.achievements.includes(achievementId)) {
|
| 235 |
-
this.progress.achievements.push(achievementId);
|
| 236 |
-
return this.saveProgress();
|
| 237 |
-
}
|
| 238 |
-
return false;
|
| 239 |
-
}
|
| 240 |
-
|
| 241 |
-
// Verificar se tem conquista
|
| 242 |
-
hasAchievement(achievementId) {
|
| 243 |
-
return this.progress.achievements.includes(achievementId);
|
| 244 |
-
}
|
| 245 |
-
|
| 246 |
-
// Obter todas as conquistas
|
| 247 |
-
getAchievements() {
|
| 248 |
-
return this.progress.achievements;
|
| 249 |
-
}
|
| 250 |
-
|
| 251 |
-
// Obter progresso completo
|
| 252 |
-
getProgress() {
|
| 253 |
-
return this.progress;
|
| 254 |
-
}
|
| 255 |
-
|
| 256 |
-
// Resetar progresso
|
| 257 |
-
reset() {
|
| 258 |
-
this.progress = this.getDefaultProgress();
|
| 259 |
-
return this.saveProgress();
|
| 260 |
-
}
|
| 261 |
-
|
| 262 |
-
// Exportar dados
|
| 263 |
-
export() {
|
| 264 |
-
return JSON.stringify(this.progress, null, 2);
|
| 265 |
-
}
|
| 266 |
-
|
| 267 |
-
// Importar dados
|
| 268 |
-
import(jsonData) {
|
| 269 |
-
try {
|
| 270 |
-
const data = JSON.parse(jsonData);
|
| 271 |
-
if (data.workoutHistory && Array.isArray(data.workoutHistory)) {
|
| 272 |
-
this.progress = data;
|
| 273 |
-
return this.saveProgress();
|
| 274 |
-
}
|
| 275 |
-
return false;
|
| 276 |
-
} catch (e) {
|
| 277 |
-
console.error('Error importing progress:', e);
|
| 278 |
-
return false;
|
| 279 |
-
}
|
| 280 |
-
}
|
| 281 |
-
}
|
| 282 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|