Hey all i really hope you can help me out.
Im compiling a project and im getting 2 errors which are saying local function definitions are illegal.
Anyone know what this mean? And especially HOW to fix it??
Thanks.. Sorry if this is a noob question.. I AM still a noobcoder.
Greetz
15 25690
[quote=unknownbomb]Hey all i really hope you can help me out.
Im compiling a project and im getting 2 errors which are saying local function definitions are illegal.
Anyone know what this mean? And especially HOW to fix it??
Thanks.. Sorry if this is a noob question.. I AM still a noobcoder.
Greetz[/QUOTE
it would be betterif u could post some code
ssharish
Sure !
Compiling...
cOpenGL.cpp
D:\TLS-GL\cOpenGL.cpp(206) : error C2601: 'hooked_wglSwapBuffers' : local function definitions are illegal
D:\TLS-GL\cOpenGL.cpp(211) : error C2601: 'CodeWalk' : local function definitions are illegal
.
Error 1:
void APIENTRY hooked_wglSwapBuffers (HDC hDC)
{
pwglSwapBuffers( hDC );
}
Error 2: (in the beginning here arrow points at so think its here somewhere what i made bold) void CodeWalk( DWORD dwStartAddress, DWORD dwEndAddress )
{
for ( DWORD dwCurrentAddress = dwStartAddress; dwCurrentAddress <= dwEndAddress-0x6; dwCurrentAddress+=0x6 ) { PDWORD pdwTempAddress = ( PDWORD ) dwCurrentAddress + 0x2;
PDWORD pdwTableAddress = ( PDWORD ) *pdwTempAddress;
HMODULE hmOpenGL = LoadLibrary( "opengl32.dll" );
if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glBegin" ) )
{
pglBegin = ( glBegin_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glBegin;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glBlendFunc" ) )
{
pglBlendFunc = ( glBlendFunc_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glBlendFunc;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glClear" ) )
{
pglClear = ( glClear_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glClear;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glEnable" ) )
{
pglEnable = ( glEnable_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glEnable;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glEnd" ) )
{
pglEnd = ( glEnd_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glEnd;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glPopMatrix" ) )
{
pglPopMatrix = ( glPopMatrix_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glPopMatrix;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glPushMatrix" ) )
{
pglPushMatrix = ( glPushMatrix_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glPushMatrix;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glShadeModel" ) )
{
pglShadeModel = ( glShadeModel_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glShadeModel;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glVertex2f" ) )
{
pglVertex2f = ( glVertex2f_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glVertex2f;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glVertex3f" ) )
{
pglVertex3f = ( glVertex3f_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glVertex3f;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glVertex3fv" ) )
{
pglVertex3fv = ( glVertex3fv_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glVertex3fv;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glViewport" ) )
{
pglViewport = ( glViewport_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_glViewport;
}
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "wglSwapBuffers" ) )
{
pwglSwapBuffers = ( wglSwapBuffers_t ) *pdwTableAddress;
*pdwTableAddress = ( DWORD ) &hooked_wglSwapBuffers;
}
}
}
Banfa 9,065
Expert Mod 8TB
You made the mistake of thinking you knew where the error in your code was so you have not posted enough code for us to be able to highlight your error in your code.
However the error you are getting is because you can not declare a function inside another function, this would produce the error -
void myfunction1(void)
-
{
-
void myfunction2(void)
-
{
-
}
-
-
myfunction2(void);
-
}
-
this needs to be written as -
void myfunction2(void);
-
-
void myfunction1(void)
-
{
-
myfunction2(void);
-
}
-
-
void myfunction2(void)
-
{
-
}
-
-
#include <windows.h>
-
#include <gl\gl.h>
-
#include <gl\glu.h>
-
#include <gl\glaux.h>
-
#include "cOpenGL.h"
-
#include "cPatch.h"
-
#include "cVariables.h"
-
#include "Functions.h"
-
#include "SDK.h"
-
#include "xorstr.h"
-
#pragma comment(lib,"OpenGL32.lib")
-
#pragma comment(lib,"GLu32.lib")
-
#pragma comment(lib,"GLaux.lib")
-
//=======================
-
glBegin_t pglBegin;
-
glBlendFunc_t pglBlendFunc;
-
glClear_t pglClear;
-
glEnable_t pglEnable;
-
glEnd_t pglEnd;
-
glPopMatrix_t pglPopMatrix;
-
glPushMatrix_t pglPushMatrix;
-
glShadeModel_t pglShadeModel;
-
glVertex2f_t pglVertex2f;
-
glVertex3f_t pglVertex3f;
-
glVertex3fv_t pglVertex3fv;
-
glViewport_t pglViewport;
-
wglSwapBuffers_t pwglSwapBuffers;
-
//==============================================================================
-
bool oglSubtractive = false;
-
//==============================================================================
-
int centerX = 0; // center of our screen width
-
int centerY = 0; // center of our screen height
-
int GAME_ID; // get game id
-
//==============================================================================
-
struct cl_enginefuncs_s gEngfuncs;
-
struct engine_studio_api_s IEngineStudio;
-
cl_enginefuncs_s* pEngfuncs = (cl_enginefuncs_s*) EF_OFFSET;
-
engine_studio_api_s* pEngStudio = (engine_studio_api_s*) ES_OFFSET;
-
playermove_s* ppmove = (playermove_s*) PM_OFFSET;
-
//==============================================================================
-
SCREENINFO screeninfo;
-
//==============================================================================
-
bool isValidEnt(cl_entity_s *ent)
-
{
-
if(ent && (ent != pEngfuncs->GetLocalPlayer()) && !(ent->curstate.effects & EF_NODRAW) && ent->player && !ent->curstate.spectator && ent->curstate.solid && !(ent->curstate.messagenum < pEngfuncs->GetLocalPlayer()->curstate.messagenum))
-
{return true;}
-
else{return false;}
-
}
-
//==============================================================================
-
int DrawLen(char *fmt)
-
{
-
int len=0;
-
for ( char * p = fmt; *p; p++ )
-
len+=screeninfo.charWidths[*p];
-
return len;
-
}
-
//==============================================================================
-
void DrawHudString(int x,int y,int r,int g,int b,char * fmt, ... )
-
{
-
va_list va_alist;
-
char buf[512];
-
va_start (va_alist, fmt);
-
_vsnprintf (buf, sizeof(buf), fmt, va_alist);
-
va_end (va_alist);
-
-
for ( char * p = buf; *p; p++ )
-
{
-
int next = x + screeninfo.charWidths[*p];
-
pEngfuncs->pfnDrawCharacter(x, y, *p, r, g, b);
-
x = next;
-
}
-
}
-
//==============================================================================
-
void DrawHudStringCenter(int x,int y,int r,int g,int b,char * fmt, ... )
-
{
-
va_list va_alist;
-
char buf[512];
-
va_start (va_alist, fmt);
-
_vsnprintf (buf, sizeof(buf), fmt, va_alist);
-
va_end (va_alist);
-
-
int drawLen = DrawLen(buf);
-
x -= drawLen/2;
-
-
for ( char * p = buf; *p; p++ )
-
{
-
int next = x + screeninfo.charWidths[*p];
-
pEngfuncs->pfnDrawCharacter(x, y, *p, r, g, b);
-
x = next;
-
}
-
}
-
//==============================================================================
-
bool CalcScreen( float *origin, float *vecScreen )
-
{
-
int cResult = 0;
-
if( pEngfuncs->GetLocalPlayer() != NULL )
-
cResult = pEngfuncs->pTriAPI->WorldToScreen( origin, vecScreen );
-
if( vecScreen[0] < 1 && vecScreen[1] < 1 && vecScreen[0] > -1 && vecScreen [1] > -1 && !cResult )
-
{
-
vecScreen[0] = vecScreen[0] * centerX + centerX;
-
vecScreen[1] = -vecScreen[1] * centerY + centerY;
-
return true;
-
}
-
return false;
-
}
-
//==============================================================================
-
void FillArea(int x,int y,int w,int h,int r,int g,int b,int a)
-
{
-
oglSubtractive=true;
-
pEngfuncs->pfnFillRGBA(x,y,w,h,r,g,b,a);
-
oglSubtractive=false;
-
}
-
//==============================================================================
-
void AtRoundStart()
-
{
-
-
}
-
//==============================================================================
-
void DrawOnHud ( void )
-
{
-
-
}
-
//==============================================================================
-
void APIENTRY hooked_glBegin( GLenum mode )
-
{
-
//Example XQZ Wallhack
-
if (mode == GL_TRIANGLE_STRIP || mode == GL_TRIANGLE_FAN) (glDisable)(GL_DEPTH_TEST);
-
pglBegin( mode );
-
}
-
//==============================================================================
-
void APIENTRY hooked_glBlendFunc( GLenum sfactor, GLenum dfactor )
-
{
-
pglBlendFunc(sfactor, dfactor);
-
}
-
//==============================================================================
-
void APIENTRY hooked_glClear(GLbitfield mask)
-
{
-
pglClear(mask);
-
}
-
//==============================================================================
-
void APIENTRY hooked_glEnable(GLenum cap)
-
{
-
pglEnable(cap);
-
}
-
//==============================================================================
-
void APIENTRY hooked_glEnd(void)
-
{
-
pglEnd( );
-
}
-
//==============================================================================
-
-
void APIENTRY hooked_glPopMatrix( GLvoid )
-
{
-
pglPopMatrix( );
-
}
-
//==============================================================================
-
void APIENTRY hooked_glPushMatrix( GLvoid )
-
{
-
pglPushMatrix( );
-
}
-
//==============================================================================
-
void APIENTRY hooked_glShadeModel (GLenum mode)
-
{
-
pglShadeModel( mode );
-
}
-
//==============================================================================
-
void APIENTRY hooked_glVertex2f(GLfloat x, GLfloat y)
-
{
-
pglVertex2f(x, y);
-
}
-
//==============================================================================
-
void APIENTRY hooked_glVertex3f(GLfloat x, GLfloat y, GLfloat z)
-
{
-
pglVertex3f(x, y, z);
-
}
-
//==============================================================================
-
void APIENTRY hooked_glVertex3fv(const GLfloat *v)
-
{
-
pglVertex3fv( v );
-
}
-
//==============================================================================
-
void APIENTRY hooked_glViewport( GLint x, GLint y, GLsizei width, GLsizei height )
-
{
-
static bool bInit = false;
-
if(!bInit)
-
{
-
pEngfuncs->pfnConsolePrint("Hello world"); // origineel he!
-
pEngfuncs->pfnClientCmd("toggleconsole");
-
bInit = true;
-
}
-
pglViewport( x, y, width, height );
-
-
//==============================================================================
-
void APIENTRY hooked_wglSwapBuffers (HDC hDC)
-
{
-
pwglSwapBuffers( hDC );
-
}
-
//==============================================================================
-
void CodeWalk( DWORD dwStartAddress, DWORD dwEndAddress )
-
{
-
for ( DWORD dwCurrentAddress = dwStartAddress; dwCurrentAddress <= dwEndAddress-0x6; dwCurrentAddress+=0x6 )
-
-
{ PDWORD pdwTempAddress = ( PDWORD ) dwCurrentAddress + 0x2;
-
-
PDWORD pdwTableAddress = ( PDWORD ) *pdwTempAddress;
-
-
HMODULE hmOpenGL = LoadLibrary( "opengl32.dll" );
-
-
if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glBegin" ) )
-
{
-
pglBegin = ( glBegin_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glBegin;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glBlendFunc" ) )
-
{
-
pglBlendFunc = ( glBlendFunc_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glBlendFunc;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glClear" ) )
-
{
-
pglClear = ( glClear_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glClear;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glEnable" ) )
-
{
-
pglEnable = ( glEnable_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glEnable;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glEnd" ) )
-
{
-
pglEnd = ( glEnd_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glEnd;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glPopMatrix" ) )
-
{
-
pglPopMatrix = ( glPopMatrix_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glPopMatrix;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glPushMatrix" ) )
-
{
-
pglPushMatrix = ( glPushMatrix_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glPushMatrix;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glShadeModel" ) )
-
{
-
pglShadeModel = ( glShadeModel_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glShadeModel;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glVertex2f" ) )
-
{
-
pglVertex2f = ( glVertex2f_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glVertex2f;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glVertex3f" ) )
-
{
-
pglVertex3f = ( glVertex3f_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glVertex3f;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glVertex3fv" ) )
-
{
-
pglVertex3fv = ( glVertex3fv_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glVertex3fv;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "glViewport" ) )
-
{
-
pglViewport = ( glViewport_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_glViewport;
-
}
-
else if ( *pdwTableAddress == ( DWORD ) GetProcAddress( hmOpenGL, "wglSwapBuffers" ) )
-
{
-
pwglSwapBuffers = ( wglSwapBuffers_t ) *pdwTableAddress;
-
*pdwTableAddress = ( DWORD ) &hooked_wglSwapBuffers;
-
}
-
}
-
}
-
//==============================================================================
-
void SetupOpenGLHooks( void )
-
-
; DWORD dwImportCode = pPatch->dwFindPattern( 0x01D7AC00, 0x000FF000 , (BYTE*) "\xA1\xFF\xFF\xFF\xFF\x56\x33\xF6\x3B\xC6\x74\x07\x50" ,"x????xxxxxxxx" );
-
-
if(dwImportCode == NULL)
-
{
-
return;
-
}
-
else
-
{
-
dwImportCode += 0x13;
-
CodeWalk(dwImportCode,dwImportCode + 0x870);
-
}
-
}
-
Thats my whole code..
Might you can highlight it now WHAT i have to Change???
Thanks mate.. If u find it you are a hero :P
Banfa 9,065
Expert Mod 8TB -
//================================================== ============================
-
void APIENTRY hooked_glViewport( GLint x, GLint y, GLsizei width, GLsizei height )
-
{
-
static bool bInit = false;
-
if(!bInit)
-
{
-
pEngfuncs->pfnConsolePrint("Hello world"); // origineel he!
-
pEngfuncs->pfnClientCmd("toggleconsole");
-
bInit = true;
-
}
-
pglViewport( x, y, width, height );
-
- // You are missing a } at this place in the code
-
-
//================================================== ============================
-
void APIENTRY hooked_wglSwapBuffers (HDC hDC)
-
{
-
pwglSwapBuffers( hDC );
-
}
-
//================================================== ============================
-
You make have other errors of this type, I searched for the specific error rather than checking all your code.
Banfa 9,065
Expert Mod 8TB
In Fact -
//================================================== ============================
-
void SetupOpenGLHooks( void )
- // You are missing a { at this point in the code
-
; DWORD dwImportCode = pPatch->dwFindPattern( 0x01D7AC00, 0x000FF000 , (BYTE*) "\xA1\xFF\xFF\xFF\xFF\x56\x33\xF6\x3B\xC6\x74\x07\x 50" ,"x????xxxxxxxx" );
-
-
if(dwImportCode == NULL)
-
{
-
return;
-
}
-
else
-
{
-
dwImportCode += 0x13;
-
CodeWalk(dwImportCode,dwImportCode + 0x870);
-
}
-
}
-
Doesnt help a thing only get 2 more errors :S
cOpenGL.cpp
D:\TLS-GL\cOpenGL.cpp(206) : error C2601: 'hooked_wglSwapBuffers' : local function definitions are illegal
D:\TLS-GL\cOpenGL.cpp(212) : error C2601: 'CodeWalk' : local function definitions are illegal
D:\TLS-GL\cOpenGL.cpp(290) : error C2601: 'SetupOpenGLHooks' : local function definitions are illegal
D:\TLS-GL\cOpenGL.cpp(304) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
cOpenGL.obj - 4 error(s), 0 warning(s) -
void SetupOpenGLHooks( void )
-
{
-
; DWORD dwImportCode = pPatch->dwFindPattern( 0x01D7AC00, 0x000FF000 , (BYTE*) "\xA1\xFF\xFF\xFF\xFF\x56\x33\xF6\x3B\xC6\x74\x07\x50" ,"x????xxxxxxxx" );
-
-
if(dwImportCode == NULL)
-
{
-
return;
-
}
-
else
-
{
-
dwImportCode += 0x13;
-
CodeWalk(dwImportCode,dwImportCode + 0x870);
-
}
-
}
-
Also if i put // { it doesnt work either
But error isnt pointing here so i dont know if u are doing good? But i guess u are and have more knowlegde than me!
Banfa 9,065
Expert Mod 8TB
But error isnt pointing here so i dont know if u are doing good? But i guess u are and have more knowlegde than me!
You have only read and implemented 1 of the 2 fixes I gave.
You will need to implement them both.
Read both of my previous 2 posts.
Oh Stupid me.:P it works
THANK U VERY MUCH :D
Great.. Made a hack and now if i start it and after it start the game the game doesnt start up and gives error -.-
Very maybe someone knows answer on this ??
If i start up my injecting hack.. (First open exe file i press OK and then it gonna bbe injected if i start the game) so i start game and it gives me an Fatal error and it close :(
Banfa 9,065
Expert Mod 8TB
Very maybe someone knows answer on this ??
If i start up my injecting hack.. (First open exe file i press OK and then it gonna bbe injected if i start the game) so i start game and it gives me an Fatal error and it close :(
What gives you a fatal error?
Sign in to post your reply or Sign up for a free account.
Similar topics
by: Kobu |
last post by:
Does anyone know how old style function definitions differ in
"behaviour" to new style function definitions?
I heard the old style function definitions caused integeral promotion
and floating...
|
by: murphy |
last post by:
Hi,
I've been seeing two symptoms with my asp.net site that have started
recently after a long period of smooth running. As others on our team
make changes to referenced dll's I find that I...
|
by: Olov Johansson |
last post by:
I just found out that JavaScript 1.5 (I tested this with Firefox 1.0.7
and Konqueror 3.5) has support not only for standard function
definitions, function expressions (lambdas) and Function...
|
by: kaygee |
last post by:
Hi ppl can anyone tell me what this error means?
error C2601: 'meanData' : local function definitions are illegal
|
by: subramanian100in |
last post by:
Suppose I have
#include <stdio.h>
#include <string.h>
size_t strlen(const char *str)
{
printf("from strlen - %s\n", str);
return 0; // return some dummy value
|
by: dheerajkoli |
last post by:
hello friends ,
i m getting a problem on when i compiling a my project in vc++6.0
error C2274: 'function-style cast' : illegal as right side of '.' operator.
please help me .
if any hint...
|
by: MrHenry007 |
last post by:
Hello!
I'm fairly new to c++ but I have been following tutorials and have created functions before, but not one using a string. I can't work out what the problem is here.
The function is supposed...
|
by: kirayamato1992 |
last post by:
i wrote some codes for my assignments.
then it came out several problems involving illegal local function definition.
#include <iostream>
using namespace std;
void system_module();
void...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
| |