@danything/arib 1.3.1 → 2.0.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.
- package/dist/ait.d.ts +4 -4
- package/dist/ait.js +5 -5
- package/dist/aribtext-gaiji.d.ts +1 -1
- package/dist/aribtext-gaiji.js +1 -1
- package/dist/aribtext.js +3 -3
- package/dist/b24-tables.d.ts +5 -5
- package/dist/b24-tables.js +42 -42
- package/dist/b24caption.js +3 -3
- package/dist/bml-protocol.d.ts +2 -2
- package/dist/bml-protocol.js +1 -1
- package/dist/bml.d.ts +4 -4
- package/dist/bml.js +8 -8
- package/dist/bytes.d.ts +3 -3
- package/dist/bytes.js +3 -3
- package/dist/caption-text.d.ts +1 -1
- package/dist/drcs-smooth.d.ts +1 -1
- package/dist/drcs-smooth.js +1 -1
- package/dist/dsmcc.d.ts +5 -5
- package/dist/dsmcc.js +4 -4
- package/dist/eit.d.ts +11 -11
- package/dist/eit.js +17 -17
- package/dist/multipart.js +1 -1
- package/dist/pes.d.ts +4 -4
- package/dist/pes.js +10 -10
- package/dist/psi.d.ts +11 -44
- package/dist/psi.js +26 -35
- package/dist/service-filter.d.ts +9 -9
- package/dist/service-filter.js +10 -10
- package/dist/synth-av.d.ts +5 -5
- package/dist/synth-av.js +8 -8
- package/dist/synth-caption.d.ts +1 -1
- package/dist/synth-caption.js +1 -1
- package/dist/synth.d.ts +10 -10
- package/dist/synth.js +11 -11
- package/package.json +1 -1
package/dist/synth-av.d.ts
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
* - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1 コマ 7 バイト
|
|
13
13
|
*
|
|
14
14
|
* 規格は ISO/IEC 13818-2 (映像) と 13818-7 / 14496-3 (AAC)。表の出どころは
|
|
15
|
-
*
|
|
15
|
+
* 各関数の冒頭に書いてある。
|
|
16
16
|
*/
|
|
17
17
|
/** 29.97 コマ/秒の 1 コマ (90kHz)。放送と同じ */
|
|
18
18
|
export declare const FRAME_TICKS = 3003;
|
|
19
19
|
/** AAC の 1 コマ (1024 標本 @48kHz を 90kHz で) */
|
|
20
20
|
export declare const AUDIO_TICKS = 1920;
|
|
21
21
|
/**
|
|
22
|
-
* I フレームを 1 枚。**毎枚、系列ヘッダから書く。**
|
|
22
|
+
* I フレームを 1 枚。**毎枚、系列ヘッダから書く。** どこから受け取っても先頭からデコードできる
|
|
23
23
|
* (放送は GOP ごとに書く。試験ではその手間を省く)。
|
|
24
24
|
*
|
|
25
25
|
* @param n 何枚目か。色と time_code に使う
|
|
@@ -27,21 +27,21 @@ export declare const AUDIO_TICKS = 1920;
|
|
|
27
27
|
*/
|
|
28
28
|
export declare function mpeg2Frame(n: number, color?: (col: number, row: number, n: number, field: 0 | 1) => [number, number, number]): Uint8Array;
|
|
29
29
|
/**
|
|
30
|
-
* AAC-LC の無音を 1 コマ、ADTS
|
|
30
|
+
* AAC-LC の無音を 1 コマ、ADTS のヘッダ付きで。48kHz・ステレオ (channel_configuration 2)。
|
|
31
31
|
*
|
|
32
32
|
* 中身は CPE が 1 つ: 両耳とも `max_sfb = 0` (係数を 1 つも持たない) で、あとは END。
|
|
33
33
|
* 55 ビットなので 7 バイトに収まる (14496-3 の raw_data_block)
|
|
34
34
|
*/
|
|
35
35
|
export declare function silentAac(): Uint8Array;
|
|
36
36
|
/**
|
|
37
|
-
* PES にする。映像は長さ 0 (
|
|
37
|
+
* PES にする。映像は長さ 0 (「次の PES の先頭まで」。放送もそう書く)、音声は長さを書く
|
|
38
38
|
*
|
|
39
39
|
* @param streamId 0xE0 (映像) / 0xC0 (音声) / 0xBD (字幕。`synth-caption.ts`)
|
|
40
40
|
*/
|
|
41
41
|
export declare function pes(streamId: number, pts: number, data: Uint8Array): Uint8Array;
|
|
42
42
|
/**
|
|
43
43
|
* PES を TS パケットに割る。**最後のパケットは適応フィールドで詰める** (中身を 0xFF で
|
|
44
|
-
* 埋めると PES の続きに見える)
|
|
44
|
+
* 埋めると PES の続きに見える)。最初のパケットに PCR を載せることもできる
|
|
45
45
|
*
|
|
46
46
|
* @param counter 連続性カウンタの続き。返り値の `counter` を次に渡す
|
|
47
47
|
*/
|
package/dist/synth-av.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - 音声 … 48kHz ステレオの AAC-LC の**無音**を ADTS で。1 コマ 7 バイト
|
|
13
13
|
*
|
|
14
14
|
* 規格は ISO/IEC 13818-2 (映像) と 13818-7 / 14496-3 (AAC)。表の出どころは
|
|
15
|
-
*
|
|
15
|
+
* 各関数の冒頭に書いてある。
|
|
16
16
|
*/
|
|
17
17
|
import { concatBytes } from "./bytes.js";
|
|
18
18
|
import { PACKET, SYNC } from "./psi.js";
|
|
@@ -96,7 +96,7 @@ function colorAt(col, row, n, field) {
|
|
|
96
96
|
return [y, 96 + ((row * 16) % 64), 160 - ((col * 4) % 64)];
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
-
* I フレームを 1 枚。**毎枚、系列ヘッダから書く。**
|
|
99
|
+
* I フレームを 1 枚。**毎枚、系列ヘッダから書く。** どこから受け取っても先頭からデコードできる
|
|
100
100
|
* (放送は GOP ごとに書く。試験ではその手間を省く)。
|
|
101
101
|
*
|
|
102
102
|
* @param n 何枚目か。色と time_code に使う
|
|
@@ -162,7 +162,7 @@ export function mpeg2Frame(n, color = colorAt) {
|
|
|
162
162
|
bits.put(0, 1); // progressive_frame = 0
|
|
163
163
|
bits.put(0, 1); // composite_display_flag
|
|
164
164
|
for (let row = 0; row < mbHeight; row++) {
|
|
165
|
-
// 1 行を 1
|
|
165
|
+
// 1 行を 1 スライスに。予測は行の先頭で 128 に戻る (7.2.1)
|
|
166
166
|
bits.startCode(row + 1);
|
|
167
167
|
bits.put(8, 5); // quantiser_scale_code (DC だけなので効かない)
|
|
168
168
|
bits.put(0, 1); // extra_bit_slice
|
|
@@ -187,7 +187,7 @@ export function mpeg2Frame(n, color = colorAt) {
|
|
|
187
187
|
return bits.bytes();
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
|
-
* AAC-LC の無音を 1 コマ、ADTS
|
|
190
|
+
* AAC-LC の無音を 1 コマ、ADTS のヘッダ付きで。48kHz・ステレオ (channel_configuration 2)。
|
|
191
191
|
*
|
|
192
192
|
* 中身は CPE が 1 つ: 両耳とも `max_sfb = 0` (係数を 1 つも持たない) で、あとは END。
|
|
193
193
|
* 55 ビットなので 7 バイトに収まる (14496-3 の raw_data_block)
|
|
@@ -224,7 +224,7 @@ export function silentAac() {
|
|
|
224
224
|
head.put(0, 2); // number_of_raw_data_blocks - 1
|
|
225
225
|
return Uint8Array.from([...head.bytes(), ...payload]);
|
|
226
226
|
}
|
|
227
|
-
/** PTS/DTS の 5 バイト (2.4.3.7)
|
|
227
|
+
/** PTS/DTS の 5 バイト (2.4.3.7)。先頭の 4 ビットは '0010' (PTS だけ) */
|
|
228
228
|
function stamp(pts) {
|
|
229
229
|
const value = pts % 2 ** 33;
|
|
230
230
|
const high = Math.floor(value / 2 ** 30) & 0x07;
|
|
@@ -239,7 +239,7 @@ function stamp(pts) {
|
|
|
239
239
|
];
|
|
240
240
|
}
|
|
241
241
|
/**
|
|
242
|
-
* PES にする。映像は長さ 0 (
|
|
242
|
+
* PES にする。映像は長さ 0 (「次の PES の先頭まで」。放送もそう書く)、音声は長さを書く
|
|
243
243
|
*
|
|
244
244
|
* @param streamId 0xE0 (映像) / 0xC0 (音声) / 0xBD (字幕。`synth-caption.ts`)
|
|
245
245
|
*/
|
|
@@ -259,7 +259,7 @@ export function pes(streamId, pts, data) {
|
|
|
259
259
|
}
|
|
260
260
|
/**
|
|
261
261
|
* PES を TS パケットに割る。**最後のパケットは適応フィールドで詰める** (中身を 0xFF で
|
|
262
|
-
* 埋めると PES の続きに見える)
|
|
262
|
+
* 埋めると PES の続きに見える)。最初のパケットに PCR を載せることもできる
|
|
263
263
|
*
|
|
264
264
|
* @param counter 連続性カウンタの続き。返り値の `counter` を次に渡す
|
|
265
265
|
*/
|
|
@@ -271,7 +271,7 @@ export function packetizePes(pid, data, counter, pcr = null) {
|
|
|
271
271
|
const withPcr = at === 0 && pcr !== null;
|
|
272
272
|
const rest = data.length - at;
|
|
273
273
|
/*
|
|
274
|
-
* 適応フィールドの長さ。PCR
|
|
274
|
+
* 適応フィールドの長さ。PCR を載せるならフラグ 1 バイト + 6 バイト。**中身が
|
|
275
275
|
* 足りないときもここを伸ばして詰める** (中身を 0xFF で埋めると PES の続きに見える)
|
|
276
276
|
*/
|
|
277
277
|
const least = withPcr ? 7 : 0;
|
package/dist/synth-caption.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export declare function text(body: number[], language?: number): Uint8Array;
|
|
|
30
30
|
*/
|
|
31
31
|
export declare function drcsUnit(code: number, rows: string[]): number[];
|
|
32
32
|
/**
|
|
33
|
-
* ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1
|
|
33
|
+
* ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1 本・コマごとに SimpleBlock 1 つ)。
|
|
34
34
|
* 中身は字幕の PES の中身 (`text(...)` など) をそのまま入れる
|
|
35
35
|
*
|
|
36
36
|
* @param frames [時刻 (ミリ秒。65535 まで), 中身] の並び
|
package/dist/synth-caption.js
CHANGED
|
@@ -100,7 +100,7 @@ function element(id, body) {
|
|
|
100
100
|
return [...id, 0x01, 0, 0, 0, (size >>> 24) & 0xff, ...u24(size), ...body];
|
|
101
101
|
}
|
|
102
102
|
/**
|
|
103
|
-
* ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1
|
|
103
|
+
* ffmpeg が `-c:s copy -f matroska` で書くのと同じ骨組みの Matroska (トラック 1 本・コマごとに SimpleBlock 1 つ)。
|
|
104
104
|
* 中身は字幕の PES の中身 (`text(...)` など) をそのまま入れる
|
|
105
105
|
*
|
|
106
106
|
* @param frames [時刻 (ミリ秒。65535 まで), 中身] の並び
|
package/dist/synth.d.ts
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* TS のセクションを組み立てる。
|
|
3
3
|
*
|
|
4
4
|
* 実チューナーが無いので、解析のテストにも偽エージェントにも「それらしい TS」が要る。
|
|
5
|
-
* 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など)
|
|
5
|
+
* 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、仕様を書き写しているのはここだけ。
|
|
6
6
|
*/
|
|
7
7
|
import { withCrc } from "./psi.js";
|
|
8
8
|
export { withCrc };
|
|
9
|
-
/** 表のバージョンと、何本に分けたうちのどれか。指定しなければバージョン 0
|
|
9
|
+
/** 表のバージョンと、何本に分けたうちのどれか。指定しなければバージョン 0・セクション 0/0 */
|
|
10
10
|
export interface SectionPart {
|
|
11
11
|
version?: number;
|
|
12
12
|
sectionNumber?: number;
|
|
13
13
|
lastSectionNumber?: number;
|
|
14
14
|
}
|
|
15
|
-
/** PCR の基準部 (90kHz) を適応フィールドに書く (
|
|
15
|
+
/** PCR の基準部 (90kHz) を適応フィールドに書く (フラグは呼ぶ側が立てる)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
|
|
16
16
|
export declare function putPcr(packet: Uint8Array, pcr: number): void;
|
|
17
17
|
/**
|
|
18
18
|
* 文字列を ARIB STD-B24 の 8 単位符号にする。
|
|
@@ -113,9 +113,9 @@ options?: SectionPart & {
|
|
|
113
113
|
export declare function satelliteDeliveryDescriptor(frequency: number, symbolRate?: number): number[];
|
|
114
114
|
/** 地上の分配の記述子 (0xFA)。周波数は Hz で渡す (1/7 MHz 単位に丸める) */
|
|
115
115
|
export declare function terrestrialDeliveryDescriptor(areaCode: number, frequencies: number[]): number[];
|
|
116
|
-
/** セクションを TS
|
|
116
|
+
/** セクションを TS パケットに詰める。最初のパケットには pointer_field が付く */
|
|
117
117
|
export declare function packetize(pid: number, section: Uint8Array, counter?: number): Uint8Array;
|
|
118
|
-
/** 部品を 1
|
|
118
|
+
/** 部品を 1 本のバイト列に繋ぐ。組んだパケットを流し込むときに使う */
|
|
119
119
|
export declare function stream(...parts: Uint8Array[]): Uint8Array;
|
|
120
120
|
/** PCR を 1 つ運ぶだけのパケット */
|
|
121
121
|
export declare function pcrPacket(pid: number, seconds: number, counter?: number): Uint8Array;
|
|
@@ -124,7 +124,7 @@ export declare function tdtPacket(unixMs: number): Uint8Array;
|
|
|
124
124
|
/** PAT。サービス ID → PMT の PID */
|
|
125
125
|
export declare function patSection(programs: [number, number][], transportStreamId?: number): Uint8Array;
|
|
126
126
|
/**
|
|
127
|
-
* PMT
|
|
127
|
+
* PMT。ロゴのカルーセルを運ぶ ES を 1 つだけ持たせる。
|
|
128
128
|
* 目印は stream_identifier_descriptor (0x52) の component_tag
|
|
129
129
|
*/
|
|
130
130
|
export declare function pmtSection(serviceId: number, esPid: number, componentTag: number): Uint8Array;
|
|
@@ -198,11 +198,11 @@ export declare const BML_TS: {
|
|
|
198
198
|
};
|
|
199
199
|
/** BML の ES が 1 本だけ載った PMT (`BML_TS` の割り振り) */
|
|
200
200
|
export declare function bmlPmt(): Uint8Array;
|
|
201
|
-
/** PAT と PMT
|
|
201
|
+
/** PAT と PMT。データ放送のストリームの先頭 */
|
|
202
202
|
export declare function bmlHead(): Uint8Array[];
|
|
203
203
|
/**
|
|
204
204
|
* モジュール 1 つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
|
|
205
|
-
*
|
|
205
|
+
* 本物と同じく、先頭に Content-Type、境界で区切って各ファイルに Content-Location
|
|
206
206
|
*/
|
|
207
207
|
export declare function multipartModule(files: [location: string, type: string, body: string][]): Uint8Array;
|
|
208
208
|
/** PMT の ES に付ける application_signalling_descriptor (0x6F)。**AIT の在り処の印** */
|
|
@@ -213,7 +213,7 @@ export interface SynthHybridcastApp {
|
|
|
213
213
|
/** `CONTROL` の値。既定は autostart */
|
|
214
214
|
controlCode?: number;
|
|
215
215
|
name?: string;
|
|
216
|
-
/** URL
|
|
216
|
+
/** URL の先頭部分。**通信路で運ぶもの** (protocol_id = 3) として入れる */
|
|
217
217
|
base?: string;
|
|
218
218
|
/** その先のパス */
|
|
219
219
|
path?: string;
|
|
@@ -221,6 +221,6 @@ export interface SynthHybridcastApp {
|
|
|
221
221
|
/**
|
|
222
222
|
* AIT (table_id 0x74)。**Hybridcast のアプリのアドレス (URL) が載っている表。**
|
|
223
223
|
*
|
|
224
|
-
*
|
|
224
|
+
* アプリそのものは放送では送られていないので、ここに入るのは URL と名前だけ
|
|
225
225
|
*/
|
|
226
226
|
export declare function aitSection(applications: SynthHybridcastApp[], applicationType?: number): Uint8Array;
|
package/dist/synth.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* TS のセクションを組み立てる。
|
|
3
3
|
*
|
|
4
4
|
* 実チューナーが無いので、解析のテストにも偽エージェントにも「それらしい TS」が要る。
|
|
5
|
-
* 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など)
|
|
5
|
+
* 読む側 (psi.ts・eit.ts・dsmcc.ts・ait.ts、denpa の logo.ts など) と対になる書く側で、仕様を書き写しているのはここだけ。
|
|
6
6
|
*/
|
|
7
7
|
import { joinBytes } from "./bytes.js";
|
|
8
8
|
import { PACKET, SYNC, withCrc } from "./psi.js";
|
|
@@ -10,7 +10,7 @@ import { PACKET, SYNC, withCrc } from "./psi.js";
|
|
|
10
10
|
export { withCrc };
|
|
11
11
|
const be = (value) => [(value >> 8) & 0xff, value & 0xff];
|
|
12
12
|
const be32 = (value) => [...be(value >>> 16), ...be(value & 0xffff)];
|
|
13
|
-
/**
|
|
13
|
+
/** セクションの先頭 8 バイト (長さは `withCrc` が埋める) */
|
|
14
14
|
function head(tableId, extension, part = {}) {
|
|
15
15
|
return [
|
|
16
16
|
tableId,
|
|
@@ -22,7 +22,7 @@ function head(tableId, extension, part = {}) {
|
|
|
22
22
|
part.lastSectionNumber ?? 0,
|
|
23
23
|
];
|
|
24
24
|
}
|
|
25
|
-
/** PCR の基準部 (90kHz) を適応フィールドに書く (
|
|
25
|
+
/** PCR の基準部 (90kHz) を適応フィールドに書く (フラグは呼ぶ側が立てる)。拡張部 (27MHz の端数) は読む側が見ていないので 0 */
|
|
26
26
|
export function putPcr(packet, pcr) {
|
|
27
27
|
const base = Math.round(pcr) % 2 ** 33;
|
|
28
28
|
packet[6] = Math.floor(base / 2 ** 25) & 0xff;
|
|
@@ -96,7 +96,7 @@ function encodeSiText(text) {
|
|
|
96
96
|
}
|
|
97
97
|
/** 言語の符号 "jpn" (ISO 639-2) */
|
|
98
98
|
const JPN = [0x6a, 0x70, 0x6e];
|
|
99
|
-
/** 長さ 1
|
|
99
|
+
/** 長さ 1 バイトを先頭に付けた文字列。SI の記述子はどこもこの形式 */
|
|
100
100
|
const sized = (text) => {
|
|
101
101
|
const body = encodeSiText(text);
|
|
102
102
|
return [body.length, ...body];
|
|
@@ -305,7 +305,7 @@ export function terrestrialDeliveryDescriptor(areaCode, frequencies) {
|
|
|
305
305
|
];
|
|
306
306
|
return [0xfa, body.length, ...body];
|
|
307
307
|
}
|
|
308
|
-
/** セクションを TS
|
|
308
|
+
/** セクションを TS パケットに詰める。最初のパケットには pointer_field が付く */
|
|
309
309
|
export function packetize(pid, section, counter = 0) {
|
|
310
310
|
const packets = [];
|
|
311
311
|
let data = [0x00, ...section]; // pointer_field = 0
|
|
@@ -320,7 +320,7 @@ export function packetize(pid, section, counter = 0) {
|
|
|
320
320
|
}
|
|
321
321
|
return Uint8Array.from(packets);
|
|
322
322
|
}
|
|
323
|
-
/** 部品を 1
|
|
323
|
+
/** 部品を 1 本のバイト列に繋ぐ。組んだパケットを流し込むときに使う */
|
|
324
324
|
export function stream(...parts) {
|
|
325
325
|
return joinBytes(parts);
|
|
326
326
|
}
|
|
@@ -350,7 +350,7 @@ export function patSection(programs, transportStreamId = 1) {
|
|
|
350
350
|
return withCrc(body);
|
|
351
351
|
}
|
|
352
352
|
/**
|
|
353
|
-
* PMT
|
|
353
|
+
* PMT。ロゴのカルーセルを運ぶ ES を 1 つだけ持たせる。
|
|
354
354
|
* 目印は stream_identifier_descriptor (0x52) の component_tag
|
|
355
355
|
*/
|
|
356
356
|
export function pmtSection(serviceId, esPid, componentTag) {
|
|
@@ -538,7 +538,7 @@ export function bmlPmt() {
|
|
|
538
538
|
],
|
|
539
539
|
]);
|
|
540
540
|
}
|
|
541
|
-
/** PAT と PMT
|
|
541
|
+
/** PAT と PMT。データ放送のストリームの先頭 */
|
|
542
542
|
export function bmlHead() {
|
|
543
543
|
return [
|
|
544
544
|
packetize(0x0000, patSection([[BML_TS.service, BML_TS.pmtPid]])),
|
|
@@ -547,7 +547,7 @@ export function bmlHead() {
|
|
|
547
547
|
}
|
|
548
548
|
/**
|
|
549
549
|
* モジュール 1 つぶんの中身。**放送は multipart/mixed で複数のファイルを詰める。**
|
|
550
|
-
*
|
|
550
|
+
* 本物と同じく、先頭に Content-Type、境界で区切って各ファイルに Content-Location
|
|
551
551
|
*/
|
|
552
552
|
export function multipartModule(files) {
|
|
553
553
|
const boundary = "denpa";
|
|
@@ -565,7 +565,7 @@ export function aitSignallingDescriptor(applicationType = 0x0010, version = 1) {
|
|
|
565
565
|
/**
|
|
566
566
|
* AIT (table_id 0x74)。**Hybridcast のアプリのアドレス (URL) が載っている表。**
|
|
567
567
|
*
|
|
568
|
-
*
|
|
568
|
+
* アプリそのものは放送では送られていないので、ここに入るのは URL と名前だけ
|
|
569
569
|
*/
|
|
570
570
|
export function aitSection(applications, applicationType = 0x0010) {
|
|
571
571
|
const loop = [];
|
|
@@ -578,7 +578,7 @@ export function aitSection(applications, applicationType = 0x0010) {
|
|
|
578
578
|
}
|
|
579
579
|
if (app.base !== undefined) {
|
|
580
580
|
const base = [...new TextEncoder().encode(app.base)];
|
|
581
|
-
// transport_protocol_descriptor: protocol_id=3 (通信路)、label、URL
|
|
581
|
+
// transport_protocol_descriptor: protocol_id=3 (通信路)、label、URL の先頭部分
|
|
582
582
|
info.push(0x02, 5 + base.length, ...be(0x0003), 0x01, base.length, ...base, 0x00);
|
|
583
583
|
}
|
|
584
584
|
if (app.path !== undefined) {
|