1
0
Fork 0
mirror of https://github.com/codedread/bitjs synced 2025-10-03 01:29:17 +02:00

Move archive events into its own module.

This commit is contained in:
Jeff Schiller 2023-12-11 08:57:07 -08:00
parent 483f51ceeb
commit 5ad89892bd
10 changed files with 317 additions and 271 deletions

View file

@ -9,11 +9,12 @@
* Copyright(c) 2011 Google Inc.
*/
// TODO: When up-revving to a major new version, remove this module.
import { UnarchiveAppendEvent, UnarchiveErrorEvent, UnarchiveEvent, UnarchiveEventType,
UnarchiveExtractEvent, UnarchiveFinishEvent, UnarchiveInfoEvent,
UnarchiveProgressEvent, UnarchiveStartEvent, Unarchiver,
UnrarrerInternal, UntarrerInternal, UnzipperInternal,
getUnarchiverInternal } from './decompress-internal.js';
UnarchiveProgressEvent, UnarchiveStartEvent } from './events.js';
import { Unarchiver } from './decompress-internal.js';
import { Unzipper, Unrarrer, Untarrer, getUnarchiver } from './decompress.js';
export {

View file

@ -9,6 +9,9 @@
* Copyright(c) 2021 Google Inc.
*/
import { UnarchiveAppendEvent, UnarchiveErrorEvent, UnarchiveEvent, UnarchiveEventType,
UnarchiveExtractEvent, UnarchiveFinishEvent, UnarchiveInfoEvent,
UnarchiveProgressEvent, UnarchiveStartEvent } from './events.js';
import { findMimeType } from '../file/sniffer.js';
/**
@ -31,152 +34,6 @@ export const ThreadingMode = {
* @property {ThreadingMode=} threadingMode The default is WEB_WORKER.
*/
/**
* The UnarchiveEvent types.
*/
export const UnarchiveEventType = {
START: 'start',
APPEND: 'append',
PROGRESS: 'progress',
EXTRACT: 'extract',
FINISH: 'finish',
INFO: 'info',
ERROR: 'error'
};
/**
* An unarchive event.
*/
export class UnarchiveEvent extends Event {
/**
* @param {string} type The event type.
*/
constructor(type) {
super(type);
}
}
/**
* Updates all Archiver listeners that an append has occurred.
*/
export class UnarchiveAppendEvent extends UnarchiveEvent {
/**
* @param {number} numBytes The number of bytes appended.
*/
constructor(numBytes) {
super(UnarchiveEventType.APPEND);
/**
* The number of appended bytes.
* @type {number}
*/
this.numBytes = numBytes;
}
}
/**
* Useful for passing info up to the client (for debugging).
*/
export class UnarchiveInfoEvent extends UnarchiveEvent {
/**
* @param {string} msg The info message.
*/
constructor(msg) {
super(UnarchiveEventType.INFO);
/**
* The information message.
* @type {string}
*/
this.msg = msg;
}
}
/**
* An unrecoverable error has occured.
*/
export class UnarchiveErrorEvent extends UnarchiveEvent {
/**
* @param {string} msg The error message.
*/
constructor(msg) {
super(UnarchiveEventType.ERROR);
/**
* The information message.
* @type {string}
*/
this.msg = msg;
}
}
/**
* Start event.
*/
export class UnarchiveStartEvent extends UnarchiveEvent {
constructor() {
super(UnarchiveEventType.START);
}
}
/**
* Finish event.
*/
export class UnarchiveFinishEvent extends UnarchiveEvent {
/**
* @param {Object} metadata A collection fo metadata about the archive file.
*/
constructor(metadata = {}) {
super(UnarchiveEventType.FINISH);
this.metadata = metadata;
}
}
/**
* Progress event.
*/
export class UnarchiveProgressEvent extends UnarchiveEvent {
/**
* @param {string} currentFilename
* @param {number} currentFileNumber
* @param {number} currentBytesUnarchivedInFile
* @param {number} currentBytesUnarchived
* @param {number} totalUncompressedBytesInArchive
* @param {number} totalFilesInArchive
* @param {number} totalCompressedBytesRead
*/
constructor(currentFilename, currentFileNumber, currentBytesUnarchivedInFile,
currentBytesUnarchived, totalUncompressedBytesInArchive, totalFilesInArchive,
totalCompressedBytesRead) {
super(UnarchiveEventType.PROGRESS);
this.currentFilename = currentFilename;
this.currentFileNumber = currentFileNumber;
this.currentBytesUnarchivedInFile = currentBytesUnarchivedInFile;
this.totalFilesInArchive = totalFilesInArchive;
this.currentBytesUnarchived = currentBytesUnarchived;
this.totalUncompressedBytesInArchive = totalUncompressedBytesInArchive;
this.totalCompressedBytesRead = totalCompressedBytesRead;
}
}
/**
* Extract event.
*/
export class UnarchiveExtractEvent extends UnarchiveEvent {
/**
* @param {UnarchivedFile} unarchivedFile
*/
constructor(unarchivedFile) {
super(UnarchiveEventType.EXTRACT);
/**
* @type {UnarchivedFile}
*/
this.unarchivedFile = unarchivedFile;
}
}
/**
* Base class for all Unarchivers.
*/
@ -422,3 +279,17 @@ export class UntarrerInternal extends Unarchiver {
}
return unarchiver;
}
// Re-export things that used to live here.
// TODO: When up-revving to a major new version, remove these exports?
export {
UnarchiveAppendEvent,
UnarchiveErrorEvent,
UnarchiveEvent,
UnarchiveEventType,
UnarchiveExtractEvent,
UnarchiveFinishEvent,
UnarchiveInfoEvent,
UnarchiveProgressEvent,
UnarchiveStartEvent,
};

View file

@ -10,8 +10,8 @@
import { UnarchiveAppendEvent, UnarchiveErrorEvent, UnarchiveEvent, UnarchiveEventType,
UnarchiveExtractEvent, UnarchiveFinishEvent, UnarchiveInfoEvent,
UnarchiveProgressEvent, UnarchiveStartEvent, Unarchiver,
UnrarrerInternal, UntarrerInternal, UnzipperInternal,
UnarchiveProgressEvent, UnarchiveStartEvent } from './events.js';
import { Unarchiver, UnrarrerInternal, UntarrerInternal, UnzipperInternal,
getUnarchiverInternal } from './decompress-internal.js';
export {

153
archive/events.js Normal file
View file

@ -0,0 +1,153 @@
/**
* events.js
*
* Licensed under the MIT License
*
* Copyright(c) 2023 Google Inc.
*/
/**
* The UnarchiveEvent types.
*/
export const UnarchiveEventType = {
START: 'start',
APPEND: 'append',
PROGRESS: 'progress',
EXTRACT: 'extract',
FINISH: 'finish',
INFO: 'info',
ERROR: 'error'
};
/**
* An unarchive event.
*/
export class UnarchiveEvent extends Event {
/**
* @param {string} type The event type.
*/
constructor(type) {
super(type);
}
}
/**
* Updates all Archiver listeners that an append has occurred.
*/
export class UnarchiveAppendEvent extends UnarchiveEvent {
/**
* @param {number} numBytes The number of bytes appended.
*/
constructor(numBytes) {
super(UnarchiveEventType.APPEND);
/**
* The number of appended bytes.
* @type {number}
*/
this.numBytes = numBytes;
}
}
/**
* Useful for passing info up to the client (for debugging).
*/
export class UnarchiveInfoEvent extends UnarchiveEvent {
/**
* @param {string} msg The info message.
*/
constructor(msg) {
super(UnarchiveEventType.INFO);
/**
* The information message.
* @type {string}
*/
this.msg = msg;
}
}
/**
* An unrecoverable error has occured.
*/
export class UnarchiveErrorEvent extends UnarchiveEvent {
/**
* @param {string} msg The error message.
*/
constructor(msg) {
super(UnarchiveEventType.ERROR);
/**
* The information message.
* @type {string}
*/
this.msg = msg;
}
}
/**
* Start event.
*/
export class UnarchiveStartEvent extends UnarchiveEvent {
constructor() {
super(UnarchiveEventType.START);
}
}
/**
* Finish event.
*/
export class UnarchiveFinishEvent extends UnarchiveEvent {
/**
* @param {Object} metadata A collection fo metadata about the archive file.
*/
constructor(metadata = {}) {
super(UnarchiveEventType.FINISH);
this.metadata = metadata;
}
}
/**
* Progress event.
*/
export class UnarchiveProgressEvent extends UnarchiveEvent {
/**
* @param {string} currentFilename
* @param {number} currentFileNumber
* @param {number} currentBytesUnarchivedInFile
* @param {number} currentBytesUnarchived
* @param {number} totalUncompressedBytesInArchive
* @param {number} totalFilesInArchive
* @param {number} totalCompressedBytesRead
*/
constructor(currentFilename, currentFileNumber, currentBytesUnarchivedInFile,
currentBytesUnarchived, totalUncompressedBytesInArchive, totalFilesInArchive,
totalCompressedBytesRead) {
super(UnarchiveEventType.PROGRESS);
this.currentFilename = currentFilename;
this.currentFileNumber = currentFileNumber;
this.currentBytesUnarchivedInFile = currentBytesUnarchivedInFile;
this.totalFilesInArchive = totalFilesInArchive;
this.currentBytesUnarchived = currentBytesUnarchived;
this.totalUncompressedBytesInArchive = totalUncompressedBytesInArchive;
this.totalCompressedBytesRead = totalCompressedBytesRead;
}
}
/**
* Extract event.
*/
export class UnarchiveExtractEvent extends UnarchiveEvent {
/**
* @param {UnarchivedFile} unarchivedFile
*/
constructor(unarchivedFile) {
super(UnarchiveEventType.EXTRACT);
/**
* @type {UnarchivedFile}
*/
this.unarchivedFile = unarchivedFile;
}
}

View file

@ -8,109 +8,15 @@
* @returns {Unarchiver}
*/
export function getUnarchiverInternal(ab: ArrayBuffer, connectPortFn: any, options?: any | string): Unarchiver;
export namespace UnarchiveEventType {
const START: string;
const APPEND: string;
const PROGRESS: string;
const EXTRACT: string;
const FINISH: string;
const INFO: string;
const ERROR: string;
export namespace ThreadingMode {
const WEB_WORKER: string;
}
/**
* An unarchive event.
* @typedef UnarchiverOptions
* @property {string} pathToBitJS The path to the bitjs folder.
* @property {boolean=} debug Set to true for verbose unarchiver logging.
* @property {ThreadingMode=} threadingMode The default is WEB_WORKER.
*/
export class UnarchiveEvent extends Event {
/**
* @param {string} type The event type.
*/
constructor(type: string);
}
/**
* Updates all Archiver listeners that an append has occurred.
*/
export class UnarchiveAppendEvent extends UnarchiveEvent {
/**
* @param {number} numBytes The number of bytes appended.
*/
constructor(numBytes: number);
/**
* The number of appended bytes.
* @type {number}
*/
numBytes: number;
}
/**
* Useful for passing info up to the client (for debugging).
*/
export class UnarchiveInfoEvent extends UnarchiveEvent {
/**
* The information message.
* @type {string}
*/
msg: string;
}
/**
* An unrecoverable error has occured.
*/
export class UnarchiveErrorEvent extends UnarchiveEvent {
/**
* The information message.
* @type {string}
*/
msg: string;
}
/**
* Start event.
*/
export class UnarchiveStartEvent extends UnarchiveEvent {
constructor();
}
/**
* Finish event.
*/
export class UnarchiveFinishEvent extends UnarchiveEvent {
/**
* @param {Object} metadata A collection fo metadata about the archive file.
*/
constructor(metadata?: any);
metadata: any;
}
/**
* Progress event.
*/
export class UnarchiveProgressEvent extends UnarchiveEvent {
/**
* @param {string} currentFilename
* @param {number} currentFileNumber
* @param {number} currentBytesUnarchivedInFile
* @param {number} currentBytesUnarchived
* @param {number} totalUncompressedBytesInArchive
* @param {number} totalFilesInArchive
* @param {number} totalCompressedBytesRead
*/
constructor(currentFilename: string, currentFileNumber: number, currentBytesUnarchivedInFile: number, currentBytesUnarchived: number, totalUncompressedBytesInArchive: number, totalFilesInArchive: number, totalCompressedBytesRead: number);
currentFilename: string;
currentFileNumber: number;
currentBytesUnarchivedInFile: number;
totalFilesInArchive: number;
currentBytesUnarchived: number;
totalUncompressedBytesInArchive: number;
totalCompressedBytesRead: number;
}
/**
* Extract event.
*/
export class UnarchiveExtractEvent extends UnarchiveEvent {
/**
* @param {UnarchivedFile} unarchivedFile
*/
constructor(unarchivedFile: UnarchivedFile);
/**
* @type {UnarchivedFile}
*/
unarchivedFile: UnarchivedFile;
}
/**
* Base class for all Unarchivers.
*/
@ -126,12 +32,6 @@ export class Unarchiver extends EventTarget {
* deprecated.
*/
constructor(arrayBuffer: ArrayBuffer, connectPortFn: any, options?: UnarchiverOptions | string);
/**
* A handle to the decompressor implementation context.
* @type {Worker|*}
* @private
*/
private implRef_;
/**
* The client-side port that sends messages to, and receives messages from the
* decompressor implementation.
@ -229,5 +129,21 @@ export type UnarchiverOptions = {
* Set to true for verbose unarchiver logging.
*/
debug?: boolean | undefined;
/**
* The default is WEB_WORKER.
*/
threadingMode?: {
WEB_WORKER: string;
} | undefined;
};
import { UnarchiveAppendEvent } from "./events.js";
import { UnarchiveErrorEvent } from "./events.js";
import { UnarchiveEvent } from "./events.js";
import { UnarchiveEventType } from "./events.js";
import { UnarchiveExtractEvent } from "./events.js";
import { UnarchiveFinishEvent } from "./events.js";
import { UnarchiveInfoEvent } from "./events.js";
import { UnarchiveProgressEvent } from "./events.js";
import { UnarchiveStartEvent } from "./events.js";
export { UnarchiveAppendEvent, UnarchiveErrorEvent, UnarchiveEvent, UnarchiveEventType, UnarchiveExtractEvent, UnarchiveFinishEvent, UnarchiveInfoEvent, UnarchiveProgressEvent, UnarchiveStartEvent };
//# sourceMappingURL=decompress-internal.d.ts.map

View file

@ -1 +1 @@
{"version":3,"file":"decompress-internal.d.ts","sourceRoot":"","sources":["../../archive/decompress-internal.js"],"names":[],"mappings":"AAsZA;;;;;;;;GAQG;AACF,0CANU,WAAW,gCAEX,MAAO,MAAM,GAEX,UAAU,CAkBtB;;;;;;;;;;AAzYD;;GAEG;AACH;IACE;;OAEG;IACH,kBAFW,MAAM,EAIhB;CACF;AAED;;GAEG;AACH;IACE;;OAEG;IACH,sBAFW,MAAM,EAUhB;IALC;;;OAGG;IACH,UAFU,MAAM,CAEQ;CAE3B;AAED;;GAEG;AACH;IAOI;;;OAGG;IACH,KAFU,MAAM,CAEF;CAEjB;AAED;;GAEG;AACH;IAOI;;;OAGG;IACH,KAFU,MAAM,CAEF;CAEjB;AAED;;GAEG;AACH;IACE,cAEC;CACF;AAED;;GAEG;AACH;IACE;;OAEG;IACH,4BAGC;IADC,cAAwB;CAE3B;AAED;;GAEG;AACH;IACE;;;;;;;;OAQG;IACH,6BARW,MAAM,qBACN,MAAM,gCACN,MAAM,0BACN,MAAM,mCACN,MAAM,uBACN,MAAM,4BACN,MAAM,EAchB;IAPC,wBAAsC;IACtC,0BAA0C;IAC1C,qCAAgE;IAChE,4BAA8C;IAC9C,+BAAoD;IACpD,wCAAsE;IACtE,iCAAwD;CAE3D;AAED;;GAEG;AACH;IACE;;OAEG;IACH,4BAFW,cAAc,EASxB;IAJC;;OAEG;IACH,gBAFU,cAAc,CAEY;CAEvC;AAED;;GAEG;AACF;IAgBC;;;;;;;;;OASG;IACH,yBATW,WAAW,gCAKX,iBAAiB,GAAC,MAAM,EAuClC;IA5DD;;;;OAIG;IACH,iBAAS;IAET;;;;;OAKG;IACH,cAAM;IAqBJ;;;;OAIG;IACH,cAHU,WAAW,CAGA;IAErB;;;;OAIG;IACH,uBAAmC;IAEnC;;;;OAIG;IACH,qBAA8C;IAE9C;;;OAGG;IACH,YAFU,OAAO,CAEkB;IAGrC;;;;OAIG;IACH,yBAHa,MAAM,CAKlB;IAED;;;;OAIG;IACH,+BAHa,MAAM,CAKlB;IAED;;;;;OAKG;IACH,8BAsBC;IAED;;;;;OAKG;IACH,yBAWC;IAED;;OAEG;IACH,cA8BC;IAED;;;;;;;;OAQG;IACH,WAPW,WAAW,qBAGX,OAAO,oBAgBjB;IAED;;OAEG;IACH,aAWC;CACF;AAED;IACE,gEAEC;CAIF;AAED;IACE,gEAEC;CAIF;AAED;IACE,gEAEC;CAIF;;cArYa,MAAM;cACN,UAAU;;;;;;iBAKV,MAAM;;;;YACN,OAAO"}
{"version":3,"file":"decompress-internal.d.ts","sourceRoot":"","sources":["../../archive/decompress-internal.js"],"names":[],"mappings":"AA+PA;;;;;;;;GAQG;AACF,0CANU,WAAW,gCAEX,MAAO,MAAM,GAEX,UAAU,CAkBtB;;;;AA3PD;;;;;GAKG;AAEH;;GAEG;AACH;IASE;;;;;;;;;OASG;IACH,yBATW,WAAW,gCAKX,iBAAiB,GAAC,MAAM,EAuClC;IArDD;;;;;OAKG;IACH,cAAM;IAqBJ;;;;OAIG;IACH,cAHU,WAAW,CAGA;IAErB;;;;OAIG;IACH,uBAAmC;IAEnC;;;;OAIG;IACH,qBAA8C;IAE9C;;;OAGG;IACH,YAFU,OAAO,CAEkB;IAGrC;;;;OAIG;IACH,yBAHa,MAAM,CAKlB;IAED;;;;OAIG;IACH,+BAHa,MAAM,CAKlB;IAED;;;;;OAKG;IACH,8BAsBC;IAED;;;;;OAKG;IACH,yBAWC;IAED;;OAEG;IACH,cA2BC;IAED;;;;;;;;OAQG;IACH,WAPW,WAAW,qBAGX,OAAO,oBAgBjB;IAED;;OAEG;IACH,aAKC;CACF;AAED;IACE,gEAEC;CAIF;AAED;IACE,gEAEC;CAIF;AAED;IACE,gEAEC;CAIF;;cA3Oa,MAAM;cACN,UAAU;;;;;;iBAYV,MAAM;;;;YACN,OAAO"}

View file

@ -25,15 +25,15 @@ export type UnarchivedFile = {
};
export type UnarchiverOptions = import('./decompress-internal.js').UnarchiverOptions;
import { Unarchiver } from "./decompress-internal.js";
import { UnarchiveAppendEvent } from "./decompress-internal.js";
import { UnarchiveErrorEvent } from "./decompress-internal.js";
import { UnarchiveEvent } from "./decompress-internal.js";
import { UnarchiveEventType } from "./decompress-internal.js";
import { UnarchiveExtractEvent } from "./decompress-internal.js";
import { UnarchiveFinishEvent } from "./decompress-internal.js";
import { UnarchiveInfoEvent } from "./decompress-internal.js";
import { UnarchiveProgressEvent } from "./decompress-internal.js";
import { UnarchiveStartEvent } from "./decompress-internal.js";
import { UnarchiveAppendEvent } from "./events.js";
import { UnarchiveErrorEvent } from "./events.js";
import { UnarchiveEvent } from "./events.js";
import { UnarchiveEventType } from "./events.js";
import { UnarchiveExtractEvent } from "./events.js";
import { UnarchiveFinishEvent } from "./events.js";
import { UnarchiveInfoEvent } from "./events.js";
import { UnarchiveProgressEvent } from "./events.js";
import { UnarchiveStartEvent } from "./events.js";
import { UnzipperInternal } from "./decompress-internal.js";
import { UnrarrerInternal } from "./decompress-internal.js";
import { UntarrerInternal } from "./decompress-internal.js";

View file

@ -1 +1 @@
{"version":3,"file":"decompress.d.ts","sourceRoot":"","sources":["../../archive/decompress.js"],"names":[],"mappings":"AA+EA;;;;;;;;;;EAUE;AACF,kCARU,WAAW,YAGX,iBAAiB,GAAC,MAAM,GAGtB,UAAU,CAIrB;AAzBD;IACE,mCAA+D;CAChE;AAED;IACE,mCAA+D;CAChE;AAED;IACE,mCAA+D;CAChE;;cAzCa,MAAM;cACN,UAAU;;gCAIX,OAAO,0BAA0B,EAAE,iBAAiB"}
{"version":3,"file":"decompress.d.ts","sourceRoot":"","sources":["../../archive/decompress.js"],"names":[],"mappings":"AAgFA;;;;;;;;;;EAUE;AACF,kCARU,WAAW,YAGX,iBAAiB,GAAC,MAAM,GAGtB,UAAU,CAIrB;AAzBD;IACE,mCAA+D;CAChE;AAED;IACE,mCAA+D;CAChE;AAED;IACE,mCAA+D;CAChE;;cAzCa,MAAM;cACN,UAAU;;gCAIX,OAAO,0BAA0B,EAAE,iBAAiB"}

104
types/archive/events.d.ts vendored Normal file
View file

@ -0,0 +1,104 @@
export namespace UnarchiveEventType {
const START: string;
const APPEND: string;
const PROGRESS: string;
const EXTRACT: string;
const FINISH: string;
const INFO: string;
const ERROR: string;
}
/**
* An unarchive event.
*/
export class UnarchiveEvent extends Event {
/**
* @param {string} type The event type.
*/
constructor(type: string);
}
/**
* Updates all Archiver listeners that an append has occurred.
*/
export class UnarchiveAppendEvent extends UnarchiveEvent {
/**
* @param {number} numBytes The number of bytes appended.
*/
constructor(numBytes: number);
/**
* The number of appended bytes.
* @type {number}
*/
numBytes: number;
}
/**
* Useful for passing info up to the client (for debugging).
*/
export class UnarchiveInfoEvent extends UnarchiveEvent {
/**
* The information message.
* @type {string}
*/
msg: string;
}
/**
* An unrecoverable error has occured.
*/
export class UnarchiveErrorEvent extends UnarchiveEvent {
/**
* The information message.
* @type {string}
*/
msg: string;
}
/**
* Start event.
*/
export class UnarchiveStartEvent extends UnarchiveEvent {
constructor();
}
/**
* Finish event.
*/
export class UnarchiveFinishEvent extends UnarchiveEvent {
/**
* @param {Object} metadata A collection fo metadata about the archive file.
*/
constructor(metadata?: any);
metadata: any;
}
/**
* Progress event.
*/
export class UnarchiveProgressEvent extends UnarchiveEvent {
/**
* @param {string} currentFilename
* @param {number} currentFileNumber
* @param {number} currentBytesUnarchivedInFile
* @param {number} currentBytesUnarchived
* @param {number} totalUncompressedBytesInArchive
* @param {number} totalFilesInArchive
* @param {number} totalCompressedBytesRead
*/
constructor(currentFilename: string, currentFileNumber: number, currentBytesUnarchivedInFile: number, currentBytesUnarchived: number, totalUncompressedBytesInArchive: number, totalFilesInArchive: number, totalCompressedBytesRead: number);
currentFilename: string;
currentFileNumber: number;
currentBytesUnarchivedInFile: number;
totalFilesInArchive: number;
currentBytesUnarchived: number;
totalUncompressedBytesInArchive: number;
totalCompressedBytesRead: number;
}
/**
* Extract event.
*/
export class UnarchiveExtractEvent extends UnarchiveEvent {
/**
* @param {UnarchivedFile} unarchivedFile
*/
constructor(unarchivedFile: UnarchivedFile);
/**
* @type {UnarchivedFile}
*/
unarchivedFile: UnarchivedFile;
}
//# sourceMappingURL=events.d.ts.map

View file

@ -0,0 +1 @@
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../archive/events.js"],"names":[],"mappings":";;;;;;;;;AAqBA;;GAEG;AACH;IACE;;OAEG;IACH,kBAFW,MAAM,EAIhB;CACF;AAED;;GAEG;AACH;IACE;;OAEG;IACH,sBAFW,MAAM,EAUhB;IALC;;;OAGG;IACH,UAFU,MAAM,CAEQ;CAE3B;AAED;;GAEG;AACH;IAOI;;;OAGG;IACH,KAFU,MAAM,CAEF;CAEjB;AAED;;GAEG;AACH;IAOI;;;OAGG;IACH,KAFU,MAAM,CAEF;CAEjB;AAED;;GAEG;AACH;IACE,cAEC;CACF;AAED;;GAEG;AACH;IACE;;OAEG;IACH,4BAGC;IADC,cAAwB;CAE3B;AAED;;GAEG;AACH;IACE;;;;;;;;OAQG;IACH,6BARW,MAAM,qBACN,MAAM,gCACN,MAAM,0BACN,MAAM,mCACN,MAAM,uBACN,MAAM,4BACN,MAAM,EAchB;IAPC,wBAAsC;IACtC,0BAA0C;IAC1C,qCAAgE;IAChE,4BAA8C;IAC9C,+BAAoD;IACpD,wCAAsE;IACtE,iCAAwD;CAE3D;AAED;;GAEG;AACH;IACE;;OAEG;IACH,4CAOC;IAJC;;OAEG;IACH,+BAAoC;CAEvC"}