Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 051f851

Browse filesBrowse files
committed
Merge remote-tracking branch 'origin/sdk_version2' into fixing_sdk_version
2 parents 614dafb + cd92587 commit 051f851
Copy full SHA for 051f851

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree

43 files changed

+257
-130
lines changed

‎CHANGELOG.md

Copy file name to clipboardExpand all lines: CHANGELOG.md
+14Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
## [8.3.6](https://github.com/NativeScript/NativeScript/compare/8.3.5-core...8.3.6) (2022-11-12)
2+
3+
4+
### Bug Fixes
5+
6+
* **android:** CSS style not working properly in modal pages ([#10070](https://github.com/NativeScript/NativeScript/issues/10070)) ([95c3b30](https://github.com/NativeScript/NativeScript/commit/95c3b3026db9316b126849671fb2be18549b6796))
7+
* **android:** WeakRef race condition on timers ([#10066](https://github.com/NativeScript/NativeScript/issues/10066)) ([a65fc06](https://github.com/NativeScript/NativeScript/commit/a65fc06c50dc9b6f6bab4d8068ac6d2ecaa78cdf))
8+
* **ios:** ensure view layout when using large titles ([#10044](https://github.com/NativeScript/NativeScript/issues/10044)) ([0552a3a](https://github.com/NativeScript/NativeScript/commit/0552a3a722469312044fd2e9c40be630d04312ec))
9+
* **ios:** page isRunningLayout ([#10078](https://github.com/NativeScript/NativeScript/issues/10078)) ([6f1a5d1](https://github.com/NativeScript/NativeScript/commit/6f1a5d16e310324a4e6a2622e2fdf992d2a775d5))
10+
* **ios:** prevent creating `ActionBar` when not needed ([#10017](https://github.com/NativeScript/NativeScript/issues/10017)) ([8094cf2](https://github.com/NativeScript/NativeScript/commit/8094cf207a4c5714fd0e592e8aa3adf4a4d377e0))
11+
* **ios:** tab page navigation when showing dialog messages ([#10075](https://github.com/NativeScript/NativeScript/issues/10075)) ([0337a33](https://github.com/NativeScript/NativeScript/commit/0337a3360d37a4b529e94e5f20e9b8f561f4ad1b))
12+
13+
14+
115
## [8.3.5](https://github.com/NativeScript/NativeScript/compare/8.3.4-core...8.3.5) (2022-09-23)
216

317

‎apps/automated/src/color/color-tests-common.ts

Copy file name to clipboardExpand all lines: apps/automated/src/color/color-tests-common.ts
+11Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,14 @@ export var test_rgba_Color_CSS = function () {
107107
TKUnit.assertEqual(color.hex, '#FF646480', 'Color.hex not properly parsed');
108108
TKUnit.assertEqual(color.argb, 0x80ff6464, 'Color.argb not properly parsed');
109109
};
110+
111+
export var test_Color_isValid = function () {
112+
var color = new Color('#FF0000');
113+
114+
TKUnit.assertEqual(Color.isValid(color), true, 'Failed to validate color instance');
115+
TKUnit.assertEqual(Color.isValid('#FF0000'), true, 'Failed to validate hex color');
116+
TKUnit.assertEqual(Color.isValid('rgb(255, 100, 100)'), true, 'Failed to validate rgb color');
117+
TKUnit.assertEqual(Color.isValid('hsl(50, 50%, 50%)'), true, 'Failed to validate hsl color');
118+
TKUnit.assertEqual(Color.isValid(null) || Color.isValid(undefined), false, 'Failed to invalidate nullish value');
119+
TKUnit.assertEqual(Color.isValid('iamnotaknowncolor'), false, 'Failed to invalidate unknown color');
120+
};

‎apps/toolbox/src/main-page.ts

Copy file name to clipboard
+5-1Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import { EventData, Page } from '@nativescript/core';
1+
import { EventData, Page, Utils } from '@nativescript/core';
22
import { HelloWorldModel } from './main-view-model';
33

44
export function navigatingTo(args: EventData) {
55
const page = <Page>args.object;
66
page.bindingContext = new HelloWorldModel();
7+
8+
if (global.isIOS) {
9+
Utils.ios.setWindowBackgroundColor('blue');
10+
}
711
}

‎apps/toolbox/src/main.ts

Copy file name to clipboard
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import { Application } from '@nativescript/core';
1+
import { Application, Utils } from '@nativescript/core';
22

33
Application.run({ moduleName: 'app-root' });

‎apps/toolbox/src/pages/box-shadow.ts

Copy file name to clipboardExpand all lines: apps/toolbox/src/pages/box-shadow.ts
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export class BoxShadowModel extends Observable {
1010
private _selectedBackgroundType: string;
1111
private _selectedBorderType: string;
1212
private _selectedAnimation: string;
13-
private _boxShadow: string = '0 10 15 -3 rgba(200, 0, 0, 0.4)';
13+
private _boxShadow: string = '0 0 2 2 rgba(200, 0, 0, 0.4)';
1414
// private _boxShadow: string = '5 5 1 1 rgba(255, 0, 0, .9)';
1515
// private _boxShadow: string = '5 5 5 10 rgba(255, 0, 0, .9)';
1616

‎apps/toolbox/src/pages/webview.xml

Copy file name to clipboardExpand all lines: apps/toolbox/src/pages/webview.xml
+10-7Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
</Page.actionBar>
66

77
<StackLayout class="p-10">
8-
<Label text="iPhone by default plays media content in a webview in full screen, meaning it takes over your whole UI. You can toggle this on and off with a cool new property: iosAllowInlineMediaPlayback" textWrap="true" style="color: gray;" class="m-b-10 v-center text-center" />
8+
<Label text="iPhone by default plays media content in a webview in full screen, meaning it takes over your whole UI. You can toggle this on and off with a cool new property: iosAllowInlineMediaPlayback" textWrap="true" style="color: gray;" class="m-b-10 v-center text-center" />
99

10-
<Label style="color: gray;" textWrap="true" class="m-b-5 text-center" text="This webview plays this youtube content inline." />
11-
<WebView iosAllowInlineMediaPlayback="true" src="https://sphere.presonus.com/video/youtube/QnGX0xrv6Dw" height="200" />
10+
<Label style="color: gray;" textWrap="true" class="m-b-5 text-center" text="This webview plays this youtube content inline." />
11+
<GridLayout rows="200" columns="">
12+
<WebView iosAllowInlineMediaPlayback="true" src="https://www.youtube.com/embed/Mzy1jWxrSiw" height="200" />
13+
</GridLayout>
14+
<Label style="color: gray;" textWrap="true" class="m-b-5 m-t-20 text-center" text="This webview forces media content into fullscreen on iPhone." />
15+
<GridLayout rows="200" columns="">
16+
<WebView src="https://www.youtube.com/embed/Mzy1jWxrSiw" height="200" />
17+
</GridLayout>
1218

13-
<Label style="color: gray;" textWrap="true" class="m-b-5 m-t-20 text-center" text="This webview forces media content into fullscreen on iPhone." />
14-
<WebView src="https://sphere.presonus.com/video/youtube/QnGX0xrv6Dw" height="200" />
15-
16-
</StackLayout>
19+
</StackLayout>
1720
</Page>

‎package.json

Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nativescript",
3-
"version": "8.3.5",
3+
"version": "8.4.0",
44
"license": "MIT",
55
"scripts": {
66
"clean": "git clean -f -X -d --exclude=!.idea/ --exclude=!.vscode/* --exclude=!.npmrc",

‎packages/core/accessibility/accessibility-service.android.ts

Copy file name to clipboardExpand all lines: packages/core/accessibility/accessibility-service.android.ts
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ function ensureStateListener(): SharedA11YObservable {
7373
});
7474
accessibilityManager.addAccessibilityStateChangeListener(accessibilityStateChangeListener);
7575

76-
if (android.os.Build.VERSION.SDK_INT >= 19) {
76+
if (Utils.SDK_VERSION >= 19) {
7777
touchExplorationStateChangeListener = new android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener({
7878
onTouchExplorationStateChanged(enabled) {
7979
updateAccessibilityState();

‎packages/core/accessibility/index.android.ts

Copy file name to clipboardExpand all lines: packages/core/accessibility/index.android.ts
+4-3Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as Application from '../application';
22
import { Trace } from '../trace';
3+
import { SDK_VERSION } from '../utils';
34
import type { View } from '../ui/core/view';
45
import { GestureTypes } from '../ui/gestures';
56
import { notifyAccessibilityFocusState } from './accessibility-common';
@@ -52,7 +53,7 @@ function accessibilityEventHelper(view: Partial<View>, eventType: number) {
5253
* Android API >= 26 handles accessibility tap-events by converting them to TYPE_VIEW_CLICKED
5354
* These aren't triggered for custom tap events in NativeScript.
5455
*/
55-
if (android.os.Build.VERSION.SDK_INT >= 26) {
56+
if (SDK_VERSION >= 26) {
5657
// Find all tap gestures and trigger them.
5758
for (const tapGesture of view.getGestureObservers(GestureTypes.tap) ?? []) {
5859
tapGesture.callback({
@@ -169,7 +170,7 @@ function ensureNativeClasses() {
169170
if (accessibilityRole) {
170171
const androidClassName = RoleTypeMap.get(accessibilityRole);
171172
if (androidClassName) {
172-
const oldClassName = info.getClassName() || (android.os.Build.VERSION.SDK_INT >= 28 && host.getAccessibilityClassName()) || null;
173+
const oldClassName = info.getClassName() || (SDK_VERSION >= 28 && host.getAccessibilityClassName()) || null;
173174
info.setClassName(androidClassName);
174175

175176
if (Trace.isEnabled()) {
@@ -189,7 +190,7 @@ function ensureNativeClasses() {
189190
info.setClickable(true);
190191
}
191192

192-
if (android.os.Build.VERSION.SDK_INT >= 28) {
193+
if (SDK_VERSION >= 28) {
193194
if (accessibilityRole === AccessibilityRole.Header) {
194195
if (Trace.isEnabled()) {
195196
Trace.write(`onInitializeAccessibilityNodeInfo ${view} - set heading role=${accessibilityRole}`, Trace.categories.Accessibility);

‎packages/core/application-settings/index.android.ts

Copy file name to clipboardExpand all lines: packages/core/application-settings/index.android.ts
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ export function getString(key: string, defaultValue?: string): string {
4141
export function getNumber(key: string, defaultValue?: number): number {
4242
verify(key);
4343
if (hasKey(key)) {
44-
return sharedPreferences.getFloat(key, float(0.0));
44+
// SharedPreferences has no getter or setter for double so use long instead
45+
return java.lang.Double.longBitsToDouble(sharedPreferences.getLong(key, long(0)));
4546
}
4647

4748
return defaultValue;
@@ -68,7 +69,8 @@ export function setNumber(key: string, value: number): void {
6869
verify(key);
6970
common.ensureValidValue(value, 'number');
7071
const editor = sharedPreferences.edit();
71-
editor.putFloat(key, float(value));
72+
// SharedPreferences has no getter or setter for double so use long instead
73+
editor.putLong(key, java.lang.Double.doubleToRawLongBits(double(value)));
7274
editor.apply();
7375
}
7476

‎packages/core/color/color-common.ts

Copy file name to clipboardExpand all lines: packages/core/color/color-common.ts
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export class Color implements definition.Color {
151151
}
152152

153153
public static isValid(value: any): boolean {
154-
if (types.isNullOrUndefined(value) || value instanceof Color) {
154+
if (value instanceof Color) {
155155
return true;
156156
}
157157

‎packages/core/connectivity/index.android.ts

Copy file name to clipboardExpand all lines: packages/core/connectivity/index.android.ts
+4-3Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { android as androidApp, getNativeApplication } from '../application';
2+
import { SDK_VERSION } from '../utils';
23

34
export enum connectionType {
45
none = 0,
@@ -69,7 +70,7 @@ function parseNetworkCapabilities(capabilities?: android.net.NetworkCapabilities
6970
}
7071

7172
export function getConnectionType(): number {
72-
if (android.os.Build.VERSION.SDK_INT >= 28) {
73+
if (SDK_VERSION >= 28) {
7374
return getNetworkCapabilities();
7475
} else {
7576
const activeNetworkInfo = getActiveNetworkInfo();
@@ -117,7 +118,7 @@ let networkCallback;
117118
let notifyCallback;
118119

119120
export function startMonitoring(connectionTypeChangedCallback: (newConnectionType: number) => void): void {
120-
if (android.os.Build.VERSION.SDK_INT >= 28) {
121+
if (SDK_VERSION >= 28) {
121122
const manager = getConnectivityManager();
122123
if (manager) {
123124
notifyCallback = (network: android.net.Network, networkCapabilities: android.net.NetworkCapabilities) => {
@@ -162,7 +163,7 @@ export function startMonitoring(connectionTypeChangedCallback: (newConnectionTyp
162163
}
163164

164165
export function stopMonitoring(): void {
165-
if (android.os.Build.VERSION.SDK_INT >= 28) {
166+
if (SDK_VERSION >= 28) {
166167
// @ts-ignore
167168
const manager = getConnectivityManager();
168169
if (manager && callback) {

‎packages/core/file-system/file-system-access.android.ts

Copy file name to clipboardExpand all lines: packages/core/file-system/file-system-access.android.ts
+10-3Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as textModule from '../text';
22
import { getNativeApplication } from '../application';
3+
import { SDK_VERSION } from '../utils/utils-common';
34

45
import type { IFileSystemAccess } from './file-system-access';
56

@@ -581,9 +582,15 @@ export class FileSystemAccess implements IFileSystemAccess {
581582
}
582583

583584
public normalizePath(path: string): string {
584-
// the [''] is a trick to not have to create a android.net.URI
585-
// and use the method with string signature
586-
return java.nio.file.Paths.get(path, ['']).normalize().toString();
585+
if (SDK_VERSION >= 26) {
586+
// the [''] is a trick to not have to create a android.net.URI
587+
// and use the method with string signature
588+
return java.nio.file.Paths.get(path, ['']).normalize().toString();
589+
} else {
590+
// for now it wont work on pre 26 as File does not normalize
591+
const file = new java.io.File(path);
592+
return file.getAbsolutePath();
593+
}
587594
}
588595

589596
public joinPath(left: string, right: string): string {

‎packages/core/file-system/index.ts

Copy file name to clipboardExpand all lines: packages/core/file-system/index.ts
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { IFileSystemAccess, FileSystemAccess, FileSystemAccess29 } from './file-system-access';
22
import { Device } from '../platform';
3+
import { SDK_VERSION } from '../utils';
34
// The FileSystemAccess implementation, used through all the APIs.
45
let fileAccess: IFileSystemAccess;
56

@@ -9,7 +10,7 @@ let fileAccess: IFileSystemAccess;
910
*/
1011
export function getFileAccess(): IFileSystemAccess {
1112
if (!fileAccess) {
12-
if (global.isAndroid && parseInt(Device.sdkVersion) >= 29) {
13+
if (global.isAndroid && SDK_VERSION >= 29) {
1314
fileAccess = new FileSystemAccess29();
1415
} else {
1516
fileAccess = new FileSystemAccess();

‎packages/core/fps-meter/fps-native.android.ts

Copy file name to clipboardExpand all lines: packages/core/fps-meter/fps-native.android.ts
+2-4Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
import * as definition from './fps-native';
2-
import { Device } from '../platform';
2+
import { SDK_VERSION } from '../utils';
33

44
export class FPSCallback implements definition.FPSCallback {
55
private impl: android.view.Choreographer.FrameCallback | ((nanos: number) => void);
66
private onFrame: (currentTimeMillis: number) => void;
77

88
public running: boolean;
9-
sdkVersion: number;
109
nativeFramesSupported: boolean;
1110
constructor(onFrame: (currentTimeMillis: number) => void) {
1211
this.running = false;
1312
this.onFrame = onFrame;
1413

15-
this.sdkVersion = parseInt(Device.sdkVersion);
16-
this.nativeFramesSupported = this.sdkVersion >= 24 && this._isNativeFramesSupported();
14+
this.nativeFramesSupported = SDK_VERSION >= 24 && this._isNativeFramesSupported();
1715

1816
if (this.nativeFramesSupported) {
1917
this.impl = (nanos: number) => {

‎packages/core/index.d.ts

Copy file name to clipboardExpand all lines: packages/core/index.d.ts
+3-1Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export type { InstrumentationMode, TimerInfo } from './profiling';
105105
export { encoding } from './text';
106106
export * from './trace';
107107
export * from './ui';
108-
import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, executeOnUIThread, releaseNativeObject, getModuleName, openFile, openUrl, isRealDevice, layout, ad as androidUtils, iOSNativeHelper as iosUtils, Source, escapeRegexSymbols, convertString, dismissSoftInput, queueMacrotask, queueGC, throttle, debounce, dataSerialize, dataDeserialize } from './utils';
108+
import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, executeOnUIThread, releaseNativeObject, getModuleName, openFile, openUrl, isRealDevice, layout, ad as androidUtils, iOSNativeHelper as iosUtils, Source, escapeRegexSymbols, convertString, dismissSoftInput, dismissKeyboard, queueMacrotask, queueGC, throttle, debounce, dataSerialize, dataDeserialize, copyToClipboard } from './utils';
109109
import { ClassInfo, getClass, getBaseClasses, getClassInfo, isBoolean, isDefined, isFunction, isNullOrUndefined, isNumber, isObject, isString, isUndefined, toUIString, verifyCallback, numberHasDecimals, numberIs64Bit } from './utils/types';
110110
export declare const Utils: {
111111
GC: typeof GC;
@@ -158,5 +158,7 @@ export declare const Utils: {
158158
toUIString: typeof toUIString;
159159
verifyCallback: typeof verifyCallback;
160160
dismissSoftInput: typeof dismissSoftInput;
161+
dismissKeyboard: typeof dismissKeyboard;
162+
copyToClipboard: typeof copyToClipboard;
161163
};
162164
export { XmlParser, ParserEventType, ParserEvent } from './xml';

‎packages/core/index.ts

Copy file name to clipboardExpand all lines: packages/core/index.ts
+3-1Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export * from './trace';
137137

138138
export * from './ui';
139139

140-
import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, executeOnUIThread, queueMacrotask, queueGC, debounce, throttle, releaseNativeObject, getModuleName, openFile, openUrl, isRealDevice, layout, ad as androidUtils, iOSNativeHelper as iosUtils, Source, RESOURCE_PREFIX, FILE_PREFIX, escapeRegexSymbols, convertString, dismissSoftInput, dataDeserialize, dataSerialize } from './utils';
140+
import { GC, isFontIconURI, isDataURI, isFileOrResourcePath, executeOnMainThread, mainThreadify, isMainThread, dispatchToMainThread, executeOnUIThread, queueMacrotask, queueGC, debounce, throttle, releaseNativeObject, getModuleName, openFile, openUrl, isRealDevice, layout, ad as androidUtils, iOSNativeHelper as iosUtils, Source, RESOURCE_PREFIX, FILE_PREFIX, escapeRegexSymbols, convertString, dismissSoftInput, dismissKeyboard, dataDeserialize, dataSerialize, copyToClipboard } from './utils';
141141
import { ClassInfo, getClass, getBaseClasses, getClassInfo, isBoolean, isDefined, isFunction, isNullOrUndefined, isNumber, isObject, isString, isUndefined, toUIString, verifyCallback, numberHasDecimals, numberIs64Bit } from './utils/types';
142142

143143
export const Utils = {
@@ -194,6 +194,8 @@ export const Utils = {
194194
toUIString,
195195
verifyCallback,
196196
dismissSoftInput,
197+
dismissKeyboard,
198+
copyToClipboard,
197199
};
198200

199201
export { XmlParser, ParserEventType, ParserEvent } from './xml';

‎packages/core/package.json

Copy file name to clipboardExpand all lines: packages/core/package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nativescript/core",
3-
"version": "8.3.5",
3+
"version": "8.4.0",
44
"description": "A JavaScript library providing an easy to use api for interacting with iOS and Android platform APIs.",
55
"main": "index",
66
"types": "index.d.ts",

‎packages/core/platform/index.android.ts

Copy file name to clipboardExpand all lines: packages/core/platform/index.android.ts
+3-2Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* tslint:disable:class-name */
22
import { getNativeApplication, on, orientationChangedEvent, android as AndroidApplication } from '../application';
3+
import { SDK_VERSION } from '../utils';
34

45
const MIN_TABLET_PIXELS = 600;
56

@@ -129,7 +130,7 @@ class DeviceRef {
129130

130131
get language(): string {
131132
let defaultNativeLocale;
132-
if (android.os.Build.VERSION.SDK_INT >= 24) {
133+
if (SDK_VERSION >= 24) {
133134
defaultNativeLocale = android.content.res.Resources.getSystem().getConfiguration().getLocales().get(0);
134135
} else {
135136
defaultNativeLocale = android.content.res.Resources.getSystem().getConfiguration().locale;
@@ -139,7 +140,7 @@ class DeviceRef {
139140

140141
get region(): string {
141142
let defaultNativeLocale;
142-
if (android.os.Build.VERSION.SDK_INT >= 24) {
143+
if (SDK_VERSION >= 24) {
143144
defaultNativeLocale = android.content.res.Resources.getSystem().getConfiguration().getLocales().get(0);
144145
} else {
145146
defaultNativeLocale = android.content.res.Resources.getSystem().getConfiguration().locale;

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.