Captions: add German and Portuguese, make them findable, and fix the dead "Add mine" button

Three things.

GERMAN AND PORTUGUESE. Marty's call, and the right one: the translation cache only
shows who is already here, not who Manson is bringing. Manson knows his audience, so
Portuguese goes in even though site data ranks German above it. All five videos now
carry English, Italian, French, Spanish, German and Portuguese. Disclaimers checked by
hand in the two new languages: "Es wird kein Einkommen garantiert" and "Nenhuma renda
e garantida".

FINDABILITY. Marty went looking for the multilingual feature on his own training page
and could not find it, because the first build leaned on the native CC control and
nothing switches on for an English reader. A feature nobody can find is not shipped.
Every captioned player now carries a visible row of subtitle chips underneath, named
in their own language, with an Off option. Captions still stay off by default for an
English reader and still turn themselves on for anyone who already picked a language
with the globe button; the chips just make the choice visible instead of buried.

THE DEAD BUTTON. The inbox banner's "Add mine" shipped with NO click handler, so it
rendered and did absolutely nothing. That is why Marty could not add his address while
connected to the right wallet: nothing was listening. It now opens the same optional
profile dialog and re-renders when it completes.

Tests: gate-e2e 38 (up from 33, and rendering that button is explicitly not the test
any more, it has to actually open the dialog), captions-e2e 158 across six languages
including the new chip behaviour, clicking one and turning them back off.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-17 06:39:08 -05:00
parent 1c51599f07
commit 88a3ad1149
15 changed files with 3229 additions and 132 deletions
@@ -0,0 +1,407 @@
WEBVTT
1
00:00:01.480 --> 00:00:07.760
Wenn du das hier siehst, bist du bereits
dabei, dein Team
2
00:00:07.900 --> 00:00:11.740
im Crypto Team Build Netzwerk als Teil
unseres Team Build Projektes aufzubauen.
3
00:00:12.300 --> 00:00:16.440
Du siehst also eine Seite wie diese, aber
um deine Position zu kaufen,
4
00:00:16.460 --> 00:00:18.660
musst du sie über einen Empfehlungslink
kaufen.
5
00:00:18.860 --> 00:00:24.100
Die Strategie für mein Team – wie wir das
machen – ist, dass
6
00:00:24.160 --> 00:00:27.760
wir uns alle gegenseitig helfen, diese
Positionen aufzubauen, und gemeinsam
wachsen.
7
00:00:28.020 --> 00:00:29.020
Okay?
8
00:00:29.100 --> 00:00:31.660
Du kannst den Rest durchgehen, um zu
verstehen, wie das funktioniert und welche
Strategie
9
00:00:31.720 --> 00:00:37.480
dahintersteckt, aber jetzt schauen wir,
wer die nächste Person in unserer
Platzierung ist – und
10
00:00:37.900 --> 00:00:38.900
das ist Michael.
11
00:00:39.040 --> 00:00:39.880
Okay?
12
00:00:39.920 --> 00:00:44.820
Also, Michael hat bereits eine seiner
Positionen, und wir werden
13
00:00:44.840 --> 00:00:47.660
ihm helfen, sich zu qualifizieren.
14
00:00:48.480 --> 00:00:53.820
Sobald wir auf „Join with Current Sponsor“
klicken, werden wir zu
15
00:00:53.880 --> 00:00:55.180
seinem Link weitergeleitet.
16
00:00:55.500 --> 00:00:56.740
Seine ID ist darin enthalten.
17
00:00:56.780 --> 00:00:58.600
Das Gleiche machen wir für alle, okay?
18
00:00:59.260 --> 00:01:04.780
Wenn wir hier rübergehen, sieht die
Smart-Contract-Seite so
19
00:01:05.780 --> 00:01:08.500
aus, um mit dem RM Circle zu starten.
20
00:01:08.640 --> 00:01:11.820
Beachte, dass Michaels ID, Nummer 35, als
Sponsor eingetragen ist.
21
00:01:12.920 --> 00:01:14.600
Wir arbeiten nur mit Premium.
22
00:01:14.760 --> 00:01:18.100
Es ist sinnvoller, das zu tun, statt dem
Standard, weil...
23
00:01:18.140 --> 00:01:22.020
Du kannst dir die Unterschiede ansehen,
aber wir arbeiten nicht aktiv mit dem
Standard, weil
24
00:01:22.080 --> 00:01:25.800
du im Grunde nur die Hälfte von dem
verdienst, was du hier verdienen würdest.
25
00:01:25.900 --> 00:01:28.020
Also konzentrieren wir uns nur auf
Premium.
26
00:01:28.700 --> 00:01:34.400
Es sagt uns, dass wir 361 Polygon aus
unserer MetaMask Wallet
27
00:01:34.440 --> 00:01:35.380
senden müssen.
28
00:01:35.420 --> 00:01:38.740
Als Erstes müssen wir unsere MetaMask
Wallet verbinden, also klicken
29
00:01:38.760 --> 00:01:39.760
wir auf „Connect“.
30
00:01:41.240 --> 00:01:42.240
Wir wählen MetaMask.
31
00:01:44.220 --> 00:01:49.000
Es öffnet unsere Wallet-Erweiterung und
fordert uns auf, uns mit dem RM Circle von
32
00:01:49.100 --> 00:01:52.320
unserer MetaMask Wallet aus zu verbinden.
Also klicken wir auf „Connect“.
33
00:01:54.960 --> 00:01:56.260
Jetzt ist unser Wallet verbunden.
34
00:01:57.220 --> 00:02:01.320
Jetzt – beachte, es wird uns sagen, dass
wir zum Polygon-Mainnet
35
00:02:01.360 --> 00:02:05.400
wechseln müssen, weil Polygon
standardmäßig auf der Ethereum-Blockchain
oder dem Ethereum-Netzwerk
36
00:02:05.460 --> 00:02:06.160
läuft.
37
00:02:06.200 --> 00:02:10.460
Wir wechseln zum Polygon-Netzwerk,
hauptsächlich weil die Gebühren viel
günstiger
38
00:02:10.539 --> 00:02:11.539
sind.
39
00:02:11.940 --> 00:02:16.480
Was wir jetzt vielleicht tun müssen, ist
manuell unser Netzwerk im MetaMask-Wallet
40
00:02:16.560 --> 00:02:18.400
zu ändern – das machen wir einfach ganz
schnell.
41
00:02:18.460 --> 00:02:19.460
Warte kurz.
42
00:02:21.300 --> 00:02:22.540
Öffnen wir die Erweiterung.
43
00:02:27.800 --> 00:02:31.260
Jetzt gehen wir unser Wallet oder unser
Netzwerk auswählen.
44
00:02:33.060 --> 00:02:35.720
Im Moment verwenden wir Ethereum.
45
00:02:35.800 --> 00:02:39.760
Wir wollen unser Polygon finden.
46
00:02:44.220 --> 00:02:45.220
Warte eine Minute.
47
00:02:47.100 --> 00:02:48.100
Alle Netzwerke.
48
00:02:50.940 --> 00:02:51.980
Wir wechseln zu Polygon.
49
00:02:52.100 --> 00:02:54.560
Wir sind jetzt im Polygon-Netzwerk, genau
hier.
50
00:02:54.740 --> 00:02:56.280
Du wirst sehen, es wird genau hier
angezeigt.
51
00:02:56.840 --> 00:02:59.960
Da wir jetzt gewechselt haben,
aktualisiere ich einfach diese Seite.
52
00:03:01.360 --> 00:03:06.000
Wir verbinden unser Wallet erneut, und
diesmal wird es uns sagen, dass wir
bereits
53
00:03:06.020 --> 00:03:09.000
mit dem richtigen Netzwerk verbunden sind,
oder es wird uns gar nichts sagen.
54
00:03:09.060 --> 00:03:10.060
Also, Wallet ist verbunden.
55
00:03:10.420 --> 00:03:12.480
Wir senden 361 Polygon.
56
00:03:12.860 --> 00:03:14.540
Wir unterschreiben unseren Vertrag.
57
00:03:15.260 --> 00:03:18.840
Der Smart Contract ist eine verbindliche,
unveränderliche Sache auf der Blockchain.
58
00:03:18.880 --> 00:03:19.700
Das wird sich nie ändern.
59
00:03:19.740 --> 00:03:24.260
Beachte also, dass da steht: „Hey, wir
schicken dir dieses Polygon
60
00:03:24.300 --> 00:03:25.160
im Polygon-Netzwerk."
61
00:03:25.200 --> 00:03:28.200
Wir signieren es mit dieser
Vertragsadresse hier.
62
00:03:30.000 --> 00:03:31.000
Klicke auf „Bestätigen".
63
00:03:33.300 --> 00:03:34.300
Transaktion eingereicht.
64
00:03:34.300 --> 00:03:35.760
Wir warten nur ein paar Sekunden.
65
00:03:38.560 --> 00:03:40.760
Und schwupps – schon haben wir unsere
Referral-ID.
66
00:03:41.000 --> 00:03:43.000
Wir sind jetzt Teil des RM Circle.
67
00:03:43.060 --> 00:03:44.060
So einfach ist das.
68
00:03:44.720 --> 00:03:49.480
Jetzt kannst du dir den Rest der Strategie
ansehen, um zu erfahren, was wir als
Nächstes vorhaben –
69
00:03:49.540 --> 00:03:51.020
aber das war's für dieses Video.
70
00:03:51.080 --> 00:03:55.480
Wir haben jetzt unsere Position. Wir haben
also unser Polygon ausgegeben, um unsere
Position
71
00:03:55.540 --> 00:04:01.020
zu kaufen, und jetzt müssen wir uns darauf
konzentrieren, anderen zu helfen, ihre
nächsten
72
00:04:01.060 --> 00:04:05.400
zwei Positionen zu bekommen, damit sie
qualifiziert sind. Und wenn du an der
Reihe bist, machen
73
00:04:05.440 --> 00:04:05.920
wir dasselbe
74
00:04:05.960 --> 00:04:06.660
mit dir.
75
00:04:06.700 --> 00:04:10.760
Wenn du schon ein paar Leute kennst, die
einsteigen können, ist das auch okay – das
können
76
00:04:10.800 --> 00:04:14.260
wir auch machen – aber merke dir hier
deine ID.
77
00:04:14.800 --> 00:04:16.300
Du kannst dir auch dein Profil ansehen.
78
00:04:17.920 --> 00:04:19.820
Hier kannst du deinen Referral-Link
kopieren.
79
00:04:19.980 --> 00:04:22.840
Du kannst hier alle möglichen anderen
Informationen einsehen, wenn nötig, und
bei allen,
80
00:04:22.900 --> 00:04:28.120
die du geworben hast, siehst du, ob du
Empfehlungen hast und wie viel du
81
00:04:28.180 --> 00:04:29.060
verdient hast.
82
00:04:29.100 --> 00:04:30.000
Die Zahlungen erfolgen direkt.
83
00:04:30.040 --> 00:04:31.160
Sie kommen sofort bei dir an.
84
00:04:31.380 --> 00:04:35.440
Es ist automatisch und – und es ist
ziemlich cool.
85
00:04:35.780 --> 00:04:36.240
Okay?
86
00:04:36.280 --> 00:04:37.460
Das war's für dieses Video.
87
00:04:37.520 --> 00:04:38.520
Wir sehen uns im nächsten Video.
@@ -0,0 +1,397 @@
WEBVTT
1
00:00:01.480 --> 00:00:07.760
Então, se você está vendo isso, já está
pensando em montar sua
2
00:00:07.900 --> 00:00:11.740
equipe dentro da rede Crypto Team Build
como parte do nosso projeto Team Build
aqui.
3
00:00:12.300 --> 00:00:16.440
Então você está vendo uma página como
esta, mas para comprar sua posição,
4
00:00:16.460 --> 00:00:18.660
você terá que usar um link de referência.
5
00:00:18.860 --> 00:00:24.100
Agora, a estratégia para a minha equipe, a
forma como fazemos isso, é que todos
6
00:00:24.160 --> 00:00:27.760
nós ajudamos uns aos outros coletivamente
a construir essas posições, e crescemos
juntos.
7
00:00:28.020 --> 00:00:29.020
Ok?
8
00:00:29.100 --> 00:00:31.660
Você pode dar uma olhada no restante para
entender como funciona e a
9
00:00:31.720 --> 00:00:37.480
estratégia, mas agora vamos ver quem é a
próxima pessoa na nossa colocação, e
10
00:00:37.900 --> 00:00:38.900
é o Michael.
11
00:00:39.040 --> 00:00:39.880
Ok?
12
00:00:39.920 --> 00:00:44.820
Então o que vamos fazer, o Michael já tem
uma de suas posições, e o
13
00:00:44.840 --> 00:00:47.660
que vamos fazer é ajudá-lo a se
qualificar.
14
00:00:48.480 --> 00:00:53.820
Então o que vai acontecer é que assim que
dissermos "Entrar com Patrocinador Atual",
vamos
15
00:00:53.880 --> 00:00:55.180
ser levados ao link dele.
16
00:00:55.500 --> 00:00:56.740
Ele contém o ID dele.
17
00:00:56.780 --> 00:00:58.600
Vamos fazer o mesmo para todo mundo, ok?
18
00:00:59.260 --> 00:01:04.780
Então, quando vamos para cá, é assim que a
página do
19
00:01:05.780 --> 00:01:08.500
smart contract se parece para começar com
o RM Circle.
20
00:01:08.640 --> 00:01:11.820
Observe que tem o ID do Michael, número
trinta e cinco, como patrocinador.
21
00:01:12.920 --> 00:01:14.600
Estamos trabalhando apenas com o premium.
22
00:01:14.760 --> 00:01:18.100
Só faz sentido fazer isso em vez do
standard porque o...
23
00:01:18.140 --> 00:01:22.020
Você pode dar uma olhada nas diferenças,
mas não estamos trabalhando ativamente com
24
00:01:22.080 --> 00:01:25.800
o standard porque é basicamente você
ganhar metade do que ganharia aqui.
25
00:01:25.900 --> 00:01:28.020
Então estamos focando apenas no premium.
26
00:01:28.700 --> 00:01:34.400
Está nos dizendo que precisamos enviar
trezentos e sessenta e um Polygon da
27
00:01:34.440 --> 00:01:35.380
nossa carteira MetaMask.
28
00:01:35.420 --> 00:01:38.740
Agora, a primeira coisa que precisamos
fazer é conectar nossa carteira MetaMask,
então vamos
29
00:01:38.760 --> 00:01:39.760
clicar em Conectar.
30
00:01:41.240 --> 00:01:42.240
Vamos escolher MetaMask.
31
00:01:44.220 --> 00:01:49.000
Vai abrir a extensão da nossa carteira e
vai pedir para conectar ao RM Circle
32
00:01:49.100 --> 00:01:52.320
a partir da nossa carteira MetaMask, então
vamos clicar em Conectar.
33
00:01:54.960 --> 00:01:56.260
Agora nossa carteira está conectada.
34
00:01:57.220 --> 00:02:01.320
Agora, ele-- note que ele vai nos dizer
que precisamos trocar para a mainnet
35
00:02:01.360 --> 00:02:05.400
da Polygon, porque por padrão a Polygon
roda na blockchain Ethereum ou na rede
36
00:02:05.460 --> 00:02:06.160
Ethereum.
37
00:02:06.200 --> 00:02:10.460
Vamos trocar para a rede Polygon,
principalmente porque as taxas são muito
mais
38
00:02:10.539 --> 00:02:11.539
baratas.
39
00:02:11.940 --> 00:02:16.480
Agora, o que podemos ter que fazer é mudar
manualmente nossa rede na
40
00:02:16.560 --> 00:02:18.400
carteira MetaMask, o que nós vamos-- vamos
fazer isso rapidinho.
41
00:02:18.460 --> 00:02:19.460
Só um segundo.
42
00:02:21.300 --> 00:02:22.540
Vamos abrir a extensão.
43
00:02:27.800 --> 00:02:31.260
Agora vamos escolher nossa carteira ou
nossa rede.
44
00:02:33.060 --> 00:02:35.720
No momento estamos usando Ethereum.
45
00:02:35.800 --> 00:02:39.760
Queremos encontrar nossa Polygon.
46
00:02:44.220 --> 00:02:45.220
Espere um minuto.
47
00:02:47.100 --> 00:02:48.100
Todas as redes.
48
00:02:50.940 --> 00:02:51.980
Estamos trocando para Polygon.
49
00:02:52.100 --> 00:02:54.560
Agora estamos na rede que é Polygon aqui.
50
00:02:54.740 --> 00:02:56.280
Você vai ver isso indicado bem aqui.
51
00:02:56.840 --> 00:02:59.960
Então agora que trocamos, vou apenas
atualizar esta página.
52
00:03:01.360 --> 00:03:06.000
Vamos conectar nossa carteira novamente, e
desta vez ela vai nos dizer que
53
00:03:06.020 --> 00:03:09.000
já estamos conectados à rede correta, ou
não vai nos dizer nada.
54
00:03:09.060 --> 00:03:10.060
Então a carteira está conectada.
55
00:03:10.420 --> 00:03:12.480
Vamos enviar trezentos e sessenta e um
Polygon.
56
00:03:12.860 --> 00:03:14.540
Vamos assinar nosso contrato.
57
00:03:15.260 --> 00:03:18.840
O contrato inteligente é algo vinculante e
imutável na blockchain.
58
00:03:18.880 --> 00:03:19.700
Isso nunca vai mudar.
59
00:03:19.740 --> 00:03:24.260
Então repare que diz: 'Ei, vamos, vamos
enviar este polygon na
60
00:03:24.300 --> 00:03:25.160
rede Polygon.'
61
00:03:25.200 --> 00:03:28.200
Vamos assinar com este endereço de
contrato bem aqui.
62
00:03:30.000 --> 00:03:31.000
Clique em Confirmar.
63
00:03:33.300 --> 00:03:34.300
Transação enviada.
64
00:03:34.300 --> 00:03:35.760
Vamos esperar apenas alguns segundos.
65
00:03:38.560 --> 00:03:40.760
E pronto, agora temos nosso ID de
referência.
66
00:03:41.000 --> 00:03:43.000
Fazemos parte do RM Circle.
67
00:03:43.060 --> 00:03:44.060
É simples assim.
68
00:03:44.720 --> 00:03:49.480
Agora, você pode ver o resto da estratégia
para saber o que vamos fazer a seguir, mas
69
00:03:49.540 --> 00:03:51.020
é só isso neste vídeo.
70
00:03:51.080 --> 00:03:55.480
Agora temos nossa posição, então acabamos
de gastar nosso polygon para comprar nossa
71
00:03:55.540 --> 00:04:01.020
posição, e agora precisamos focar em
ajudar as pessoas a conseguir suas
72
00:04:01.060 --> 00:04:05.400
próximas duas posições para que se
qualifiquem, e então, quando for sua vez,
faremos
73
00:04:05.440 --> 00:04:05.920
a mesma coisa
74
00:04:05.960 --> 00:04:06.660
com você.
75
00:04:06.700 --> 00:04:10.760
Se você já conhece algumas pessoas que,
que podem começar, tudo bem, podemos fazer
76
00:04:10.800 --> 00:04:14.260
isso também, mas anote seu ID bem aqui.
77
00:04:14.800 --> 00:04:16.300
Você também pode ver seu perfil.
78
00:04:17.920 --> 00:04:19.820
Você pode copiar seu link de referência
aqui.
79
00:04:19.980 --> 00:04:22.840
Você pode, você pode ver todos os tipos de
outras informações aqui se precisar,
80
00:04:22.900 --> 00:04:28.120
e qualquer pessoa que você indicou, você
veria se tem algum referido aqui e
81
00:04:28.180 --> 00:04:29.060
quanto ganhou.
82
00:04:29.100 --> 00:04:30.000
Os pagamentos são diretos.
83
00:04:30.040 --> 00:04:31.160
Eles chegam até você imediatamente.
84
00:04:31.380 --> 00:04:35.440
É automático e, e é, é bem legal.
85
00:04:35.780 --> 00:04:36.240
Ok?
86
00:04:36.280 --> 00:04:37.460
Então é isso para este vídeo.
87
00:04:37.520 --> 00:04:38.520
Vejo você no próximo.
@@ -0,0 +1,356 @@
WEBVTT
1
00:00:02.040 --> 00:00:02.440
Okay.
2
00:00:02.340 --> 00:00:07.160
In diesem Video zeige ich dir eine
Verbesserung für unseren Teambuild für RM
3
00:00:07.260 --> 00:00:08.260
Circle.
4
00:00:09.460 --> 00:00:15.880
Geschaffen wurde die Möglichkeit, den
Onboarding-Prozess für neue Mitglieder zu
5
00:00:15.920 --> 00:00:16.920
optimieren.
6
00:00:17.100 --> 00:00:22.460
Wenn du das gerade siehst und beitreten
möchtest, gibt es eine offizielle RM
Circle-Seite,
7
00:00:22.560 --> 00:00:26.440
der du beitreten kannst – so wie alle
anderen auch.
8
00:00:26.900 --> 00:00:33.100
Aber speziell für unseren Teambuild
verwenden wir einen optimierten
Onboarding-Prozess,
9
00:00:33.140 --> 00:00:37.400
der dir und deinen Empfehlungen hilft.
10
00:00:37.940 --> 00:00:41.280
Er funktioniert weiterhin mit demselben
Smart Contract, du durchläufst also alles,
was
11
00:00:41.340 --> 00:00:46.140
du auch über die Unternehmensseite machen
würdest, aber wir halten es so
12
00:00:46.160 --> 00:00:52.960
vereinfacht, dass du für den Teambuild auf
unserer Website bleibst und
13
00:00:53.000 --> 00:00:56.740
du im Handumdrehen loslegen und es für
deine Mitglieder leichter reproduzierbar
machen
14
00:00:56.780 --> 00:00:57.780
kannst.
15
00:00:57.840 --> 00:01:02.480
Sobald du auf deiner My-Referral-Seite
bist, gilt das für ID 40.
16
00:01:03.060 --> 00:01:06.320
40 ist zum Zeitpunkt dieses Videos die
Nächste, die wir qualifizieren wollen.
17
00:01:06.460 --> 00:01:09.760
Also braucht 40 noch eine Person, um sich
zu qualifizieren.
18
00:01:10.700 --> 00:01:12.580
Also klicken wir auf „Join The Team“.
19
00:01:14.880 --> 00:01:18.980
Jetzt wirst du aufgefordert, deine Wallet
zu verbinden, und wir klicken
20
00:01:19.400 --> 00:01:20.840
auf den Button „Connect Wallet“.
21
00:01:21.060 --> 00:01:24.340
Ich bin gerade im Brave-Browser, aber das
funktioniert bei den anderen
22
00:01:24.400 --> 00:01:25.400
genauso.
23
00:01:25.960 --> 00:01:30.320
Sobald ich das tue, werde ich
aufgefordert, die Wallet auszuwählen, mit
der ich arbeiten möchte.
24
00:01:30.480 --> 00:01:31.920
Du hast vielleicht nur eine Wallet.
25
00:01:31.980 --> 00:01:33.680
Du hast vielleicht gerade eine Wallet
erstellt.
26
00:01:34.540 --> 00:01:38.160
Äh, es könnte MetaMask sein, TrustWallet,
SafePal, weißt du, in diesem
27
00:01:38.200 --> 00:01:41.940
Fall ist es der Brave-Browser, also hat er
auch eine integrierte Wallet.
28
00:01:42.460 --> 00:01:45.180
Aber für diese Demo verwenden wir SafePal.
29
00:01:46.280 --> 00:01:50.260
Sobald ich darauf klicke, wirst du sehen,
dass ich aufgefordert werde, mich mit
meiner
30
00:01:50.300 --> 00:01:51.300
SafePal-Wallet zu verbinden.
31
00:01:52.460 --> 00:01:53.700
Ich klicke jetzt auf „Connect“.
32
00:01:56.040 --> 00:02:00.620
Mein Wallet ist jetzt verbunden, und Sie
können in der Aktivität hier unten sehen,
dass wir
33
00:02:00.660 --> 00:02:01.080
verbunden sind.
34
00:02:01.120 --> 00:02:06.640
Und als Nächstes werden wir aufgefordert,
dem Team beizutreten und die 360 Polygon
35
00:02:06.800 --> 00:02:08.699
zu bezahlen.
36
00:02:09.060 --> 00:02:13.340
Weißt du, das, das kann je nach Gebühr zum
Zeitpunkt etwas variieren, aber
37
00:02:13.440 --> 00:02:15.280
wir werden trotzdem auf Join Team klicken.
38
00:02:15.940 --> 00:02:18.100
Wir machen das auf dem Polygon-Mainnet.
39
00:02:19.120 --> 00:02:21.580
Ich habe dieses Wallet aufgeladen, um
diesem Mitglied zu helfen.
40
00:02:21.640 --> 00:02:24.480
Ich habe dieses Wallet mit 370 Polygon
aufgeladen.
41
00:02:24.520 --> 00:02:31.340
Es wird uns 360.58 kosten, um unsere
Smart-Contract-Position zu kaufen.
42
00:02:32.080 --> 00:02:36.480
Sobald wir auf Join The Team klicken, wird
das Wallet wieder erscheinen und uns
43
00:02:36.500 --> 00:02:39.260
auffordern, den Smart Contract zu
signieren.
44
00:02:39.960 --> 00:02:43.960
Jetzt, ich sage Ihnen, wann immer ich eine
Option für Gebühren sehe, wähle
45
00:02:44.000 --> 00:02:49.300
ich High, damit ich es schnell machen
kann, ähm, einfach um es zu erledigen.
46
00:02:49.900 --> 00:02:51.680
Aber wir werden trotzdem auf Continue
klicken.
47
00:02:53.820 --> 00:02:58.600
Es hat die Transaktion auf dem Smart
Contract für RM Circle übermittelt, und
48
00:02:59.520 --> 00:03:01.820
schon haben Sie Ihre Position und Ihre
ID-Nummer.
49
00:03:02.040 --> 00:03:02.520
Okay?
50
00:03:02.560 --> 00:03:06.920
Und Sie werden automatisch zu Ihrer
ID-Nummer weitergeleitet, die genau hier
ist.
51
00:03:08.300 --> 00:03:12.480
Und Sie können auf Ihr Positions-Dashboard
klicken und genau sehen, wo
52
00:03:12.520 --> 00:03:13.060
Sie stehen.
53
00:03:13.100 --> 00:03:13.500
Okay?
54
00:03:13.440 --> 00:03:18.020
Sie sind jetzt also in der Premium-Stufe,
dem Centillo-Level, der allerersten
55
00:03:18.100 --> 00:03:18.500
Stufe.
56
00:03:18.400 --> 00:03:22.040
Sie sind noch nicht qualifiziert, also
haben Sie null von zwei Positionen.
57
00:03:22.520 --> 00:03:25.760
Sie haben einen vollständigen Plan davon,
was hier passiert.
58
00:03:25.880 --> 00:03:28.920
Sie werden Ihr Team sehen, sobald dies
geladen ist.
59
00:03:28.960 --> 00:03:32.320
Es kann ein paar Minuten dauern, um alles
zu aktualisieren, aber alles
60
00:03:32.360 --> 00:03:32.920
ist bereit.
61
00:03:32.960 --> 00:03:33.960
Du kannst loslegen.
62
00:03:34.280 --> 00:03:36.120
Also, ich werde jetzt meine Daten
einreichen.
63
00:03:36.160 --> 00:03:39.200
Das ist der nächste Schritt, den du machen
musst, nachdem du deine Position erhalten
hast.
64
00:03:39.800 --> 00:03:45.680
Also, ich werde Position 123 einreichen,
65
00:03:48.380 --> 00:03:50.660
und zwar für den Benutzer Joseph.
66
00:03:51.600 --> 00:03:52.500
Okay?
67
00:03:52.540 --> 00:03:54.480
Also klicken wir auf „Meine ID
einreichen“.
68
00:03:55.080 --> 00:03:59.200
Du bist jetzt in der Rotation, damit dir
auch andere helfen können, und wir haben
jetzt ID Nummer
69
00:03:59.240 --> 00:04:01.300
40 geholfen, qualifiziert zu werden.
70
00:04:01.360 --> 00:04:07.820
Also kann ID 40, also Jason, jetzt
anfangen, Geld zu verdienen und sein Team
aufzubauen.
71
00:04:07.900 --> 00:04:11.500
So machen wir das gemeinsam in unserem
Teamaufbau.
72
00:04:12.380 --> 00:04:16.279
Ein sehr einfacher Prozess, um dich in nur
wenigen Minuten startklar zu machen.
73
00:04:16.940 --> 00:04:20.420
Und ich würde sagen, wende dich an deinen
Sponsor, wenn du Fragen hast, oder
74
00:04:20.480 --> 00:04:22.980
treff uns in der Telegram-Gruppe, und wir
helfen dir gerne weiter.
@@ -0,0 +1,347 @@
WEBVTT
1
00:00:02.040 --> 00:00:02.440
Tudo bem.
2
00:00:02.340 --> 00:00:07.160
Neste vídeo, vou mostrar uma melhoria para
a nossa equipe da RM
3
00:00:07.260 --> 00:00:08.260
Circle.
4
00:00:09.460 --> 00:00:15.880
O que foi criado é a capacidade de
simplificar o processo de integração de um
5
00:00:15.920 --> 00:00:16.920
novo membro.
6
00:00:17.100 --> 00:00:22.460
Então, se você está vendo isso agora e
quer entrar, existe uma página oficial
7
00:00:22.560 --> 00:00:26.440
da RM Circle para se inscrever, que todo
mundo recebe.
8
00:00:26.900 --> 00:00:33.100
Mas, especificamente para a nossa equipe,
usamos um processo de integração otimizado
e simplificado para
9
00:00:33.140 --> 00:00:37.400
ajudar você e seus indicados ao longo do
caminho.
10
00:00:37.940 --> 00:00:41.280
Ele continua funcionando com o mesmo smart
contract, então você passa por tudo
11
00:00:41.340 --> 00:00:46.140
o que passaria pela página da empresa, mas
estamos tentando manter as coisas
12
00:00:46.160 --> 00:00:52.960
simples para que você fique no nosso site
para a equipe e
13
00:00:53.000 --> 00:00:56.740
possa começar rapidinho e tornar o
processo mais replicável para seus
14
00:00:56.780 --> 00:00:57.780
membros.
15
00:00:57.840 --> 00:01:02.480
Então, quando você está aqui na página
Meus Indicados, esse é o ID 40.
16
00:01:03.060 --> 00:01:06.320
O 40 é o próximo, no momento deste vídeo,
que estamos tentando qualificar.
17
00:01:06.460 --> 00:01:09.760
Então o 40 precisa de mais uma pessoa para
se qualificar.
18
00:01:10.700 --> 00:01:12.580
Vamos clicar em Entrar na Equipe.
19
00:01:14.880 --> 00:01:18.980
Agora você será solicitado a conectar sua
carteira, e vamos
20
00:01:19.400 --> 00:01:20.840
clicar no botão Conectar Carteira.
21
00:01:21.060 --> 00:01:24.340
Estou no navegador Brave agora, mas vai
funcionar igual nos outros
22
00:01:24.400 --> 00:01:25.400
também.
23
00:01:25.960 --> 00:01:30.320
Assim que eu fizer isso, vai pedir para
escolher qual carteira quero usar.
24
00:01:30.480 --> 00:01:31.920
Você pode ter apenas uma carteira.
25
00:01:31.980 --> 00:01:33.680
Você pode ter acabado de criar uma
carteira.
26
00:01:34.540 --> 00:01:38.160
Pode ser MetaMask, TrustWallet, SafePal,
sabe, neste caso é
27
00:01:38.200 --> 00:01:41.940
o navegador Brave, que também tem uma
carteira integrada.
28
00:01:42.460 --> 00:01:45.180
Mas vamos usar a SafePal para esta
demonstração.
29
00:01:46.280 --> 00:01:50.260
Assim que eu clicar, repare que vai pedir
para conectar usando minha
30
00:01:50.300 --> 00:01:51.300
carteira SafePal.
31
00:01:52.460 --> 00:01:53.700
Vou clicar em Conectar.
32
00:01:56.040 --> 00:02:00.620
Agora minha carteira está conectada, e
você pode ver na atividade aqui embaixo
que
33
00:02:00.660 --> 00:02:01.080
estamos conectados.
34
00:02:01.120 --> 00:02:06.640
E a próxima coisa que vai nos pedir para
fazer é entrar no time e pagar
35
00:02:06.800 --> 00:02:08.699
os 360 Polygon.
36
00:02:09.060 --> 00:02:13.340
Sabe, isso pode variar um pouco dependendo
da taxa no momento, mas vamos
37
00:02:13.440 --> 00:02:15.280
em frente e clicar em Join Team.
38
00:02:15.940 --> 00:02:18.100
Estamos fazendo isso na mainnet da
Polygon.
39
00:02:19.120 --> 00:02:21.580
Eu fundei esta carteira para ajudar este
membro.
40
00:02:21.640 --> 00:02:24.480
Eu fundei esta carteira com 370 Polygon.
41
00:02:24.520 --> 00:02:31.340
Vai nos custar 360.58 para comprar nossa
posição no smart contract.
42
00:02:32.080 --> 00:02:36.480
Então, assim que clicarmos em Join The
Team, vai abrir a carteira novamente e vai
43
00:02:36.500 --> 00:02:39.260
nos pedir para assinar o smart contract.
44
00:02:39.960 --> 00:02:43.960
Agora, vou te dizer, sempre que vejo uma
opção de
45
00:02:44.000 --> 00:02:49.300
taxas, escolho High para fazer rapidinho,
só para terminar logo.
46
00:02:49.900 --> 00:02:51.680
Mas vamos em frente e clicar em Continue.
47
00:02:53.820 --> 00:02:58.600
Submetemos a transação no smart contract
da RM Circle, e pronto, agora você
48
00:02:59.520 --> 00:03:01.820
tem sua posição e seu número de ID.
49
00:03:02.040 --> 00:03:02.520
Ok?
50
00:03:02.560 --> 00:03:06.920
E você é automaticamente levado ao seu
número de ID, que está bem aqui.
51
00:03:08.300 --> 00:03:12.480
E você pode clicar no dashboard de
Positions, e ver exatamente onde
52
00:03:12.520 --> 00:03:13.060
você está.
53
00:03:13.100 --> 00:03:13.500
Ok?
54
00:03:13.440 --> 00:03:18.020
Então você está agora no nível premium, o
nível Centillo, que é o primeiro
55
00:03:18.100 --> 00:03:18.500
nível.
56
00:03:18.400 --> 00:03:22.040
Você ainda não está qualificado, então tem
zero de duas posições.
57
00:03:22.520 --> 00:03:25.760
Você tem um plano completo do que está
acontecendo aqui.
58
00:03:25.880 --> 00:03:28.920
Então você verá seu time assim que isso
carregar.
59
00:03:28.960 --> 00:03:32.320
Pode levar alguns minutos para atualizar
tudo, mas está tudo pronto
60
00:03:32.360 --> 00:03:32.920
para começar.
61
00:03:32.960 --> 00:03:33.960
Você está pronto para seguir em frente.
62
00:03:34.280 --> 00:03:36.120
Então vou enviar minhas informações.
63
00:03:36.160 --> 00:03:39.200
Esta é a próxima coisa que você precisa
fazer depois de conseguir sua posição.
64
00:03:39.800 --> 00:03:45.680
Então vou enviar a posição 123, e
65
00:03:48.380 --> 00:03:50.660
isso será para o usuário Joseph.
66
00:03:51.600 --> 00:03:52.500
Ok?
67
00:03:52.540 --> 00:03:54.480
Então vamos clicar em Enviar Meu ID.
68
00:03:55.080 --> 00:03:59.200
Você agora está na rotação para que outros
também possam ajudá-lo, e acabamos de
ajudar o ID
69
00:03:59.240 --> 00:04:01.300
número 40 a se qualificar.
70
00:04:01.360 --> 00:04:07.820
Então agora o ID 40, que é o Jason, ele
pode começar a ganhar e montar sua equipe.
71
00:04:07.900 --> 00:04:11.500
Então é assim que estamos fazendo
coletivamente dentro da nossa construção
de equipe.
72
00:04:12.380 --> 00:04:16.279
Processo muito simples para deixá-lo
pronto e funcionando em apenas alguns
minutos.
73
00:04:16.940 --> 00:04:20.420
E eu diria para entrar em contato com seu
patrocinador se tiver alguma dúvida, ou
74
00:04:20.480 --> 00:04:22.980
nos encontrar no grupo do Telegram, e
ficaremos felizes em tentar ajudá-lo.
@@ -0,0 +1,138 @@
WEBVTT
1
00:00:00.920 --> 00:00:05.180
Hier ist die Frage, die sich jeder
Aufbauer früher oder später stellt: Müssen
Zahlungen von meinem
2
00:00:05.220 --> 00:00:06.760
Team warten, bis ich die Stufe gekauft
habe?
3
00:00:07.300 --> 00:00:08.680
Kurze Antwort: Nein.
4
00:00:09.220 --> 00:00:10.420
Lange Antwort: besser.
5
00:00:11.620 --> 00:00:15.440
An dem Tag, an dem du qualifiziert bist,
deine beiden persönlichen Leute – das ist
der ganze Test
6
00:00:16.180 --> 00:00:17.180
– kannst du bereits einfangen.
7
00:00:18.240 --> 00:00:22.240
Wenn die beiden Positionen unter dir ihr
erstes Upgrade kaufen, landen diese
Zahlungen bei dir.
8
00:00:22.880 --> 00:00:26.940
Im Grunde besitzt du diese Stufe noch
nicht, und der Vertrag kümmert sich nicht
darum.
9
00:00:27.320 --> 00:00:31.260
Er prüft nur die Stufe, von der sie
springen, und alle fangen dort an.
10
00:00:32.320 --> 00:00:35.340
Aber hier ist die Regel, die ändern
sollte, wie du aufbaust.
11
00:00:36.160 --> 00:00:40.180
Jede Stufe, die du besitzt, verlängert
deine Reichweite genau eine Generation
tiefer.
12
00:00:40.800 --> 00:00:43.340
Um aus zwei Schichten Tiefe zu fangen,
brauchst du Stufe zwei.
13
00:00:43.940 --> 00:00:45.620
Drei Schichten tief, Stufe drei.
14
00:00:46.500 --> 00:00:50.000
Deine Stufe ist kein Abzeichen auf deinem
Dashboard, sie ist die Länge deines Arms.
15
00:00:51.000 --> 00:00:52.960
Und Zahlungen warten auf niemanden.
16
00:00:53.800 --> 00:00:59.100
Wenn jemand tief in deiner Matrix
aufsteigt, klettert diese Zahlung, bis sie
die erste Person findet,
17
00:00:59.160 --> 00:01:03.120
die qualifiziert und hoch genug gestuft
ist, um sie zu fangen.
18
00:01:04.080 --> 00:01:07.880
Wenn das nicht du bist, geht sie über dich
hinweg zu jemandem darüber.
19
00:01:08.460 --> 00:01:09.460
Weg.
20
00:01:09.940 --> 00:01:10.940
Also ist das Spiel einfach.
21
00:01:11.300 --> 00:01:16.480
Bleib eine Stufe vor deiner tiefsten
aktiven Schicht und lass die Struktur
dafür
22
00:01:16.500 --> 00:01:17.200
bezahlen.
23
00:01:17.240 --> 00:01:20.760
Dein allererster Fang auf jeder Stufe ist
der genaue Preis für deinen nächsten
Aufstieg.
24
00:01:21.440 --> 00:01:23.520
Bis auf den Cent genau, das ist kein
Glück.
25
00:01:24.320 --> 00:01:25.320
Das ist das Design.
26
00:01:26.260 --> 00:01:27.300
Dein Level ist deine Reichweite.
27
00:01:27.600 --> 00:01:28.480
Baue das Team auf.
28
00:01:28.520 --> 00:01:31.900
Halte deinen Arm lang und lehre deine
zwei, genau dasselbe zu tun.
@@ -0,0 +1,134 @@
WEBVTT
1
00:00:00.920 --> 00:00:05.180
Aqui está a pergunta que todo construtor
faz mais cedo ou mais tarde: Os pagamentos
da minha
2
00:00:05.220 --> 00:00:06.760
equipe precisam esperar até que eu compre
o nível?
3
00:00:07.300 --> 00:00:08.680
A resposta curta é: não.
4
00:00:09.220 --> 00:00:10.420
Resposta longa, melhor.
5
00:00:11.620 --> 00:00:15.440
No dia em que você se qualifica, suas duas
pessoas pessoais — esse é o teste completo
6
00:00:16.180 --> 00:00:17.180
— você já consegue capturar.
7
00:00:18.240 --> 00:00:22.240
Quando as duas posições abaixo de você
comprarem a primeira atualização, esses
pagamentos caem em você.
8
00:00:22.880 --> 00:00:26.940
Na verdade, você ainda não possui aquele
nível, e o contrato não liga.
9
00:00:27.320 --> 00:00:31.260
Ele só verifica o nível de onde eles estão
saindo, e todo mundo começa lá.
10
00:00:32.320 --> 00:00:35.340
Mas aqui está a regra que deve mudar como
você constrói.
11
00:00:36.160 --> 00:00:40.180
Cada nível que você possui estende seu
alcance exatamente uma geração mais
profunda.
12
00:00:40.800 --> 00:00:43.340
Capturar de duas camadas abaixo exige
nível dois.
13
00:00:43.940 --> 00:00:45.620
Três camadas abaixo, nível três.
14
00:00:46.500 --> 00:00:50.000
Seu nível não é um distintivo no seu
painel, é o comprimento do seu braço.
15
00:00:51.000 --> 00:00:52.960
E os pagamentos não esperam por ninguém.
16
00:00:53.800 --> 00:00:59.100
Quando alguém no fundo da sua matriz sobe
de nível, esse pagamento sobe até
encontrar a
17
00:00:59.160 --> 00:01:03.120
primeira pessoa qualificada e com nível
alto o suficiente para capturá-lo.
18
00:01:04.080 --> 00:01:07.880
Se não for você, ele passa por você para
alguém acima.
19
00:01:08.460 --> 00:01:09.460
Perdido.
20
00:01:09.940 --> 00:01:10.940
Então a jogada é simples.
21
00:01:11.300 --> 00:01:16.480
Fique um nível à frente da sua camada
ativa mais profunda e deixe a estrutura
pagar por
22
00:01:16.500 --> 00:01:17.200
isso.
23
00:01:17.240 --> 00:01:20.760
Sua primeira captura em cada nível é
exatamente o preço da sua próxima subida.
24
00:01:21.440 --> 00:01:23.520
Até o centavo, isso não é sorte.
25
00:01:24.320 --> 00:01:25.320
Esse é o design.
26
00:01:26.260 --> 00:01:27.300
Seu nível é seu alcance.
27
00:01:27.600 --> 00:01:28.480
Monte a equipe.
28
00:01:28.520 --> 00:01:31.900
Mantenha o braço estendido e ensine seus
dois a fazer exatamente a mesma coisa.
@@ -0,0 +1,451 @@
WEBVTT
1
00:00:00.360 --> 00:00:02.060
Die meisten Team-Builds scheitern aus
einem Grund.
2
00:00:02.360 --> 00:00:04.800
Jeder rekrutiert und niemand hilft.
3
00:00:05.840 --> 00:00:07.380
Der RM Circle dreht das um.
4
00:00:08.220 --> 00:00:13.140
Es ist ein Team-First-Build auf der
Polygon-Blockchain, bei dem der gesamte
Plan in einen
5
00:00:13.180 --> 00:00:13.880
Satz passt.
6
00:00:13.920 --> 00:00:18.860
Hol dir deine zwei, hilf deinen zwei, ihre
zu bekommen, und bring ihnen bei, dasselbe
zu tun.
7
00:00:19.160 --> 00:00:24.880
Dieses Video zeigt das vollständige Bild,
wie die Struktur funktioniert, wie das
Geld fließt und
8
00:00:24.920 --> 00:00:26.500
genau, was deine Aufgabe ist.
9
00:00:27.080 --> 00:00:28.560
Es ist einfacher, als du denkst.
10
00:00:29.540 --> 00:00:30.780
Jeder tritt auf die gleiche Weise ein.
11
00:00:31.320 --> 00:00:34.540
Eine Position in einem Smart Contract,
platziert in einer zwei breiten Matrix.
12
00:00:35.080 --> 00:00:37.820
Du brauchst genau zwei Personen, die über
deinen Link beitreten.
13
00:00:38.380 --> 00:00:39.620
Wir nennen sie deine Direkten.
14
00:00:40.240 --> 00:00:42.920
Und sobald du zwei hast, ist deine
Position qualifiziert.
15
00:00:43.420 --> 00:00:45.020
Das ist die Ziellinie für die Breite.
16
00:00:45.820 --> 00:00:46.820
Du brauchst nie einen Dritten.
17
00:00:47.000 --> 00:00:49.320
Von dort aus geht der Build nach unten,
nicht nach außen.
18
00:00:50.120 --> 00:00:51.760
Deine zwei bekommen jeweils ihre zwei.
19
00:00:51.820 --> 00:00:53.040
Diese vier bekommen ihre.
20
00:00:53.780 --> 00:00:58.740
Und die Matrix füllt sich mit zwei, vier,
acht, sechzehn, während das gesamte Team
die gleiche
21
00:00:58.800 --> 00:00:59.800
Welle vorantreibt.
22
00:01:00.340 --> 00:01:02.560
Du wirst auf zwei Arten bezahlt, und sie
sind unterschiedlich.
23
00:01:03.060 --> 00:01:05.440
Den Unterschied zu kennen, erspart dir
eine Menge Verwirrung.
24
00:01:05.980 --> 00:01:07.720
Stream eins, Eintrittsbelohnungen.
25
00:01:08.320 --> 00:01:12.680
Jede einzelne Person, die über deinen Link
beitritt, zahlt dir eine
Eintrittsbelohnung, die in derselben
Transaktion,
26
00:01:12.760 --> 00:01:15.400
mit der sie beitreten, in deine Wallet
geliefert wird.
27
00:01:15.960 --> 00:01:18.180
Nicht nur die ersten beiden, sondern
jeder.
28
00:01:18.740 --> 00:01:20.820
Stream zwei, Upgrade-Zahlungen.
29
00:01:21.320 --> 00:01:22.880
Das Programm hat acht Stufen.
30
00:01:23.540 --> 00:01:27.720
Wenn Leute unter dir Stufen kaufen,
wandert jede Zahlung die Matrix hinauf und
landet
31
00:01:27.780 --> 00:01:30.300
auf einer Position, derjenigen mit der
passenden Tiefe.
32
00:01:30.960 --> 00:01:35.400
Jemand eine Ebene unter dir zahlt dir,
wenn er Stufe zwei kauft.
33
00:01:36.380 --> 00:01:40.080
Zwei Ebenen tiefer, Stufe drei, und so
weiter, acht Ebenen tief.
34
00:01:40.320 --> 00:01:44.020
Jede Person unter dir zahlt dir genau
einmal auf einer bestimmten Stufe.
35
00:01:44.980 --> 00:01:47.840
Hier ist die Regel, die entscheidet, ob du
das Geld bekommst.
36
00:01:48.260 --> 00:01:53.720
Um eine Stufenzahlung zu erhalten, muss
deine Position qualifiziert sein, zwei
Direktmitglieder haben und bereits
37
00:01:53.800 --> 00:01:55.260
die Stufe besitzen, die gekauft wird.
38
00:01:55.680 --> 00:01:57.720
Wenn du das nicht bist, wartet die Zahlung
nicht.
39
00:01:58.300 --> 00:02:01.880
Sie geht dauerhaft auf die nächste
berechtigte Position über dir über.
40
00:02:02.700 --> 00:02:03.700
Das ist keine Bestrafung.
41
00:02:03.900 --> 00:02:06.280
Es ist der Vertrag, der jede Zahlung in
Bewegung hält.
42
00:02:07.120 --> 00:02:11.180
Deine Aufgabe ist es einfach, eine Stufe
vor der tiefsten aktiven Ebene deines
Teams zu sein.
43
00:02:12.180 --> 00:02:15.800
Und dein Dashboard zeigt dir buchstäblich,
wann der Moment kommt.
44
00:02:16.700 --> 00:02:20.300
Wenn die beiden Plätze von jemandem voll
sind und eine weitere Person seinem Team
45
00:02:20.360 --> 00:02:24.860
beitritt, platziert der Vertrag dieses
neue Mitglied im ersten freien Platz
weiter unten.
46
00:02:25.440 --> 00:02:26.580
Das ist der Überlauf.
47
00:02:28.080 --> 00:02:32.280
Der Überlauf füllt deine Struktur mit
Leuten, die du nie angeworben hast, und
jeder von
48
00:02:32.340 --> 00:02:34.800
ihnen ist zukünftiges Upgrade-Einkommen
für deine Position.
49
00:02:35.280 --> 00:02:38.500
Aber höre dies genau: Spillover
qualifiziert dich nicht.
50
00:02:38.960 --> 00:02:42.980
Nur Leute, die über deinen eigenen Link
beitreten, zählen als deine Direkten.
51
00:02:43.860 --> 00:02:45.780
Spillover ist ein Geschenk für deine
Tiefe.
52
00:02:46.600 --> 00:02:48.240
Deine zwei sind immer noch deine Aufgabe.
53
00:02:49.140 --> 00:02:52.020
Sobald du qualifiziert bist, ist die
Empfehlung des Teams einfach.
54
00:02:52.860 --> 00:02:54.080
Verlagere deine Anstrengung nach unten.
55
00:02:54.900 --> 00:02:58.520
Hilf deinen zwei, ihre zwei zu bekommen,
anstatt selbst mehr Direkte zu stapeln.
56
00:02:59.540 --> 00:03:02.240
Deine Einladungsseite erledigt das sogar
automatisch.
57
00:03:02.700 --> 00:03:08.220
Sobald du zwei von zwei erreichst, leitet
es neue Beitritte zur nächsten Person in
deinem Bein, die
58
00:03:08.280 --> 00:03:08.940
sie braucht.
59
00:03:08.980 --> 00:03:13.320
Und wenn danach trotzdem jemand über
deinen Link beitritt, dann ist das ein
Bonus, niemals
60
00:03:13.360 --> 00:03:14.360
ein Problem.
61
00:03:14.400 --> 00:03:18.700
Du behältst die volle Eintrittsbelohnung,
und sie fließen als Tiefe in dein Bein
hinunter.
62
00:03:19.680 --> 00:03:20.780
Es gibt keine Regel dagegen.
63
00:03:20.960 --> 00:03:22.560
Es gibt nur einen klügeren Ort, auf den
man zielen sollte.
64
00:03:24.060 --> 00:03:26.820
Hier unterscheidet sich der RM Circle von
allem, was du bisher ausprobiert hast.
65
00:03:27.580 --> 00:03:29.260
Dein Dashboard ist dein Co-Pilot.
66
00:03:29.880 --> 00:03:34.400
Es zeigt dein Team live, die Zahlungen,
die sich unter dir bilden, genau wann du
upgraden solltest, um
67
00:03:34.440 --> 00:03:37.460
sie zu erhalten, und wer in deinem Team
als Nächstes Hilfe braucht.
68
00:03:38.400 --> 00:03:41.260
Mit einem integrierten Nachrichtensystem,
verifiziert durch deine Wallet.
69
00:03:41.780 --> 00:03:43.560
Und jedes Mitglied hat das gleiche
Dashboard.
70
00:03:43.640 --> 00:03:47.840
Wenn du also deine zwei coachst, sag ihnen
nicht nur, was sie tun sollen.
71
00:03:48.220 --> 00:03:51.640
Öffne ihr Dashboard mit ihnen und bring
ihnen bei, das gleiche Spiel für ihre zwei
zu führen.
72
00:03:52.560 --> 00:03:53.880
Du baust keine Downline auf.
73
00:03:54.100 --> 00:03:55.100
Du trainierst Coaches.
74
00:03:55.100 --> 00:03:57.400
Das baut Tiefe auf, die jahrelang
auszahlt.
75
00:03:58.320 --> 00:03:59.760
Der Einstieg erfordert drei Schritte.
76
00:04:00.560 --> 00:04:02.240
Sieh dir die kurzen Schulungen auf der
Seite an.
77
00:04:02.920 --> 00:04:05.280
Richte eine kostenlose Wallet ein und
finanziere sie mit POEL.
78
00:04:06.160 --> 00:04:08.500
Du kannst es mit einer Debitkarte kaufen,
wenn du ganz neu bist.
79
00:04:09.120 --> 00:04:10.980
Und tritt direkt auf der Seite mit einem
Klick bei.
80
00:04:11.660 --> 00:04:14.900
Du wirst automatisch dem Team zugewiesen,
und dein Dashboard ist
81
00:04:14.940 --> 00:04:16.779
live, sobald deine Transaktion bestätigt
ist.
82
00:04:17.700 --> 00:04:23.180
Zu guter Letzt, weil wir das nur ehrlich
machen: Das ist Kryptowährung auf
83
00:04:23.300 --> 00:04:25.820
einem Smart Contract mit echtem Risiko.
84
00:04:26.460 --> 00:04:27.760
Es wird kein Einkommen garantiert.
85
00:04:28.140 --> 00:04:32.220
Ergebnisse kommen vom Teameinsatz, und du
solltest nur Geld verwenden, dessen
Verlust du dir leisten
86
00:04:32.260 --> 00:04:33.100
kannst.
87
00:04:33.140 --> 00:04:34.920
Was garantiert ist, ist die Mathematik.
88
00:04:35.440 --> 00:04:36.680
Der Code kann nicht geändert werden.
89
00:04:36.900 --> 00:04:38.440
Kein Unternehmen hält die Gelder.
90
00:04:38.820 --> 00:04:41.480
Und jede jemals getätigte Zahlung ist
öffentlich auf der Blockchain.
91
00:04:42.140 --> 00:04:43.140
Hol dir deine zwei.
92
00:04:43.380 --> 00:04:44.760
Hilf deinen zwei, ihre zu bekommen.
93
00:04:45.200 --> 00:04:46.200
Bringe ihnen bei, zu lehren.
94
00:04:46.680 --> 00:04:48.260
RM Circle dot team.
@@ -0,0 +1,442 @@
WEBVTT
1
00:00:00.360 --> 00:00:02.060
A maioria das construções de equipe falha
por um motivo.
2
00:00:02.360 --> 00:00:04.800
Todo mundo recruta e ninguém ajuda.
3
00:00:05.840 --> 00:00:07.380
O RM Circle inverte isso.
4
00:00:08.220 --> 00:00:13.140
É uma construção com a equipe em primeiro
lugar na blockchain Polygon, onde todo o
plano cabe
5
00:00:13.180 --> 00:00:13.880
em uma frase.
6
00:00:13.920 --> 00:00:18.860
Consiga seus dois, ajude seus dois a
conseguir os deles e ensine-os a fazer o
mesmo.
7
00:00:19.160 --> 00:00:24.880
Este vídeo mostra o panorama completo,
como a estrutura funciona, como o dinheiro
circula e exatamente
8
00:00:24.920 --> 00:00:26.500
qual é o seu trabalho.
9
00:00:27.080 --> 00:00:28.560
É mais simples do que você pensa.
10
00:00:29.540 --> 00:00:30.780
Todos entram da mesma forma.
11
00:00:31.320 --> 00:00:34.540
Uma posição em um smart contract colocada
em uma matriz de largura dois.
12
00:00:35.080 --> 00:00:37.820
Você precisa exatamente de duas pessoas
que entrem com seu link.
13
00:00:38.380 --> 00:00:39.620
Nós os chamamos de seus diretos.
14
00:00:40.240 --> 00:00:42.920
E assim que você tiver dois, sua posição
está qualificada.
15
00:00:43.420 --> 00:00:45.020
Essa é a linha de chegada para a largura.
16
00:00:45.820 --> 00:00:46.820
Você nunca precisa de um terceiro.
17
00:00:47.000 --> 00:00:49.320
A partir daí, a construção vai para baixo,
não para fora.
18
00:00:50.120 --> 00:00:51.760
Cada um dos seus dois consegue os seus
dois.
19
00:00:51.820 --> 00:00:53.040
Esses quatro conseguem os deles.
20
00:00:53.780 --> 00:00:58.740
E a matriz preenche dois, quatro, oito,
dezesseis com toda a equipe empurrando a
21
00:00:58.800 --> 00:00:59.800
mesma onda.
22
00:01:00.340 --> 00:01:02.560
Você recebe de duas maneiras, e elas são
diferentes.
23
00:01:03.060 --> 00:01:05.440
Saber a diferença poupa você de muita
confusão.
24
00:01:05.980 --> 00:01:07.720
Stream one, recompensas de entrada.
25
00:01:08.320 --> 00:01:12.680
Toda pessoa que entra pelo seu link paga a
você uma recompensa de entrada, entregue
na
26
00:01:12.760 --> 00:01:15.400
sua carteira na mesma transação em que ela
entra.
27
00:01:15.960 --> 00:01:18.180
Não apenas os dois primeiros, todo mundo.
28
00:01:18.740 --> 00:01:20.820
Stream two, pagamentos de upgrade.
29
00:01:21.320 --> 00:01:22.880
O programa tem oito níveis.
30
00:01:23.540 --> 00:01:27.720
À medida que pessoas abaixo de você
compram níveis, cada pagamento sobe pela
matriz e
31
00:01:27.780 --> 00:01:30.300
cai em uma posição, aquela na profundidade
correspondente.
32
00:01:30.960 --> 00:01:35.400
Alguém um nível abaixo de você paga a você
quando compra o nível dois.
33
00:01:36.380 --> 00:01:40.080
Dois níveis abaixo, nível três, e assim
por diante, até oito níveis de
profundidade.
34
00:01:40.320 --> 00:01:44.020
Cada pessoa abaixo de você paga a você uma
vez em exatamente um nível.
35
00:01:44.980 --> 00:01:47.840
Aqui está a regra que decide se você
recebe esse dinheiro.
36
00:01:48.260 --> 00:01:53.720
Para receber um pagamento de nível, sua
posição precisa estar qualificada, ter
dois diretos, e já
37
00:01:53.800 --> 00:01:55.260
estar no nível que está sendo comprado.
38
00:01:55.680 --> 00:01:57.720
Se você não estiver, o pagamento não
espera.
39
00:01:58.300 --> 00:02:01.880
Ele passa para a próxima posição elegível
acima de você permanentemente.
40
00:02:02.700 --> 00:02:03.700
Isso não é uma punição.
41
00:02:03.900 --> 00:02:06.280
É o contrato mantendo cada pagamento em
movimento.
42
00:02:07.120 --> 00:02:11.180
Seu trabalho é simplesmente ficar um nível
à frente da camada ativa mais profunda da
sua equipe.
43
00:02:12.180 --> 00:02:15.800
E seu painel mostra literalmente quando o
momento está chegando.
44
00:02:16.700 --> 00:02:20.300
Quando as duas vagas de alguém estão
cheias e outra pessoa entra na equipe
45
00:02:20.360 --> 00:02:24.860
dela, o contrato coloca esse novo membro
na primeira vaga aberta mais abaixo.
46
00:02:25.440 --> 00:02:26.580
Isso é spillover.
47
00:02:28.080 --> 00:02:32.280
Spillover preenche sua estrutura com
pessoas que você nunca recrutou, e cada
uma delas é
48
00:02:32.340 --> 00:02:34.800
uma futura receita de upgrade para sua
posição.
49
00:02:35.280 --> 00:02:38.500
Mas ouça isso claramente: o
transbordamento não qualifica você.
50
00:02:38.960 --> 00:02:42.980
Apenas pessoas que entram com seu próprio
link contam como seus diretos.
51
00:02:43.860 --> 00:02:45.780
Transbordamento é um presente para sua
profundidade.
52
00:02:46.600 --> 00:02:48.240
Seu dois ainda é seu trabalho.
53
00:02:49.140 --> 00:02:52.020
Depois que você se qualificar, a
recomendação da equipe é simples.
54
00:02:52.860 --> 00:02:54.080
Mude seu esforço para baixo.
55
00:02:54.900 --> 00:02:58.520
Ajude seu dois a conseguir o próprio dois,
em vez de empilhar mais diretos em você.
56
00:02:59.540 --> 00:03:02.240
Sua página de convite lida com isso
automaticamente.
57
00:03:02.700 --> 00:03:08.220
Assim que você atingir dois de dois, ela
direciona novas entradas para a próxima
pessoa na sua perna
58
00:03:08.280 --> 00:03:08.940
que precisa delas.
59
00:03:08.980 --> 00:03:13.320
E se alguém ainda entrar pelo seu link
depois disso, isso é um bônus, nunca
60
00:03:13.360 --> 00:03:14.360
um problema.
61
00:03:14.400 --> 00:03:18.700
Você fica com a recompensa total de
entrada, e eles escorrem para sua perna
como profundidade.
62
00:03:19.680 --> 00:03:20.780
Não há nenhuma regra contra isso.
63
00:03:20.960 --> 00:03:22.560
Apenas há um lugar mais inteligente para
mirar.
64
00:03:24.060 --> 00:03:26.820
É aqui que o RM Circle é diferente de tudo
que você já experimentou.
65
00:03:27.580 --> 00:03:29.260
Seu painel é seu co-piloto.
66
00:03:29.880 --> 00:03:34.400
Ele mostra sua equipe ao vivo, os
pagamentos se formando abaixo de você,
exatamente quando atualizar para
67
00:03:34.440 --> 00:03:37.460
pegá-los, e quem na sua equipe precisa de
ajuda em seguida.
68
00:03:38.400 --> 00:03:41.260
Com um sistema de mensagens integrado,
verificado pela sua carteira.
69
00:03:41.780 --> 00:03:43.560
E cada membro tem o mesmo painel.
70
00:03:43.640 --> 00:03:47.840
Então, quando você treinar seu dois, não
apenas diga a eles o que fazer.
71
00:03:48.220 --> 00:03:51.640
Abra o painel deles com eles e ensine-os a
executar a mesma jogada para o dois deles.
72
00:03:52.560 --> 00:03:53.880
Você não está construindo uma downline.
73
00:03:54.100 --> 00:03:55.100
Você está treinando coaches.
74
00:03:55.100 --> 00:03:57.400
É isso que constrói profundidade que paga
por anos.
75
00:03:58.320 --> 00:03:59.760
Para entrar, são três passos.
76
00:04:00.560 --> 00:04:02.240
Assista aos treinamentos rápidos no site.
77
00:04:02.920 --> 00:04:05.280
Configure uma carteira gratuita e abasteça
com POEL.
78
00:04:06.160 --> 00:04:08.500
Você pode comprá-la com um cartão de
débito se for iniciante.
79
00:04:09.120 --> 00:04:10.980
E entre direto no site com um toque.
80
00:04:11.660 --> 00:04:14.900
Você será colocado automaticamente no
time, e seu painel fica ativo
81
00:04:14.940 --> 00:04:16.779
assim que sua transação for confirmada.
82
00:04:17.700 --> 00:04:23.180
Última coisa, porque só fazemos isso
honestamente, isso é criptomoeda em um
83
00:04:23.300 --> 00:04:25.820
contrato inteligente com risco real.
84
00:04:26.460 --> 00:04:27.760
Nenhuma renda é garantida.
85
00:04:28.140 --> 00:04:32.220
Resultados vêm do trabalho em equipe, e
você só deve usar dinheiro que pode
86
00:04:32.260 --> 00:04:33.100
perder.
87
00:04:33.140 --> 00:04:34.920
O que é garantido é a matemática.
88
00:04:35.440 --> 00:04:36.680
O código não pode ser alterado.
89
00:04:36.900 --> 00:04:38.440
Nenhuma empresa mantém os fundos.
90
00:04:38.820 --> 00:04:41.480
E cada pagamento já feito é público na
blockchain.
91
00:04:42.140 --> 00:04:43.140
Consiga seus dois.
92
00:04:43.380 --> 00:04:44.760
Ajude seus dois a conseguir os deles.
93
00:04:45.200 --> 00:04:46.200
Ensine-os a ensinar.
94
00:04:46.680 --> 00:04:48.260
RM Circle dot team.
@@ -0,0 +1,160 @@
WEBVTT
1
00:00:01.140 --> 00:00:03.140
Ich möchte dir eine Position in unserem
Team zeigen – meine.
2
00:00:03.700 --> 00:00:07.760
Nicht um dich zu beeindrucken, sondern um
dir den Spielzug zu zeigen, den ich jedem
beibringe – exakt nach Vorschrift
ausgeführt.
3
00:00:09.500 --> 00:00:11.220
Ein Einstieg, aus eigener Tasche
finanziert.
4
00:00:11.680 --> 00:00:13.580
Das war das letzte Mal, dass meine Tasche
involviert war.
5
00:00:14.020 --> 00:00:16.920
Von da an blieb jeder Zahlungseingang
liegen.
6
00:00:17.400 --> 00:00:19.480
Ich habe die Fänge nicht ausgegeben, ich
bin mit ihnen aufgestiegen.
7
00:00:21.340 --> 00:00:22.420
Das ist die ganze Disziplin.
8
00:00:22.780 --> 00:00:25.820
Ein Fang auf deiner Stufe ist genau der
Preis für deine nächste Stufe.
9
00:00:26.520 --> 00:00:29.040
Der Vertrag ist genau so aufgebaut – bis
auf den Cent.
10
00:00:29.720 --> 00:00:32.360
So kaufte jedes Mal, wenn Geld eintraf,
die nächste Sprosse.
11
00:00:32.520 --> 00:00:35.080
Ascensus, Fabrica, Coleman.
12
00:00:37.000 --> 00:00:38.120
Und hier kommt der ehrliche Teil.
13
00:00:38.560 --> 00:00:40.840
Auf dem Weg nach oben gingen Zahlungen an
Menschen vorbei.
14
00:00:41.300 --> 00:00:42.880
Keine Bestrafung, sondern Mechanik.
15
00:00:43.420 --> 00:00:47.220
Eine Zahlung stoppt nur an einer Position,
die qualifiziert ist und auf gleicher
Ebene, um sie zu fangen.
16
00:00:47.700 --> 00:00:49.760
Stillstehen hat einen leisen Preis.
17
00:00:51.620 --> 00:00:54.420
Diese Woche hat ein Mitglied fünf Ebenen
tiefer Apex erreicht.
18
00:00:55.140 --> 00:00:59.220
Seine Zahlung übersprang vier Positionen
und stoppte bei mir, weil meine
19
00:00:59.280 --> 00:01:00.280
positioniert war.
20
00:01:00.360 --> 00:01:04.200
Sie finanzierte mein eigenes Apex in
derselben Stunde – rein und rauf.
21
00:01:04.720 --> 00:01:06.380
Das Drehbuch lief wie geschrieben.
22
00:01:08.340 --> 00:01:09.560
Wo steht dann die Position?
23
00:01:09.880 --> 00:01:14.440
Alles, was je eingezahlt wurde, ist mit
Tausenden von POL obendrauf
zurückgekommen.
24
00:01:15.260 --> 00:01:18.820
Und die tieferen Fänge, auf die es jetzt
ausgerichtet ist, haben sich noch nicht
einmal gebildet.
25
00:01:19.880 --> 00:01:21.440
Geduld und Beständigkeit.
26
00:01:22.160 --> 00:01:25.260
Das ist das ganze Geheimnis, es ist
langweilig, und es funktioniert.
27
00:01:27.140 --> 00:01:31.280
Wenn du im Team bist und stillsitzt, formt
sich die nächste Welle bereits unter
28
00:01:31.320 --> 00:01:33.620
dir, und die Positionierung ist noch
offen.
29
00:01:34.200 --> 00:01:35.220
Öffne dein Dashboard.
30
00:01:35.660 --> 00:01:39.740
Das Pipeline-Panel zeigt genau, was sich
unter dir aufbaut und die Sprosse, die du
brauchst, um
31
00:01:39.780 --> 00:01:40.780
es zu fangen.
32
00:01:41.080 --> 00:01:42.120
Oder frage deinen Sponsor.
33
00:01:42.580 --> 00:01:45.240
So oder so, die Antwort liegt
wahrscheinlich schon in deiner Wallet.
@@ -0,0 +1,155 @@
WEBVTT
1
00:00:01.140 --> 00:00:03.140
Quero mostrar a você uma posição em nosso
time, a minha.
2
00:00:03.700 --> 00:00:07.760
Não para impressionar você, mas para
mostrar a jogada que ensino a todos
executarem exatamente conforme o livro.
3
00:00:09.500 --> 00:00:11.220
Uma entrada financiada do próprio bolso.
4
00:00:11.680 --> 00:00:13.580
Essa foi a última vez que meu bolso esteve
envolvido.
5
00:00:14.020 --> 00:00:16.920
A partir daí, todo pagamento que chegou,
ficou.
6
00:00:17.400 --> 00:00:19.480
Não gastei as capturas, subi com elas.
7
00:00:21.340 --> 00:00:22.420
Essa é toda a disciplina.
8
00:00:22.780 --> 00:00:25.820
Uma captura no seu nível é exatamente o
preço do seu próximo nível.
9
00:00:26.520 --> 00:00:29.040
O contrato é construído assim até o último
centavo.
10
00:00:29.720 --> 00:00:32.360
Então, cada vez que o dinheiro chegava,
comprava o próximo degrau.
11
00:00:32.520 --> 00:00:35.080
Ascensus, Fabrica, Coleman.
12
00:00:37.000 --> 00:00:38.120
E aqui está a parte honesta.
13
00:00:38.560 --> 00:00:40.840
No caminho para cima, os pagamentos
passaram por cima das pessoas.
14
00:00:41.300 --> 00:00:42.880
Não castigo, mecânica.
15
00:00:43.420 --> 00:00:47.220
Um pagamento só para em uma posição que
está qualificada e no nível para
capturá-lo.
16
00:00:47.700 --> 00:00:49.760
Parado tem um custo silencioso.
17
00:00:51.620 --> 00:00:54.420
Esta semana, um membro cinco camadas
abaixo alcançou Apex.
18
00:00:55.140 --> 00:00:59.220
O pagamento dele pulou quatro posições e
parou na minha porque a minha
19
00:00:59.280 --> 00:01:00.280
estava posicionada.
20
00:01:00.360 --> 00:01:04.200
Financiou meu próprio Apex na mesma hora,
entrou e subiu.
21
00:01:04.720 --> 00:01:06.380
O livro funcionou como escrito.
22
00:01:08.340 --> 00:01:09.560
Como fica a posição?
23
00:01:09.880 --> 00:01:14.440
Tudo o que foi pago retornou com milhares
de POL extras.
24
00:01:15.260 --> 00:01:18.820
E as capturas mais profundas para as quais
está posicionado ainda nem se formaram.
25
00:01:19.880 --> 00:01:21.440
Paciência e consistência.
26
00:01:22.160 --> 00:01:25.260
Esse é o segredo todo, e é chato, e
funciona.
27
00:01:27.140 --> 00:01:31.280
Se você está no time e está parado, a
próxima onda já está se formando abaixo
28
00:01:31.320 --> 00:01:33.620
de você, e o posicionamento ainda está
aberto.
29
00:01:34.200 --> 00:01:35.220
Abra seu painel.
30
00:01:35.660 --> 00:01:39.740
O painel de pipeline mostra exatamente o
que está se formando abaixo de você e o
degrau que
31
00:01:39.780 --> 00:01:40.780
você precisa para capturá-lo.
32
00:01:41.080 --> 00:01:42.120
Ou pergunte ao seu patrocinador.
33
00:01:42.580 --> 00:01:45.240
De qualquer forma, a resposta
provavelmente já está na sua carteira.
+13
View File
@@ -396,6 +396,19 @@
<div style="display:flex;gap:10px;align-items:center;margin-top:8px"><button id="msgSendBtn" class="btn btn-primary">Send →</button><span id="msgStatus" class="micro"></span></div></div>`;
const unreadIds=(data.inbox||[]).filter(m=>!m.read).map(m=>m.mid);
if(unreadIds.length)fetch('/api/public/msg-read',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mids:unreadIds})}).catch(()=>{});
// The inbox "Add mine" button was rendered with NO click handler, so it sat there
// doing nothing (Marty, 2026-09-17). It opens the same optional profile dialog the
// dashboard card uses, then re-renders so the banner disappears once it is done.
const ac=document.getElementById('msgAddContact');
if(ac)ac.addEventListener('click',async function(){
ac.disabled=true;
try{
await window.RMCProfile.prompt({onlyForId:me.id,reason:'inbox'});
const p2=await window.RMCProfile.status();
if(p2&&p2.profile&&p2.profile.complete){ try{ renderAlerts({id:me.id}); }catch(e){} loadMsgUI(d); return; }
}catch(e){}
ac.disabled=false;
});
const sb=document.getElementById('msgSendBtn');
if(sb)sb.addEventListener('click',async function(){
const st=document.getElementById('msgStatus');st.textContent='Sending…';sb.disabled=true;
+5 -5
View File
@@ -8,7 +8,7 @@
<main>
<section class="section"><div class="wrap"><div class="section-head"><div class="eyebrow">Team training</div><h1 style="font-size:clamp(34px,5vw,54px);margin:8px 0 10px">Watch. Learn. <span class="gold">Duplicate.</span></h1><p>Short videos take you from zero to your Premium position — in order. Watch them all before you join, and share this page with your two directs when it's their turn.</p></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 1 · 5 min · UPDATED</div><h2 style="margin:6px 0 6px">How the team build works</h2><p style="color:var(--muted);margin:0 0 12px">The full picture in five minutes: the 2-direct strategy, both income streams, the catch-or-pass rule, spillover, the moving link, and how your dashboard coaches you through all of it.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/v/rmc-team-overview-poster.jpg" src="/v/rmc-team-overview-f8856dc743.mp4"><track kind="captions" srclang="en" label="English" src="/captions/rmc-team-overview-f8856dc743.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/rmc-team-overview-f8856dc743.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/rmc-team-overview-f8856dc743.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/rmc-team-overview-f8856dc743.es.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 1 · 5 min · UPDATED</div><h2 style="margin:6px 0 6px">How the team build works</h2><p style="color:var(--muted);margin:0 0 12px">The full picture in five minutes: the 2-direct strategy, both income streams, the catch-or-pass rule, spillover, the moving link, and how your dashboard coaches you through all of it.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/v/rmc-team-overview-poster.jpg" src="/v/rmc-team-overview-f8856dc743.mp4"><track kind="captions" srclang="en" label="English" src="/captions/rmc-team-overview-f8856dc743.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/rmc-team-overview-f8856dc743.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/rmc-team-overview-f8856dc743.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/rmc-team-overview-f8856dc743.es.vtt"><track kind="captions" srclang="de" label="Deutsch" src="/captions/rmc-team-overview-f8856dc743.de.vtt"><track kind="captions" srclang="pt" label="Português" src="/captions/rmc-team-overview-f8856dc743.pt.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 2 · 3 min</div><h2 style="margin:6px 0 6px">Create your MetaMask wallet</h2><p style="color:var(--muted);margin:0 0 12px">Install MetaMask safely and set up your wallet. Never share your Secret Recovery Phrase with anyone.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/create_metamask_wallet_poster.jpg" src="/training/create_metamask_wallet.mp4"></video></div>
@@ -16,14 +16,14 @@
<div class="callout" style="max-width:880px;margin:0 auto 26px"><strong>💳 Brand new to crypto? You can buy POL with a card.</strong> If you don't have crypto anywhere yet, the simplest path is <a href="https://www.moonpay.com/buy/matic" target="_blank" rel="noopener nofollow">MoonPay</a> — buy with a debit/credit card, Apple Pay, or Google Pay. Three things to get right: choose <strong>POL on the Polygon network</strong> (MoonPay may show POL's old name, <em>MATIC</em> — same token), paste <strong>your own wallet address</strong> from Video 2 as the destination, and buy about <strong>385 POL</strong> (the 362 entry plus a little gas<span id="fundUsdNote"></span>). Why the extra? Think of it like a car: the blockchain is the road and POL is also the fuel — every transaction burns a tiny bit of "gas" to move, so you keep a little in the tank beyond your entry. A wallet with an empty tank can't go anywhere. The crypto is delivered straight to your wallet — this site never touches your money. MoonPay handles ID verification and charges its own card fee (~4.5%); a first purchase can take a few minutes to arrive. The join page will also offer this automatically if your connected wallet is short.</div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 4 · 4 min · the new way to join</div><h2 style="margin:6px 0 6px">Joining right on the site — connect wallet &amp; buy your position</h2><p style="color:var(--muted);margin:0 0 12px">The whole join process, start to finish: open your invite link (or <a href="/start" style="color:var(--teal)">the start page</a>), connect your wallet, and buy your Premium position in one guided flow — the sponsor ID is filled in for you automatically.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/new_integrated_join_process_poster.jpg" src="/training/new_integrated_join_process.mp4"><track kind="captions" srclang="en" label="English" src="/captions/new_integrated_join_process.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/new_integrated_join_process.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/new_integrated_join_process.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/new_integrated_join_process.es.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 4 · 4 min · the new way to join</div><h2 style="margin:6px 0 6px">Joining right on the site — connect wallet &amp; buy your position</h2><p style="color:var(--muted);margin:0 0 12px">The whole join process, start to finish: open your invite link (or <a href="/start" style="color:var(--teal)">the start page</a>), connect your wallet, and buy your Premium position in one guided flow — the sponsor ID is filled in for you automatically.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/new_integrated_join_process_poster.jpg" src="/training/new_integrated_join_process.mp4"><track kind="captions" srclang="en" label="English" src="/captions/new_integrated_join_process.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/new_integrated_join_process.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/new_integrated_join_process.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/new_integrated_join_process.es.vtt"><track kind="captions" srclang="de" label="Deutsch" src="/captions/new_integrated_join_process.de.vtt"><track kind="captions" srclang="pt" label="Português" src="/captions/new_integrated_join_process.pt.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 5 · 5 min · backup method</div><h2 style="margin:6px 0 6px">Buying the Premium position in the dApp</h2><p style="color:var(--muted);margin:0 0 12px">If the on-site wallet connect isn't an option for you, you can still join the original way: connect to the RM Circle dApp with the current team sponsor and complete your Premium entry there. Double-check the sponsor ID matches the start page before signing.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/buying_the_premium_position_poster.jpg" src="/training/buying_the_premium_position.mp4"><track kind="captions" srclang="en" label="English" src="/captions/buying_the_premium_position.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/buying_the_premium_position.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/buying_the_premium_position.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/buying_the_premium_position.es.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 5 · 5 min · backup method</div><h2 style="margin:6px 0 6px">Buying the Premium position in the dApp</h2><p style="color:var(--muted);margin:0 0 12px">If the on-site wallet connect isn't an option for you, you can still join the original way: connect to the RM Circle dApp with the current team sponsor and complete your Premium entry there. Double-check the sponsor ID matches the start page before signing.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/buying_the_premium_position_poster.jpg" src="/training/buying_the_premium_position.mp4"><track kind="captions" srclang="en" label="English" src="/captions/buying_the_premium_position.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/buying_the_premium_position.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/buying_the_premium_position.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/buying_the_premium_position.es.vtt"><track kind="captions" srclang="de" label="Deutsch" src="/captions/buying_the_premium_position.de.vtt"><track kind="captions" srclang="pt" label="Português" src="/captions/buying_the_premium_position.pt.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 6 · 3 min · payments explained</div><h2 style="margin:6px 0 6px">Why you're not getting paid <span class="gold">yet</span> — direct rewards vs pass-ups</h2><p style="color:var(--muted);margin:0 0 12px">The #1 thing that confuses new members: how direct payments differ from upgrade pass-ups, which <strong style="color:var(--text)">generation</strong> gets paid, and in what order. Watch this the moment you wonder "where's my payment?" — it walks a real, on-chain example.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/how-payments-work-poster.jpg" src="/v/rmc-how-payments-work-47533beedc.mp4"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 7 · 97 sec · why leveling up matters</div><h2 style="margin:6px 0 6px">Your level is your <span class="gold">reach</span></h2><p style="color:var(--muted);margin:0 0 12px">You don't need to own a level to catch your team's first upgrades — being qualified is enough. But every level you own extends your reach exactly <strong style="color:var(--text)">one generation deeper</strong>, and payments you can't catch pass over you. 97 seconds on the single rule behind "stay one level ahead of your deepest active layer."</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/v/rmc-level-reach-poster.jpg" src="/v/rmc-level-reach-65b337be4d.mp4"><track kind="captions" srclang="en" label="English" src="/captions/rmc-level-reach-65b337be4d.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/rmc-level-reach-65b337be4d.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/rmc-level-reach-65b337be4d.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/rmc-level-reach-65b337be4d.es.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 7 · 97 sec · why leveling up matters</div><h2 style="margin:6px 0 6px">Your level is your <span class="gold">reach</span></h2><p style="color:var(--muted);margin:0 0 12px">You don't need to own a level to catch your team's first upgrades — being qualified is enough. But every level you own extends your reach exactly <strong style="color:var(--text)">one generation deeper</strong>, and payments you can't catch pass over you. 97 seconds on the single rule behind "stay one level ahead of your deepest active layer."</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/v/rmc-level-reach-poster.jpg" src="/v/rmc-level-reach-65b337be4d.mp4"><track kind="captions" srclang="en" label="English" src="/captions/rmc-level-reach-65b337be4d.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/rmc-level-reach-65b337be4d.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/rmc-level-reach-65b337be4d.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/rmc-level-reach-65b337be4d.es.vtt"><track kind="captions" srclang="de" label="Deutsch" src="/captions/rmc-level-reach-65b337be4d.de.vtt"><track kind="captions" srclang="pt" label="Português" src="/captions/rmc-level-reach-65b337be4d.pt.vtt"></video></div>
<div id="textbook-play" class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow" style="color:var(--gold)">NEW · 1 min 51 · patience pays</div><h2 style="margin:6px 0 6px">The Textbook Play — a real position, run <span class="gold">by the book</span></h2><p style="color:var(--muted);margin:0 0 12px">One of our team builders near the top opens his own position's books: one entry out of pocket, every catch kept, every rung paid for by the catch before it — and this week's Apex catch landing and going straight back up the same hour. Watch what patience, consistency, and position actually look like on-chain, why payments pass over positions that stand still, and how your dashboard's pipeline panel shows your own next play.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="none" poster="/v/rmc-textbook-play-poster.jpg" src="/v/rmc-textbook-play-e352d39721.mp4"><track kind="captions" srclang="en" label="English" src="/captions/rmc-textbook-play-e352d39721.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/rmc-textbook-play-e352d39721.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/rmc-textbook-play-e352d39721.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/rmc-textbook-play-e352d39721.es.vtt"></video></div>
<div id="textbook-play" class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow" style="color:var(--gold)">NEW · 1 min 51 · patience pays</div><h2 style="margin:6px 0 6px">The Textbook Play — a real position, run <span class="gold">by the book</span></h2><p style="color:var(--muted);margin:0 0 12px">One of our team builders near the top opens his own position's books: one entry out of pocket, every catch kept, every rung paid for by the catch before it — and this week's Apex catch landing and going straight back up the same hour. Watch what patience, consistency, and position actually look like on-chain, why payments pass over positions that stand still, and how your dashboard's pipeline panel shows your own next play.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="none" poster="/v/rmc-textbook-play-poster.jpg" src="/v/rmc-textbook-play-e352d39721.mp4"><track kind="captions" srclang="en" label="English" src="/captions/rmc-textbook-play-e352d39721.en.vtt"><track kind="captions" srclang="it" label="Italiano" src="/captions/rmc-textbook-play-e352d39721.it.vtt"><track kind="captions" srclang="fr" label="Français" src="/captions/rmc-textbook-play-e352d39721.fr.vtt"><track kind="captions" srclang="es" label="Español" src="/captions/rmc-textbook-play-e352d39721.es.vtt"><track kind="captions" srclang="de" label="Deutsch" src="/captions/rmc-textbook-play-e352d39721.de.vtt"><track kind="captions" srclang="pt" label="Português" src="/captions/rmc-textbook-play-e352d39721.pt.vtt"></video></div>
<div class="video-card" style="max-width:880px;margin:0 auto 26px"><div style="padding:6px 6px 0"><div class="eyebrow">Video 7 · 14 min · your daily driver</div><h2 style="margin:6px 0 6px">The Member Dashboard — full walkthrough</h2><p style="color:var(--muted);margin:0 0 12px">Everything your dashboard does, end to end: your position and team, the pipeline that shows money forming below you, upgrading your level right on the page, wallet-verified Messages, the Coach Your Team panel, and grabbing your personalized promo tools and QR code. Watch this once and you'll never wonder what to do next.</p></div><video class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="/training/dashboard_walkthrough_poster.jpg" src="/training/dashboard_walkthrough.mp4"></video></div>
+84 -27
View File
@@ -1,33 +1,90 @@
// Match video captions to the language the member already chose with the 🌐 button.
// Video captions: match the language the member already chose with the 🌐 button, and
// make the fact that captions EXIST visible without hunting for the player's CC button.
//
// Deliberately NOT on by default for English. Someone reading English does not want
// captions forced over the picture; someone who switched the site to Italian almost
// certainly does. So: if their chosen language has a track, show it. Otherwise show
// nothing and leave the player's own CC button to do its job.
// Marty, 2026-09-17: the first build relied on the native CC control. He could not find
// it on his own page, which means members would not either, so every captioned player
// now carries a visible row of language chips underneath.
//
// Marty + Manson, 2026-09-17. See tools/captions.mjs for how the tracks are built.
// Still deliberately OFF by default for an English reader: someone reading English does
// not want text over the picture. Someone who already switched the site to Italian
// almost certainly does, so that one turns itself on.
//
// Tracks are built by tools/captions.mjs. See memory rm-circle-video-captions.
(function () {
function pick() {
var lang = '';
try { lang = String(localStorage.getItem('rmc.lang') || '').toLowerCase(); } catch (e) {}
var vids = document.querySelectorAll('video');
for (var i = 0; i < vids.length; i++) {
var tt = vids[i].textTracks;
if (!tt || !tt.length) continue;
var wanted = null;
for (var j = 0; j < tt.length; j++) {
if (tt[j].kind !== 'captions' && tt[j].kind !== 'subtitles') continue;
// never leave a stale track showing when the member switches language
tt[j].mode = 'disabled';
if (lang && lang !== 'en' && String(tt[j].language || '').toLowerCase() === lang) wanted = tt[j];
}
if (wanted) wanted.mode = 'showing';
var NAMES = { en: 'English', it: 'Italiano', fr: 'Français', es: 'Español', de: 'Deutsch',
pt: 'Português', nl: 'Nederlands', pl: 'Polski', ro: 'Română', ru: 'Русский', uk: 'Українська',
tr: 'Türkçe', ar: 'العربية', hi: 'हिन्दी', vi: 'Tiếng Việt', id: 'Bahasa', th: 'ไทย',
zh: '中文', ja: '日本語', ko: '한국어', sw: 'Kiswahili', fil: 'Filipino' };
function chosen() {
try { return String(localStorage.getItem('rmc.lang') || '').toLowerCase(); } catch (e) { return ''; }
}
function tracksOf(v) {
var out = [], tt = v.textTracks;
for (var i = 0; tt && i < tt.length; i++) if (tt[i].kind === 'captions' || tt[i].kind === 'subtitles') out.push(tt[i]);
return out;
}
function show(v, lang) {
var list = tracksOf(v), hit = null;
for (var i = 0; i < list.length; i++) {
list[i].mode = 'disabled'; // never leave a stale track showing
if (lang && String(list[i].language || '').toLowerCase() === lang) hit = list[i];
}
if (hit) hit.mode = 'showing';
paint(v, lang);
}
function paint(v, active) {
var bar = v.parentNode && v.parentNode.querySelector('.cap-bar');
if (!bar) return;
var btns = bar.querySelectorAll('button[data-lang]');
for (var i = 0; i < btns.length; i++) {
var on = btns[i].getAttribute('data-lang') === (active || '');
btns[i].style.background = on ? 'rgba(240,197,109,.22)' : 'transparent';
btns[i].style.borderColor = on ? 'rgba(240,197,109,.7)' : 'var(--line, #24425d)';
btns[i].style.color = on ? 'var(--gold, #f0c56d)' : 'var(--muted, #8fa6bd)';
btns[i].setAttribute('aria-pressed', on ? 'true' : 'false');
}
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', pick);
else pick();
// translate.js writes rmc.lang when the member picks a language; re-run so the
// captions follow without a reload, and cover players rendered later.
window.addEventListener('storage', function (e) { if (!e || e.key === 'rmc.lang') pick(); });
window.RMCCaptions = { refresh: pick };
function build(v) {
var list = tracksOf(v);
if (!list.length || !v.parentNode) return;
if (v.parentNode.querySelector('.cap-bar')) return; // already built
var bar = document.createElement('div');
bar.className = 'cap-bar';
bar.style.cssText = 'display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:8px 6px 2px;font-size:12px';
var lab = document.createElement('span');
lab.textContent = 'Subtitles:';
lab.style.cssText = 'color:var(--muted,#8fa6bd);text-transform:uppercase;letter-spacing:.07em;font-weight:700;margin-right:2px';
bar.appendChild(lab);
var mk = function (lang, text) {
var b = document.createElement('button');
b.type = 'button';
b.setAttribute('data-lang', lang);
b.textContent = text;
b.style.cssText = 'cursor:pointer;border:1px solid var(--line,#24425d);background:transparent;color:var(--muted,#8fa6bd);' +
'border-radius:999px;padding:4px 11px;font-size:12px;font-family:inherit;line-height:1.4';
b.addEventListener('click', function () { show(v, lang); });
return b;
};
bar.appendChild(mk('', 'Off'));
for (var i = 0; i < list.length; i++) {
var code = String(list[i].language || '').toLowerCase();
bar.appendChild(mk(code, NAMES[code] || (list[i].label || code)));
}
v.parentNode.insertBefore(bar, v.nextSibling);
}
function init() {
var vids = document.querySelectorAll('video');
var lang = chosen();
for (var i = 0; i < vids.length; i++) {
if (!tracksOf(vids[i]).length) continue;
build(vids[i]);
// English readers get nothing over the picture; a chosen language turns itself on
show(vids[i], lang && lang !== 'en' ? lang : '');
}
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
else init();
window.addEventListener('storage', function (e) { if (!e || e.key === 'rmc.lang') init(); });
window.RMCCaptions = { refresh: init };
})();
+130 -100
View File
@@ -1,100 +1,130 @@
// Proves the caption tracks actually load and follow the member's chosen language.
//
// A .vtt served with the wrong Content-Type is silently ignored by the browser, and a
// track that fails to parse shows zero cues with no error anywhere. So checking the
// markup is not enough: this reads the parsed cues back out of the player itself.
//
// Run: LOCAL=http://127.0.0.1:3399 node qa/captions-e2e.mjs
// LOCAL=https://rmcircle.team node qa/captions-e2e.mjs
import { pathToFileURL } from 'node:url';
import fs from 'node:fs';
const PW = 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright';
const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default;
const B = process.env.LOCAL || 'http://127.0.0.1:3399';
const ok = [], bad = [];
const t = (n, c, extra) => { (c ? ok : bad).push(n + (c || !extra ? '' : ' -> ' + extra)); };
// the captioned set is whatever training.html actually wires up, so this suite follows
// the page rather than a list that can drift out of date
const html = fs.readFileSync('public/training.html', 'utf8');
const players = [];
for (const m of html.matchAll(/<video[^>]*src="([^"]+\.mp4)"[^>]*>([\s\S]*?)<\/video>/g)) {
const langs = [...m[2].matchAll(/srclang="([a-z]+)"[^>]*src="([^"]+)"/g)].map(x => ({ lang: x[1], src: x[2] }));
if (langs.length) players.push({ video: m[1], langs });
}
t('training.html wires up captioned players', players.length > 0, String(players.length));
console.log('captioned players: ' + players.length);
// 1. every referenced file is served as real VTT with real cues
for (const p of players) {
for (const { lang, src } of p.langs) {
const r = await fetch(B + src);
const ct = r.headers.get('content-type') || '';
const body = r.ok ? await r.text() : '';
const cues = (body.match(/-->/g) || []).length;
t(src.split('/').pop() + ' served as text/vtt with cues',
r.ok && /text\/vtt/.test(ct) && body.startsWith('WEBVTT') && cues > 10,
r.status + ' ' + ct + ' cues=' + cues);
}
}
const browser = await chromium.launch();
const load = async lang => {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
await ctx.addInitScript(l => {
try { if (l) localStorage.setItem('rmc.lang', l); } catch (e) {}
// the event flyer covers the page and is not what this suite tests
const g = Storage.prototype.getItem;
Storage.prototype.getItem = function (k) {
if (/^rmc-promo-/.test(k)) return 'seen';
if (/^rmc-announce-/.test(k)) return 'done';
return g.call(this, k);
};
}, lang);
const page = await ctx.newPage();
await page.goto(B + '/training', { waitUntil: 'domcontentloaded' });
await page.waitForTimeout(3000);
return { ctx, page };
};
const read = page => page.evaluate(() => Array.from(document.querySelectorAll('video')).map(v => ({
src: v.getAttribute('src'),
tracks: Array.from(v.textTracks).map(tr => ({ lang: tr.language, mode: tr.mode, cues: tr.cues ? tr.cues.length : 0,
first: tr.cues && tr.cues[0] ? tr.cues[0].text : '' }))
})));
// 2. an English member: tracks are available but nothing is forced over the picture
let { ctx, page } = await load(null);
let vids = await read(page);
for (const p of players) {
const v = vids.find(x => x.src === p.video);
t('player has its tracks: ' + p.video.split('/').pop(), !!v && v.tracks.length === p.langs.length,
v ? String(v.tracks.length) : 'player not found');
t('nothing forced on for an English member: ' + p.video.split('/').pop(),
!!v && v.tracks.every(x => x.mode !== 'showing'), v && JSON.stringify(v.tracks.map(x => x.mode)));
}
await ctx.close();
// 3. each translated language: that track shows, parses, and is not English passthrough
const ENGLISH_OPENERS = /^(Most team builds|Welcome|Hey|In this video|Alright|So )/i;
for (const lang of ['it', 'fr', 'es']) {
({ ctx, page } = await load(lang));
await page.waitForTimeout(1500);
vids = await read(page);
for (const p of players) {
if (!p.langs.some(l => l.lang === lang)) continue;
const v = vids.find(x => x.src === p.video);
const tr = v && v.tracks.find(x => x.lang === lang);
const name = p.video.split('/').pop().slice(0, 30);
t(lang + ': showing on ' + name, !!tr && tr.mode === 'showing', tr ? tr.mode : 'track missing');
t(lang + ': cues parsed on ' + name, !!tr && tr.cues > 10, tr ? String(tr.cues) : '-');
t(lang + ': not English passthrough on ' + name, !!tr && !ENGLISH_OPENERS.test(tr.first), tr && tr.first.slice(0, 50));
t(lang + ': English not also showing on ' + name,
!!v && v.tracks.every(x => x.lang === lang || x.mode !== 'showing'), v && JSON.stringify(v.tracks.map(x => x.lang + ':' + x.mode)));
}
await ctx.close();
}
console.log('PASS ' + ok.length);
for (const b of bad) console.log('FAIL ' + b);
await browser.close();
process.exit(bad.length ? 1 : 0);
// Proves the caption tracks actually load and follow the member's chosen language.
//
// A .vtt served with the wrong Content-Type is silently ignored by the browser, and a
// track that fails to parse shows zero cues with no error anywhere. So checking the
// markup is not enough: this reads the parsed cues back out of the player itself.
//
// Run: LOCAL=http://127.0.0.1:3399 node qa/captions-e2e.mjs
// LOCAL=https://rmcircle.team node qa/captions-e2e.mjs
import { pathToFileURL } from 'node:url';
import fs from 'node:fs';
const PW = 'D:/Projects/MarketingAgent/qa-tester/node_modules/playwright';
const { chromium } = (await import(pathToFileURL(PW + '/index.js').href)).default;
const B = process.env.LOCAL || 'http://127.0.0.1:3399';
const ok = [], bad = [];
const t = (n, c, extra) => { (c ? ok : bad).push(n + (c || !extra ? '' : ' -> ' + extra)); };
// the captioned set is whatever training.html actually wires up, so this suite follows
// the page rather than a list that can drift out of date
const html = fs.readFileSync('public/training.html', 'utf8');
const players = [];
for (const m of html.matchAll(/<video[^>]*src="([^"]+\.mp4)"[^>]*>([\s\S]*?)<\/video>/g)) {
const langs = [...m[2].matchAll(/srclang="([a-z]+)"[^>]*src="([^"]+)"/g)].map(x => ({ lang: x[1], src: x[2] }));
if (langs.length) players.push({ video: m[1], langs });
}
t('training.html wires up captioned players', players.length > 0, String(players.length));
console.log('captioned players: ' + players.length);
// 1. every referenced file is served as real VTT with real cues
for (const p of players) {
for (const { lang, src } of p.langs) {
const r = await fetch(B + src);
const ct = r.headers.get('content-type') || '';
const body = r.ok ? await r.text() : '';
const cues = (body.match(/-->/g) || []).length;
t(src.split('/').pop() + ' served as text/vtt with cues',
r.ok && /text\/vtt/.test(ct) && body.startsWith('WEBVTT') && cues > 10,
r.status + ' ' + ct + ' cues=' + cues);
}
}
const browser = await chromium.launch();
const load = async lang => {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
await ctx.addInitScript(l => {
try { if (l) localStorage.setItem('rmc.lang', l); } catch (e) {}
// the event flyer covers the page and is not what this suite tests
const g = Storage.prototype.getItem;
Storage.prototype.getItem = function (k) {
if (/^rmc-promo-/.test(k)) return 'seen';
if (/^rmc-announce-/.test(k)) return 'done';
return g.call(this, k);
};
}, lang);
const page = await ctx.newPage();
await page.goto(B + '/training', { waitUntil: 'domcontentloaded' });
await page.waitForTimeout(3000);
return { ctx, page };
};
const read = page => page.evaluate(() => Array.from(document.querySelectorAll('video')).map(v => ({
src: v.getAttribute('src'),
tracks: Array.from(v.textTracks).map(tr => ({ lang: tr.language, mode: tr.mode, cues: tr.cues ? tr.cues.length : 0,
first: tr.cues && tr.cues[0] ? tr.cues[0].text : '' }))
})));
// 2. an English member: tracks are available but nothing is forced over the picture
let { ctx, page } = await load(null);
let vids = await read(page);
for (const p of players) {
const v = vids.find(x => x.src === p.video);
t('player has its tracks: ' + p.video.split('/').pop(), !!v && v.tracks.length === p.langs.length,
v ? String(v.tracks.length) : 'player not found');
t('nothing forced on for an English member: ' + p.video.split('/').pop(),
!!v && v.tracks.every(x => x.mode !== 'showing'), v && JSON.stringify(v.tracks.map(x => x.mode)));
}
await ctx.close();
// 3. each translated language: that track shows, parses, and is not English passthrough
const ENGLISH_OPENERS = /^(Most team builds|Welcome|Hey|In this video|Alright|So )/i;
for (const lang of ['it', 'fr', 'es', 'de', 'pt']) {
({ ctx, page } = await load(lang));
await page.waitForTimeout(1500);
vids = await read(page);
for (const p of players) {
if (!p.langs.some(l => l.lang === lang)) continue;
const v = vids.find(x => x.src === p.video);
const tr = v && v.tracks.find(x => x.lang === lang);
const name = p.video.split('/').pop().slice(0, 30);
t(lang + ': showing on ' + name, !!tr && tr.mode === 'showing', tr ? tr.mode : 'track missing');
t(lang + ': cues parsed on ' + name, !!tr && tr.cues > 10, tr ? String(tr.cues) : '-');
t(lang + ': not English passthrough on ' + name, !!tr && !ENGLISH_OPENERS.test(tr.first), tr && tr.first.slice(0, 50));
t(lang + ': English not also showing on ' + name,
!!v && v.tracks.every(x => x.lang === lang || x.mode !== 'showing'), v && JSON.stringify(v.tracks.map(x => x.lang + ':' + x.mode)));
}
await ctx.close();
}
// 4. DISCOVERABILITY. Marty could not find the captions on his own page because the
// native CC button is tiny and nothing switches on for an English reader. A feature
// nobody can find is not shipped, so every captioned player must carry visible chips.
({ ctx, page } = await load(null));
const bars = await page.evaluate(() => Array.from(document.querySelectorAll('video')).map(v => {
const bar = v.parentNode && v.parentNode.querySelector('.cap-bar');
return { src: v.getAttribute('src'), has: !!bar, labels: bar ? Array.from(bar.querySelectorAll('button[data-lang]')).map(b => b.textContent) : [] };
}));
for (const p of players) {
const b = bars.find(x => x.src === p.video);
const name = p.video.split('/').pop().slice(0, 30);
t('visible subtitle chips on ' + name, !!b && b.has, 'no .cap-bar');
t('chips cover every track plus Off on ' + name, !!b && b.labels.length === p.langs.length + 1, b && b.labels.join(','));
t('chips are named in their own language on ' + name, !!b && b.labels.includes('Italiano') && b.labels.includes('Deutsch'), b && b.labels.join(','));
}
// clicking a chip switches the track for an English reader who wants one
await page.click('.cap-bar button[data-lang="pt"]').catch(() => {});
await page.waitForTimeout(900);
const afterClick = await read(page);
const firstWithTracks = afterClick.find(v => v.tracks.length);
t('clicking a chip turns that language on', !!firstWithTracks && firstWithTracks.tracks.some(x => x.lang === 'pt' && x.mode === 'showing'),
firstWithTracks && JSON.stringify(firstWithTracks.tracks.map(x => x.lang + ':' + x.mode)));
await page.click('.cap-bar button[data-lang=""]').catch(() => {});
await page.waitForTimeout(700);
const afterOff = await read(page);
const off = afterOff.find(v => v.tracks.length);
t('"Off" turns captions back off', !!off && off.tracks.every(x => x.mode !== 'showing'),
off && JSON.stringify(off.tracks.map(x => x.mode)));
await ctx.close();
console.log('PASS ' + ok.length);
for (const b of bad) console.log('FAIL ' + b);
await browser.close();
process.exit(bad.length ? 1 : 0);
+10
View File
@@ -93,6 +93,16 @@ t('no modal for the member without contact details', !(await modalOpen(p3)));
const body3 = await p3.evaluate(() => document.body.innerText.replace(/\s+/g, ' '));
t('the inbox explains why it needs an address', /Messages reach you here only/i.test(body3), body3.slice(0, 140));
t('the inbox ask is phrased as optional', /Optional, private, removable/i.test(body3));
// Marty, 2026-09-17: this button shipped with NO click handler and did nothing at all.
// Rendering it is not the test; it has to actually open the dialog.
t('the inbox "Add mine" button exists', await p3.evaluate(() => !!document.getElementById('msgAddContact')));
await p3.click('#msgAddContact').catch(() => {});
await p3.waitForTimeout(1400);
t('"Add mine" actually opens the profile dialog', await modalOpen(p3), 'button did nothing');
t('and that dialog uses the inbox wording', /inbox needs somewhere to reach you|reach you off the site/i.test(await cardText(p3)) || /username/i.test(await cardText(p3)), await cardText(p3));
t('and it can be closed', await p3.evaluate(() => !!document.getElementById('pgClose')));
await p3.click('#pgClose').catch(() => {}); await p3.waitForTimeout(500);
t('closing it leaves the inbox usable', !(await modalOpen(p3)));
// ---------- 4. nothing changed for visitors or shared links ----------
const anon = await ctxFor(null); const p4 = await anon.newPage();