Azure build fails with “ng” unrecognized
up vote
0
down vote
favorite
I am trying to deploy angular application with azure +"kudu" .In build script It doesn't pick up "Ng keyword".
I have set default node version to higher one
angular dependencies added to dependency list as well.
i have tried almost all the solutions in the internet but cannot make this work,can someone please help me to resolve this
build script result
Command: deploy.cmd
D:homesiterepository
D:homesiterepository..artifacts
D:homesitewwwroot
D:homesiterepository
Handling node.js deployment.
before npm install
Looking for app.js/server.js under site root.
Invalid start-up command "ng serve" in package.json. Please use the format "node <script relative path>".
The package.json file does not specify node.js engine version constraints.
Missing server.js/app.js files, web.config is not generated
The node.js application will run with the default node.js version 10.6.0.
'ng' is not recognized as an internal or external command,
Selected npm version 6.1.0
operable program or batch file.
after npm install
npm ERR! code ELIFECYCLE
package json exist
npm ERR! errno 1
if angular json exists
npm ERR! frontend-angular-app@0.0.0 build: `ng build --prod`
Building app in "D:homesiterepository"
npm ERR! Exit status 1
my package.json
{
"name": "frontend-angular-app",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^6.1.0",
"@angular/common": "^6.1.0",
"@angular/compiler": "^6.1.0",
"@angular/core": "^6.1.0",
"@angular/cli": "~6.1.3",
"@angular/compiler-cli": "^6.1.0",
"@angular/forms": "^6.1.0",
"@angular/http": "^6.1.0",
"@angular/platform-browser": "^6.1.0",
"@angular/platform-browser-dynamic": "^6.1.0",
"@angular/router": "^6.1.0",
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"ag-grid-angular": "^19.1.1",
"ag-grid-community": "^19.1.1",
"angular2-moment": "^1.9.0",
"bootstrap": "^4.1.3",
"chart.js": "^2.7.3",
"core-js": "^2.5.4",
"font-awesome": "^4.7.0",
"moment": "^2.22.2",
"rxjs": "^6.0.0",
"xlsx": "^0.14.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"@types/jasmine": "~2.8.6",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "~4.2.1",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.0",
"karma-jasmine": "~1.1.1",
"karma-jasmine-html-reporter": "^0.2.2",
"ng2-chartjs2": "^1.2.0",
"protractor": "~5.3.0",
"ts-node": "~5.0.1",
"tslint": "~5.9.1",
"typescript": "~2.7.2"
}
}
my build.cmd
IF EXIST "%DEPLOYMENT_TARGET%package.json" (
echo package json exist
pushd "%DEPLOYMENT_TARGET%"
call :ExecuteCmd !NPM_CMD! install --production
IF !ERRORLEVEL! NEQ 0 goto error
popd
)
echo after npm install
IF EXIST "%DEPLOYMENT_SOURCE%angular.json" (
echo if angular json exists
echo Building app in "%DEPLOYMENT_SOURCE%"
call :ExecuteCmd !NPM_CMD! run build
IF !ERRORLEVEL NEQ 0 goto error
popd
)
echo build done
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%/dist" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
in azure application settings
WEBSITE_NODE_DEFAULT_VERSION:10.6.0
angular azure deployment kudu
|
show 1 more comment
up vote
0
down vote
favorite
I am trying to deploy angular application with azure +"kudu" .In build script It doesn't pick up "Ng keyword".
I have set default node version to higher one
angular dependencies added to dependency list as well.
i have tried almost all the solutions in the internet but cannot make this work,can someone please help me to resolve this
build script result
Command: deploy.cmd
D:homesiterepository
D:homesiterepository..artifacts
D:homesitewwwroot
D:homesiterepository
Handling node.js deployment.
before npm install
Looking for app.js/server.js under site root.
Invalid start-up command "ng serve" in package.json. Please use the format "node <script relative path>".
The package.json file does not specify node.js engine version constraints.
Missing server.js/app.js files, web.config is not generated
The node.js application will run with the default node.js version 10.6.0.
'ng' is not recognized as an internal or external command,
Selected npm version 6.1.0
operable program or batch file.
after npm install
npm ERR! code ELIFECYCLE
package json exist
npm ERR! errno 1
if angular json exists
npm ERR! frontend-angular-app@0.0.0 build: `ng build --prod`
Building app in "D:homesiterepository"
npm ERR! Exit status 1
my package.json
{
"name": "frontend-angular-app",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^6.1.0",
"@angular/common": "^6.1.0",
"@angular/compiler": "^6.1.0",
"@angular/core": "^6.1.0",
"@angular/cli": "~6.1.3",
"@angular/compiler-cli": "^6.1.0",
"@angular/forms": "^6.1.0",
"@angular/http": "^6.1.0",
"@angular/platform-browser": "^6.1.0",
"@angular/platform-browser-dynamic": "^6.1.0",
"@angular/router": "^6.1.0",
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"ag-grid-angular": "^19.1.1",
"ag-grid-community": "^19.1.1",
"angular2-moment": "^1.9.0",
"bootstrap": "^4.1.3",
"chart.js": "^2.7.3",
"core-js": "^2.5.4",
"font-awesome": "^4.7.0",
"moment": "^2.22.2",
"rxjs": "^6.0.0",
"xlsx": "^0.14.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"@types/jasmine": "~2.8.6",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "~4.2.1",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.0",
"karma-jasmine": "~1.1.1",
"karma-jasmine-html-reporter": "^0.2.2",
"ng2-chartjs2": "^1.2.0",
"protractor": "~5.3.0",
"ts-node": "~5.0.1",
"tslint": "~5.9.1",
"typescript": "~2.7.2"
}
}
my build.cmd
IF EXIST "%DEPLOYMENT_TARGET%package.json" (
echo package json exist
pushd "%DEPLOYMENT_TARGET%"
call :ExecuteCmd !NPM_CMD! install --production
IF !ERRORLEVEL! NEQ 0 goto error
popd
)
echo after npm install
IF EXIST "%DEPLOYMENT_SOURCE%angular.json" (
echo if angular json exists
echo Building app in "%DEPLOYMENT_SOURCE%"
call :ExecuteCmd !NPM_CMD! run build
IF !ERRORLEVEL NEQ 0 goto error
popd
)
echo build done
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%/dist" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
in azure application settings
WEBSITE_NODE_DEFAULT_VERSION:10.6.0
angular azure deployment kudu
1
Try using local version ofng
. For example, instead of executingng run --prod
usenpm run build
– yurzui
Nov 11 at 4:16
i'll give it a try
– Heshan
Nov 11 at 4:19
it did n't make any difference :(
– Heshan
Nov 11 at 4:30
trynode node_modules/.bin/ng build --prod
instead ofng build --prod
– David
Nov 11 at 10:40
will update after trying @david
– Heshan
Nov 11 at 11:42
|
show 1 more comment
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I am trying to deploy angular application with azure +"kudu" .In build script It doesn't pick up "Ng keyword".
I have set default node version to higher one
angular dependencies added to dependency list as well.
i have tried almost all the solutions in the internet but cannot make this work,can someone please help me to resolve this
build script result
Command: deploy.cmd
D:homesiterepository
D:homesiterepository..artifacts
D:homesitewwwroot
D:homesiterepository
Handling node.js deployment.
before npm install
Looking for app.js/server.js under site root.
Invalid start-up command "ng serve" in package.json. Please use the format "node <script relative path>".
The package.json file does not specify node.js engine version constraints.
Missing server.js/app.js files, web.config is not generated
The node.js application will run with the default node.js version 10.6.0.
'ng' is not recognized as an internal or external command,
Selected npm version 6.1.0
operable program or batch file.
after npm install
npm ERR! code ELIFECYCLE
package json exist
npm ERR! errno 1
if angular json exists
npm ERR! frontend-angular-app@0.0.0 build: `ng build --prod`
Building app in "D:homesiterepository"
npm ERR! Exit status 1
my package.json
{
"name": "frontend-angular-app",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^6.1.0",
"@angular/common": "^6.1.0",
"@angular/compiler": "^6.1.0",
"@angular/core": "^6.1.0",
"@angular/cli": "~6.1.3",
"@angular/compiler-cli": "^6.1.0",
"@angular/forms": "^6.1.0",
"@angular/http": "^6.1.0",
"@angular/platform-browser": "^6.1.0",
"@angular/platform-browser-dynamic": "^6.1.0",
"@angular/router": "^6.1.0",
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"ag-grid-angular": "^19.1.1",
"ag-grid-community": "^19.1.1",
"angular2-moment": "^1.9.0",
"bootstrap": "^4.1.3",
"chart.js": "^2.7.3",
"core-js": "^2.5.4",
"font-awesome": "^4.7.0",
"moment": "^2.22.2",
"rxjs": "^6.0.0",
"xlsx": "^0.14.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"@types/jasmine": "~2.8.6",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "~4.2.1",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.0",
"karma-jasmine": "~1.1.1",
"karma-jasmine-html-reporter": "^0.2.2",
"ng2-chartjs2": "^1.2.0",
"protractor": "~5.3.0",
"ts-node": "~5.0.1",
"tslint": "~5.9.1",
"typescript": "~2.7.2"
}
}
my build.cmd
IF EXIST "%DEPLOYMENT_TARGET%package.json" (
echo package json exist
pushd "%DEPLOYMENT_TARGET%"
call :ExecuteCmd !NPM_CMD! install --production
IF !ERRORLEVEL! NEQ 0 goto error
popd
)
echo after npm install
IF EXIST "%DEPLOYMENT_SOURCE%angular.json" (
echo if angular json exists
echo Building app in "%DEPLOYMENT_SOURCE%"
call :ExecuteCmd !NPM_CMD! run build
IF !ERRORLEVEL NEQ 0 goto error
popd
)
echo build done
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%/dist" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
in azure application settings
WEBSITE_NODE_DEFAULT_VERSION:10.6.0
angular azure deployment kudu
I am trying to deploy angular application with azure +"kudu" .In build script It doesn't pick up "Ng keyword".
I have set default node version to higher one
angular dependencies added to dependency list as well.
i have tried almost all the solutions in the internet but cannot make this work,can someone please help me to resolve this
build script result
Command: deploy.cmd
D:homesiterepository
D:homesiterepository..artifacts
D:homesitewwwroot
D:homesiterepository
Handling node.js deployment.
before npm install
Looking for app.js/server.js under site root.
Invalid start-up command "ng serve" in package.json. Please use the format "node <script relative path>".
The package.json file does not specify node.js engine version constraints.
Missing server.js/app.js files, web.config is not generated
The node.js application will run with the default node.js version 10.6.0.
'ng' is not recognized as an internal or external command,
Selected npm version 6.1.0
operable program or batch file.
after npm install
npm ERR! code ELIFECYCLE
package json exist
npm ERR! errno 1
if angular json exists
npm ERR! frontend-angular-app@0.0.0 build: `ng build --prod`
Building app in "D:homesiterepository"
npm ERR! Exit status 1
my package.json
{
"name": "frontend-angular-app",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^6.1.0",
"@angular/common": "^6.1.0",
"@angular/compiler": "^6.1.0",
"@angular/core": "^6.1.0",
"@angular/cli": "~6.1.3",
"@angular/compiler-cli": "^6.1.0",
"@angular/forms": "^6.1.0",
"@angular/http": "^6.1.0",
"@angular/platform-browser": "^6.1.0",
"@angular/platform-browser-dynamic": "^6.1.0",
"@angular/router": "^6.1.0",
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"ag-grid-angular": "^19.1.1",
"ag-grid-community": "^19.1.1",
"angular2-moment": "^1.9.0",
"bootstrap": "^4.1.3",
"chart.js": "^2.7.3",
"core-js": "^2.5.4",
"font-awesome": "^4.7.0",
"moment": "^2.22.2",
"rxjs": "^6.0.0",
"xlsx": "^0.14.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.7.0",
"@angular/language-service": "^6.1.0",
"@types/jasmine": "~2.8.6",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"codelyzer": "~4.2.1",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~1.7.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.0",
"karma-jasmine": "~1.1.1",
"karma-jasmine-html-reporter": "^0.2.2",
"ng2-chartjs2": "^1.2.0",
"protractor": "~5.3.0",
"ts-node": "~5.0.1",
"tslint": "~5.9.1",
"typescript": "~2.7.2"
}
}
my build.cmd
IF EXIST "%DEPLOYMENT_TARGET%package.json" (
echo package json exist
pushd "%DEPLOYMENT_TARGET%"
call :ExecuteCmd !NPM_CMD! install --production
IF !ERRORLEVEL! NEQ 0 goto error
popd
)
echo after npm install
IF EXIST "%DEPLOYMENT_SOURCE%angular.json" (
echo if angular json exists
echo Building app in "%DEPLOYMENT_SOURCE%"
call :ExecuteCmd !NPM_CMD! run build
IF !ERRORLEVEL NEQ 0 goto error
popd
)
echo build done
:: 1. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%/dist" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
in azure application settings
WEBSITE_NODE_DEFAULT_VERSION:10.6.0
angular azure deployment kudu
angular azure deployment kudu
asked Nov 11 at 3:59
Heshan
937
937
1
Try using local version ofng
. For example, instead of executingng run --prod
usenpm run build
– yurzui
Nov 11 at 4:16
i'll give it a try
– Heshan
Nov 11 at 4:19
it did n't make any difference :(
– Heshan
Nov 11 at 4:30
trynode node_modules/.bin/ng build --prod
instead ofng build --prod
– David
Nov 11 at 10:40
will update after trying @david
– Heshan
Nov 11 at 11:42
|
show 1 more comment
1
Try using local version ofng
. For example, instead of executingng run --prod
usenpm run build
– yurzui
Nov 11 at 4:16
i'll give it a try
– Heshan
Nov 11 at 4:19
it did n't make any difference :(
– Heshan
Nov 11 at 4:30
trynode node_modules/.bin/ng build --prod
instead ofng build --prod
– David
Nov 11 at 10:40
will update after trying @david
– Heshan
Nov 11 at 11:42
1
1
Try using local version of
ng
. For example, instead of executing ng run --prod
use npm run build
– yurzui
Nov 11 at 4:16
Try using local version of
ng
. For example, instead of executing ng run --prod
use npm run build
– yurzui
Nov 11 at 4:16
i'll give it a try
– Heshan
Nov 11 at 4:19
i'll give it a try
– Heshan
Nov 11 at 4:19
it did n't make any difference :(
– Heshan
Nov 11 at 4:30
it did n't make any difference :(
– Heshan
Nov 11 at 4:30
try
node node_modules/.bin/ng build --prod
instead of ng build --prod
– David
Nov 11 at 10:40
try
node node_modules/.bin/ng build --prod
instead of ng build --prod
– David
Nov 11 at 10:40
will update after trying @david
– Heshan
Nov 11 at 11:42
will update after trying @david
– Heshan
Nov 11 at 11:42
|
show 1 more comment
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245728%2fazure-build-fails-with-ng-unrecognized%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Try using local version of
ng
. For example, instead of executingng run --prod
usenpm run build
– yurzui
Nov 11 at 4:16
i'll give it a try
– Heshan
Nov 11 at 4:19
it did n't make any difference :(
– Heshan
Nov 11 at 4:30
try
node node_modules/.bin/ng build --prod
instead ofng build --prod
– David
Nov 11 at 10:40
will update after trying @david
– Heshan
Nov 11 at 11:42