@posthog/browser-common 0.9.3 → 0.9.5

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.
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ const FeatureFlagsCommonExtension = 'featureFlagsCommon';
31
+ __webpack_require__.d(__webpack_exports__, {}, {
32
+ FeatureFlagsCommonExtension: FeatureFlagsCommonExtension
33
+ });
34
+ exports.FeatureFlagsCommonExtension = __webpack_exports__.FeatureFlagsCommonExtension;
35
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
36
+ "FeatureFlagsCommonExtension"
37
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
38
+ Object.defineProperty(exports, '__esModule', {
39
+ value: true
40
+ });
@@ -0,0 +1,2 @@
1
+ const FeatureFlagsCommonExtension = 'featureFlagsCommon';
2
+ export { FeatureFlagsCommonExtension };
@@ -23,11 +23,15 @@ import type { Client } from './client';
23
23
  export interface Extension {
24
24
  /** Stable extension name used for diagnostics and de-duplication within a client instance. */
25
25
  readonly name: string;
26
+ /** Additional lookup targets whose lifecycle belongs to this extension. */
27
+ readonly bindings?: Readonly<Record<string, Extension>>;
26
28
  /**
27
29
  * Start the extension with the host client's capability surface. Called once
28
30
  * after construction; return a promise when setup needs asynchronous state.
29
31
  */
30
32
  setup(client: Client): void | Promise<void>;
33
+ /** Flush buffered work. Shutdown awaits this within the host's timeout before disposal. */
34
+ flush?(reason?: 'flush' | 'shutdown'): Promise<void>;
31
35
  /** Release final resources synchronously. Feature-level start/stop remains extension-owned. */
32
36
  dispose?(): void;
33
37
  }
@@ -797,7 +797,7 @@ class PostHogFeatureFlags {
797
797
  let flagCallReported = this._prop(external_constants_js_namespaceObject.FLAG_CALL_REPORTED) || {};
798
798
  let sessionIdToPersist;
799
799
  if (this._config.deduplicateCallsPerSession) {
800
- const currentSessionId = this._client?.session.sessionId;
800
+ const currentSessionId = this._client?.session?.sessionId;
801
801
  const storedSessionId = this._prop(external_constants_js_namespaceObject.FLAG_CALL_REPORTED_SESSION_ID);
802
802
  if (currentSessionId && currentSessionId !== storedSessionId) {
803
803
  flagCallReported = {};
@@ -761,7 +761,7 @@ class PostHogFeatureFlags {
761
761
  let flagCallReported = this._prop(FLAG_CALL_REPORTED) || {};
762
762
  let sessionIdToPersist;
763
763
  if (this._config.deduplicateCallsPerSession) {
764
- const currentSessionId = this._client?.session.sessionId;
764
+ const currentSessionId = this._client?.session?.sessionId;
765
765
  const storedSessionId = this._prop(FLAG_CALL_REPORTED_SESSION_ID);
766
766
  if (currentSessionId && currentSessionId !== storedSessionId) {
767
767
  flagCallReported = {};
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
  export type { Extension } from './extension';
6
6
  export type { ExtensionToken } from './token';
7
+ export { FeatureFlagsCommonExtension } from './extension-tokens';
7
8
  export * from './types';
8
9
  export { createDisposable, type Disposable } from './disposable';
9
10
  export type { Listener } from './pubsub';
package/dist/index.js CHANGED
@@ -3,6 +3,9 @@ var __webpack_modules__ = {
3
3
  "./disposable" (module) {
4
4
  module.exports = require("./disposable.js");
5
5
  },
6
+ "./extension-tokens" (module) {
7
+ module.exports = require("./extension-tokens.js");
8
+ },
6
9
  "./pubsub" (module) {
7
10
  module.exports = require("./pubsub.js");
8
11
  },
@@ -57,24 +60,29 @@ function __webpack_require__(moduleId) {
57
60
  var __webpack_exports__ = {};
58
61
  (()=>{
59
62
  __webpack_require__.r(__webpack_exports__);
60
- var _types__rspack_import_0 = __webpack_require__("./types");
63
+ var _extension_tokens__rspack_import_0 = __webpack_require__("./extension-tokens");
64
+ var _types__rspack_import_1 = __webpack_require__("./types");
61
65
  var __rspack_reexport = {};
62
- for(const __rspack_import_key in _types__rspack_import_0)if ([
66
+ for(const __rspack_import_key in _types__rspack_import_1)if ([
63
67
  "Publisher",
64
68
  "createDisposable",
69
+ "FeatureFlagsCommonExtension",
65
70
  "default"
66
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_0[__rspack_import_key];
71
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_1[__rspack_import_key];
67
72
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
68
- var _disposable__rspack_import_1 = __webpack_require__("./disposable");
69
- var _pubsub__rspack_import_2 = __webpack_require__("./pubsub");
73
+ var _disposable__rspack_import_2 = __webpack_require__("./disposable");
74
+ var _pubsub__rspack_import_3 = __webpack_require__("./pubsub");
70
75
  __webpack_require__.d(__webpack_exports__, {
71
- Publisher: ()=>_pubsub__rspack_import_2.Publisher,
72
- createDisposable: ()=>_disposable__rspack_import_1.createDisposable
76
+ FeatureFlagsCommonExtension: ()=>_extension_tokens__rspack_import_0.FeatureFlagsCommonExtension,
77
+ Publisher: ()=>_pubsub__rspack_import_3.Publisher,
78
+ createDisposable: ()=>_disposable__rspack_import_2.createDisposable
73
79
  });
74
80
  })();
81
+ exports.FeatureFlagsCommonExtension = __webpack_exports__.FeatureFlagsCommonExtension;
75
82
  exports.Publisher = __webpack_exports__.Publisher;
76
83
  exports.createDisposable = __webpack_exports__.createDisposable;
77
84
  for(var __rspack_i in __webpack_exports__)if (-1 === [
85
+ "FeatureFlagsCommonExtension",
78
86
  "Publisher",
79
87
  "createDisposable"
80
88
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./types/index.mjs";
2
+ export { FeatureFlagsCommonExtension } from "./extension-tokens.mjs";
2
3
  export { createDisposable } from "./disposable.mjs";
3
4
  export { Publisher } from "./pubsub.mjs";
@@ -0,0 +1,24 @@
1
+ import type { LogCaptureOptions } from '@posthog/types';
2
+ import type { ResolvedPostHogLogsConfig } from '@posthog/core';
3
+ export interface BrowserLogsConfig extends LogCaptureOptions {
4
+ captureConsoleLogs?: boolean;
5
+ }
6
+ /** SDK configuration mapping; values are read again when configuration changes. */
7
+ export interface LogsConfigSource {
8
+ get(): BrowserLogsConfig | undefined;
9
+ readonly captureHintKey: string;
10
+ readonly remoteConfigWillArrive: boolean;
11
+ }
12
+ /**
13
+ * Resolves the public `logs` config into the shape core `PostHogLogs` consumes.
14
+ *
15
+ * `serviceNameDefault` is the console instance's `service.name` fallback
16
+ * (`posthog-browser-logs`); the programmatic instance falls back to core's
17
+ * `unknown_service`. `consoleCapture` disables the per-interval rate cap entirely
18
+ * (even when the user set `maxLogsPerInterval`), so console capture is never
19
+ * rate-dropped — the deep buffer is its only bound.
20
+ */
21
+ export declare function resolveLogsConfig(config: LogCaptureOptions | undefined, opts?: {
22
+ serviceNameDefault?: string;
23
+ consoleCapture?: boolean;
24
+ }): ResolvedPostHogLogsConfig;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ resolveLogsConfig: ()=>resolveLogsConfig
32
+ });
33
+ const core_namespaceObject = require("@posthog/core");
34
+ const DEFAULT_FLUSH_INTERVAL_MS = 3000;
35
+ const DEFAULT_MAX_BUFFER_SIZE = 100;
36
+ const DEFAULT_MAX_LOGS_PER_INTERVAL = 1000;
37
+ const DEFAULT_CONSOLE_MAX_QUEUE_SIZE = 2048;
38
+ const DEFAULT_MAX_BATCH_RECORDS_PER_POST = 100;
39
+ function defaultResourceAttributes() {
40
+ let osName = '';
41
+ let osVersion = '';
42
+ try {
43
+ const browserGlobal = "u" > typeof globalThis ? globalThis : "u" > typeof window ? window : void 0;
44
+ const userAgent = browserGlobal?.navigator?.userAgent;
45
+ if (userAgent) [osName, osVersion] = (0, core_namespaceObject.detectOS)(userAgent);
46
+ } catch {}
47
+ return (0, core_namespaceObject.osResourceAttributes)(osName, osVersion);
48
+ }
49
+ function resolveLogsConfig(config, opts) {
50
+ const flushIntervalMs = config?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
51
+ const maxBufferSize = config?.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE;
52
+ const maxLogsPerInterval = opts?.consoleCapture ? void 0 : config?.maxLogsPerInterval ?? DEFAULT_MAX_LOGS_PER_INTERVAL;
53
+ const maxQueueSize = (0, core_namespaceObject.isUndefined)(maxLogsPerInterval) ? Math.max(maxBufferSize, DEFAULT_CONSOLE_MAX_QUEUE_SIZE) : Math.max(maxBufferSize, maxLogsPerInterval);
54
+ const resourceAttributes = {
55
+ ...defaultResourceAttributes(),
56
+ ...config?.resourceAttributes
57
+ };
58
+ return {
59
+ serviceName: resourceAttributes?.['service.name'] ?? config?.serviceName ?? opts?.serviceNameDefault,
60
+ serviceVersion: resourceAttributes?.['service.version'] ?? config?.serviceVersion,
61
+ environment: resourceAttributes?.['deployment.environment'] ?? config?.environment,
62
+ resourceAttributes,
63
+ beforeSend: config?.beforeSend,
64
+ flushIntervalMs,
65
+ maxBufferSize,
66
+ maxQueueSize,
67
+ maxBatchRecordsPerPost: DEFAULT_MAX_BATCH_RECORDS_PER_POST,
68
+ rateCapWindowMs: flushIntervalMs,
69
+ maxLogsPerInterval,
70
+ backgroundFlushBudgetMs: 0,
71
+ terminationFlushBudgetMs: 0
72
+ };
73
+ }
74
+ exports.resolveLogsConfig = __webpack_exports__.resolveLogsConfig;
75
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
76
+ "resolveLogsConfig"
77
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
78
+ Object.defineProperty(exports, '__esModule', {
79
+ value: true
80
+ });
@@ -0,0 +1,42 @@
1
+ import { detectOS, isUndefined, osResourceAttributes } from "@posthog/core";
2
+ const DEFAULT_FLUSH_INTERVAL_MS = 3000;
3
+ const DEFAULT_MAX_BUFFER_SIZE = 100;
4
+ const DEFAULT_MAX_LOGS_PER_INTERVAL = 1000;
5
+ const DEFAULT_CONSOLE_MAX_QUEUE_SIZE = 2048;
6
+ const DEFAULT_MAX_BATCH_RECORDS_PER_POST = 100;
7
+ function defaultResourceAttributes() {
8
+ let osName = '';
9
+ let osVersion = '';
10
+ try {
11
+ const browserGlobal = "u" > typeof globalThis ? globalThis : "u" > typeof window ? window : void 0;
12
+ const userAgent = browserGlobal?.navigator?.userAgent;
13
+ if (userAgent) [osName, osVersion] = detectOS(userAgent);
14
+ } catch {}
15
+ return osResourceAttributes(osName, osVersion);
16
+ }
17
+ function resolveLogsConfig(config, opts) {
18
+ const flushIntervalMs = config?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
19
+ const maxBufferSize = config?.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE;
20
+ const maxLogsPerInterval = opts?.consoleCapture ? void 0 : config?.maxLogsPerInterval ?? DEFAULT_MAX_LOGS_PER_INTERVAL;
21
+ const maxQueueSize = isUndefined(maxLogsPerInterval) ? Math.max(maxBufferSize, DEFAULT_CONSOLE_MAX_QUEUE_SIZE) : Math.max(maxBufferSize, maxLogsPerInterval);
22
+ const resourceAttributes = {
23
+ ...defaultResourceAttributes(),
24
+ ...config?.resourceAttributes
25
+ };
26
+ return {
27
+ serviceName: resourceAttributes?.['service.name'] ?? config?.serviceName ?? opts?.serviceNameDefault,
28
+ serviceVersion: resourceAttributes?.['service.version'] ?? config?.serviceVersion,
29
+ environment: resourceAttributes?.['deployment.environment'] ?? config?.environment,
30
+ resourceAttributes,
31
+ beforeSend: config?.beforeSend,
32
+ flushIntervalMs,
33
+ maxBufferSize,
34
+ maxQueueSize,
35
+ maxBatchRecordsPerPost: DEFAULT_MAX_BATCH_RECORDS_PER_POST,
36
+ rateCapWindowMs: flushIntervalMs,
37
+ maxLogsPerInterval,
38
+ backgroundFlushBudgetMs: 0,
39
+ terminationFlushBudgetMs: 0
40
+ };
41
+ }
42
+ export { resolveLogsConfig };
@@ -0,0 +1,31 @@
1
+ import type { Client } from './client';
2
+ import type { LogSdkContext } from '@posthog/core';
3
+ /**
4
+ * The console methods both bundles agree on: the main bundle records these, the
5
+ * entrypoint maps and serializes them. Deriving both sides from this tuple makes
6
+ * a missing level a compile error rather than a silently unbuffered one.
7
+ */
8
+ export declare const BUFFERED_CONSOLE_LEVELS: readonly ['debug', 'log', 'warn', 'error', 'info'];
9
+ export type BufferedConsoleLevel = (typeof BUFFERED_CONSOLE_LEVELS)[number];
10
+ /**
11
+ * A `console.*` call the main bundle recorded before the logs entrypoint was available.
12
+ *
13
+ * `args` stay raw so the entrypoint's `stringifyArgsSafely` is the single serializer.
14
+ * They are also held by reference: an object mutated between the console call and the
15
+ * replay is serialized in its later state, unlike the live path which serializes inline.
16
+ *
17
+ * `context` and `occurredAtMs` are snapshotted at the console call, because identity,
18
+ * session and feature flags can all change before the replay.
19
+ */
20
+ export interface BufferedConsoleEntry {
21
+ level: BufferedConsoleLevel;
22
+ args: any[];
23
+ occurredAtMs: number;
24
+ context: LogSdkContext;
25
+ }
26
+ export interface ConsoleLogsCapture {
27
+ initialize(client: Client): (() => void) | undefined;
28
+ replay(client: Client, entries: BufferedConsoleEntry[]): void;
29
+ }
30
+ /** A loader may report its result synchronously. */
31
+ export type ConsoleLogsLoader = (callback: (error: unknown, capture?: ConsoleLogsCapture) => void) => void;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ const BUFFERED_CONSOLE_LEVELS = [
31
+ 'debug',
32
+ 'log',
33
+ 'warn',
34
+ 'error',
35
+ 'info'
36
+ ];
37
+ __webpack_require__.d(__webpack_exports__, {}, {
38
+ BUFFERED_CONSOLE_LEVELS: BUFFERED_CONSOLE_LEVELS
39
+ });
40
+ exports.BUFFERED_CONSOLE_LEVELS = __webpack_exports__.BUFFERED_CONSOLE_LEVELS;
41
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
42
+ "BUFFERED_CONSOLE_LEVELS"
43
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
44
+ Object.defineProperty(exports, '__esModule', {
45
+ value: true
46
+ });
@@ -0,0 +1,8 @@
1
+ const BUFFERED_CONSOLE_LEVELS = [
2
+ 'debug',
3
+ 'log',
4
+ 'warn',
5
+ 'error',
6
+ 'info'
7
+ ];
8
+ export { BUFFERED_CONSOLE_LEVELS };
package/dist/logs.d.ts ADDED
@@ -0,0 +1,85 @@
1
+ import type { CaptureLogOptions, Logger } from '@posthog/types';
2
+ import type { RemoteConfigResult } from './types/remote-config';
3
+ import type { LogSdkContext } from '@posthog/core';
4
+ import type { Client, DeepReadonly } from './client';
5
+ import type { Extension } from './extension';
6
+ import type { ConsoleLogsLoader } from './logs-types';
7
+ import { type LogsConfigSource } from './logs-config';
8
+ export declare const RECORDER_MAX_AGE_MS = 30000;
9
+ export declare class PostHogLogs implements Extension {
10
+ private readonly _configSource;
11
+ /** Reads host SDK metadata at capture time, including while console calls are buffered. */
12
+ private readonly _getSdkContext;
13
+ readonly name: string;
14
+ private _isLogsEnabled;
15
+ private _isLoaded;
16
+ private _isLoading;
17
+ private _logger;
18
+ private get _coreLogger();
19
+ private _queue;
20
+ private _core;
21
+ private _resolvedConfig;
22
+ private _resolvedFrom;
23
+ private _capture_logger;
24
+ private _consoleQueue;
25
+ private _consoleCore;
26
+ private _consoleLogsDispose;
27
+ private _consoleResolvedConfig;
28
+ private _consoleResolvedFrom;
29
+ private _consecutiveStatusZeroFailures;
30
+ private _client;
31
+ private _setupStarted;
32
+ private _remoteConfigSubscription;
33
+ private _disposed;
34
+ private _consoleBuffer;
35
+ private _consoleRecorderUnpatchers;
36
+ private _isRecordingConsole;
37
+ private _consoleRecorderTimeout;
38
+ private _isRecordingConsoleEntry;
39
+ private _window;
40
+ private _listeningForReconnect;
41
+ constructor(_configSource: LogsConfigSource,
42
+ /** Reads host SDK metadata at capture time, including while console calls are buffered. */
43
+ _getSdkContext: () => LogSdkContext);
44
+ protected get _isRequestReady(): boolean;
45
+ protected _getConsoleLoader(): ConsoleLogsLoader | undefined;
46
+ protected _listenForReconnect(): void;
47
+ private _onReconnect;
48
+ private _buildCore;
49
+ private _getCore;
50
+ private _getConsoleCore;
51
+ setup(client: Client): void | Promise<void>;
52
+ private _finishSetup;
53
+ dispose(): void;
54
+ onRemoteConfig(result: DeepReadonly<RemoteConfigResult>): void;
55
+ reset(): void;
56
+ captureLog(options: CaptureLogOptions): void;
57
+ /** @internal */
58
+ captureConsoleLog(options: CaptureLogOptions): void;
59
+ /** @internal */
60
+ captureBufferedConsoleLog(options: CaptureLogOptions, context: LogSdkContext, occurredAtMs: number): void;
61
+ /**
62
+ * Releases everything console capture is holding when capturing is turned off: the
63
+ * pre-load buffer, the `console` patches, and console records already queued — at
64
+ * that moment rather than whenever the page next writes to the console.
65
+ *
66
+ * @internal
67
+ */
68
+ _onOptOut(): void;
69
+ private _stopRecorderStartedByPersistedHint;
70
+ private _startConsoleRecorder;
71
+ private _recordConsoleEntry;
72
+ private _stopConsoleRecorder;
73
+ private _takeConsoleBuffer;
74
+ get logger(): Logger;
75
+ flushLogs(transport?: 'XHR' | 'fetch' | 'sendBeacon'): void;
76
+ /** Await both product queues without changing the legacy fire-and-forget flush API. */
77
+ flush(): Promise<void>;
78
+ private _logFlushError;
79
+ loadIfEnabled(): void;
80
+ private _createHost;
81
+ private _sendLogsBatch;
82
+ private _trackEndpointReachability;
83
+ private _flushViaTransport;
84
+ private _drainQueueViaTransport;
85
+ }