@kubesense/kubesense-browser-rum-core 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,7 +17,7 @@ function startDefaultContext(hooks, configuration, sdkName) {
17
17
  trace_sample_rate: (0, kubesense_browser_core_1.round)(configuration.traceSampleRate, 3),
18
18
  beta_encode_cookie_options: configuration.betaEncodeCookieOptions,
19
19
  },
20
- browser_sdk_version: (0, kubesense_browser_core_1.canUseEventBridge)() ? "1.2.0" : undefined,
20
+ browser_sdk_version: (0, kubesense_browser_core_1.canUseEventBridge)() ? "1.4.0" : undefined,
21
21
  sdk_name: sdkName,
22
22
  },
23
23
  application: {
@@ -50,11 +50,11 @@ function sampleUsingKnuthFactor(identifier, sampleRate) {
50
50
  // modulo would be incorrect. Thus, we are using BigInts here.
51
51
  //
52
52
  // Implementation in other languages:
53
- // * Go https://github.com/DataDog/kubesense-trace-go/blob/ec6fbb1f2d517b7b8e69961052adf7136f3af773/ddtrace/tracer/sampler.go#L86-L91
54
- // * Python https://github.com/DataDog/kubesense-trace-py/blob/0cee2f066fb6e79aa15947c1514c0f406dea47c5/ddtrace/sampling_rule.py#L197
55
- // * Ruby https://github.com/DataDog/kubesense-trace-rb/blob/1a6e255cdcb7e7e22235ea5955f90f6dfa91045d/lib/kubesense/tracing/sampling/rate_sampler.rb#L42
56
- // * C++ https://github.com/DataDog/kubesense-trace-cpp/blob/159629edc438ae45f2bb318eb7bd51abd05e94b5/src/kubesense/trace_sampler.cpp#L58
57
- // * Java https://github.com/DataDog/kubesense-trace-java/blob/896dd6b380533216e0bdee59614606c8272d313e/kubesense-trace-core/src/main/java/kubesense/trace/common/sampling/DeterministicSampler.java#L48
53
+ // * Go https://github.com/kubsense-ai/kubesense-trace-go/blob/ec6fbb1f2d517b7b8e69961052adf7136f3af773/ddtrace/tracer/sampler.go#L86-L91
54
+ // * Python https://github.com/kubsense/kubesense-trace-py/blob/0cee2f066fb6e79aa15947c1514c0f406dea47c5/ddtrace/sampling_rule.py#L197
55
+ // * Ruby https://github.com/kubsense/kubesense-trace-rb/blob/1a6e255cdcb7e7e22235ea5955f90f6dfa91045d/lib/kubesense/tracing/sampling/rate_sampler.rb#L42
56
+ // * C++ https://github.com/kubsense/kubesense-trace-cpp/blob/159629edc438ae45f2bb318eb7bd51abd05e94b5/src/kubesense/trace_sampler.cpp#L58
57
+ // * Java https://github.com/kubsense/kubesense-trace-java/blob/896dd6b380533216e0bdee59614606c8272d313e/kubesense-trace-core/src/main/java/kubesense/trace/common/sampling/DeterministicSampler.java#L48
58
58
  //
59
59
  // Note: All implementations have slight variations. Some of them use '<=' instead of '<', and
60
60
  // use `sampleRate * 2^64 - 1` instead of `sampleRate * 2^64`. The following implementation
@@ -1 +1 @@
1
- {"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/domain/tracing/sampler.ts"],"names":[],"mappings":";;AAIA,wCA0BC;AAGD,4DAEC;AASD,wDAwBC;AApED,8EAA+D;AAE/D,IAAI,mBAAyE,CAAA;AAE7E,SAAgB,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,+FAA+F;IAC/F,0CAA0C;IAC1C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,mBAAmB,IAAI,SAAS,KAAK,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACvE,OAAO,mBAAmB,CAAC,QAAQ,CAAA;IACrC,CAAC;IAED,IAAI,QAAiB,CAAA;IACrB,2EAA2E;IAC3E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACvF,CAAC;SAAM,CAAC;QACN,sFAAsF;QACtF,oEAAoE;QACpE,QAAQ,GAAG,IAAA,oCAAW,EAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IACD,mBAAmB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC7C,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,qBAAqB;AACrB,SAAgB,wBAAwB;IACtC,mBAAmB,GAAG,SAAS,CAAA;AACjC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,UAAkB,EAAE,UAAkB;IAC3E,kBAAkB;IAClB,EAAE;IACF,0DAA0D;IAC1D,EAAE;IACF,4FAA4F;IAC5F,8DAA8D;IAC9D,EAAE;IACF,qCAAqC;IACrC,yIAAyI;IACzI,qIAAqI;IACrI,0JAA0J;IAC1J,4IAA4I;IAC5I,0MAA0M;IAC1M,EAAE;IACF,8FAA8F;IAC9F,2FAA2F;IAC3F,6FAA6F;IAC7F,+FAA+F;IAC/F,kEAAkE;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA,CAAC,YAAY;IAC3D,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/domain/tracing/sampler.ts"],"names":[],"mappings":";;AAIA,wCA0BC;AAGD,4DAEC;AASD,wDAwBC;AApED,8EAA+D;AAE/D,IAAI,mBAAyE,CAAA;AAE7E,SAAgB,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,+FAA+F;IAC/F,0CAA0C;IAC1C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,mBAAmB,IAAI,SAAS,KAAK,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACvE,OAAO,mBAAmB,CAAC,QAAQ,CAAA;IACrC,CAAC;IAED,IAAI,QAAiB,CAAA;IACrB,2EAA2E;IAC3E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACvF,CAAC;SAAM,CAAC;QACN,sFAAsF;QACtF,oEAAoE;QACpE,QAAQ,GAAG,IAAA,oCAAW,EAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IACD,mBAAmB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC7C,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,qBAAqB;AACrB,SAAgB,wBAAwB;IACtC,mBAAmB,GAAG,SAAS,CAAA;AACjC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,UAAkB,EAAE,UAAkB;IAC3E,kBAAkB;IAClB,EAAE;IACF,0DAA0D;IAC1D,EAAE;IACF,4FAA4F;IAC5F,8DAA8D;IAC9D,EAAE;IACF,qCAAqC;IACrC,6IAA6I;IAC7I,sIAAsI;IACtI,2JAA2J;IAC3J,6IAA6I;IAC7I,2MAA2M;IAC3M,EAAE;IACF,8FAA8F;IAC9F,2FAA2F;IAC3F,6FAA6F;IAC7F,+FAA+F;IAC/F,kEAAkE;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA,CAAC,YAAY;IAC3D,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC"}
@@ -14,7 +14,7 @@ export function startDefaultContext(hooks, configuration, sdkName) {
14
14
  trace_sample_rate: round(configuration.traceSampleRate, 3),
15
15
  beta_encode_cookie_options: configuration.betaEncodeCookieOptions,
16
16
  },
17
- browser_sdk_version: canUseEventBridge() ? "1.2.0" : undefined,
17
+ browser_sdk_version: canUseEventBridge() ? "1.4.0" : undefined,
18
18
  sdk_name: sdkName,
19
19
  },
20
20
  application: {
@@ -45,11 +45,11 @@ export function sampleUsingKnuthFactor(identifier, sampleRate) {
45
45
  // modulo would be incorrect. Thus, we are using BigInts here.
46
46
  //
47
47
  // Implementation in other languages:
48
- // * Go https://github.com/DataDog/kubesense-trace-go/blob/ec6fbb1f2d517b7b8e69961052adf7136f3af773/ddtrace/tracer/sampler.go#L86-L91
49
- // * Python https://github.com/DataDog/kubesense-trace-py/blob/0cee2f066fb6e79aa15947c1514c0f406dea47c5/ddtrace/sampling_rule.py#L197
50
- // * Ruby https://github.com/DataDog/kubesense-trace-rb/blob/1a6e255cdcb7e7e22235ea5955f90f6dfa91045d/lib/kubesense/tracing/sampling/rate_sampler.rb#L42
51
- // * C++ https://github.com/DataDog/kubesense-trace-cpp/blob/159629edc438ae45f2bb318eb7bd51abd05e94b5/src/kubesense/trace_sampler.cpp#L58
52
- // * Java https://github.com/DataDog/kubesense-trace-java/blob/896dd6b380533216e0bdee59614606c8272d313e/kubesense-trace-core/src/main/java/kubesense/trace/common/sampling/DeterministicSampler.java#L48
48
+ // * Go https://github.com/kubsense-ai/kubesense-trace-go/blob/ec6fbb1f2d517b7b8e69961052adf7136f3af773/ddtrace/tracer/sampler.go#L86-L91
49
+ // * Python https://github.com/kubsense/kubesense-trace-py/blob/0cee2f066fb6e79aa15947c1514c0f406dea47c5/ddtrace/sampling_rule.py#L197
50
+ // * Ruby https://github.com/kubsense/kubesense-trace-rb/blob/1a6e255cdcb7e7e22235ea5955f90f6dfa91045d/lib/kubesense/tracing/sampling/rate_sampler.rb#L42
51
+ // * C++ https://github.com/kubsense/kubesense-trace-cpp/blob/159629edc438ae45f2bb318eb7bd51abd05e94b5/src/kubesense/trace_sampler.cpp#L58
52
+ // * Java https://github.com/kubsense/kubesense-trace-java/blob/896dd6b380533216e0bdee59614606c8272d313e/kubesense-trace-core/src/main/java/kubesense/trace/common/sampling/DeterministicSampler.java#L48
53
53
  //
54
54
  // Note: All implementations have slight variations. Some of them use '<=' instead of '<', and
55
55
  // use `sampleRate * 2^64 - 1` instead of `sampleRate * 2^64`. The following implementation
@@ -1 +1 @@
1
- {"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/domain/tracing/sampler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE/D,IAAI,mBAAyE,CAAA;AAE7E,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,+FAA+F;IAC/F,0CAA0C;IAC1C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,mBAAmB,IAAI,SAAS,KAAK,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACvE,OAAO,mBAAmB,CAAC,QAAQ,CAAA;IACrC,CAAC;IAED,IAAI,QAAiB,CAAA;IACrB,2EAA2E;IAC3E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACvF,CAAC;SAAM,CAAC;QACN,sFAAsF;QACtF,oEAAoE;QACpE,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IACD,mBAAmB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC7C,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,wBAAwB;IACtC,mBAAmB,GAAG,SAAS,CAAA;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,UAAkB;IAC3E,kBAAkB;IAClB,EAAE;IACF,0DAA0D;IAC1D,EAAE;IACF,4FAA4F;IAC5F,8DAA8D;IAC9D,EAAE;IACF,qCAAqC;IACrC,yIAAyI;IACzI,qIAAqI;IACrI,0JAA0J;IAC1J,4IAA4I;IAC5I,0MAA0M;IAC1M,EAAE;IACF,8FAA8F;IAC9F,2FAA2F;IAC3F,6FAA6F;IAC7F,+FAA+F;IAC/F,kEAAkE;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA,CAAC,YAAY;IAC3D,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/domain/tracing/sampler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE/D,IAAI,mBAAyE,CAAA;AAE7E,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,+FAA+F;IAC/F,0CAA0C;IAC1C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,mBAAmB,IAAI,SAAS,KAAK,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACvE,OAAO,mBAAmB,CAAC,QAAQ,CAAA;IACrC,CAAC;IAED,IAAI,QAAiB,CAAA;IACrB,2EAA2E;IAC3E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACvF,CAAC;SAAM,CAAC;QACN,sFAAsF;QACtF,oEAAoE;QACpE,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IACD,mBAAmB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC7C,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,wBAAwB;IACtC,mBAAmB,GAAG,SAAS,CAAA;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,UAAkB;IAC3E,kBAAkB;IAClB,EAAE;IACF,0DAA0D;IAC1D,EAAE;IACF,4FAA4F;IAC5F,8DAA8D;IAC9D,EAAE;IACF,qCAAqC;IACrC,6IAA6I;IAC7I,sIAAsI;IACtI,2JAA2J;IAC3J,6IAA6I;IAC7I,2MAA2M;IAC3M,EAAE;IACF,8FAA8F;IAC9F,2FAA2F;IAC3F,6FAA6F;IAC7F,+FAA+F;IAC/F,kEAAkE;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA,CAAC,YAAY;IAC3D,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,17 @@
1
1
  {
2
2
  "name": "@kubesense/kubesense-browser-rum-core",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
+ "description": "Shared RUM event-collection logic for the Kubesense Browser SDK (consumed by the rum and rum-slim packages).",
4
5
  "license": "Apache-2.0",
6
+ "keywords": [
7
+ "kubesense",
8
+ "browser",
9
+ "rum",
10
+ "real-user-monitoring",
11
+ "monitoring",
12
+ "observability",
13
+ "core"
14
+ ],
5
15
  "main": "cjs/index.js",
6
16
  "module": "esm/index.js",
7
17
  "types": "cjs/index.d.ts",
@@ -9,7 +19,7 @@
9
19
  "build": "node ../../scripts/build/build-package.ts --modules"
10
20
  },
11
21
  "dependencies": {
12
- "@kubesense/kubesense-browser-core": "1.2.0"
22
+ "@kubesense/kubesense-browser-core": "1.4.0"
13
23
  },
14
24
  "devDependencies": {
15
25
  "ajv": "8.17.1"
@@ -25,5 +35,5 @@
25
35
  "publishConfig": {
26
36
  "access": "public"
27
37
  },
28
- "gitHead": "c49352eb57b271896c63b12053001be6a2684fb0"
38
+ "gitHead": "af1a0950e2441f45b4303b2dc17b09f9cd0d999d"
29
39
  }
@@ -48,7 +48,7 @@ export const enum LifeCycleEventType {
48
48
  // JavaScript).
49
49
  //
50
50
  // See issues:
51
- // * https://github.com/DataDog/browser-sdk/issues/2208
51
+ // * https://github.com/kubsense/kubsense-browser-sdk/issues/2208
52
52
  // * https://github.com/microsoft/TypeScript/issues/54152
53
53
  declare const LifeCycleEventTypeAsConst: {
54
54
  AUTO_ACTION_COMPLETED: LifeCycleEventType.AUTO_ACTION_COMPLETED
@@ -51,11 +51,11 @@ export function sampleUsingKnuthFactor(identifier: bigint, sampleRate: number) {
51
51
  // modulo would be incorrect. Thus, we are using BigInts here.
52
52
  //
53
53
  // Implementation in other languages:
54
- // * Go https://github.com/DataDog/kubesense-trace-go/blob/ec6fbb1f2d517b7b8e69961052adf7136f3af773/ddtrace/tracer/sampler.go#L86-L91
55
- // * Python https://github.com/DataDog/kubesense-trace-py/blob/0cee2f066fb6e79aa15947c1514c0f406dea47c5/ddtrace/sampling_rule.py#L197
56
- // * Ruby https://github.com/DataDog/kubesense-trace-rb/blob/1a6e255cdcb7e7e22235ea5955f90f6dfa91045d/lib/kubesense/tracing/sampling/rate_sampler.rb#L42
57
- // * C++ https://github.com/DataDog/kubesense-trace-cpp/blob/159629edc438ae45f2bb318eb7bd51abd05e94b5/src/kubesense/trace_sampler.cpp#L58
58
- // * Java https://github.com/DataDog/kubesense-trace-java/blob/896dd6b380533216e0bdee59614606c8272d313e/kubesense-trace-core/src/main/java/kubesense/trace/common/sampling/DeterministicSampler.java#L48
54
+ // * Go https://github.com/kubsense-ai/kubesense-trace-go/blob/ec6fbb1f2d517b7b8e69961052adf7136f3af773/ddtrace/tracer/sampler.go#L86-L91
55
+ // * Python https://github.com/kubsense/kubesense-trace-py/blob/0cee2f066fb6e79aa15947c1514c0f406dea47c5/ddtrace/sampling_rule.py#L197
56
+ // * Ruby https://github.com/kubsense/kubesense-trace-rb/blob/1a6e255cdcb7e7e22235ea5955f90f6dfa91045d/lib/kubesense/tracing/sampling/rate_sampler.rb#L42
57
+ // * C++ https://github.com/kubsense/kubesense-trace-cpp/blob/159629edc438ae45f2bb318eb7bd51abd05e94b5/src/kubesense/trace_sampler.cpp#L58
58
+ // * Java https://github.com/kubsense/kubesense-trace-java/blob/896dd6b380533216e0bdee59614606c8272d313e/kubesense-trace-core/src/main/java/kubesense/trace/common/sampling/DeterministicSampler.java#L48
59
59
  //
60
60
  // Note: All implementations have slight variations. Some of them use '<=' instead of '<', and
61
61
  // use `sampleRate * 2^64 - 1` instead of `sampleRate * 2^64`. The following implementation